明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5246|回复: 11

面域求差集

  [复制链接]
发表于 2011-12-24 14:05:09 | 显示全部楼层 |阅读模式
  1. (defun c:mreg ()
  2.   (vl-load-com)
  3.   (setq  *Obj (vlax-get-acad-object)
  4.   *Doc (vla-get-activeDocument *Obj)
  5.   *MSp (vla-get-Modelspace *Doc)
  6.   )
  7.   (princ "\n选择生成面域的多段线: ")
  8.   (setq plss (ssget))
  9.   (setq  pli  0
  10.   dei  0
  11.   plcount  (sslength plss)
  12.   objs  nil
  13.   )
  14.   (repeat plcount
  15.     (setq ent (ssname plss pli))
  16.     (setq object (vlax-ename->vla-object ent))
  17.     (setq pb (vla-get-closed object))
  18.     (if  (= pb :vlax-true)
  19.       (setq objs (cons object objs))
  20.     )
  21.     (setq pli (1+ pli))
  22.   )
  23.   (setq  curves (vlax-make-safearray
  24.      vlax-vbobject
  25.      (eval '(cons 0 (1- plcount)))
  26.          )
  27.   )
  28.   (vlax-safearray-fill curves objs)
  29.   (setq regobjs (vla-addregion *Msp curves))
  30.   (repeat plcount
  31.     (setq obj (nth dei objs))
  32.     (vla-delete obj)
  33.     (setq dei (1+ dei))
  34.   )
  35.   (setq regobjs (vlax-safearray->list (vlax-variant-value regobjs)))
  36.   (setq  regobjs
  37.    (vl-sort
  38.      regobjs
  39.      '(lambda (s1 s2) (> (vla-get-area s1) (vla-get-area s2)))
  40.    )
  41.   )

  42. )
求出了面域的集合regobjs,如何求差集?
发表于 2023-3-15 14:18:09 | 显示全部楼层
这个有用,好好学习一下
发表于 2011-12-24 15:34:24 | 显示全部楼层
(vla-boolean obj1 acSubtraction obj2)
 楼主| 发表于 2011-12-24 16:13:05 | 显示全部楼层
谢谢!
发表于 2011-12-24 18:09:52 | 显示全部楼层
(vla-Boolean Object Operation Object2)
3DSolid 或 Region 对象之间的布尔运算 (并集、交集、差集)
acUnion : 执行并集运算
acIntersection : 执行交集运算
acSubtraction:  执行差集运算
 楼主| 发表于 2011-12-26 10:28:45 | 显示全部楼层
太感谢啦!
发表于 2012-7-15 01:21:33 | 显示全部楼层
obj2如果有很多图元怎么办
 楼主| 发表于 2012-7-21 10:36:54 | 显示全部楼层
本帖最后由 lilq_78 于 2012-7-21 10:38 编辑
  1. (defun c:mreg (/ reg_ss s0 sss count i obj_ss reg_count obj_ss reg_i reg_j kword reg_obj reg_obj1 reg_obj_area reg_obj_area1 new_obj_area)
  2.   (setq reg_ss (ssget))
  3.   (setq s0 (ssadd))
  4.   (setq sss (entlast))
  5.   (command "region" reg_ss "")
  6.   (while (setq sss (entnext sss))
  7.     (if        (not (member (cdr (assoc 0 (entget sss)))
  8.                      '("region")
  9.              )
  10.         )
  11.       (ssadd sss s0)
  12.     )
  13.   )
  14.   (setq        count  (sslength s0)
  15.         i      0
  16.         obj_ss nil
  17.   )
  18.   (while (> count i)
  19.     (setq ent (ssname s0 i))
  20.     (setq obj (vlax-ename->vla-object ent))
  21.     (setq obj_ss (cons obj obj_ss))
  22.     (setq i (1+ i))
  23.   )

  24.   (setq        reg_count (length obj_ss)
  25.         reg_i          1
  26.         reg_j          1
  27.   )
  28.   (setq        obj_ss
  29.          (vl-sort
  30.            obj_ss
  31.            '(lambda (s1 s2)
  32.               (> (vla-get-area s1)
  33.                  (vla-get-area s2)
  34.               )
  35.             )
  36.          )
  37.   )
  38.   (while (< reg_i reg_count)
  39.     (setq reg_obj (nth (- reg_i 1) obj_ss))
  40.     (setq reg_obj_area (vla-get-area reg_obj))
  41.     (while (< reg_j reg_count)
  42.       (setq reg_obj1 (nth reg_j obj_ss))
  43.       (setq reg_obj_area1 (vla-get-area reg_obj1))
  44.       (command "undo" "m")
  45.       (vla-boolean reg_obj acunion reg_obj1)
  46.       (setq new_obj_area (vla-get-area reg_obj))
  47.       (command "undo" "b")
  48.       (if (= new_obj_area reg_obj_area)
  49.         (progn
  50.           (vla-boolean reg_obj acSubtraction reg_obj1)
  51.           (setq obj_ss (vl-remove reg_obj1 obj_ss))
  52.           (setq        obj_ss
  53.                  (vl-sort
  54.                    obj_ss
  55.                    '(lambda (s1 s2)
  56.                       (> (vla-get-area s1)
  57.                          (vla-get-area s2)
  58.                       )
  59.                     )
  60.                  )
  61.           )
  62.           (setq        reg_count (length obj_ss)
  63.                 reg_i          0
  64.           )
  65.           (setq reg_j reg_count)
  66.         )
  67.       )
  68.       (setq reg_j (1+ reg_j))
  69.     )
  70.     (setq reg_i (1+ reg_i))
  71.     (setq reg_j reg_i)
  72.   )
  73.   (setq
  74.     kword (strcase
  75.             (getstring "\n是否做成并集(Y/N): <N>")
  76.           )
  77.   )
  78.   (if (= kword nil)
  79.     (setq kword "N")
  80.   )
  81.   (setq union_reg 1)
  82.   (setq union_obj (nth 0 obj_ss))
  83.   (if (= kword "Y")
  84.     (progn
  85.       (while (< union_reg reg_count)
  86.         (setq union_obj1 (nth union_reg obj_ss))
  87.         (vla-boolean union_obj acunion union_obj1)
  88.         (setq union_reg (1+ union_reg))
  89.       )
  90.     )
  91.   )
  92. )


这是我修改后的程序,与各位共享。
发表于 2012-11-25 22:53:31 | 显示全部楼层
不能差集和交集
发表于 2012-11-25 22:59:17 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2012-11-25 22:59:53 | 显示全部楼层
要做到样在功能就好了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 10:17 , Processed in 0.196038 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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