乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 216|回复: 0

[编程交流] 在两条闭合多段线之间创建边界

[复制链接]

107

主题

615

帖子

575

银币

中流砥柱

Rank: 25

铜币
521
发表于 2022-10-11 15:42:20 | 显示全部楼层 |阅读模式
你好。我正在寻找一个 lisp 代码来在 2 条重叠的闭合折线(如照片)之间创建边界。我知道我可以使用 bounady 命令,但有时绘图不是那么干净和简单(必须有孵化 ot 块等)。
我将此代码用于多边界,但会为选择中的所有区域创建边界。在示例中,您可以看到一条红色闭合折线和一条白色闭合折线。我想选择红色和白色的折线并在重叠区域创建绿色边界。      
  1. (defun c:test ( / *error* big ent enx idx int lst pt1 pt2 rtn sel spc tmp tot val var vtx )
  2.     (defun *error* ( msg )
  3.         (foreach obj rtn
  4.             (if (and (vlax-write-enabled-p obj) (not (vlax-erased-p obj)))
  5.                 (vla-delete obj)
  6.             )
  7.         )
  8.         (mapcar 'setvar var val)
  9.         (LM:endundo (LM:acdoc))
  10.         (if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
  11.             (princ (strcat "\nError: " msg))
  12.         )
  13.         (princ)
  14.     )
  15.     (LM:startundo (LM:acdoc))
  16.     (cond
  17.         (   (= 4 (logand 4 (cdr (assoc 70 (tblsearch "layer" (getvar 'clayer))))))
  18.             (princ "\nCurrent layer locked.")
  19.         )
  20.         (   (setq sel
  21.                 (LM:ssget "\nSelect Lines or Polylines: "
  22.                     (list
  23.                         (list
  24.                            '(-4 . "<OR")
  25.                                '(0 . "LINE")
  26.                                '(-4 . "<AND")
  27.                                    '(0 . "LWPOLYLINE")
  28.                                    '(-4 . "<NOT")
  29.                                        '(-4 . "<>")
  30.                                        '(42 . 0.0)
  31.                                    '(-4 . "NOT>")
  32.                                '(-4 . "AND>")
  33.                            '(-4 . "OR>")
  34.                             (if (= 1 (getvar 'cvport))
  35.                                 (cons 410 (getvar 'ctab))
  36.                                '(410 . "Model")
  37.                             )
  38.                         )
  39.                     )
  40.                 )
  41.             )
  42.             (setq spc
  43.                 (vlax-get-property (LM:acdoc)
  44.                     (if (= 1 (getvar 'cvport))
  45.                         'paperspace
  46.                         'modelspace
  47.                     )
  48.                 )
  49.             )
  50.             (repeat (setq idx (sslength sel))
  51.                 (if (= "LINE" (cdr (assoc 0 (setq enx (entget (ssname sel (setq idx (1- idx))))))))
  52.                     (setq lst (cons (list (cdr (assoc 10 enx)) (cdr (assoc 11 enx))) lst))
  53.                     (setq vtx (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) enx))
  54.                           vtx (mapcar 'list vtx (if (= 1 (logand 1 (cdr (assoc 70 enx)))) (cons (last vtx) vtx) (cdr vtx)))
  55.                           lst (append vtx lst)
  56.                     )
  57.                 )
  58.             )
  59.             (foreach pl1 lst
  60.                 (setq pt1 (car  pl1)
  61.                       pt2 (cadr pl1)
  62.                 )
  63.                 (foreach pl2 lst
  64.                     (if
  65.                         (and
  66.                             (not (equal pl1 pl2 1e-8))
  67.                             (setq int (inters pt1 pt2 (car pl2) (cadr pl2)))
  68.                             (not (vl-member-if '(lambda ( pnt ) (equal pnt int 1e-8)) pl1))
  69.                         )
  70.                         (setq pl1 (cons int pl1))
  71.                     )
  72.                 )
  73.                 (setq rtn
  74.                     (append
  75.                         (mapcar
  76.                             (function
  77.                                 (lambda ( a b )
  78.                                     (vla-addline spc
  79.                                         (vlax-3D-point a)
  80.                                         (vlax-3D-point b)
  81.                                     )
  82.                                 )
  83.                             )
  84.                             (setq pl1
  85.                                 (vl-sort pl1
  86.                                     (function
  87.                                         (lambda ( a b )
  88.                                             (< (distance pt1 a) (distance pt1 b))
  89.                                         )
  90.                                     )
  91.                                 )
  92.                             )
  93.                             (cdr pl1)
  94.                         )
  95.                         rtn
  96.                     )
  97.                 )
  98.             )
  99.             (setq var '(cmdecho peditaccept)
  100.                   val  (mapcar 'getvar var)
  101.                   tot  0.0
  102.             )
  103.             (mapcar 'setvar var '(0 1))
  104.             (foreach reg (vlax-invoke spc 'addregion rtn)
  105.                 (setq ent (entlast))
  106.                 (command "_.pedit" "_m")
  107.                 (apply 'command (mapcar 'vlax-vla-object->ename (vlax-invoke reg 'explode)))
  108.                 (command "" "_j" "" "")
  109.                 (if
  110.                     (and
  111.                         (not (eq ent (setq ent (entlast))))
  112.                         (= "LWPOLYLINE" (cdr (assoc 0 (entget ent))))
  113.                     )
  114.                     (progn
  115.                         (setq tmp (vlax-curve-getarea ent)
  116.                               tot (+ tot tmp)
  117.                         )
  118.                         (if (< (car big) tmp)
  119.                             (setq big (list tmp ent))
  120.                         )
  121.                     )
  122.                 )
  123.                 (vla-delete reg)
  124.             )
  125.             (if (equal (car big) (/ tot 2.0) 1e-3) ;; Gian Paolo Cattaneo
  126.                 (entdel (cadr big))
  127.             )
  128.             (foreach obj rtn (vla-delete obj))
  129.             (mapcar 'setvar var val)
  130.         )
  131.     )
  132.     (LM:endundo (LM:acdoc))
  133.     (princ)
  134. )
  135. ;; ssget  -  Lee Mac
  136. ;; A wrapper for the ssget function to permit the use of a custom selection prompt
  137. ;; msg - [str] selection prompt
  138. ;; arg - [lst] list of ssget arguments
  139. (defun LM:ssget ( msg arg / sel )
  140.     (princ msg)
  141.     (setvar 'nomutt 1)
  142.     (setq sel (vl-catch-all-apply 'ssget arg))
  143.     (setvar 'nomutt 0)
  144.     (if (not (vl-catch-all-error-p sel)) sel)
  145. )
  146. ;; Start Undo  -  Lee Mac
  147. ;; Opens an Undo Group.
  148. (defun LM:startundo ( doc )
  149.     (LM:endundo doc)
  150.     (vla-startundomark doc)
  151. )
  152. ;; End Undo  -  Lee Mac
  153. ;; Closes an Undo Group.
  154. (defun LM:endundo ( doc )
  155.     (while (= 8 (logand 8 (getvar 'undoctl)))
  156.         (vla-endundomark doc)
  157.     )
  158. )
  159. ;; Active Document  -  Lee Mac
  160. ;; Returns the VLA Active Document Object
  161. (defun LM:acdoc nil
  162.     (eval (list 'defun 'LM:acdoc 'nil (vla-get-activedocument (vlax-get-acad-object))))
  163.     (LM:acdoc)
  164. )
  165. (vl-load-com) (princ)

164226um1ernp5ccr5e1pr.jpeg
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-4 01:38 , Processed in 0.661386 second(s), 57 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表