CATIA产品层级VB.NET宏复制Body异常:同名Body不同实例问题
问题诊断
你的宏在处理同名零件实例时出现异常,核心原因是:
- 代码通过
currentProduct.Name = partName匹配零件,找到第一个符合名称的实例就终止循环。 - 对于同一零件的多个实例(或名称相同的不同零件),它们的
ReferenceProduct指向的是同一个(或你不需要的)原始零件文档,导致所有同名实例都复用第一个找到的源Part,无法区分目标实例。
修复方案
不要仅依赖零件名称识别实例,而是在用户选择源零件时,直接保存每个选中实例的Product对象引用(而非仅名称),确保能精准定位到用户选中的实例对应的零件。
修改步骤
填充源零件列表时存储Product对象
在你填充partsList的代码中,将每个Product对象存入列表项的Tag属性:' 示例:遍历产品层级填充源零件列表 For Each prod As Product In rootProduct.Products Dim item As New ListViewItem(prod.Name) ' 将Product对象存入Tag,用于后续精准获取 item.Tag = prod partsList.Items.Add(item) Next修改源零件获取逻辑
替换原代码中获取源零件名称的部分,直接从列表项的Tag中提取Product对象:' 替换原有的sourcePartNames获取代码 Dim sourceProducts As List(Of Product) = partsList.Items.Cast(Of ListViewItem)() .Select(Function(item) DirectCast(item.Tag, Product)).ToList() Try ' 遍历所有选中的源Product实例 For Each sourceProd As Product In sourceProducts Dim sourcePart As Part = Nothing Try ' 直接从选中的Product实例获取对应的Part sourcePart = DirectCast(sourceProd.ReferenceProduct.Parent, PartDocument).Part Catch ex As Exception MessageBox.Show($"无法获取源零件实例 '{sourceProd.Name}' 的Part对象。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Warning) Continue For End If ' 后续查找Body并复制的逻辑保持不变 For Each bodyName In bodyNames Dim sourceBody As Body = Nothing Try sourceBody = sourcePart.Bodies.Item(bodyName) Catch ex As Exception MessageBox.Show($"在源零件 '{sourceProd.Name}'中未找到Body '{bodyName}'。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Warning) Continue For End Try ' 选择Body并以链接形式复制 selection.Clear() selection.Add(sourceBody) selection.Copy() ' 在目标Part中以链接形式粘贴 selection.Clear() targetPart.InWorkObject = targetPart.MainBody selection.Add(targetPart.MainBody) selection.PasteSpecial("CATPrtResult") Next Next targetPart.Update() Catch ex As Exception MessageBox.Show("发生错误: " & ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try
额外说明
- 如果你的场景中,同名实例是不同零件文档(而非同一零件的多个实例),上述修改也能精准定位到用户选中的那个实例对应的零件,避免误取第一个匹配名称的零件。
- 若无法修改列表填充逻辑,也可以通过
Product.Id(唯一标识)来匹配实例,而非Name,但存储Product对象是最直接可靠的方式。
内容的提问来源于stack exchange,提问作者Yunus Mert AŞKIN
相关产品推荐
相关产品推荐

