You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CATIA产品层级VB.NET宏复制Body异常:同名Body不同实例问题

问题诊断

你的宏在处理同名零件实例时出现异常,核心原因是:

  • 代码通过currentProduct.Name = partName匹配零件,找到第一个符合名称的实例就终止循环。
  • 对于同一零件的多个实例(或名称相同的不同零件),它们的ReferenceProduct指向的是同一个(或你不需要的)原始零件文档,导致所有同名实例都复用第一个找到的源Part,无法区分目标实例。
修复方案

不要仅依赖零件名称识别实例,而是在用户选择源零件时,直接保存每个选中实例的Product对象引用(而非仅名称),确保能精准定位到用户选中的实例对应的零件。

修改步骤

  1. 填充源零件列表时存储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
    
  2. 修改源零件获取逻辑
    替换原代码中获取源零件名称的部分,直接从列表项的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 02:44:52