如何在CATScript/VBScript中向选中产品添加子产品结构?
解决CATIA V5 CATScript产品结构创建与几何束转换问题
需求与问题
- 基础需求:运行宏前在产品树中选中任意层级的产品,宏执行时:
- 弹窗输入自定义名称
- 在选中产品下创建
A_<名称>子产品 - 在
A_<名称>下创建B_<名称>、C_<名称>、D_<名称>、E_<名称>四个子产品
- 当前问题:原代码仅支持向根产品添加结构,尝试直接将
Selection赋值给Product变量时因类型不匹配报错 - 进阶需求:将
A_<名称>产品转换为Geometrical Bundle(非集合),并添加允许向其添加Multibrancheables的电气发布属性
修改后的完整CATScript代码
Language="VBSCRIPT" Sub CATMain() ' 声明变量 Dim oSel As Selection Dim oTargetProduct As Product Dim sName As String Dim oMainChild As Product Dim oChildProducts As Products ' 获取选中对象 Set oSel = CATIA.ActiveDocument.Selection If oSel.Count = 0 Then MsgBox "请先在产品树中选中一个产品!", vbExclamation Exit Sub End If ' 验证选中对象为Product类型 Set oTargetProduct = oSel.Item(1).Value If Not TypeName(oTargetProduct) = "Product" Then MsgBox "选中对象必须是产品类型!", vbExclamation Exit Sub End If ' 获取输入名称 sName = InputBox("请输入装配名称", "输入框", "name") If sName = "" Then MsgBox "名称不能为空!", vbExclamation Exit Sub End If ' -------------------------- ' 1. 创建A_<名称>子产品 ' -------------------------- Set oMainChild = oTargetProduct.Products.AddNewComponent("Product", "") oMainChild.PartNumber = "A_" & sName oMainChild.Name = "A_" & sName ' -------------------------- ' 2. 将A_<名称>转换为Geometrical Bundle ' -------------------------- oMainChild.Activate oMainChild.SetGeometricalBundle True ' True表示转换为非集合类型的几何束 ' -------------------------- ' 3. 设置电气发布属性(允许添加Multibrancheables) ' -------------------------- oMainChild.PublishForElectrical = True ' 设置允许Multibrancheables的属性 oMainChild.SetAttribute("CATIAElectricalAllowMultibrancheables", "Yes") ' -------------------------- ' 4. 在A_<名称>下创建B/C/D/E子产品 ' -------------------------- Set oChildProducts = oMainChild.Products ' 创建B_<名称> AddNamedProduct oChildProducts, "B_" & sName ' 创建C_<名称> AddNamedProduct oChildProducts, "C_" & sName ' 创建D_<名称> AddNamedProduct oChildProducts, "D_" & sName ' 创建E_<名称> AddNamedProduct oChildProducts, "E_" & sName MsgBox "产品结构创建完成!", vbInformation End Sub ' 辅助函数:向Products集合添加指定名称的产品 Sub AddNamedProduct(oProducts As Products, sFullName As String) Dim oProd As Product Set oProd = oProducts.AddNewComponent("Product", "") oProd.PartNumber = sFullName oProd.Name = sFullName End Sub
关键修改说明
1. 正确获取选中产品
- 使用
CATIA.ActiveDocument.Selection获取选中集合,再通过Item(1).Value取出第一个选中的Product对象 - 添加了选中验证:判断选中数量、对象类型,避免非法输入导致报错
2. 动态适配父产品层级
- 将原代码中固定的根产品
oRootProduct替换为选中的oTargetProduct,所有子产品创建逻辑基于该父节点,支持任意层级的选中产品
3. 几何束转换与电气属性设置
- 调用
Product.Activate确保目标产品处于激活状态 - 使用
SetGeometricalBundle True将产品转换为非集合类型的Geometrical Bundle - 通过
PublishForElectrical = True开启电气发布,再用SetAttribute设置允许添加Multibrancheables的属性
4. 代码优化
- 提取
AddNamedProduct辅助函数,避免重复代码,提升可维护性
内容的提问来源于stack exchange,提问作者Janwillem3DGeoInt
相关产品推荐
相关产品推荐

