找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: 啵浪鼓

[讨论]:如何找到多义线的对角点

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-4-30 23:26:21 | 显示全部楼层
1 对不同图层操作应该利用 过滤选项 '((0 . "*polyline")(8  . "D01A,D02A"),更高效的写法是将处理部分写成函数,参数是选择集。
2 对你的应用中这个判断可能要简单的多,只要判断pline 的 Box 是否在另一个的 Box 内即可,
  1. (while (< i ssl)
  2.   (setq e (ssname ss (setq ssl (1- ssl))))
  3.   (vla-getboundingbox (vlax-ename->vla-object e) 'bp 'up)
  4.   (if (not outpl) (setq outpl e out_box (list (safearray-value bp) (safrarray-value up))));_ 保存初始值
  5.   ..接下来对第二个以后的实体和保存的初始值比较Box,如果第二个实体的Box在第一个
  6.   ;;内部不处理,不在记录的Box内部,则对记录的 outpl out_box 重新赋值
  7. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-1 00:12:33 | 显示全部楼层
(vlax-ename->vla-object e)
得到的结果:IAcadLWPolyline 052ff574>
而全句(vla-getboundingbox (vlax-ename->vla-object e) 'bp 'up)
得到的结果为nil,因为bp与up此时未定义呀

斑竹,不要告诉我思路,直接写程序好了,我对arx一窍不通,这样来得比较快些~!
(16楼的程序我也不知该往程序里哪里加,还是斑竹直接写全程序我再来慢慢钻好了)
好像还有个问题,上面的程序感觉只是分辨当同图层2个以内的*pline在一起能识别,你写全程序时请帮忙考虑可能会有无限多个*pline,程序只要得到最外面的*pline即可(乎略所有内在*pline)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-5-1 00:53:19 | 显示全部楼层

  1. (defun getssoutpl (ss / ssl e outpl out_box bp up bp0 up0)
  2.   (setq ssl (sslength ss))
  3.   (while (> ssl 0)
  4.     (setq e (ssname ss (setq ssl (1- ssl))))
  5.     (vla-getboundingbox (vlax-ename->vla-object e) 'bp 'up)
  6.     (if        (not outpl)
  7.       (setq outpl   e
  8.             out_box (list (safearray-value bp) (safearray-value up))
  9.       )
  10.       (progn
  11.         (vla-getboundingbox (vlax-ename->vla-object e) 'bp 'up)
  12.         (setq bp  (safearray-value bp)
  13.               up  (safearray-value up)
  14.               bp0 (car out_box)
  15.               up0 (cadr out_box)
  16.         )
  17.         (if (and (and (< (car bp) (car bp0))
  18.                       (< (cadr bp) (cadr bp0))
  19.                  )
  20.                  (and (> (car up) (car up0))
  21.                       (> (cadr up) (cadr up0))
  22.                  )
  23.             )
  24.           (setq        outpl        e
  25.                 out_box        (list bp up)
  26.           )
  27.         )
  28.       )
  29.     )
  30.   )
  31.   out_box
  32. )
  33. (defun c:tt (/ ss lst)
  34.   (if (setq ss (ssget '((0 . "*polyline"))))
  35.     (progn
  36.       (setq lst (getssoutpl ss))
  37.       (princ lst))
  38.   )
  39.   (princ)
  40. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-1 02:17:43 | 显示全部楼层
点到为止,请不要再找我麻烦

自定义函数(c:corn)
选取图块,返回列表:  '(图块内"0"层实体包围盒对角点 ""D06A"层包围盒实体对角点)
返回格式'(((x1 y1 z1)(x2 y2 z2))((x3 y3 z3)(x4 y4 z4)))
调用实例:

  1. (defun c:tt ()
  2.   (setq lst (c:corn))
  3.   (command ".line" (caar lst)(cadar lst)"" ".line" (caadr lst)(cadadr lst)"")
  4. )

(附件中为编译后的函数,含测试c:tt.加载后直接输入tt可测试)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-1 10:21:49 | 显示全部楼层
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-2 12:28:40 | 显示全部楼层
  1. (defun c:ttt (/)
  2.   (if (setq s (ssget '((0 . "*polyline")
  3.       (8 . "D01A,D02A,D03A,D04A,D05A,D05B,S01A,S01B,S02A,P05A,P04A,P03A,P02A,P01A"))))
  4.     (progn
  5.       (setq d1 (ssadd) d2 (ssadd) d3 (ssadd) d4 (ssadd)  d5 (ssadd) d5b (ssadd)
  6.             s1 (ssadd) s1b (ssadd) s2 (ssadd) p5 (ssadd) p4 (ssadd)
  7.             p3 (ssadd) p2 (ssadd)  p1 (ssadd)i 0)
  8.       (while (< i (sslength s))
  9.         (if (= "D01A" (cdr(assoc 8 (entget (ssname s i)))))
  10.           (ssadd (ssname s i) d1))
  11.         (if (= "D02A" (cdr(assoc 8 (entget (ssname s i)))))
  12.           (ssadd (ssname s i) d2))
  13.         (if (= "D03A" (cdr(assoc 8 (entget (ssname s i)))))
  14.           (ssadd (ssname s i) d3))
  15.         (if (= "D04A" (cdr(assoc 8 (entget (ssname s i)))))
  16.           (ssadd (ssname s i) d4))
  17.         (if (= "D05A" (cdr(assoc 8 (entget (ssname s i)))))
  18.           (ssadd (ssname s i) d5))
  19.         (if (= "D05B" (cdr(assoc 8 (entget (ssname s i)))))
  20.           (ssadd (ssname s i) d5b))
  21.         (if (= "S01A" (cdr(assoc 8 (entget (ssname s i)))))
  22.           (ssadd (ssname s i) s1))
  23.         (if (= "S01B" (cdr(assoc 8 (entget (ssname s i)))))
  24.           (ssadd (ssname s i) s1b))
  25.         (if (= "P05A" (cdr(assoc 8 (entget (ssname s i)))))
  26.           (ssadd (ssname s i) p5))
  27.         (if (= "P04A" (cdr(assoc 8 (entget (ssname s i)))))
  28.           (ssadd (ssname s i) p4))
  29.         (if (= "P03A" (cdr(assoc 8 (entget (ssname s i)))))
  30.           (ssadd (ssname s i) p3))
  31.         (if (= "P02A" (cdr(assoc 8 (entget (ssname s i)))))
  32.           (ssadd (ssname s i) p2))
  33.         (if (= "P01A" (cdr(assoc 8 (entget (ssname s i)))))
  34.           (ssadd (ssname s i) p1))
  35.         (setq i (+ i 1))
  36.       );while
  37. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;start d1
  38.       (setq i 0)
  39.       (while (< i (sslength d1))
  40.         (setq d11 (ssname d1 i))
  41.         (vla-getboundingbox (vlax-ename->vla-object d11) 'd1bp 'd1up)
  42.         (if (not d1outpl)
  43.           (setq d1outpl d11
  44.                 d1out_box (list (safearray-value d1bp) (safearray-value d1up)))
  45.           (progn
  46.             (vla-getboundingbox (vlax-ename->vla-object d11) 'd1bp 'd1up)
  47.             (setq d1bp (safearray-value d1bp)
  48.                   d1up (safearray-value d1up)
  49.                   d1bp0 (car d1out_box)
  50.                   d1up0 (cadr d1out_box))
  51.             (if (and (and (< (car d1bp) (car d1bp0))
  52.                           (< (cadr d1bp) (cadr d1bp0)))
  53.                      (and (> (car d1up) (car d1up0))
  54.                           (> (cadr d1up) (cadr d1up0)))
  55.                 )
  56.               (setq d1outpl d11
  57.                     d1out_box (list d1bp d1up))
  58.             )
  59.           )
  60.         )
  61.         d1out_box
  62.         (setq i (+ i 1))
  63.         (command "line" d1bp d1up "")
  64.         (setq d1c1 d1bp d1c2 d1up)
  65.       );while d1 end
  66. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;start d2
  67.       (setq i 0)
  68.       (while (< i (sslength d2))
  69.         (setq d22 (ssname d2 i))
  70.         (vla-getboundingbox (vlax-ename->vla-object d22) 'd2bp 'd2up)
  71.         (if (not d2outpl)
  72.           (setq d2outpl d22
  73.                 d2out_box (list (safearray-value d2bp) (safearray-value d2up)))
  74.           (progn
  75.             (vla-getboundingbox (vlax-ename->vla-object d22) 'd2bp 'd2up)
  76.             (setq d2bp (safearray-value d2bp)
  77.                   d2up (safearray-value d2up)
  78.                   d2bp0 (car d2out_box)
  79.                   d2up0 (cadr d2out_box))
  80.             (if (and (and (< (car d2bp) (car d2bp0))
  81.                           (< (cadr d2bp) (cadr d2bp0)))
  82.                      (and (> (car d2up) (car d2up0))
  83.                           (> (cadr d2up) (cadr d2up0)))
  84.                 )
  85.               (setq d2outpl d22
  86.                     d2out_box (list d2bp d2up))
  87.             )
  88.           )
  89.         )
  90.         d2out_box
  91.         (setq i (+ i 1))
  92.         (command "line" d2bp d2up "")
  93.         (setq d2c1 d2bp d2c2 d2up)
  94.       );while d2 end
  95.     );progn
  96.   );if
  97.   (princ)
  98. );defun


18楼的程序经测试是可用且无问题的,可加入我的主程序时出错了,下面错误提示是发现这段(command "line" d2bp d2up "")里有许多坐标,CAD命令导致错误!
Command: ttt
Select objects: Specify opposite corner: 2 found
Select objects:  ; error: bad argument value: AutoCAD command: #<safearray...>


因为我的主程序里需要调用图层的坐标点,所以将18楼eachy斑竹的程序加入到我的程序里。
经测试,无限多个*pline,程序无法得到最外面的*pline(将所有选中的*pline的坐标全记录了),请eachy斑竹再帮我看看问题出在哪?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-5-2 13:01:48 | 显示全部楼层
已经给你说明了,不要一次把图层都写上,分开处理
(setq s1 (ssget '((8 . "D01A"))))
(setq box1 (getssoutpl s1))
(setq s2 (ssget '((8 . "D02A"))))
(setq box2 (getssoutpl s2))
(setq s3 (ssget '((8 . "D03A"))))
(setq box3 (ssget '((8 . "D04A"))))

...

你是得到所有线的box还是每个层一个box?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-2 13:20:50 | 显示全部楼层
可是在总图里,我只要一次框选就好了,你这样做我得选多少次呀?
下面图示是我想一次得到的各图层的坐标点
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-5-2 13:33:10 | 显示全部楼层
选择用 getpoint  和 getcorner 可以得到对角点,后面构造选择集就可以使用了,不是每次都选择
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-5-2 13:44:44 | 显示全部楼层
如果用 set 和 eval 下面的代码还可以简化很多,初学就用下面的可以了
求box的一定要用子函数,不要每个选择集处理都写一遍代码

  1. (defun c:tt (/           p1         p2    s1    s2           s3         s4    s5    s6
  2.              s7           s8         s9    s10   s11   s12         s13   box1  box2
  3.              box3  box4         box5  box6  box7  box8         box9  box10 box11
  4.              box12 box13
  5.             )
  6.   (if (and (setq p1 (getpoint "\n角点: "))
  7.            (setq p2 (getcorner p1 "\n对角点: "))
  8.       )
  9.     (progn
  10.       (setq s1        (ssget "w" p1 p2 '((8 . "D01A")))
  11.             s2        (ssget "w" p1 p2 '((8 . "D02A")))
  12.             s3        (ssget "w" p1 p2 '((8 . "D04A")))
  13.             s4        (ssget "w" p1 p2 '((8 . "D05A")))
  14.             s5        (ssget "w" p1 p2 '((8 . "D05B")))
  15.             s6        (ssget "w" p1 p2 '((8 . "S01A")))
  16.             s7        (ssget "w" p1 p2 '((8 . "S01B")))
  17.             s8        (ssget "w" p1 p2 '((8 . "S02A")))
  18.             s9        (ssget "w" p1 p2 '((8 . "P05A")))
  19.             s10        (ssget "w" p1 p2 '((8 . "P04A")))
  20.             s11        (ssget "w" p1 p2 '((8 . "P03B")))
  21.             s12        (ssget "w" p1 p2 '((8 . "P02A")))
  22.             s13        (ssget "w" p1 p2 '((8 . "P01B")))
  23.       )
  24.       (setq box1  (getssoutpl s1)
  25.             box2  (getssoutpl s2)
  26.             box3  (getssoutpl s3)
  27.             box4  (getssoutpl s4)
  28.             box5  (getssoutpl s5)
  29.             box6  (getssoutpl s6)
  30.             box7  (getssoutpl s7)
  31.             box8  (getssoutpl s8)
  32.             box9  (getssoutpl s9)
  33.             box10 (getssoutpl s10)
  34.             box11 (getssoutpl s11)
  35.             box12 (getssoutpl s12)
  36.             box13 (getssoutpl s13)
  37.       )
  38.     )
  39.   )
  40. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-2 17:44:32 | 显示全部楼层
楼上的程序运行提示如下错误(有加载vl-load-com):
Command: tt
角点:
对角点: ; error: no function definition: GETSSOUTPL

又回到原话题了,需要用getpoint这个命令集了,5楼的程序就是基于getpoint建构的,因为总图里有太多的线重叠,如果用getpoint容易误选中点,所以才要改成用(ssget)来选择。
(23楼的贴图只是一个简单的图片,看5楼的flash就不难看出有多少线段在总图里了)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-5-2 18:04:23 | 显示全部楼层
getssoutpl 是18楼的函数,取点是为了构造选择集用的窗口,和线多少没关系。ssget 前先关闭 Osmode
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-3 01:05:00 | 显示全部楼层
哦,明白了一些了。。。

是不是这样写,可老出错,就是不知哪里出错,老提示; error: syntax error,可能还有其它问题,程序运行不下去了,最重要的一点是不知这样的写法对不对,无法调试,哎~

(defun getssoutpl (d1 d2 / i e outpl out_box bp up bp0 up0)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;start d1
  (setq i 0)
  (while (< i (sslength d1))
    (setq d11 (ssname d1 i))
    (vla-getboundingbox (vlax-ename->vla-object d11) 'd1bp 'd1up)
    (if (not d1outpl)
      (setq d1outpl d11
            d1out_box (list (safearray-value d1bp) (safearray-value d1up)))
      (progn
        (vla-getboundingbox (vlax-ename->vla-object d11) 'd1bp 'd1up)
        (setq d1bp (safearray-value d1bp)
              d1up (safearray-value d1up)
              d1bp0 (car d1out_box)
              d1up0 (cadr d1out_box))
        (if (and (and (< (car d1bp) (car d1bp0))
                      (< (cadr d1bp) (cadr d1bp0)))
                 (and (> (car d1up) (car d1up0))
                      (> (cadr d1up) (cadr d1up0)))
            )
          (setq d1outpl d11
                d1out_box (list d1bp d1up))
        )
      )
    )
    (setq i (+ i 1))
  );while d1 end
  d1out_box
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;start d2
  (setq i 0)
  (while (< i (sslength d2))
    (setq d22 (ssname d2 i))
    (vla-getboundingbox (vlax-ename->vla-object d22) 'd2bp 'd2up)
    (if (not d2outpl)
      (setq d2outpl d22
            d2out_box (list (safearray-value d2bp) (safearray-value d2up)))
      (progn
        (vla-getboundingbox (vlax-ename->vla-object d22) 'd2bp 'd2up)
        (setq d2bp (safearray-value d2bp)
              d2up (safearray-value d2up)
              d2bp0 (car d2out_box)
              d2up0 (cadr d2out_box))
        (if (and (and (< (car d2bp) (car d2bp0))
                      (< (cadr d2bp) (cadr d2bp0)))
                 (and (> (car d2up) (car d2up0))
                      (> (cadr d2up) (cadr d2up0)))
            )
          (setq d2outpl d22
                d2out_box (list d2bp d2up))
        )
      )
    )
    (setq i (+ i 1))
  );while d2 end
  d2out_box
);defun

(defun c:tt (/           p1         p2    s1    s2           s3         s4    s5    s6
             s7           s8         s9    s10   s11   s12         s13   box1  box2
             box3  box4         box5  box6  box7  box8         box9  box10 box11
             box12 box13
            )
  (if (setq tk (entsel "\nPick TK: "))
    (progn
      (setq oldos (getvar "osmode"))
      (setvar "osmode" 0)
      (setvar "cmdecho" 0)
      (setq obj (vlax-ename->vla-object (car tk)))
      (vla-getboundingbox obj 'tk_bp 'tk_up);_ 求对角点
      (setq tk_bp (safearray-value tk_bp);_ 转换
            tk_up (safearray-value tk_up);_ 转换
      );_注意UCS
      (setq midp (polar tk_bp (angle tk_bp tk_up) (/ (distance tk_bp tk_up) 2))) ;_图框中心
      ;;测试 Box 是否在屏幕内,不在则缩放并记录最后恢复
      (command ".zoom" "o" tk "") ;_ 2005以上功能, 缩放实体至适合屏幕
      ;;(command ".zoom" "w" tk_bp tk_up);_
    (progn
      (setq d1        (ssget "w" tk_bp tk_up '((8 . "D01A")))
            d2        (ssget "w" tk_bp tk_up '((8 . "D02A")))
            d3        (ssget "w" tk_bp tk_up '((8 . "D03A")))
            d4        (ssget "w" tk_bp tk_up '((8 . "D04A")))
            d5        (ssget "w" tk_bp tk_up '((8 . "D05A")))
            d5B        (ssget "w" tk_bp tk_up '((8 . "D05B")))
            s1        (ssget "w" tk_bp tk_up '((8 . "S01A")))
            s1b        (ssget "w" tk_bp tk_up '((8 . "S01B")))
            s2        (ssget "w" tk_bp tk_up '((8 . "S02A")))
            p5        (ssget "w" tk_bp tk_up '((8 . "P05A")))
            p4        (ssget "w" tk_bp tk_up '((8 . "P04A")))
            p3        (ssget "w" tk_bp tk_up '((8 . "P03A")))
            p2        (ssget "w" tk_bp tk_up '((8 . "P02A")))
            p1        (ssget "w" tk_bp tk_up '((8 . "P01A")))
      )
      (setq box1  (getssoutpl d1)
            box2  (getssoutpl d2)
            box3  (getssoutpl d3)
            box4  (getssoutpl d4)
            box5  (getssoutpl d5)
            box6  (getssoutpl d5b)
            box7  (getssoutpl s1)
            box8  (getssoutpl s1b)
            box9  (getssoutpl s2)
            box10 (getssoutpl p5)
            box11 (getssoutpl p4)
            box12 (getssoutpl p3)
            box13 (getssoutpl p2)
            box13 (getssoutpl p1)
      (princ box1)
      )
    )
  )
)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-5-3 07:05:49 | 显示全部楼层
你的程序起码的括号都不匹配,getssoutpl 也不对,再仔细看看我写的

  1. (defun c:tt (/           p1         p2    s1    s2           s3         s4    s5    s6
  2.              s7           s8         s9    s10   s11   s12         s13   box1  box2
  3.              box3  box4         box5  box6  box7  box8         box9  box10 box11
  4.              box12 box13 oldos getssoutpl
  5.             )
  6.   (defun getssoutpl (ss / ssl e outpl out_box bp up bp0 up0)
  7.     (if        ss
  8.       (progn
  9.         (setq ssl (sslength ss))
  10.         (while (> ssl 0)
  11.           (setq e (ssname ss (setq ssl (1- ssl))))
  12.           (vla-getboundingbox (vlax-ename->vla-object e) 'bp 'up)
  13.           (if (not outpl)
  14.             (setq outpl          e
  15.                   out_box (list (safearray-value bp) (safearray-value up))
  16.             )
  17.             (progn
  18.               (vla-getboundingbox (vlax-ename->vla-object e) 'bp 'up)
  19.               (setq bp        (safearray-value bp)
  20.                     up        (safearray-value up)
  21.                     bp0        (car out_box)
  22.                     up0        (cadr out_box)
  23.               )
  24.               (if (and (and (< (car bp) (car bp0))
  25.                             (< (cadr bp) (cadr bp0))
  26.                        )
  27.                        (and (> (car up) (car up0))
  28.                             (> (cadr up) (cadr up0))
  29.                        )
  30.                   )
  31.                 (setq outpl   e
  32.                       out_box (list bp up)
  33.                 )
  34.               )
  35.             )
  36.           )
  37.         )
  38.       )
  39.     )
  40.     out_box
  41.   )
  42.   (if (setq tk (entsel "\nPick TK: "))
  43.     (progn
  44.       (setq oldos (getvar "osmode"))
  45.       (setvar "osmode" 0)
  46.       (setvar "cmdecho" 0)
  47.       (setq obj (vlax-ename->vla-object (car tk)))
  48.       (vla-getboundingbox obj 'tk_bp 'tk_up) ;_ 求对角点
  49.       (setq tk_bp (safearray-value tk_bp) ;_ 转换
  50.             tk_up (safearray-value tk_up) ;_ 转换
  51.       ) ;_注意UCS
  52.       (setq midp (polar        tk_bp
  53.                         (angle tk_bp tk_up)
  54.                         (/ (distance tk_bp tk_up) 2)
  55.                  )
  56.       ) ;_图框中心
  57.       ;;测试 Box 是否在屏幕内,不在则缩放并记录最后恢复
  58.       (command ".zoom" "o" tk "") ;_ 2005以上功能, 缩放实体至适合屏幕
  59.       (setq oldos (getvar "osmode"))
  60.       (setvar "osmode" 0)
  61.       (setvar "cmdecho" 0)
  62.       ;;(command ".zoom" "w" tk_bp tk_up);_
  63.       (setq d1        (ssget "w" tk_bp tk_up '((8 . "D01A")))
  64.             d2        (ssget "w" tk_bp tk_up '((8 . "D02A")))
  65.             d3        (ssget "w" tk_bp tk_up '((8 . "D03A")))
  66.             d4        (ssget "w" tk_bp tk_up '((8 . "D04A")))
  67.             d5        (ssget "w" tk_bp tk_up '((8 . "D05A")))
  68.             d5B        (ssget "w" tk_bp tk_up '((8 . "D05B")))
  69.             s1        (ssget "w" tk_bp tk_up '((8 . "S01A")))
  70.             s1b        (ssget "w" tk_bp tk_up '((8 . "S01B")))
  71.             s2        (ssget "w" tk_bp tk_up '((8 . "S02A")))
  72.             p5        (ssget "w" tk_bp tk_up '((8 . "P05A")))
  73.             p4        (ssget "w" tk_bp tk_up '((8 . "P04A")))
  74.             p3        (ssget "w" tk_bp tk_up '((8 . "P03A")))
  75.             p2        (ssget "w" tk_bp tk_up '((8 . "P02A")))
  76.             p1        (ssget "w" tk_bp tk_up '((8 . "P01A")))
  77.       )
  78.       (setq box1  (getssoutpl d1)
  79.             box2  (getssoutpl d2)
  80.             box3  (getssoutpl d3)
  81.             box4  (getssoutpl d4)
  82.             box5  (getssoutpl d5)
  83.             box6  (getssoutpl d5b)
  84.             box7  (getssoutpl s1)
  85.             box8  (getssoutpl s1b)
  86.             box9  (getssoutpl s2)
  87.             box10 (getssoutpl p5)
  88.             box11 (getssoutpl p4)
  89.             box12 (getssoutpl p3)
  90.             box13 (getssoutpl p2)
  91.             box13 (getssoutpl p1)
  92.       )
  93.       ;;测试对角点
  94.       (mapcar '(lambda (a)
  95.                  (if a
  96.                    (command ".line" (car a) (cadr a))
  97.                  )
  98.                )
  99.               (list box1 box2 box3 box4        box5 box6 box7 box8 box9 box10
  100.                     box11 box12        box13)
  101.       )
  102.       ;;后面是你自己的处理程序
  103.       (setvar "osmode" oldos)
  104.     )
  105.   )
  106.   (princ)
  107. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-3 13:18:58 | 显示全部楼层
再给个思路
在单个box的基础上求选集ss的box
如: (getssbox ss)
(getssbox (ssget "c" p1 p2 '((8 . "P*A"))))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-28 04:00 , Processed in 0.203784 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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