SolidWorks API二次开发:Python实现工程图自动生成BOM球标
前言
在SolidWorks工程图设计中,BOM球标(零件序号)是装配图的重要组成部分,用于标识各个零部件的位置和序号。手动添加球标不仅耗时,而且容易出错。本文将介绍如何使用Python结合SolidWorks API,实现工程图中BOM球标的自动生成,提高设计效率。
技术准备
开发环境
- SolidWorks版本:2024(兼容其他版本)
- 编程语言:Python 3.7+
- 关键库:
win32com.client:COM组件交互pythoncom:Python COM支持
- 类型库导入:需要从SolidWorks生成对应的类型库文件(
sw2024_constant_type_library和sw2024_type_library)
SolidWorks API类型库生成
在使用前,需要通过SolidWorks API Type Library工具生成对应的Python类型库文件,以便获得代码提示和类型检查支持。
核心功能实现
1. 连接SolidWorks应用程序
defconnect_solidworks():"""连接到SolidWorks应用程序"""# 方式一:通过Dispatch获取swApp=win32com.client.Dispatch('SldWorks.Application')# 方式二:获取已打开的实例# swApp = win32com.client.GetActiveObject('SldWorks.Application')swApp.CommandInProgress=TrueswApp.Visible=TruereturnswApp2. 获取工程图文档和视图 2. 获取工程图文档和视图
defget_drawing_view(swApp):"""获取当前工程图的视图"""# 获取当前激活的工程图文档swDraw=swApp.ActiveDoc# 获取当前图纸swSheet=swDraw.GetCurrentSheet# 获取图纸上的视图(索引1为主视图)swView=swSheet.GetViews[1]returnswDraw,swView3. 配置BOM球标参数
BOM球标有多种样式和配置选项,通过IBalloonOptions接口可以灵活控制
defconfigure_balloon_params(swDraw):"""配置BOM球标参数"""params=swDraw.Extension.CreateBalloonOptions# 基础样式设置params.Style=constants.swBS_Underline# 下划线样式params.Size=constants.swBF_Tightest# 紧密配合大小# 文本内容设置params.UpperTextContent=constants.swBalloonTextCustomProperties# 数量显示设置params.ShowQuantity=Trueparams.QuantityPlacement=constants.swBalloonQuantityPlacement_Left params.QuantityDenotationText="PLACES"params.QuantityOverride=Trueparams.QuantityOverrideValue=""# 序号规则设置params.ItemNumberStart=1params.ItemNumberIncrement=1params.ItemOrder=constants.swBalloonItemNumbers_DoNotChangeItemNumbersreturnparams4. 计算球标位置
球标位置的准确定位是自动化的关键,需要通过模型到视图的坐标变换
defcalculate_balloon_position(swApp,vface,view):"""计算球标在视图中的位置"""# 获取面的包围盒box=vface.GetBox# 计算包围盒中心cx=(box[0]+box[3])/2cy=(box[1]+box[4])/2cz=(box[2]+box[5])/2# 创建模型空间点mathUtils=swApp.GetMathUtility mathPt=mathUtils.CreatePoint mathPt.ArrayData=win32com.client.VARIANT(pythoncom.VT_ARRAY|pythoncom.VT_R8,(cx,cy,cz))# 转换到视图空间transform=view.ModelToViewTransform newPt=mathPt.MultiplyTransform(transform)returnnewPt5. 插入球标的主流程
definsert_bom_balloons(swApp):"""插入BOM球标的主流程"""# 获取工程图和视图swDraw=swApp.ActiveDoc swSheet=swDraw.GetCurrentSheet swView=swSheet.GetViews[1]# 获取可见组件comps=swView.GetVisibleComponents# 配置球标参数params=configure_balloon_params(swDraw)# 遍历组件插入球标forcompincomps:# 获取组件的可见面faces=swView.GetVisibleEntities2(comp,constants.swViewEntityType_Face)iffacesandlen(faces)>0:# 选择第一个面entity=faces[0]selectData=swView.SelectionManager.CreateSelectData entity.Select4(False,selectData)# 插入球标note=swDraw.Extension.InsertBOMBalloon2(params)# 链接自定义属性note.PropertyLinkedText='$PRPVIEW:"公司名称"'# 设置球标位置position=calculate_balloon_position(swApp,entity,swView)annotation=note.GetAnnotation# 调整标注点和位置annotation.SetLeaderAttachmentPointAtIndex(0,position.ArrayData[0]+0.1,position.ArrayData[1]-0.1,0)annotation.SetPosition2(position.ArrayData[0],position.ArrayData[1],0)# 仅演示第一个组件break# 重建工程图swDraw.ForceRebuild3(False)swApp.CommandInProgress=False完整代码
importwin32com.clientimportpythoncomfromsw2024_constant_type_libraryimportconstantsfromsw2024_type_libraryimport(ISldWorks,IDrawingDoc,ISelectionMgr,IView,IFace2,IComponent2,IBalloonOptions,ISelectData,IEntity,IMathPoint,IMathUtility,IMathTransform,IAnnotation)defmain():""" 在SolidWorks工程图中为可见组件插入零件序号(BOM球标) """# 获取SolidWorks应用程序对象swApp:ISldWorks=win32com.client.Dispatch('SldWorks.Application')# 设置SolidWorks可见并阻止用户操作swApp.CommandInProgress=TrueswApp.Visible=True# 获取当前激活的工程图文档swDraw:IDrawingDoc=swApp.ActiveDoc# 获取选择管理器swSelMgr:ISelectionMgr=swDraw.SelectionManager# 获取当前图纸swSheet=swDraw.GetCurrentSheet# 获取图纸上的视图(索引1通常为主视图)swView:IView=swSheet.GetViews[1]# 获取视图中可见的组件列表vComps:IComponent2=swView.GetVisibleComponents# 创建BOM球标参数对象swBomBalloonParams:IBalloonOptions=swDraw.Extension.CreateBalloonOptions# === 配置BOM球标样式参数 ===# 设置球标样式为下划线swBomBalloonParams.Style=constants.swBS_Underline# 设置球标大小为紧密配合swBomBalloonParams.Size=constants.swBF_Tightest# 设置上部文本内容类型为自定义属性swBomBalloonParams.UpperTextContent=constants.swBalloonTextCustomProperties# 显示数量swBomBalloonParams.ShowQuantity=True# 数量位置在左侧swBomBalloonParams.QuantityPlacement=constants.swBalloonQuantityPlacement_Left# 数量标识符号swBomBalloonParams.QuantityDenotationText="PLACES"# 覆盖默认数量swBomBalloonParams.QuantityOverride=True# 自定义数量值(空字符串表示使用实际数量)swBomBalloonParams.QuantityOverrideValue=""# 序号起始值swBomBalloonParams.ItemNumberStart=1# 序号增量swBomBalloonParams.ItemNumberIncrement=1# 序号排序规则 - 不改变现有序号swBomBalloonParams.ItemOrder=constants.swBalloonItemNumbers_DoNotChangeItemNumbers# 遍历每个可见组件,插入球标forcompinvComps:# 获取视图中该组件的可见面vfaces:IFace2=swView.GetVisibleEntities2(comp,constants.swViewEntityType_Face)# 获取第一个面作为选择对象swEnt:IEntity=vfaces[0]# 创建选择数据对象swSelData:ISelectData=swSelMgr.CreateSelectData# 选择该面swEnt.Select4(False,swSelData)# 插入BOM球标swNote=swDraw.Extension.InsertBOMBalloon2(swBomBalloonParams)# 链接自定义属性到球标文本(显示公司名称)swNote.PropertyLinkedText='$PRPVIEW:"公司名称" $PRPVIEW:"公司名称"'# 获取注释swAnn:IAnnotation=swNote.GetAnnotation# 计算注释位置newPt=calculate_balloon_position(swApp,swEnt,swView)# 注释文字位置swAnn.SetLeaderAttachmentPointAtIndex(0,newPt.ArrayData[0]+0.1,newPt.ArrayData[1]-0.1,0)# 指引点位置swAnn.SetPosition2(newPt.ArrayData[0],newPt.ArrayData[1],0)# 仅处理第一个组件(演示用)break# 强制重建工程图以显示更新swDraw.ForceRebuild3(False)# 恢复用户操作权限swApp.CommandInProgress=Falsedefcalculate_balloon_position(swApp:ISldWorks,vface:IFace2,view:IView)->IMathPoint:""" 计算球标在视图中的位置 参数: swApp: SolidWorks应用程序对象 vface: 要计算位置的面 view: 当前视图 返回: 视图中球标位置的数学点 """# 获取面的包围盒BoxFeatureArray=vface.GetBox# 计算包围盒中心点 (模型坐标系)cx=(BoxFeatureArray[0]+BoxFeatureArray[3])/2cy=(BoxFeatureArray[1]+BoxFeatureArray[4])/2cz=(BoxFeatureArray[2]+BoxFeatureArray[5])/2# 获取数学工具swMathUtils:IMathUtility=swApp.GetMathUtility# 创建模型空间中的点swMathPt:IMathPoint=swMathUtils.CreatePoint# 设置点的坐标swMathPt.ArrayData=win32com.client.VARIANT(pythoncom.VT_ARRAY|pythoncom.VT_R8,(cx,cy,cz))# 获取模型到视图的变换矩阵swTransform:IMathTransform=view.ModelToViewTransform# 将点从模型空间转换到视图空间newPt=swMathPt.MultiplyTransform(swTransform)returnnewPtif__name__=='__main__':main()关键API详解
BOM球标参数配置
| 参数 | 枚举值 | 说明 |
|---|---|---|
| Style | swBS_Underline | 球标样式(圆形、下划线、分割等) |
| Size | swBF_Tightest | 球标大小(紧密、宽松等) |
| UpperTextContent | swBalloonTextCustomProperties | 上部文本内容类型 |
| QuantityPlacement | swBalloonQuantityPlacement_Left | 数量显示位置 |
坐标系转换
在SolidWorks中,坐标转换是常见需求:
模型坐标系:三维空间坐标
视图坐标系:二维平面坐标
图纸坐标系:工程图纸坐标
通过ModelToViewTransform矩阵可以实现模型坐标到视图坐标的转换。
常见问题与解决方案
1. 球标显示问号问题
问题:球标显示"?"而不是自定义属性值
解决:检查自定义属性名称是否正确,使用$PRPVIEW:"属性名"格式
2. 位置偏移问题
问题:球标位置不在期望位置
解决:调整SetLeaderAttachmentPointAtIndex和SetPosition2的坐标偏移量
3. 多个组件处理
问题:需要为所有组件生成球标
解决:移除break语句,遍历所有组件
扩展功能建议
批量处理:支持多张图纸的批量处理
自定义位置:根据组件类型自动调整球标位置
样式定制:支持更多球标样式和配置
错误处理:添加异常处理和日志记录
结语
通过Python结合SolidWorks API,我们可以实现工程图BOM球标的自动化生成,大幅提高设计效率。本文提供的代码框架可以轻松扩展,满足不同的业务需求。希望这篇文章能帮助你快速上手SolidWorks二次开发。