catia v5通过VBA宏导出树

时间:2017-09-20 19:33:18

标签: vba tree catia

我需要导出Catia Spec树以用作BoM。

出口应该:

  • 转到Excel并使用WalkDownTree函数。
  • 添加了PartNumber,Nomenclature和User 属性称为“Sinex Ref”。
  • 还必须确保导出的树忽略部件 和产品名为“Ref”。

  • 使用该项目显示每个项目的数量 部分号码。

  • 包括已停用的部分,但请提及它们 已停用。

我是Catia和VBA的新手并提出了以下内容(我对其他已发现的宏进行了调整,但发现他们忽略了树中的孩子)。目前,宏生成Excel文件,并且在相同的单元格中循环遍历规范树中的所有部分和子项,无论它们是否已停用。

Sub CATMain()



' ********* is the current document a CATIA Product **************



    If CATIA.Documents.Count = 0 Then


        MsgBox "There are no CATIA documents open. Please open a CATIA document and try again.", ,msgboxtext


        Exit Sub


    End If




    If InStr(CATIA.ActiveDocument.Name, ".CATProduct") < 1 Then


        MsgBox "The active document is not a Product. Please open a CATIA Product and try again.", ,msgboxtext


         Exit Sub


    End If





' ************* General declarations for the Active CATIA session *****************

    Dim oProdDoc As ProductDocument
    t = 1
    Set oProdDoc = CATIA.ActiveDocument
    Dim oRootProd As Product
    Set oRootProd = oProdDoc.Product
    Dim par As Parameters
    Set par = oRootProd.UserRefProperties
    Dim SinexRef As String


' *************** begin spec tree scroll ******************

    Call WalkDownTree(oRootProd)
End Sub

Sub WalkDownTree(oInProduct As Product)
        Dim oInstances As Products
    Set oInstances = oInProduct.Products

    On Error Resume Next
    Set Excel = GetObject(, "EXCEL.Application")

    If Err.Number <> 0 Then
        Set Excel = CreateObject("EXCEL.Application")
        Excel.Visible = True
        Excel.Workbooks.Add 
    End If

    If t <> 1 Then
        for i=1 to oInProduct.Count


'**************************** Export title ***************************


            row=2


            col=1
            Excel.Columns.Columns(1).Columnwidth = 5

            Excel.Columns.Columns(2).Columnwidth = 15
            Excel.Cells(row,col+1).Value = "CATProduct:"


            Excel.Cells(row,col+1).Font.Bold = true

            Excel.Cells(row,col+1).HorizontalAlignment = 3
            Excel.Cells(row,col+2).Value = CATIA.ActiveDocument.Name

' **************************** Export column titles ***************


            row=4
            Excel.Cells(row,col+1).Value = "Instance Name"
            Excel.Cells(row,col+1).Font.Bold = true

            Excel.Columns.Columns(2).Columnwidth = 20

            Excel.Cells(row,col+1).borders.LineStyle = 1
            Excel.Cells(row,col+1).HorizontalAlignment = 3
            Excel.Cells(row+2,col+1).Value = oInProduct.ReferenceProduct.PartNumber

            Excel.Cells(row,col+2).Value = "Ref"

            Excel.Cells(row,col+2).Font.Bold = true

            Excel.Columns.Columns(3).Columnwidth = 15
            Excel.Cells(row,col+2).borders.LineStyle = 1

            Excel.Cells(row,col+2).HorizontalAlignment = 3
            Excel.Cells(row+2,col+2).Value = oInProduct.ReferenceProduct.Nomenclature


            Excel.Cells(row,col+3).Value = "Quantity"

            Excel.Cells(row,col+3).Font.Bold = true

            Excel.Columns.Columns(4).Columnwidth = 15
            Excel.Cells(row,col+3).borders.LineStyle = 1
            Excel.Cells(row,col+3).HorizontalAlignment = 3
            Excel.Cells(row+2,col+3).Value = 1 'insert item quantity corresponding to PartNumber


            Excel.Cells(row,col+4).Value = "SinexRef"

            Excel.Cells(row,col+4).Font.Bold = true

            Excel.Columns.Columns(5).Columnwidth = 15
            Excel.Cells(row,col+4).borders.LineStyle = 1

            Excel.Cells(row,col+4).HorizontalAlignment = 3
            Excel.Cells(row+2,col+4).Value = 1 'insert Sinex Ref corresponding to PartNumber

            t = t + 1

        Next

    End If


    Dim k As Integer
    For k = 1 To oInstances.Count
        Dim oInst As Product
        Set oInst = oInstances.Item(k)

        Call WalkDownTree(oInst)

    Next

