如何用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
相关产品推荐
相关产品推荐

