找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2774|回复: 6

[研讨] 关于重叠填充的合并问题

[复制链接]

已领礼包: 19个

财富等级: 恭喜发财

发表于 2016-9-26 14:38:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
有段搜集的代码,能合并填充

  1. ;; © Juan Villarreal 11.20.2011 ;;;; massoc (Jaysen Long) ;;;; Minor Modification by Jvillarreal ;;;; Extracts info from list by key ;; ;; Found @ http://www.theswamp.org/index.php?topic=40149.0(defun massoc (key alist / x nlist)
  2.   (foreach x alist
  3.     (if
  4.       (eq key (car x))
  5.        (setq nlist (cons x nlist))
  6.     )
  7.   )
  8.   (reverse nlist)
  9. )                                        ;defun
  10. (defun c:MergeHatch (/                hentinfo   ss              i
  11.                      ent        ent#           seedpt#    entinfo
  12.                      entinfo2        ent#           seedpt#    seedpts
  13.                      MergedHatchList
  14.                     )
  15.   (while (/= (cdr (assoc 0 hentinfo)) "HATCH")
  16.     (setq hentinfo (car (entsel "\nSelect Hatch Pattern to use:")))
  17.     (If        hentinfo
  18.       (setq hentinfo (entget hentinfo))
  19.       (princ "\nMissed. Try again.")
  20.     )
  21.   )
  22.   (while (not ss)
  23.     (princ "\nSelect hatch entities to merge:")
  24.     (setq ss (ssget '((0 . "HATCH"))))
  25.   )
  26.   (setq        MergedHatchList
  27.          (list (cons 0 "HATCH")
  28.                (cons 100 "AcDbEntity")
  29.                (assoc 8 hentinfo)
  30.                (cons 100 "AcDbHatch")
  31.                (assoc 10 hentinfo)
  32.                (assoc 210 hentinfo)
  33.                (assoc 2 hentinfo)
  34.                (assoc 70 hentinfo)
  35.                (assoc 71 hentinfo)
  36.                (cons 91 (sslength ss))
  37.          )
  38.         i -1
  39.         seedpt#        0
  40.         ent# 0
  41.   )
  42.   (repeat (sslength ss)
  43.     (setq n                  -1
  44.           entinfo          (entget (ssname ss (setq i (1+ i))))
  45.           entinfo2          (member (assoc 92 entinfo) entinfo)
  46.           entinfo2          (reverse
  47.                             (cdr (member (assoc 75 entinfo2) (reverse entinfo2)))
  48.                           )
  49.           ent#                  (+ ent# (cdr (assoc 91 entinfo)))
  50.           seedpt#          (+ seedpt# (cdr (assoc 98 entinfo)))
  51.           seedpts          (append seedpts (cdr (member (assoc 98 entinfo) entinfo)))
  52.           MergedHatchList (append MergedHatchList entinfo2)
  53.     )
  54.     (entdel (ssname ss i))
  55.   )
  56.   (setq        MergedHatchList        (subst (cons 91 ent#)
  57.                                (assoc 91 MergedHatchList)
  58.                                MergedHatchList
  59.                         )
  60.         MergedHatchList
  61.                         (append
  62.                           MergedHatchList
  63.                           (append
  64.                             (reverse
  65.                               (cdr (member (assoc 98 hentinfo)
  66.                                            (reverse (member (assoc 75 hentinfo) hentinfo))
  67.                                    )
  68.                               )
  69.                             )
  70.                             (cons (cons 98 seedpt#) seedpts)
  71.                           )
  72.                         )
  73.   )
  74.   (if (= (cdr (assoc 71 hentinfo)) 1)
  75.     (setq MergedHatchList
  76.            (append MergedHatchList
  77.                    '((-3 ("ACAD" (1010 0.0 0.0 0.0))))
  78.            )
  79.     )
  80.   )
  81.   (entmake MergedHatchList)
  82.   (setq ent (entlast))
  83.   (if (= (cdr (assoc 71 hentinfo)) 1)
  84.     (mapcar
  85.       '(lambda (x / entlist)
  86.          (setq entlist (entget (cdr x)))
  87.          (entmod (subst (cons 330 ent) (assoc 330 entlist) entlist))
  88.        )
  89.       (massoc 330 MergedHatchList)
  90.     )
  91.   )
  92. )
  93. (defun c:MH () (c:MergeHatch))


上面代码能完成合并,但是有个问题,如图:

关于重叠填充的合并问题

关于重叠填充的合并问题


这个不太符合我们的要求,我们期望合并后应该是这样的:


关于重叠填充的合并问题

关于重叠填充的合并问题


如果用AUTOLISP或者VLISP如何实现呢?

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

已领礼包: 6489个

财富等级: 富甲天下

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-9-26 16:59:51 | 显示全部楼层
思路:
1、求出重叠的边界
2、边界多段线求并生成最外的边界
3、添加LOOP到填充里面,或用这个边界新建个填充。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1304个

财富等级: 财源广进

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

使用道具 举报

已领礼包: 2226个

财富等级: 金玉满堂

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2016-9-27 17:09:18 | 显示全部楼层
用VLISP简单写了个

  1. (defun c:tt (/ acad acdoc arr bndl e1 e2 ents i lp ms obj x)
  2.   (defun _setmark ()
  3.     (setq mark (entlast))
  4.   )
  5.   (defun _getnewentities (/ ents)
  6.     (while (setq mark (entnext mark))
  7.       (setq ents (cons (vlax-ename->vla-object mark) ents))
  8.     )
  9.     (setq arr (vlax-make-safearray
  10.     vlax-vbobject
  11.     (cons 0
  12.           (1-
  13.       (length ents)
  14.           )
  15.     )
  16.         )
  17.     )
  18.     (vlax-safearray-fill arr ents)
  19.     arr
  20.   )
  21.   (defun _getbound (obj)
  22.     (vla-getloopat obj 0 'lp)
  23.     (if  (vl-catch-all-error-p
  24.     (setq  bndl (vl-catch-all-apply
  25.            'vlax-safearray->list
  26.            (list lp)
  27.          )
  28.     )
  29.   )
  30.       (progn
  31.   (_setmark)
  32.   (command "_-HATCHEDIT"
  33.      (vlax-vla-object->ename obj)
  34.      "_B"
  35.      "_P"
  36.      "_Y"
  37.   )
  38.   (_getnewentities)
  39.       )
  40.       lp
  41.     )
  42.   )
  43.   (defun _addregion (obj)
  44.     (setq objs (_getbound obj))
  45.     (vla-addregion ms objs)
  46.     (mapcar
  47.       '(lambda (x)
  48.    (vla-delete x)
  49.        )
  50.       (vlax-safearray->list objs)
  51.     )
  52.     (vlax-ename->vla-object (entlast))
  53.   )
  54.   (if (and
  55.   (setq e1 (xd::ssget "\n选取第一个填充<退出>"
  56.           '(":E:S" ((0 . "HATCH")))
  57.      )
  58.   )
  59.   (setq o1 (vlax-ename->vla-object (ssname e1 0)))
  60.   (setq e2 (xd::ssget "\n选取第二个填充<退出>"
  61.           '(":E:S" ((0 . "HATCH")))
  62.      )
  63.   )
  64.   (setq o2 (vlax-ename->vla-object (ssname e2 0)))
  65.       )
  66.     (progn
  67.       (setq acad  (vlax-get-acad-object)
  68.       acdoc (vla-get-activedocument acad)
  69.       ms    (vla-get-modelspace acdoc)
  70.       )
  71.       (setq r1 (_addregion o1)
  72.       r2 (_addregion o2)
  73.       )
  74.       (setq patterntype       (vlax-get-property o1 'patterntype)
  75.       patternname       (vlax-get-property o1 'patternname)
  76.       associativehatch (vlax-get-property o1 'associativehatch)
  77.       )
  78.       (if (not (vl-catch-all-error-p
  79.      (vl-catch-all-apply
  80.        'vlax-invoke
  81.        (list r1
  82.        'boolean
  83.        acunion
  84.        r2
  85.        )
  86.      )
  87.          )
  88.     )
  89.   (progn
  90.     (setq  patterntype   (vlax-get-property o1 'patterntype)
  91.     patternname   (vlax-get-property o1 'patternname)
  92.     associativehatch (vlax-get-property o1 'associativehatch)
  93.     )
  94.     (setq  hatobj (vla-addhatch
  95.        ms
  96.        patterntype
  97.        patternname
  98.        associativehatch
  99.            )
  100.     )
  101.     (vla-put-patternscale
  102.       hatobj
  103.       (vlax-get-property o1 'patternscale)
  104.     )
  105.     (vla-appendouterloop
  106.       hatobj
  107.       (vlax-make-variant
  108.         (vlax-safearray-fill
  109.     (vlax-make-safearray
  110.       vlax-vbobject
  111.       '
  112.        (0 . 0)
  113.     )
  114.     (list r1)
  115.         )
  116.       )
  117.     )
  118.     (vla-evaluate hatobj)
  119.     (vla-delete o1)
  120.     (vla-delete o2)
  121.     (command "regen")
  122.   )
  123.       )
  124.     )
  125.   )
  126.   (princ)
  127. )


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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2016-9-27 17:17:50 | 显示全部楼层
好久不用VLISP写代码了,VLISP太累了,下面代码用XDRX API,顺手,完成同样的事。

  1. (defun c:XDTB_HatchUnion ( / c c1 c2 e1 e2 ss ss1 ss2)
  2.   (if (and
  3.   (setq e1 (car (xdrx_entsel "\n选取主色块<退出>:" '((0 . "HATCH")))))
  4.   (xdrx_pickset_redraw e1 3)
  5.   (setq e2 (car (xdrx_entsel "\n选取要合并的色块<退出>:" '((0 .
  6.                     "HATCH"
  7.                  )
  8.            )
  9.           )
  10.      )
  11.   )
  12.   (not (eq e1 e2))
  13.       )
  14.     (progn
  15.       (XD::Begin)
  16.       (if (xdrx_entity_boundingBoxIntersectwith e1 e2)
  17.   (progn
  18.     (setq ss1 (xdrx_hatch_ExternalLoopMake e1)
  19.     c1 (ssname ss1 0)
  20.     ss2 (xdrx_hatch_ExternalLoopMake e2)
  21.     c2 (ssname ss2 0)
  22.     )
  23.     (if (setq ss (xdrx_curve_union c1 c2 0))
  24.       (progn
  25.         (setq c (xdrx_hatch_make ss))
  26.         (XD::HATCH:MATCHFROM c e1)
  27.         (xdrx_entity_delete e1 e2 c1 c2)
  28.         (prompt "\n成功合并了两个色块。")
  29.       )
  30.     )

  31.   )
  32.   (prompt "\n两个色块不相交,不能合并。")
  33.       )
  34.       (XD::End)
  35.     )
  36.   )
  37.   (princ)
  38. )

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-22 02:26 , Processed in 0.367374 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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