明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6652|回复: 22

[已解答] 倾家荡产请哪位大师能搞个多边形合并让大家学习

[复制链接]
发表于 2014-2-15 11:18:36 | 显示全部楼层 |阅读模式
62明经币
本帖最后由 品茗新秀 于 2014-2-15 11:29 编辑

倾家荡产所有请哪位大师能搞个多边形合并让大家学习










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

最佳答案

查看完整内容

这里在论坛里找的,可以并集,差集,交集.
发表于 2014-2-15 11:18:37 | 显示全部楼层
这里在论坛里找的,可以并集,差集,交集.
  1. ;;复合线合并
  2. (defun c:yad_plcomb(/ dxf chgent os qa entold kg s1 s2 n ss1 ss2 ent)
  3.   (defun dxf(en val)
  4.     (if (/= (type en) 'list) (setq en (entget en)))
  5.     (cdr (assoc val en))
  6.   )
  7.   (defun chgent(ent n new / en)
  8.     (setq en (entget ent))
  9.     (if (assoc n en)
  10.       (setq en (subst (cons n new) (assoc n en) en))
  11.       (setq en (append en (list (cons n new))))
  12.     )
  13.     (entmod en)
  14.   )
  15.   (command "_.undo" "_be")
  16.   (setq os (getvar "osmode")
  17.         qa (getvar "qaflags")
  18.   )
  19.   (setvar "osmode" 0)
  20.   (setvar "cmdecho" 0)
  21.   (setq entold (entlast))
  22.   (initget "1 2 3")
  23.   (setq kg (getkword "\n选择合并方式[1 并集/2 差集/3 交集]:<1>"))
  24.   (if (not kg) (setq kg "1"))
  25.   (prompt "\n请选择复合线:")
  26.   (if (setq s1 (ssget '((0 . "LWPOLYLINE"))))
  27.     (progn
  28.       (if (= kg "2")
  29.         (progn
  30.           (prompt "\n请选择要减去的复合线:")
  31.           (setq s2 (ssget '((0 . "LWPOLYLINE"))))
  32.         )
  33.       )
  34.       (if (not (and (= kg "2") (not s2)))
  35.         (progn
  36.           (setq n -1 ss1 (ssadd))
  37.           (repeat (sslength s1)
  38.             (setq ent (ssname s1 (setq n (1+ n))))
  39.             (if (= (dxf ent 70) 0) (chgent ent 70 1))
  40.             (command "_.region" ent "")
  41.             (ssadd (entlast) ss1)
  42.           )
  43.         )
  44.       )
  45.       (if s2
  46.         (progn
  47.           (setq n -1 ss2 (ssadd))
  48.           (repeat (sslength s2)
  49.             (setq ent (ssname s2 (setq n (1+ n))))
  50.             (if (= (dxf ent 70) 0) (chgent ent 70 1))
  51.             (command "_.region" ent "")
  52.             (ssadd (entlast) ss2)
  53.           )
  54.         )
  55.       )
  56.       (if (= kg "2")
  57.         (if ss2 (command "_.subtract" ss1 "" ss2 ""))
  58.         (command (if (= kg "1") "_.union" "_.intersect") ss1 "")
  59.       )
  60.       (setq ent (entlast))
  61.       (if (and ent (= (dxf ent 0) "REGION") (not (equal ent entold)))
  62.         (progn
  63.           (command "_.explode" ent)
  64.           (setq ss1 (ssget "p"))
  65.           (if (= (dxf (ssname ss1 0) 0) "REGION")
  66.             (progn
  67.               (setvar "qaflags" 1)
  68.               (command "_.explode" ss1 "")
  69.               (setq ss1 (ssget "p"))
  70.             )
  71.           )
  72.           (setq n -1)
  73.           (while (setq ent (ssname ss1 (setq n (1+ n))))
  74.             (if (entget ent)
  75.               (command "_.pedit" ent "j" ss1 "" "")
  76.             )
  77.           )
  78.         )
  79.       )
  80.     )
  81.   )
  82.   (setvar "osmode" os)
  83.   (setvar "qaflags" qa)
  84.   (command "_.undo" "_e")
  85.   (princ)
  86. )
  87. (prompt "\n***复合线合并yad_plcomb***  YAD建筑")
  88. (princ)
回复

使用道具 举报

发表于 2014-2-15 13:14:16 | 显示全部楼层
本帖最后由 cable2004 于 2014-2-15 16:20 编辑

命令:merge
回复

使用道具 举报

发表于 2014-2-15 14:42:40 | 显示全部楼层
楼上的功能待完善啊,有些动作效果不理想
回复

使用道具 举报

发表于 2014-2-15 15:05:19 | 显示全部楼层
;;;;;边界轮廓线
;;最后转成pline线

(defun C:bjlk (/       *error* blk     obj     MinPt   MaxPt   hiden
              pt      pl      unnamed_block   isRus   tmp_blk adoc
              blks    lays    lay     oname   sel     csp     loc
              sc      ec      ret     DS      osm     iNSpT
             )

  (defun *error* (msg)
    (princ msg)
    (mapcar '(lambda (x) (vla-put-visible x :vlax-true)) hiden)
    (vla-endundomark adoc)
    (if (and tmp_blk
             (not (vlax-erased-p tmp_blk))
             (vlax-write-enabled-p tmp_blk)
        ) ;_ end of and
      (vla-erase tmp_blk)
    ) ;_ end of if
    (if osm
      (setvar "OSMODE" osm)
    ) ;_ end of if
    (foreach x loc (vla-put-lock x :vlax-true))
  ) ;_ end of defun
  (vl-load-com)
  (setvar "CMDECHO" 0)
  (setq osm (getvar "OSMODE"))
  (if (zerop (getvar "WORLDUCS"))
    (progn (vl-cmdf "_.UCS" "") (vl-cmdf "_.Plan" ""))
  ) ;_ end of if
  (setq isRus (= (getvar "SysCodePage") "ANSI_1251"))
  (setq adoc (vla-get-activedocument (vlax-get-acad-object))
        blks (vla-get-blocks adoc)
        lays (vla-get-layers adoc)
  ) ;_ end of setq
  (vla-startundomark adoc)
  (if isRus
    (princ "\n选择做一个轮廓的对象")
    (princ "\n选择做一个轮廓的对象")
  ) ;_ end of if
  (vlax-for lay lays
    (if (= (vla-get-lock lay) :vlax-true)
      (progn (vla-put-lock lay :vlax-false)
             (setq loc (cons lay loc))
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of vlax-for
  (if (setq sel (ssget))
    (progn
      (setq sel (ssnamex sel))
;;;    (setq iNSpT(apply 'mapcar (cons 'min
;;;     (mapcar 'cadr (apply 'append (mapcar '(lambda(x)(vl-remove-if-not 'listp x)) sel))))))
      (setq iNSpT '(0 0 0))
      (setq sel (mapcar 'vlax-ename->vla-object
                        (vl-remove-if 'listp (mapcar 'cadr sel))
                ) ;_ end of mapcar
      ) ;_ end of setq
      (setq csp (vla-objectidtoobject adoc (vla-get-ownerid (car sel))))
  ;;; (setq unnamed_block (vla-add (vla-get-blocks adoc)(vlax-3d-point '(0. 0. 0.)) "*U"))
      (setq unnamed_block
             (vla-add (vla-get-blocks adoc)
                      (vlax-3d-point inspt)
                      "*U"
             ) ;_ end of vla-add
      ) ;_ end of setq
      (foreach x sel
        (setq oname (strcase (vla-get-objectname x)))
        (cond ((member oname
                       '("ACDBVIEWPORT"
                         "ACDBATTRIBUTEDEFINITION"
                         "ACDBMTEXT"
                         "ACDBTEXT"
                        )
               ) ;_ end of member
               nil
              )
              ((= oname "ACDBBLOCKREFERENCE")
               (vla-insertblock
                 unnamed_block
                 (vla-get-insertionpoint x)
                 (vla-get-name x)
                 (vla-get-xscalefactor x)
                 (vla-get-yscalefactor x)
                 (vla-get-zscalefactor x)
                 (vla-get-rotation x)
               ) ;_ end of vla-InsertBlock
               (setq blk (cons x blk))
              )
              (t (setq obj (cons x obj)))
        ) ;_ end of cond
      ) ;_foreach
      (setq lay (vla-item lays (getvar "CLAYER")))
      (if (= (vla-get-lock lay) :vlax-true)
        (progn (vla-put-lock lay :vlax-false)
               (setq loc (cons lay loc))
        ) ;_ end of progn
      ) ;_ end of if
      (if obj
        (progn (vla-copyobjects
                 (vla-get-activedocument (vlax-get-acad-object))
                 (vlax-make-variant
                   (vlax-safearray-fill
                     (vlax-make-safearray
                       vlax-vbobject
                       (cons 0 (1- (length obj)))
                     ) ;_ end of vlax-make-safearray
                     obj
                   ) ;_ end of vlax-safearray-fill
                 ) ;_ end of vlax-make-variant
                 unnamed_block
               ) ;_ end of vla-copyobjects
        ) ;_ end of progn
      ) ;_ end of if
      (setq obj (append obj blk))
      (if obj
        (progn
          (setq tmp_blk (vla-insertblock
                          csp
                          (vlax-3d-point inspt)
                          (vla-get-name unnamed_block)
                          1.0
                          1.0
                          1.0
                          0.0
                        ) ;_ end of vla-insertblock
          ) ;_ end of setq
          (vla-getboundingbox tmp_blk 'MinPt 'MaxPt)
          (setq MinPt (vlax-safearray->list MinPt)
                MaxPt (vlax-safearray->list MaxPt)
                DS    (max (distance MinPt (list (car MinPt) (cadr MaxPt)))
                           (distance MinPt (list (car MaxPt) (cadr MinPt)))
                      ) ;_ end of max
                DS    (* 0.2 DS)                  ;1/5
                DS    (max DS 10)
                MinPt (mapcar '- MinPt (list DS DS))
                MaxPt (mapcar '+ MaxPt (list DS DS))
          ) ;_ end of setq
          (lib:Zoom2Lst (list MinPt MaxPt))
          (setq sset (ssget "_C" MinPt MaxPt))
          (if sset
            (progn
              (setvar "OSMODE" 0)
              (setq hiden (mapcar 'vlax-ename->vla-object
                                  (vl-remove-if
                                    'listp
                                    (mapcar 'cadr (ssnamex sset))
                                  ) ;_ end of vl-remove-if
                          ) ;_ end of mapcar
                    hiden (vl-remove tmp_blk hiden)
              ) ;_ end of setq
              (mapcar '(lambda (x) (vla-put-visible x :vlax-false))
                      hiden
              ) ;_ end of mapcar
              (setq pt (mapcar '+ MinPt (list (* 0.5 DS) (* 0.5 DS))))
              (vl-cmdf "_.RECTANG" (trans MinPt 0 1) (trans MaxPt 0 1))
              (setq pl (vlax-ename->vla-object (entlast)))
              (setq sc (entlast))
              (if
                (vl-catch-all-error-p
                  (vl-catch-all-apply
                    '(lambda ()
                       (vl-cmdf "_-BOUNDARY" (trans pt 0 1) "")
                       (while (> (getvar "CMDACTIVE") 0) (command ""))
                     ) ;_ end of lambda
                  ) ;_ end of VL-CATCH-ALL-APPLY
                ) ;_ end of VL-CATCH-ALL-ERROR-P
                 (if isRus
                   (princ "\n这不是构造的轮廓")
                   (princ "\n这不是构造的轮廓")
                 ) ;_ end of if
              ) ;_ end of if
              (setq ec sc)
              (while (setq ec (entnext ec))
                (setq ret (cons (vlax-ename->vla-object ec) ret))
                )
                (setq ret (vl-remove pl ret))
              (mapcar '(lambda (x) (vla-erase x) (vlax-release-object x))
                      (list pl tmp_blk)
              ) ;_ end of mapcar
              (setq pl nil
                    tmp_blk nil
              ) ;_ end of setq
              (setq
                ret (mapcar '(lambda (x / mipt)
                               (vla-getboundingbox x 'MiPt nil)
                               (setq MiPt (vlax-safearray->list MiPt))
                               (list MiPt x)
                             ) ;_ end of lambda
                            ret
                    ) ;_ end of mapcar
              ) ;_ end of setq
              (setq ret (vl-sort ret
                                 '(lambda (e1 e2)
                                    (< (distance MinPt (car e1))
                                       (distance MinPt (car e2))
                                    ) ;_ end of <
                                  ) ;_ end of lambda
                        ) ;_ end of vl-sort
              ) ;_ end of setq
              (setq pl  (nth 1 ret)
                    ret (vl-remove pl ret)
              ) ;_ end of setq
              (mapcar 'vla-erase (mapcar 'cadr ret))
              (mapcar '(lambda (x) (vla-put-visible x :vlax-true))
                      hiden
              ) ;_ end of mapcar
              (foreach x loc (vla-put-lock x :vlax-true))
              (if pl
                (progn
                  (initget "Yes No")
                  (if
                    (= (getkword (if isRus
                                   "\n删除对象? [Yes/No] <No> : "
                                   "\n删除对象? [Yes/No] <No> : "
                                 ) ;_ end of if
                       ) ;_ end of getkword
                       "Yes"
                    ) ;_ end of =
                     (mapcar '(lambda (x)
                                (if (vlax-write-enabled-p x)
                                  (vla-erase x)
                                ) ;_ end of if
                              ) ;_ end of lambda
                             obj
                     ) ;_ end of mapcar
                  ) ;_ end of if
                ) ;_ end of progn
                (if isRus
                  (princ "\n这不是构造的轮廓")
                  (princ "\n这不是构造的轮廓")
                ) ;_ end of if
              ) ;_ end of if
            ) ;_ end of progn
          ) ;_ end of if
        ) ;_ end of progn
      ) ;_ end of if
      (vl-catch-all-apply
        '(lambda ()
           (mapcar 'vlax-release-object
                   (list unnamed_block tmp_blk csp blks lays)
           ) ;_ end of mapcar
         ) ;_ end of lambda
      ) ;_ end of VL-CATCH-ALL-APPLY
    ) ;_ end of progn
  ) ;_if not
  (foreach x loc (vla-put-lock x :vlax-true))
  (setvar "OSMODE" osm)
  (vla-endundomark adoc)
  (vlax-release-object adoc)
  (princ)
) ;_ end of defun
;;; ========== HELPER FUNCTION ==========================================
(defun lib:IsPtInView (pt / VCTR Y_Len SSZ X_Pix Y_Pix X_Len Lc Uc)
  (setq pt (trans pt 0 1))
  (setq VCTR  (getvar "VIEWCTR")
        Y_Len (getvar "VIEWSIZE")
        SSZ   (getvar "SCREENSIZE")
        X_Pix (car SSZ)
        Y_Pix (cadr SSZ)
        X_Len (* (/ X_Pix Y_Pix) Y_Len)
        Lc    (polar VCTR (dtr 180.0) (* 0.5 X_Len))
        Uc    (polar Lc 0.0 X_Len)
        Lc    (polar Lc (dtr 270.0) (* 0.5 Y_Len))
        Uc    (polar Uc (dtr 90.0) (* 0.5 Y_Len))
  ) ;_ end of setq
  (if (and (> (car pt) (car Lc))
           (< (car pt) (car Uc))
           (> (cadr pt) (cadr Lc))
           (< (cadr pt) (cadr Uc))
      ) ;_ end of and
    t
    nil
  ) ;_ end of if
) ;_ end of defun

(defun DTR (a) (* pi (/ a 180.0)))

(defun lib:pt_extents (vlist / tmp)

  (setq
    tmp (mapcar
          '(lambda (x) (vl-remove-if 'null x))
          (mapcar
            '(lambda (what) (mapcar '(lambda (x) (nth what x)) vlist))
            '(0 1 2)
          ) ;_ end of mapcar
        ) ;_ end of mapcar
  ) ;_setq

  (list (mapcar '(lambda (x) (apply 'min x)) tmp)
        (mapcar '(lambda (x) (apply 'max x)) tmp)
  ) ;_ end of list
) ;_defun

