muai2010 发表于 2023-10-30 14:12:25

小白求助,框选实体在框选范围内自动居中且不改变相对位置???

画图的时候经常会遇到复制内容到图框中,但摆放位置都是大概得
能否实现执行命令,框选点1到点2,则点1到点2中实体对象不改变实体原有位置,整体居中到点1到点2的矩形中心
如图





ziyouwzb 发表于 2023-10-30 14:12:26

本帖最后由 ziyouwzb 于 2023-10-30 16:41 编辑

muai2010 发表于 2023-10-30 16:38
就是需要这个效果,为什么我测试,不是居中的呢
看下是不是(vl-load-com)没加载,我加进去了,用附件程序试下

wungqiao3 发表于 2023-10-30 14:36:30

本帖最后由 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 14:54:19

本帖最后由 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
)

muai2010 发表于 2023-10-30 15:26:09

wungqiao3 发表于 2023-10-30 14:36
[*];-----------------------------------------------------------
[*];功    能:    居中
[*];------ ...

感谢提供,不过似乎有点问题,不能完全居中,什么问题呢?


muai2010 发表于 2023-10-30 15:27:47

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 15:57:53

本帖最后由 ziyouwzb 于 2023-10-30 16:07 编辑

多行文字4个角点太大了,容易出现你说的问题,就是这几个角点也算文字的范围,把多行文字的角点缩小下就可以了,如图1改成图2那样,或者把多行文字炸开成单行文字,直线和圆 单行文字等实体不受影响。文字要是不处理,目前还不知道怎么解决。

muai2010 发表于 2023-10-30 16:10:30

ziyouwzb 发表于 2023-10-30 15:57
多行文字4个角点太大了,容易出现你说的问题,就是这几个角点也算文字的范围,把多行文字的角点缩小下就可 ...

老哥,我截图的是单行文字,不是多行哈,多行我还没测试,嘿嘿,我吧附件传上来了,我是用这个测试不居中的,麻烦看下哈

ziyouwzb 发表于 2023-10-30 16:22:37

本帖最后由 ziyouwzb 于 2023-10-30 16:39 编辑

muai2010 发表于 2023-10-30 16:10
老哥,我截图的是单行文字,不是多行哈,多行我还没测试,嘿嘿,我吧附件传上来了,我是用这个测试不居中 ...
我这边出来的是右边的效果,看是不是你需要的。要是的话,看下程序运行有没有提示很么错误

muai2010 发表于 2023-10-30 16:38:42

ziyouwzb 发表于 2023-10-30 16:22
我这边出来的是右边的效果,看是不是你需要的。要是的话,看下程序运行有没有提示很么错误

就是需要这个效果,为什么我测试,不是居中的呢
页: [1] 2
查看完整版本: 小白求助,框选实体在框选范围内自动居中且不改变相对位置???