乐筑天下

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

[编程交流] 在不同多边形中创建图案填充

[复制链接]

51

主题

481

帖子

457

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
262
发表于 2022-7-6 10:50:45 | 显示全部楼层
谢谢你的回复
我想用ADDHATCH
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:52:14 | 显示全部楼层
 
 
要使用ActiveX AddHatch方法完成此任务,需要一个形成闭合边界的边界对象,以便可以附加图案填充对象的外循环(使用AppendOuterLoop方法)。
 
要使用单个点获得这样的对象,需要一个函数来测试点是否位于对象内部。
 
这是一个经典问题(PIP),可以通过多种方式实现,最常见的是光线投射或通过计算物体的缠绕数。
 
最简单的方法是在内部使用Express Tools的函数acet geom point,尽管这确实会依赖于用户系统上Express Tools的可用性。
 
使用检测点是否位于多边形内的功能,可以检查图形中的每个闭合多边形,并收集指定点位于其中的多边形。从这个集合中,我们可以检索最接近该点的多边形,并对其进行相应的图案填充。
 
例如,考虑以下代码:
 
  1. (defun c:test ( / PointInside ss pt i e l hObj ) (vl-load-com)
  2. (defun PointInside ( pt ptlst )
  3.    (acet-geom-point-inside pt ptlst
  4.      ( (lambda ( m / d ) (foreach x ptlst (if (< m (setq d (distance pt x))) (setq m d))) m)
  5.        0.0
  6.      )
  7.    )
  8. )
  9. (if
  10.    (and
  11.      (setq ss (ssget "_X" '((0 . "LWPOLYLINE") (70 . 1))))
  12.      (setq pt (getpoint "\nPick Internal Point: "))
  13.    )
  14.    (progn
  15.      (setq i -1 pt (trans pt 1 0))
  16.      
  17.      (while (setq e (ssname ss (setq i (1+ i))))
  18.        (if
  19.          (PointInside pt
  20.            (mapcar
  21.              (function
  22.                (lambda ( p ) (trans (cdr p) e 0))
  23.              )
  24.              (vl-remove-if-not (function (lambda ( p ) (= 10 (car p)))) (entget e))
  25.            )
  26.          )
  27.          (setq l (cons e l))
  28.        )
  29.      )
  30.      (if
  31.        (setq e
  32.          (car
  33.            (vl-sort l
  34.              (function
  35.                (lambda ( a b )
  36.                  (<
  37.                    (distance pt (vlax-curve-getClosestPointto a pt))
  38.                    (distance pt (vlax-curve-getClosestPointto b pt))
  39.                  )
  40.                )
  41.              )
  42.            )
  43.          )
  44.        )
  45.        (progn
  46.          (setq hObj
  47.            (vla-AddHatch
  48.              (vlax-get-property
  49.                (vla-get-ActiveDocument (vlax-get-acad-object))
  50.                (if (= 1 (getvar 'CVPORT))
  51.                  'Paperspace
  52.                  'Modelspace
  53.                )
  54.              )
  55.              acHatchPatternTypePredefined "ANSI31" :vlax-true AcHatchObject
  56.            )
  57.          )
  58.          (vlax-invoke hObj 'AppendOuterLoop (list (vlax-ename->vla-object e)))
  59.          (vla-Evaluate hObj)
  60.        )
  61.      )
  62.    )
  63. )
  64. (princ)  
  65. )

 
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 00:17 , Processed in 0.621508 second(s), 54 queries .

© 2020-2025 乐筑天下

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