(defun lib:Zoom2Lst (vlist / bl tr Lst OS)

  (setq Lst (lib:pt_extents vlist)
        bl  (car Lst)
        tr  (cadr Lst)
  ) ;_ end of setq
  (if (not (and (lib:IsPtInView bl) (lib:IsPtInView tr)))
    (progn (setq OS (getvar "OSMODE"))
           (setvar "OSMODE" 0)
           (command "_.Zoom"
                    "_Window"
                    (trans bl 0 1)
                    (trans tr 0 1)
                    "_.Zoom"
                    "0.95x"
           ) ;_ end of command
           (setvar "OSMODE" OS)
           t
    ) ;_ end of progn
    NIL
  ) ;_ end of if
) ;_ end of defun

点评

厉害!!!  发表于 2021-12-8 17:17
为什么不使用代码标签呢?[code=lisp]..........[/code]  发表于 2014-2-16 22:55
回复

使用道具 举报

发表于 2014-2-15 15:30:02 | 显示全部楼层
香田里浪人 发表于 2014-2-15 15:05
;;;;;边界轮廓线
;;最后转成pline线

太强大了,就是这个
回复

使用道具 举报

发表于 2014-2-15 16:25:02 | 显示全部楼层
这哪里需要做程序啊 cad自己就能干
自己研究下bpoly命令吧
在多边形外面随意画个矩形做边界 用bpoly命令点击矩形和多边形之间的范围 cad会自动创建多边形边界
回复

