【问题标题】:Catia VBA Saving specific parts or products from a .stp file as .CATPart and/or .CATProductCatia VBA 将 .stp 文件中的特定零件或产品保存为 .CATPart 和/或 .CATProduct
【发布时间】:2018-01-11 02:24:23
【问题描述】:

我有一个 .stp 文件,用不同的 CAD 软件导出,我可以用 CATIA 打开它。 然后,CATIA 将列出产品/零件树,就好像它是本机 CATIA .CATProduct。

我的目标是使用 CATIA 自动打开此类 .stp 文件并保存所有包含的零件/产品,并使用从每个零件/产品中的一个 UserRefProperties 中提取的名称保存所有包含的零件/产品。 因此,我想使用 VBA 创建一个宏,该宏在完成后将以批处理模式运行。

当我尝试将零件/产品保存在此 .stp 文件中时,出现了第一个问题,Catia 的保存功能会根据需要处理我的文件并将每个零件/产品保存为单独的文件。 但是,使用 VBA 我似乎无法保存任何这些部件/产品,因为 .ExportData 和 .SaveAs 方法似乎只适用于 .PartDocument 或 .ProductDocument 对象,而不是我一直在尝试的对象节省: .Product 对象。

我正在尝试做的示例:

Sub catmain()

Dim oProdDoc As ProductDocument
Set oProdDoc = CATIA.ActiveDocument

Dim oRootProd As Product
Set oRootProd = oProdDoc.Product

Dim oInstances As Products
Set oInstances = oRootProd.Products

For k = 1 To oInstances.Count

Dim oInst As Product
Set oInst = oInstances.Item(k)

oInst.ExportData "X:\path", ".CATPart"

next

end sub

如果 CATIA 可以根据需要保存我的 .stp 文件的内容,我当然可以用 VBA 做同样的事情,对吧?

任何帮助将不胜感激。

【问题讨论】:

    标签: vba catia


    【解决方案1】:

    树根部的产品可以保存为 CATProduct 文档。 树中的任何子产品也可以保存为 CATProduct。 作为树的叶子的零件可以保存为 CATPart。

    您可以像这样保存根产品:

    Dim rootProdDoc As ProductDocument
    set rootProdDoc = CATIA.ActiveDocument
    rootProdDoc.SaveAs "C:\Temp\" & rootProd.PartNumber & ".CATProduct"
    

    但是,当您这样做时,CATIA 会抱怨“这会激活其他保存操作,您要继续吗?”这样做是因为部件尚未保存。回答是 CATIA 将保存您的装配体和所有零件。但是,由于您无法控制保存的部分,因此您无法为所需的文档设置名称。

    因为你必须回答一个对话框,它会阻止你制作一个批处理程序。

    执行此操作的正确方法是首先保存叶文档,然后逐级“向上”处理树的根。然后,一切都会在您需要时保存。

    ----------Class clsSaveInfo definition--------------
    
    Public level As Integer
    Public prod As Product
    
    
    -----------------(module definition)--------------- 
    
    Option Explicit
    
    
    Sub CATMain()
    
        CATIA.DisplayFileAlerts = False
    
        'get the root product
        Dim rootProd As Product
        Set rootProd = CATIA.ActiveDocument.Product
    
        'make a dictionary to track product structure
        Dim docsToSave As Scripting.Dictionary
        Set docsToSave = New Scripting.Dictionary
    
        'some parameters
        Dim level As Integer
        Dim maxLevel As Integer
    
        'read the assembly
        level = 0
        Call slurp(level, rootProd, docsToSave, maxLevel)
    
        Dim i
        Dim kx As String
        Dim info As clsSaveInfo
    
        Do Until docsToSave.count = 0
            Dim toRemove As Collection
            Set toRemove = New Collection
            For i = 0 To docsToSave.count - 1
               kx = docsToSave.keys(i)
    
               Set info = docsToSave.item(kx)
    
               If info.level = maxLevel Then
                    Dim suffix As String
                   If TypeName(info.prod) = "Part" Then
                        suffix = ".CATPart"
                   Else
                        suffix = ".CATProduct"
                    End If
                    Dim partProd As Product
                    Set partProd = info.prod
                    Dim partDoc As Document
                    Set partDoc = partProd.ReferenceProduct.Parent
                    partDoc.SaveAs ("C:\Temp\" & partProd.partNumber & suffix)
                    toRemove.add (kx)
                End If
    
            Next
    
         'remove the saved products from the dictionary
            For i = 1 To toRemove.count
                docsToSave.Remove (toRemove.item(i))
            Next
    
            'decrement the level we are looking for
            maxLevel = maxLevel - 1
        Loop
    
    
    End Sub
    
    
    Sub slurp(ByVal level As Integer, ByRef aProd As Product, ByRef allDocs As Scripting.Dictionary, ByRef maxLevel As Integer)
    
    'increment the level
        level = level + 1
    
    'track the max level
        If level > maxLevel Then maxLevel = level
    
     'see if the part is already in the save list, if not add it
        If allDocs.Exists(aProd.partNumber) = False Then
            Dim info As clsSaveInfo
            Set info = New clsSaveInfo
            info.level = level
            Set info.prod = aProd
            Call allDocs.add(aProd.partNumber, info)
        End If
    
    'slurp up children
        Dim i
        For i = 1 To aProd.products.count
            Dim subProd As Product
            Set subProd = aProd.products.item(i)
            Call slurp(level, subProd, allDocs, maxLevel)
        Next
    
    End Sub
    

    【讨论】:

    • 是的,我已经想到我需要先保存所有较低级别的部分,然后再向上工作。我没想到只有这个问题会提供给我一个完整的脚本。如果这有效,我将非常感激。我明天早上测试一下。
    • 所以我已将您的代码粘贴到我用来为 CATIA 制作宏的 VBA 环境中。我注意到的第一件事是第一行显示为红色,并且宏不会运行。我删除了第一组破折号,并立即提示“编译错误:预期:语句结束”,“定义”一词被突出显示。我删除了第一个代码块中的“定义”和剩余的破折号,直到不再遇到提示。我尝试运行代码并再次提示我:“无效的外部过程”,clsSaveInfo 突出显示。这个“类”和“定义”是如何工作的?
    • 好吧,我想我需要创建一个 Class 模块并在这个新的 Class 模块中声明变量“level”和“prod”,并将模块命名为“clsSaveInfo”。我仍然遗漏了一些东西,因为我立即收到提示“未定义用户定义的类型”。我认为这是因为“level”和“prod”的声明没有推送到普通模块的 subs。
    • 在我之前的评论中:“我认为这是因为“level”和“prod”的声明没有推送到普通模块的 subs”。这是不正确的,问题是我没有加载使用“Scripting.Dictionary”所需的库。我通过以管理员身份运行 CATIA 和 VB 解决了这个问题,转到工具 -> 参考并选中“Microsoft 脚本库”复选框。现在脚本按预期工作了 99%。有 1 件事不能按我的意愿工作,树中的所有项目都保存为 .CATPoduct 而它应该将最低级别的项目保存为 .CATPart。
    • 关于这个问题的更多细节很快就会。
    猜你喜欢
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 2021-06-03
    • 2022-09-29
    • 1970-01-01
    相关资源
    最近更新 更多