Python操作AutoCAD的Draw类如何为所有方法自动设置LAYER等公共属性
AutoCAD Python 绘图类重复代码优化方案
核心优化思路是把重复的参数声明、属性赋值逻辑抽离到公共层,后续新增绘制方法只需要实现图形创建的核心逻辑即可。
优化步骤
- 提取公共配置到初始化方法:把
LAYER、LINETYPE_SCALE作为类实例的默认属性,实例化时可以统一配置全局默认值,不需要每个方法都重复定义默认参数,同时也支持单个方法调用时临时覆盖默认值。 - 抽取公共属性赋值方法:单独写一个私有方法统一处理所有图形对象的图层、线型比例赋值,后续如果要新增其他公共属性设置(比如颜色、线宽),只需要修改这一个方法即可,不需要调整所有绘制方法。
- 修正类方法定义:原有方法缺少实例参数
self,调整为标准实例方法格式。
优化后代码
import pythoncom import win32com.client from pyautocad import aDouble, APoint class Draw: def __init__(self, default_layer=0, default_linetype_scale=1): # 全局默认配置,实例化时可自定义 self.default_layer = default_layer self.default_linetype_scale = default_linetype_scale # 初始化AutoCAD连接 self.acad = win32com.client.Dispatch("AutoCAD.Application", dynamic=True) self.acad.Visible = True def _set_entity_properties(self, entity, layer=None, linetype_scale=None): # 公共属性设置方法,所有绘制方法创建完对象后统一调用 entity.Layer = layer if layer is not None else self.default_layer entity.LinetypeScale = linetype_scale if linetype_scale is not None else self.default_linetype_scale # 后续新增公共属性直接在这里加即可 return entity def Rectangle(self, X, Y, WIDTH, HEIGHT, layer=None, linetype_scale=None): rectangle = self.acad.model.AddLightWeightPolyline(aDouble( X, Y, X, Y + HEIGHT, X + WIDTH, Y + HEIGHT, X + WIDTH, Y, X, Y )) return self._set_entity_properties(rectangle, layer, linetype_scale) def Square(self, X, Y, WIDTH, layer=None, linetype_scale=None): square = self.acad.model.AddLightWeightPolyline(aDouble( X, Y, X, Y + WIDTH, X + WIDTH, Y + WIDTH, X + WIDTH, Y, X, Y )) return self._set_entity_properties(square, layer, linetype_scale) def Circle(self, X, Y, RADIUS, layer=None, linetype_scale=None): circle = self.acad.model.AddCircle(APoint(X, Y), RADIUS) return self._set_entity_properties(circle, layer, linetype_scale) def Polyline(self, POINTS, layer=None, linetype_scale=None): polyline = self.acad.model.AddLightWeightPolyline(aDouble(POINTS)) return self._set_entity_properties(polyline, layer, linetype_scale)
使用示例
# 实例化时指定全局默认图层为2,线型比例为2 draw = Draw(default_layer=2, default_linetype_scale=2) # 用默认配置画矩形 draw.Rectangle(0,0,100,100) # 临时覆盖默认配置,单独把这个圆放到图层3,线型比例1.5 draw.Circle(200,200,50, layer=3, linetype_scale=1.5)
内容的提问来源于stack exchange,提问作者Klak031
相关产品推荐
相关产品推荐