使用道具 举报

发表于 2014-2-15 23:24:28 来自手机 | 显示全部楼层
呵呵,bo直接搞定
回复

使用道具 举报

发表于 2014-2-15 23:52:58 | 显示全部楼层
  1. ;; 需要e派工具箱(XCAD)的支持:[url]http://yunpan.cn/QXQKsW9gAPmpF[/url];; 多边形合并
  2. (defun c:tt ()
  3.   (xyp-CMDLA0)
  4.   (if (setq ss (ssget '((0 . "LWPOLYLINE") (8 . "层10102"))))
  5.     (progn
  6.       (xyp-MkLaCo "层10102" 1)
  7.       (setq s0 (entlast)
  8.             lst        (xyp-Region-Bpoly ss)
  9.       )
  10.       (xyp-erase (list ss (car lst)))
  11.       (command "union" (cadr lst) "")
  12.       (xyp-ExplodeQf (entlast))
  13.       (xyp-ExplodeQf (xyp-SSelEntnext s0))
  14.       (xyp-PeditJoin (xyp-SSelEntnext s0) 0)
  15.     )
  16.   )
  17.   (xyp-CMDLA1)
  18. )

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2014-2-16 08:46:38 | 显示全部楼层
谢谢楼主的分享!太好用了!收藏备用。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 06:48 , Processed in 0.198656 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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