小白求助,框选实体在框选范围内自动居中且不改变相对位置???
画图的时候经常会遇到复制内容到图框中,但摆放位置都是大概得能否实现执行命令,框选点1到点2,则点1到点2中实体对象不改变实体原有位置,整体居中到点1到点2的矩形中心
如图
本帖最后由 ziyouwzb 于 2023-10-30 16:41 编辑
muai2010 发表于 2023-10-30 16:38
就是需要这个效果,为什么我测试,不是居中的呢
看下是不是(vl-load-com)没加载,我加进去了,用附件程序试下
本帖最后由 wungqiao3 于 2023-10-30 14:40 编辑
[*];-----------------------------------------------------------
[*];功 能: 居中
[*];-----------------------------------------------------------
[*](defun C:TT (/ p1 p2 p5 q-2p-mid q-vla-9p s)
[*](vl-load-com)
[*](defun Q-2p-Mid (pt1 pt2)
[*] (mapcar '(lambda (x y) (/ (+ x y) 2.0)) pt1 pt2)
[*])
[*](defun Q-VLA-9P (ss pn / i maxx maxx0 maxy maxy0 minx minx0 miny miny0 name p1 p2 p3 p4 p5 p6 p7 p8 p9 pmax pmin pp1 pp2)
[*] (if (= 'ENAME (type ss))
[*] (setq ss (ssadd ss (ssadd)))
[*] )
[*] (cond
[*] ((listp ss)
[*] (progn (setq pp1 (car ss) pp2 (cadr ss))
[*] (setq
[*] minx0 (min (car pp1) (car pp2))
[*] miny0 (min (cadr pp1) (cadr pp2))
[*] maxx0 (max (car pp1) (car pp2))
[*] maxy0 (max (cadr pp1) (cadr pp2))
[*] )
[*] )
[*] )
[*] ((= 'PICKSET (type ss))
[*] (progn (setq minx0 1e99 miny0 1e99 maxx0 -1e99 maxy0 -1e99)
[*] (setq i -1)
[*] (while (setq name (ssname ss (setq i (1+ i))))
[*] (vla-getboundingbox (vlax-ename->vla-object name) 'minp 'maxp)
[*] (setq pmax (vlax-safearray->list maxp)
[*] pmin (vlax-safearray->list minp)
[*] )
[*] (setq minx (car pmin)maxx (car pmax)miny (cadr pmin)maxy (cadr pmax))
[*] (if (> minx0 minx) (setq minx0 minx))
[*] (if (> miny0 miny) (setq miny0 miny))
[*] (if (< maxx0 maxx) (setq maxx0 maxx))
[*] (if (< maxy0 maxy) (setq maxy0 maxy))
[*] )
[*] )
[*] )
[*] )
[*] (setq p1 (list minx0 miny0 0.0))
[*] (setq p9 (list maxx0 maxy0 0.0))
[*] (setq p3 (list (car p9) (cadr p1) 0.0))
[*] (setq p7 (list (car p1) (cadr p9) 0.0))
[*] (setq p2 (Q-2p-Mid p1 p3))
[*] (setq p4 (Q-2p-Mid p1 p7))
[*] (setq p6 (Q-2p-Mid p3 p9))
[*] (setq p8 (Q-2p-Mid p7 p9))
[*] (setq p5 (Q-2p-Mid p1 p9))
[*] (nth (1- pn) (list p1 p2 p3 p4 p5 p6 p7 p8 p9))
[*])
[*]
[*](if (and
[*] (princ "\n 选择需要居中的对象:")
[*] (setq s (ssget ":S"))
[*] (setq p1 (getpoint "\n 指定矩形范围第1点:"))
[*] (setq p2 (getcorner p1 "\n 指定矩形范围第2点:"))
[*] (setq p5 (Q-VLA-9P s 5))
[*] )
[*] (vl-cmdf "MOVE" s "" p5 (Q-2p-Mid p1 p2))
[*])
[*](princ)
[*])
本帖最后由 ziyouwzb 于 2023-10-30 16:37 编辑
(defun C:jz ( / ss ssbox ptz ptz pt1 pt2 pt3 pt4 )
(setq ss (ssget))
(setq ssbox(getssbox ss))
(setq ptz(caddr ssbox))
(setq pt1 (getpoint "输入第一点"))
(setq pt2 (getcorner pt1 "输入第二点"))
(setq pt3 (mapcar '* '(0.5 0.5) (mapcar '+ pt1 pt2)))
(setq pt4 (trans pt3 0 1))
(command "move" ss "" ptz pt4)
(princ);;静默退出
);;;end defun
;---获取选择集左下角,右上角,中心点坐标
(defun getssbox(*ss* / en n ptlx ptly ptrx ptry pysj pzxd pzxj ssbox)
(vl-load-com)
(setq ptlx '())
(setq ptly '())
(setq ptrx '())
(setq ptry '())
(repeat (setq n(sslength *ss*))
(setq en(ssname *ss* (setq n(1- n))))
(vla-getboundingbox (vlax-ename->vla-object en) 'minp 'maxp)
(setq ptlx(cons (car (vlax-safearray->list minp)) ptlx));---选择集所有图元左下角X值形成的点表
(setq ptly(cons (cadr (vlax-safearray->list minp)) ptly));---选择集所有图元左下角y值形成的点表
(setq ptrx(cons (car (vlax-safearray->list maxp)) ptrx));---选择集所有图元右上角x值形成的点表
(setq ptry(cons (cadr (vlax-safearray->list maxp)) ptry));---选择集所有图元右上角Y值形成的点表
)
(setq pzxj(list (apply 'min ptlx) (apply 'min ptly)))
(setq pysj(list (apply 'max ptrx) (apply 'max ptry)))
(setq pzxd (mapcar'(lambda (X Y) (/ (+ X Y) 2)) pzxj pysj))
(setq ssbox(list pzxj pysj pzxd))
ssbox
)
wungqiao3 发表于 2023-10-30 14:36
[*];-----------------------------------------------------------
[*];功 能: 居中
[*];------ ...
感谢提供,不过似乎有点问题,不能完全居中,什么问题呢?
ziyouwzb 发表于 2023-10-30 14:54
(defun C:jz ( / ss ssbox ptz ptz pt1 pt2 pt3 pt4 )
(setq ss (ssget))
(setq ssbox(getssbox ss))
谢谢,不过似乎有点问题,不能完全居中,和楼上提供什么问题呢?
本帖最后由 ziyouwzb 于 2023-10-30 16:07 编辑
多行文字4个角点太大了,容易出现你说的问题,就是这几个角点也算文字的范围,把多行文字的角点缩小下就可以了,如图1改成图2那样,或者把多行文字炸开成单行文字,直线和圆 单行文字等实体不受影响。文字要是不处理,目前还不知道怎么解决。
ziyouwzb 发表于 2023-10-30 15:57
多行文字4个角点太大了,容易出现你说的问题,就是这几个角点也算文字的范围,把多行文字的角点缩小下就可 ...
老哥,我截图的是单行文字,不是多行哈,多行我还没测试,嘿嘿,我吧附件传上来了,我是用这个测试不居中的,麻烦看下哈
本帖最后由 ziyouwzb 于 2023-10-30 16:39 编辑
muai2010 发表于 2023-10-30 16:10
老哥,我截图的是单行文字,不是多行哈,多行我还没测试,嘿嘿,我吧附件传上来了,我是用这个测试不居中 ...
我这边出来的是右边的效果,看是不是你需要的。要是的话,看下程序运行有没有提示很么错误
ziyouwzb 发表于 2023-10-30 16:22
我这边出来的是右边的效果,看是不是你需要的。要是的话,看下程序运行有没有提示很么错误
就是需要这个效果,为什么我测试,不是居中的呢
页:
[1]
2