明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1970|回复: 12

[函数] 请教各位,为什么取点总是取到原点

  [复制链接]
发表于 2011-4-12 21:06 | 显示全部楼层 |阅读模式
我写了一个程序,想给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)
)
发表于 2011-4-12 22:07 | 显示全部楼层
如果您只想绘出外框且无座标系的考量

Try this
(apply 'vl-cmdf (cons ".Rectang" (acet-geom-ss-extents (Ssget) T)))
 楼主| 发表于 2011-4-12 22:13 | 显示全部楼层
回复 Andyhon 的帖子

不行,出现错误"; 错误: no function definition: ACET-GEOM-SS-EXTENTS"
发表于 2011-4-12 22:52 | 显示全部楼层
ACET-*  需 Express Tools 支持
 楼主| 发表于 2011-4-13 08:28 | 显示全部楼层
回复 Andyhon 的帖子

謝謝。在公司的機子試成了。不過也不是所有的機子都有裝EXPRESS.還想請教有沒有別的方法
发表于 2011-4-13 10:56 | 显示全部楼层
假设 Ptss 是用 Vla-Getboundingbox 取得的全部对象点集合
(list
  (apply 'mapcar (cons 'min ptss))
  (apply 'mapcar (cons 'max ptss))
)
 楼主| 发表于 2011-4-13 17:27 | 显示全部楼层
回复 Andyhon 的帖子

有點深,還不能理解
发表于 2011-4-13 18:12 | 显示全部楼层
;; 不能预设左下角点坐标
  1. (defun c:tt (/ oldos block n ent pmax pmin x1 y1 x2 y2 pn-x pn-y px-x px-y pt1 pt2)
  2.   (setvar "cmdecho" 1)
  3.   (setq        oldos (getvar "osmode")
  4.         block (ssget)
  5.         n     0
  6.   )  
  7.   (repeat (sslength block)
  8.     (setq ent (ssname block n))
  9.     (vla-getboundingbox
  10.       (vlax-ename->vla-object ent)
  11.       'minpoint
  12.       'maxpoint
  13.     )
  14.     (setq pmax (trans (vlax-safearray->list maxpoint) 0 1)
  15.           pmin (trans (vlax-safearray->list minpoint) 0 1)
  16.           x1 (car pmin)
  17.           y1 (cadr pmin)
  18.           x2 (car pmax)
  19.           y2 (cadr pmax)
  20.           pn-x(if pn-x pn-x x1)
  21.           pn-y(if pn-y pn-y y1)
  22.           px-x(if px-x px-x x2)
  23.           px-y(if px-y px-y y2)
  24.           pn-x(if (< x1 pn-x) x1 pn-x)
  25.           pn-y(if (< y1 pn-y) y1 pn-y)
  26.           px-x(if (> x2 px-x) x2 px-x)
  27.           px-y(if (> y2 px-y) y2 px-y)
  28.           n (1+ n)
  29.     )
  30.   )
  31.   (setq        pt1 (list pn-x pn-y)
  32.         pt2 (list px-x px-y)
  33.   )
  34.   (setvar "osmode" 0)
  35.   (vl-cmdf ".rectang" pt1 pt2)
  36.   (setvar "osmode" oldos)
  37.   (setvar "cmdecho" 1)
  38.   (princ)
  39. )
发表于 2011-4-13 18:23 | 显示全部楼层
  1. (defun c:tt (/ block n ptn pmax pmin x1 y1 x2 y2)
  2.   (setq        block (ssget)
  3.         n     0
  4.         ptn   '()
  5.   )
  6.   (repeat (sslength block)
  7.     (vla-getboundingbox
  8.       (vlax-ename->vla-object (ssname block n))
  9.       'minpoint
  10.       'maxpoint
  11.     )
  12.     (setq pmax (vlax-safearray->list maxpoint)
  13.           pmin (vlax-safearray->list minpoint)
  14.           ptn  (append (list pmin pmax) ptn)
  15.           n    (1+ n)
  16.     )
  17.   )
  18.   (setq        x1 (caar (vl-sort ptn '(lambda (a b) (< (car a) (car b)))))
  19.         y1 (cadar (vl-sort ptn '(lambda (a b) (< (cadr a) (cadr b)))))
  20.         x2 (caar (vl-sort ptn '(lambda (a b) (> (car a) (car b)))))
  21.         y2 (cadar (vl-sort ptn '(lambda (a b) (> (cadr a) (cadr b)))))
  22.   )
  23.   (vl-cmdf ".rectang" (list x1 y1) (list x2 y2))
  24.   (princ)
  25. )
发表于 2011-4-13 18:24 | 显示全部楼层
;; 需要e派工具箱的支持
  1. (if (setq ss (ssget))
  2.   (xyp-rectang
  3.     (xyp-get-ssMinMaxPoint ss 1)
  4.     (xyp-get-ssMinMaxPoint ss 9)
  5.   )
  6. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-5 10:42 , Processed in 1.512574 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表