找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 750|回复: 5

[每日一码] 利用API的mpolygon动态填充练习

[复制链接]

已领礼包: 58个

财富等级: 招财进宝

发表于 2017-8-25 12:20:37 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 brainstorm 于 2017-8-25 14:44 编辑

利用Mpolygon进行动态填充,这个结合N版的非模式对话框填充工具就可以做出比较好用的填充工具了
N版的链接 http://bbs.xdcad.net/forum.php?m ... hlight=%CC%EE%B3%E4


dynamic hatch.gif


  1. ;;;-----------------------------------------------------------

  2. ;;;-----------------------------------------------------------

  3. (defun zgx-add-hatch-byloop
  4.        (mp bdlst patten scale / hch outer inner hch patten)
  5.   (xdrx_setmark)
  6.   (setq        outer (car bdlst)
  7.         outer (xdrx_polyline_make
  8.                 (xdrx_getpropertyvalue mp "MPolygonLoopAt" outer)
  9.               )
  10.   )
  11.   (setq hch (xdrx_hatch_make outer))  
  12.   (xdrx_hatch_setpattern
  13.     hch
  14.     patten
  15.   )
  16.   (xdrx_hatch_setscale
  17.     hch
  18.     scale
  19.   )
  20.   (if (and outer
  21.            (setq inner (cadr bdlst))
  22.       )
  23.     (foreach n inner
  24.       (xdrx_hatch_appendloop
  25.         hch
  26.         (xdrx_polyline_make
  27.           (xdrx_getpropertyvalue mp "MPolygonLoopAt" n)
  28.         )
  29.       )
  30.     )
  31.   )
  32.   (xdrx_getss)
  33. )


  34. ;;;-----------------------------------------------------------
  35. (defun zgx-get-boundary-loop (mp pt / outer inner)
  36.   (setq        outer
  37.          (car (xdrx_getpropertyvalue
  38.                 mp
  39.                 "IsPointInsideMPolygon"
  40.                 pt
  41.               )
  42.          )
  43.   )
  44.   (if (not (eq (type outer) 'list))
  45.     (progn
  46.       (setq inner (xdrx_getpropertyvalue
  47.                     mp
  48.                     "ChildLoops"
  49.                     outer
  50.                   )
  51.       )
  52. ;;;--移除孙子---------------------------------------------------
  53.       (setq inner
  54.              (vl-remove-if-not
  55.                '(lambda        (x)
  56.                   (eq outer (xdrx_getpropertyvalue mp "parentloop" x))
  57.                 )
  58.                inner
  59.              )
  60.       )
  61.       (list outer inner)
  62.     )
  63.   )
  64. )
  65. ;;;-------------------------------------------------------------
  66. ;;;-------------------------------------------------------------

  67. (defun c:tt1 (/ mp bdlst tmpss oldtmpss pos curposoldtmpss *error*)
  68.   (defun *error* (msg)
  69.     (xdrx_pointmonitor)
  70.     (xdrx_entity_delete tmpss)
  71.     (xdrx_entity_delete mp)
  72.   )
  73.   (prompt "\nselect curves")
  74.   (setq mp (xdrx_mpolygon_make (ssget)))


  75.   (defun #addhatch (p)
  76.     (setq curpos (xdrx_getpropertyvalue mp "ispointinsidempolygon" p))
  77.     (if        (and (not (equal pos curpos))
  78.              curpos
  79.         )
  80.       (progn
  81.         (if oldtmpss
  82.           (xdrx_entity_delete oldtmpss)
  83.         )
  84.         (setq
  85.           bdlst
  86.            (zgx-get-boundary-loop mp p)
  87.         )
  88.         (if bdlst
  89.           (setq tmpss (ZGX-ADD-HATCH-BYLOOP mp bdlst "grass" 500))
  90.         )
  91.         (setq oldtmpss tmpss)
  92.         (setq pos curpos)
  93.       )                                        ;progn      
  94.     )                                        ;if
  95.   )
  96.   (setq        pos t
  97.         curpos nil
  98.   )
  99.   (xdrx_pointmonitor "#addhatch")
  100.   (getpoint)
  101.   (xdrx_pointmonitor)
  102.   (xdrx_entity_delete mp)
  103. )



评分

参与人数 1D豆 +5 贡献 +1 收起 理由
newer + 5 + 1 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-8-25 12:27:47 | 显示全部楼层
很棒的代码,
建议:
1、增加忽略内部环选项
2、前后操作有重叠的填充,合并到一个。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 58个

财富等级: 招财进宝

 楼主| 发表于 2017-8-25 17:06:00 | 显示全部楼层
本帖最后由 brainstorm 于 2017-8-25 17:23 编辑

1、增加忽略内部环选项
这个不执行 xdrx_hatch_appendloop 就行了
2、前后操作有重叠的填充,合并到一个。
这个是啥意思?

结合论坛另一个帖子,这种方法更全面一些,链接http://bbs.xdcad.net/forum.php?m ... hlight=%CD%D8%C6%CB

dynammic hatch1.gif

;;;-----------------------------------------------------------

(defun zgx-add-hatch-byloop
       (mp bdlst patten scale / hch outer inner hch patten)
  (xdrx_setmark)
  (setq        outer (car bdlst)
        outer (xdrx_polyline_make
                (xdrx_getpropertyvalue mp "MPolygonLoopAt" outer)
              )
  )
  (setq hch (xdrx_hatch_make outer))
  (xdrx_hatch_setpattern
    hch
    patten
  )
  (xdrx_hatch_setscale
    hch
    scale
  )
  (if (and outer
           (setq inner (cadr bdlst))
      )
    (foreach n inner
      (xdrx_hatch_appendloop
        hch
        (xdrx_polyline_make
          (xdrx_getpropertyvalue mp "MPolygonLoopAt" n)
        )
      )
    )
  )
  (xdrx_getss)
)


;;;-----------------------------------------------------------
(defun zgx-get-boundary-loop (mp pt / outer inner)
  (setq        outer
         (car (xdrx_getpropertyvalue
                mp
                "IsPointInsideMPolygon"
                pt
              )
         )
  )
  (if (not (eq (type outer) 'list))
    (progn
      (setq inner (xdrx_getpropertyvalue
                    mp
                    "ChildLoops"
                    outer
                  )
      )
;;;--移除孙子---------------------------------------------------
      (setq inner
             (vl-remove-if-not
               '(lambda        (x)
                  (eq outer (xdrx_getpropertyvalue mp "parentloop" x))
                )
               inner
             )
      )
      (list outer inner)
    )
  )
)
;;;-------------------------------------------------------------
;;;-------------------------------------------------------------

(defun c:tt1 (/        mp bdlst tmpss pos curposoldtmpss *error* oldtmpss)
  (defun *error* (msg)
    (xdrx_pointmonitor)
    (xdrx_entity_delete mp tmpss)
  )
  (prompt "\nselect curves")
  (setq ss (ssget '((0 . "*line,arc,ellipse,circle"))))
  (setq ss0 (xdrx_entity_copy ss))
  (setq ss (xdrx_curve_intersectbreak ss))
  ;;所有曲线交点打断
  (setq ss (xdrx_region_make ss))
  ;;生成region
  (setq ss (xdrx_region->curve ss))
  ;;region转出曲线(保持原来边界类型)
                                        ;(setq bd (xdrx_getss))

  (setq mp (xdrx_mpolygon_make ss))
  (xdrx_entity_delete ss)

  (defun #addhatch (p)
    (setq curpos (xdrx_getpropertyvalue mp "ispointinsidempolygon" p))
    (if        (and (not (equal pos curpos))
             curpos
        )
      (progn
        (if oldtmpss
          (xdrx_entity_delete oldtmpss)
        )
        (setq
          bdlst
           (zgx-get-boundary-loop mp p)
        )
        (if bdlst
          (setq tmpss (ZGX-ADD-HATCH-BYLOOP mp bdlst "grass" 200))
        )
        (setq oldtmpss tmpss)
      )                                        ;progn      
    )                                        ;if
  )
  (setq        pos t
        curpos nil
  )
  (setq loop t)
  (while loop
    (xdrx_pointmonitor "#addhatch")
    (setq pt (getpoint))
    (xdrx_pointmonitor)
    (if        (not pt)
      (progn
        (setq loop nil)
        (if oldtmpss
          (xdrx_entity_delete oldtmpss)
        )
      )
    )
    (setq pos t
          curpos nil
    )
    (xdrx_setsstodb tmpss 0)
    (while (setq e (xdrx_getentdata 0))
      (xdrx_setenttodb e)
      (if (wcmatch (xdrx_getentdxf 0) "*LINE")
        (xdrx_entity_delete e)
      )
    )
    (setq oldtmpss nil)
  )


  (xdrx_entity_delete mp)
  (xdrx_setsstodb tmpss 0)
  (while (setq e (xdrx_getentdata 0))
    (xdrx_setenttodb e)
    (if        (wcmatch (xdrx_getentdxf 0) "*LINE")
      (xdrx_entity_delete e)
    )
  )
)



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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-8-25 17:25:27 | 显示全部楼层
本帖最后由 newer 于 2017-8-25 17:33 编辑

合并的意思如下图,
红色的是先点选画的填充,
在点选画黄的填充时候, 结果把黄色和红色的合并到一起。这样保证填充最大(如果没特殊要求时候)
这样的好处是,可以通过细小的边界合并出复杂的大的边界的填充。
或者说,对话框给个合并临近的开关。

比如下面的图,我想画个黄色加上红色区域的填充,还不想临时隐藏中间的直线边界,如果用点选的画是 直接画不出的,要点两个边界,画两个填充。

搜狗截图20170825172130.png

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

使用道具 举报

已领礼包: 58个

财富等级: 招财进宝

 楼主| 发表于 2017-8-25 20:33:15 | 显示全部楼层

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

使用道具 举报

已领礼包: 1304个

财富等级: 财源广进

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 00:49 , Processed in 0.215523 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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