You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python通过win32com实现AutoCAD填充图案叠加显示

实现AutoCAD填充图案叠加显示的Python解决方案

我目前用Python结合win32com.client库给AutoCAD图纸添加填充图案,现有代码如下:

import win32com.client
import pythoncom

acad = win32com.client.Dispatch("AutoCAD.Application")
acadModel = acad.ActiveDocument.ModelSpace 

def APoint(x, y, z = 0):
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (x, y, z))

def ADouble(xyz):
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (xyz))

def variants(object):
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_DISPATCH, (object))

out_loop = [acadModel.AddPolyline(ADouble([0,0,0,1000,0,0,1000,1000,0,0,1000,0,0,0,0]))]

hatch = acadModel.AddHatch(0, "HEX", True)
hatch.PatternScale = 20
hatch.AppendOuterLoop(variants(out_loop))
hatch.Evaluate()

hatch = acadModel.AddHatch(0, "ANSI31", True)
hatch.PatternScale = 10
hatch.AppendOuterLoop(variants(out_loop))
hatch.Evaluate()

需求是实现填充图案叠加显示(效果类似手动炸开第一个填充再添加第二个的效果),不想借助Lisp/Autolisp,也考虑过WipeOut和SuperHatch方法,但不清楚代码实现方式。


解决方案

方法一:炸开第一个填充后叠加

完全复刻手动操作逻辑,对第一个填充执行炸开后再添加第二个填充:

import win32com.client
import pythoncom

acad = win32com.client.Dispatch("AutoCAD.Application")
acadModel = acad.ActiveDocument.ModelSpace 
doc = acad.ActiveDocument

def APoint(x, y, z = 0):
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (x, y, z))

def ADouble(xyz):
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (xyz))

def variants(object):
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_DISPATCH, (object))

# 创建边界多段线
out_loop = [acadModel.AddPolyline(ADouble([0,0,0,1000,0,0,1000,1000,0,0,1000,0,0,0,0]))]

# 创建第一个填充并炸开
hatch1 = acadModel.AddHatch(0, "HEX", True)
hatch1.PatternScale = 20
hatch1.AppendOuterLoop(variants(out_loop))
hatch1.Evaluate()
# 炸开填充,返回炸开后的图形对象集合
exploded_objs = hatch1.Explode()
# 可选:删除原始填充对象
hatch1.Delete()

# 创建第二个填充叠加在炸开的图案上
hatch2 = acadModel.AddHatch(0, "ANSI31", True)
hatch2.PatternScale = 10
hatch2.AppendOuterLoop(variants(out_loop))
hatch2.Evaluate()

方法二:使用WipeOut实现局部叠加

如果不想破坏原始填充,可以用WipeOut遮挡第一个填充的指定区域,再在遮挡层添加第二个填充:

import win32com.client
import pythoncom

acad = win32com.client.Dispatch("AutoCAD.Application")
acadModel = acad.ActiveDocument.ModelSpace 
doc = acad.ActiveDocument

def APoint(x, y, z = 0):
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (x, y, z))

def ADouble(xyz):
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (xyz))

def variants(object):
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_DISPATCH, (object))

# 创建边界多段线
out_loop = [acadModel.AddPolyline(ADouble([0,0,0,1000,0,0,1000,1000,0,0,1000,0,0,0,0]))]

# 创建第一个填充
hatch1 = acadModel.AddHatch(0, "HEX", True)
hatch1.PatternScale = 20
hatch1.AppendOuterLoop(variants(out_loop))
hatch1.Evaluate()

# 创建WipeOut对象覆盖需要叠加的区域(此处与边界范围一致,可按需调整)
wipeout = acadModel.AddWipeOut(variants(out_loop))
# 将WipeOut置于第一个填充上方,遮挡原始填充
wipeout.SendToBack()

# 创建第二个填充并置于最上层
hatch2 = acadModel.AddHatch(0, "ANSI31", True)
hatch2.PatternScale = 10
hatch2.AppendOuterLoop(variants(out_loop))
hatch2.Evaluate()
hatch2.BringToFront()

方法三:使用SuperHatch(基于块定义)

SuperHatch可将组合图案作为块插入实现叠加,需先定义包含双填充的临时块:

import win32com.client
import pythoncom

acad = win32com.client.Dispatch("AutoCAD.Application")
acadModel = acad.ActiveDocument.ModelSpace 
doc = acad.ActiveDocument

def APoint(x, y, z = 0):
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (x, y, z))

def ADouble(xyz):
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (xyz))

def variants(object):
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_DISPATCH, (object))

# 创建临时块,包含需要叠加的双填充图案
temp_block = doc.Blocks.Add(APoint(0,0,0), "TempHatchBlock")
# 在块内创建第一个填充
block_hatch1 = temp_block.AddHatch(0, "HEX", True)
block_hatch1.PatternScale = 20
block_hatch1.AppendOuterLoop(variants([temp_block.AddPolyline(ADouble([0,0,0,1000,0,0,1000,1000,0,0,1000,0,0,0,0]))]))
block_hatch1.Evaluate()
# 在块内创建第二个填充
block_hatch2 = temp_block.AddHatch(0, "ANSI31", True)
block_hatch2.PatternScale = 10
block_hatch2.AppendOuterLoop(variants([temp_block.AddPolyline(ADouble([0,0,0,1000,0,0,1000,1000,0,0,1000,0,0,0,0]))]))
block_hatch2.Evaluate()

# 通过SendCommand调用AutoCAD的SUPERHATCH命令插入块
doc.SendCommand("SUPERHATCH\nBLOCK\nTempHatchBlock\n\n\n\n")
# 可选:删除临时块
doc.Blocks.Item("TempHatchBlock").Delete()

内容的提问来源于stack exchange,提问作者Bobby Lith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 11:10:39