请教各位,为什么取点总是取到原点
我写了一个程序,想给N个选中的物件做最小包围盒,可是PT1总是取到(0 0),找不到问题所在,发上来请各位大侠帮忙看一下.(Defun C:Tx (/ Pt1 Pt2)
(Setvar "Cmdecho" 1)
(Setq Oldos (Getvar "Osmode"))
(Setq Block (Ssget))
(Setq N 0)
(Setq Ptmin-X 0 Ptmin-Y 0 Ptmax-X 0 Ptmax-Y 0)
(Repeat (Sslength Block)
(Setq Ent (Cdr (Assoc -1 (Entget (Ssname Block N)))))
(Progn
(Vla-Getboundingbox (Vlax-Ename->Vla-Object Ent) 'Minpoint 'Maxpoint)
(Setq Pmax (Trans (Vlax-Safearray->List Maxpoint) 0 1)
Pmin (Trans (Vlax-Safearray->List Minpoint) 0 1))
(progn (If(< (Car Pmin) Ptmin-X) (Setq Ptmin-X (Car Pmin)) (Setq Ptmin-X Ptmin-X))
(If(< (Cadr Pmin) Ptmin-Y) (Setq Ptmin-Y (Cadr Pmin)) (Setq Ptmin-Y Ptmin-Y))
(If(> (Car Pmax) Ptmax-X) (Setq Ptmax-X (Car Pmax)) (Setq Ptmax-X Ptmax-X))
(If(> (Cadr Pmax) Ptmax-Y) (Setq Ptmax-Y (Cadr Pmax)) (Setq Ptmax-Y Ptmax-Y)))
)
(Setq N (1+ N))
)
(Setq Pt1 (List Ptmin-X Ptmin-Y)
Pt2 (List Ptmax-X Ptmax-Y))
(Setvar "Osmode" 0)
(vl-cmdf ".Rectang" Pt1 Pt2)
(Setvar "Osmode" Oldos)
;)
(Setvar "Cmdecho" 1)
(Princ)
)
如果您只想绘出外框且无座标系的考量
Try this
(apply 'vl-cmdf (cons ".Rectang" (acet-geom-ss-extents (Ssget) T))) 回复 Andyhon 的帖子
不行,出现错误"; 错误: no function definition: ACET-GEOM-SS-EXTENTS" ACET-*需 Express Tools 支持 回复 Andyhon 的帖子
謝謝。在公司的機子試成了。不過也不是所有的機子都有裝EXPRESS.還想請教有沒有別的方法 假设 Ptss 是用 Vla-Getboundingbox 取得的全部对象点集合
(list
(apply 'mapcar (cons 'min ptss))
(apply 'mapcar (cons 'max ptss))
) 回复 Andyhon 的帖子
有點深,還不能理解 ;; 不能预设左下角点坐标(defun c:tt (/ oldos block n ent pmax pmin x1 y1 x2 y2 pn-x pn-y px-x px-y pt1 pt2)
(setvar "cmdecho" 1)
(setq oldos (getvar "osmode")
block (ssget)
n 0
)
(repeat (sslength block)
(setq ent (ssname block n))
(vla-getboundingbox
(vlax-ename->vla-object ent)
'minpoint
'maxpoint
)
(setq pmax (trans (vlax-safearray->list maxpoint) 0 1)
pmin (trans (vlax-safearray->list minpoint) 0 1)
x1 (car pmin)
y1 (cadr pmin)
x2 (car pmax)
y2 (cadr pmax)
pn-x(if pn-x pn-x x1)
pn-y(if pn-y pn-y y1)
px-x(if px-x px-x x2)
px-y(if px-y px-y y2)
pn-x(if (< x1 pn-x) x1 pn-x)
pn-y(if (< y1 pn-y) y1 pn-y)
px-x(if (> x2 px-x) x2 px-x)
px-y(if (> y2 px-y) y2 px-y)
n (1+ n)
)
)
(setq pt1 (list pn-x pn-y)
pt2 (list px-x px-y)
)
(setvar "osmode" 0)
(vl-cmdf ".rectang" pt1 pt2)
(setvar "osmode" oldos)
(setvar "cmdecho" 1)
(princ)
) (defun c:tt (/ block n ptn pmax pmin x1 y1 x2 y2)
(setq block (ssget)
n 0
ptn '()
)
(repeat (sslength block)
(vla-getboundingbox
(vlax-ename->vla-object (ssname block n))
'minpoint
'maxpoint
)
(setq pmax (vlax-safearray->list maxpoint)
pmin (vlax-safearray->list minpoint)
ptn(append (list pmin pmax) ptn)
n (1+ n)
)
)
(setq x1 (caar (vl-sort ptn '(lambda (a b) (< (car a) (car b)))))
y1 (cadar (vl-sort ptn '(lambda (a b) (< (cadr a) (cadr b)))))
x2 (caar (vl-sort ptn '(lambda (a b) (> (car a) (car b)))))
y2 (cadar (vl-sort ptn '(lambda (a b) (> (cadr a) (cadr b)))))
)
(vl-cmdf ".rectang" (list x1 y1) (list x2 y2))
(princ)
) ;; 需要e派工具箱的支持(if (setq ss (ssget))
(xyp-rectang
(xyp-get-ssMinMaxPoint ss 1)
(xyp-get-ssMinMaxPoint ss 9)
)
)
页:
[1]
2