End Sub

3 个答案:

答案 0 :(得分:0)

假设

  

在同一个单元格中循环遍历spec树中的所有部分和子项

你的意思是它是在同一个单元格中写入/覆盖来自CATIA的数据,这是因为你没有增加关于Excel行/列的任何内容。

我个人会为CATProduct,Instance Name等创建标题,然后将纯数据放在下面,而不是每次都重复这些相同的标题,但是你的格式也会有用,可能只是更难以汇总数据在Excel中。

无论如何,要保持现有的格式,你需要在循环结束时增加Row,在t增加的地方。

在现有循环中,第一个oInProduct似乎使用了行2-6(总共5行)。在循环开始时有一个row = 2,需要在循环之前放置,这意味着它将从第二行开始。循环内部还有一个row = 4需要更改,我们可以使用row = row + 2来获得相同的效果。然后,在循环结束时,我们再次递增以达到总数5,所以使用row = row + 3.

row = 2

for i = 1 to oInProduct.Count

    '**************************** Export title ***************************

    col=1
    Excel.Columns.Columns(1).Columnwidth = 5

    ...
    row = row + 2 'previously row = 4
    ...

    Excel.Cells(row,col + 4).HorizontalAlignment = 3
    Excel.Cells(row + 2,col + 4).Value = 1 'insert Sinex Ref corresponding to PartNumber

    t = t + 1
    row = row + 3

Next

答案 1 :(得分:0)

尝试 ->分析->物料清单->定义格式(用于可选选项)->>另存为->文件格式为.xls

或: ->文件->另存为-> Filetype:txt ...确定是txt,但也许可以转换为.xls (尤其是如果您缺少许可证)

答案 2 :(得分:0)

我使用了Catia库中可用的 AssemblyConverter 对象来提取BOM。我在使用上述注释中提到的步骤记录宏时发现了这一点。 尝试->分析->物料清单->定义格式(用于可选选项)->>另存为->文件格式为.xls
我认为这是最简单快捷的。另外,我们也可以更改文件的格式和位置。

录制的宏:

Sub CATMain()

    Dim productDocument1 As ProductDocument
    Set productDocument1 = CATIA.ActiveDocument

    Dim product1 As Product
    Set product1 = productDocument1.Product

    Dim assemblyConvertor1 As AssemblyConvertor
    Set assemblyConvertor1 = product1.GetItem("BillOfMaterial")

    Dim arrayOfVariantOfBSTR1(4)
    arrayOfVariantOfBSTR1(0) = "Quantity"
    arrayOfVariantOfBSTR1(1) = "Part Number"
    arrayOfVariantOfBSTR1(2) = "Type"
    arrayOfVariantOfBSTR1(3) = "Nomenclature"
    arrayOfVariantOfBSTR1(4) = "Revision"
    Set assemblyConvertor1Variant = assemblyConvertor1
    assemblyConvertor1Variant.SetCurrentFormat arrayOfVariantOfBSTR1

    Dim arrayOfVariantOfBSTR2(1)
    arrayOfVariantOfBSTR2(0) = "Quantity"
    arrayOfVariantOfBSTR2(1) = "Part Number"
    Set assemblyConvertor1Variant = assemblyConvertor1
    assemblyConvertor1Variant.SetSecondaryFormat arrayOfVariantOfBSTR2

    assemblyConvertor1.[Print] "XLS", "C:\Users\Desktop\BOM.xls", product1

End Sub