如何编写AutoCAD Lisp程序实现填充无交叉叠加放置
AutoCAD Lisp实现填充叠加无交叉的方案
效果示例:左侧为当前交叉混乱的填充效果,右侧为期望的叠加无交叉效果(后绘制填充覆盖先绘制填充的重叠区域,先绘制填充仅显示在后绘制填充下方)
核心逻辑
要解决多填充交叉混乱的问题,本质是让新填充的边界“裁剪”旧填充的重叠区域,同时保证新填充在视觉层级上处于上方,最终实现先绘制的填充仅显示在后绘制填充的外部区域。
具体实现步骤与代码思路
- 1. 获取用户选择的填充对象
用entsel函数让用户分别选中需要置顶的新填充和被覆盖的旧填充:(setq new-hatch (car (entsel "\n选择要放置在上方的填充: "))) (setq old-hatch (car (entsel "\n选择要被覆盖的填充: "))) - 2. 提取填充的边界与属性
通过VLA接口获取填充的边界(转换为面域用于布尔操作),同时保存旧填充的图案名称、比例、角度等属性,确保裁剪后的填充和原属性一致:; 处理旧填充属性与边界 (setq old-vla (vlax-ename->vla-object old-hatch)) (setq old-pattern (vlax-get old-vla 'PatternName)) (setq old-scale (vlax-get old-vla 'PatternScale)) (setq old-angle (vlax-get old-vla 'PatternAngle)) (setq old-boundary (vlax-get old-vla 'Boundary)) (setq old-region (car (vlax-invoke (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))) "AddRegion" old-boundary))) ; 处理新填充边界 (setq new-vla (vlax-ename->vla-object new-hatch)) (setq new-boundary (vlax-get new-vla 'Boundary)) (setq new-region (car (vlax-invoke (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))) "AddRegion" new-boundary))) - 3. 布尔差集裁剪旧填充
对旧填充的面域和新填充的面域执行差集操作,得到旧填充减去重叠区域后的新边界,随后删除原旧填充,用新边界重新创建填充并还原属性:; 执行布尔差集:旧区域减去新区域,保留非重叠部分 (vlax-invoke old-region 'Boolean acSubtract new-region) ; 删除原旧填充与临时面域 (vla-delete old-vla) (vla-delete new-region) ; 创建裁剪后的新填充 (setq new-old-hatch (vla-AddHatch (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))) acUserDefined old-pattern :vlax-true)) (vla-AppendOuterLoop new-old-hatch old-region) (vla-put-PatternScale new-old-hatch old-scale) (vla-put-PatternAngle new-old-hatch old-angle) (vla-Evaluate new-old-hatch) - 4. 调整填充显示层级
将新填充置顶,确保视觉上处于最上层:(vla-SendToFront new-vla)
注意事项
- 填充的边界必须是闭合的多段线、面域或闭合曲线,否则布尔操作会报错。
- 若需要处理多个旧填充,可通过
ssget选择多个实体,循环执行上述裁剪逻辑。 - 操作前建议备份图纸,避免误操作导致数据丢失。
内容的提问来源于stack exchange,提问作者Edward Zotov
相关产品推荐
相关产品推荐

