Autodesk Inventor: Inventor API Basic Training

Tài liệu Training Inventor 2021 API cơ bản (Tiếng Nhật)



Autodesk Inventor API: Hệ Thống Cấp Bậc Assembly Document

Chúng ta sẽ xem xét ngắn gọn các tham chiếu tài liệu thô (raw document references) trong bài viết này, sau đó dành một chút thời gian để tìm hiểu hệ thống phân cấp vùng chứa Assembly Document trong phần tiếp theo. Đối với phạm vi của cuộc thảo luận này sẽ giới hạn hệ thống phân cấp đối tượng đó như sau:

Document -> AssemblyDocument -> AssemblyComponentDefinition -> ComponentOccurences -> ComponentOccurence

Và ComponentOccurancesEnumerator

Assembly Components

Đây là điều đã làm rõ code của tôi một cách đáng kể. Tôi đang chia thành các phần để hy vọng rằng nó sẽ dễ tiếp thu hơn.

Các Xuất hiện của Thành Phần Assembly (Assembly Component Occurrences) là tất cả các thành phần trong một assebmly, mà chứa các Occurrences, hoặc từng Component. Phần này sẽ thảo luận về cách sử dụng chúng, và các chức năng liên quan đến việc trích xuất mỗi phần.

Assembly Component Definition

Nơi chứa thành phần hoàn chỉnh; tương tự như Danh sách Vật tư Thiết kế CAD (BOM), nhưng khác biệt ở chỗ dữ liệu định nghĩa BOM thực tế được chứa riêng biệt bên trong cấu trúc này.

  • Lớp Đối tượng Cơ sở: AssemblyDocument
  • Loại: Đối tượng Tiêu chuẩn
  • Định nghĩa Đối tượng: AssemblyComponentDefinition
  • Trả về Bởi: Hàm AssemblyDocument.ComponentDefinition

Truy cập vào cấu trúc Assembly component được thực hiện thông qua đối tượng này. Chúng ta cần khai báo một đối tượng ‘AssemblyComponentDefinition’ và gán cho nó dữ liệu từ một cuộc gọi đến hàm ‘ComponentDefinition’ của Tài liệu Assembly.

Ví dụ:

' Get the active assembly.
Dim oAsmDoc As AssemblyDocument
oAsmDoc = ThisApplication.ActiveDocument
' Get the assembly component definition.
Dim oAsmCompDef As AssemblyComponentDefinition
oAsmCompDef = oAsmDoc.ComponentDefinition

…

Bây giờ khi Định nghĩa Thành phần Tổ hợp đã được điền, là lúc để thực hiện một số công việc đào sâu.

Component Occurrences

Đây là các nơi chứa từng tài liệu thành phần đang hiện diện bên trong.

Nếu một định nghĩa part xuất hiện 10 lần trong một assembly, sẽ có 10 Component Occurrences, và tất cả 10 sẽ xuất hiện trong nơi chứa này. Lợi ích ở đây là các tệp mẫu và tệp tham chiếu không thuộc cấu trúc ‘Assembly Component Definition’, vì vậy chúng không gây trở ngại ở đây.

  • Lớp Đối tượng Cơ sở: AssemblyComponentDefinition
  • Loại: Collection Object
  • Định nghĩa Đối tượng: ComponentOccurrence
  • Tham chiếu tại: AssemblyComponentDefinition.Occurrences

Bộ sưu tập Occurrences là tất cả các Component Occurrences, mà bạn có thể truy cập trực tiếp.

Bây giờ chúng ta có thể khai báo một đối tượng ‘ComponentOccurence’, và sử dụng nó để kiểm tra từng ‘ComponentOccurrence’ tồn tại trong ‘AssemblyComponentDefinition’ của chúng ta.

Trong ví dụ này, tôi đã sử dụng một hàm For Each để lấy từng thành phần.

Ví dụ:

' Iterate through all of the Part Occurrences

Dim oOccurrence As ComponentOccurrence

For Each oOccurrence In oAsmCompDef.Occurrences

 

' Set Reference to Occurrence Name

Dim oOccName As String

oOccName = oOccurrence.Name

 

‘ Show each name in a dialog

MessageBox.Show(oOccName, "Document Name")

Next

Điều này là một cách tốt để nhanh chóng lướt qua Assembly và lấy mọi component. Những gì tiếp theo là thêm chức năng khi bạn muốn cụ thể về những gì bạn đang muốn lấy.

Occurrence Enumeration

Đối tượng này đi đôi với hàm tiếp theo. Đối tượng này hoạt động như một nơi chứa để bắt một bộ sưu tập các Component Occurrences và phân tán chúng theo loại vào một đối tượng thông minh với các chức năng phù hợp.

  • Lớp Đối tượng Cơ sở: ComponentOccurrences
  • Loại: Collection Object
  • Định nghĩa Đối tượng: ComponentOccurrencesEnumerator
  • Tham chiếu Tại: Chính nó như một đối tượng kích thước

Trong ví dụ sau, chúng ta đã bỏ qua cần thiết của việc này và lặp lại qua bộ sưu tập của các thành phần của Assembly Component Definition trực tiếp, giống như một cuốn sách, từng trang một. Tuy nhiên, khi chúng ta muốn Assembly Component Definition đưa ra một danh sách lớn các thành phần, chúng ta cần một nơi để đặt chúng. API của Inventor đã cung cấp nơi chứa này cho mục đích đó.

Chúng ta cần định nghĩa đối tượng ‘ComponentOccurrenceEnumerator’ cho phần tiếp theo.

Ví dụ:

‘ Define the Component Occurrence Enumerator 
Dim oLeafOccs As ComponentOccurrencesEnumerator

All Leaf Occurrences

Leaf Occurrences là các tệp part trong một assembly, đó là điểm cuối của bất kỳ nhánh nào trong cấu trúc.

  • Lớp Đối tượng Cơ sở: AssemblyComponentDefinition
  • Loại: Hàm
  • Cuộc Gọi Hàm: Occurences.AllLeafOccurrences
  • Trả về: ComponentOccurrence

Hàm này trả về chính xác các Component Occurrences giống như chúng ta đã duyệt qua trước đó, tuy nhiên hàm này chỉ trả về một bộ sưu tập các thành phần đó đại diện cho cuối các nhánh của assembly, Các đối tượng Part hoặc ‘Leaf’.

Trong khi chúng ta đã có thể xem qua các thành phần của Assembly Component Definition giống như đọc một cuốn sách, trong hàm này, đối tượng Assembly Component Definition sẽ đổ một phụ lục vào trong vòng lặp của chúng ta.

Ở đây, chúng ta sẽ điền vào Component Occurrence Enumerator của chúng ta bằng cách gọi hàm ‘AllLeafOccurrences’ của Component Definition. Sau đó, định nghĩa một Component Occurrence khác để đại diện và điều tra từng Leaf Occurrence nằm trong Trình liệt kê (Enumerator) đã được điền của chúng ta.

Ví dụ:

' Create the Enumerator to catch all the leaf occurrences of the assembly. 
Dim oLeafOccs As ComponentOccurrencesEnumerator
oLeafOccs = oAsmCompDef.Occurrences.AllLeafOccurrences

' Iterate through the occurrences and print the name.
Dim oOcc As ComponentOccurrence
For Each oOcc In oLeafOccs
MessageBox.Show(oOcc.Name, "Occurance Name")

All Referenced Occurrences

API của Inventor cũng cho phép người dùng trích xuất tất cả các xuất hiện của các tài liệu Inventor cụ thể.

  • Lớp Đối tượng Cơ sở: AssemblyComponentDefinition
  • Loại: Hàm
  • Cuộc Gọi Hàm: AssemblyComponentDefinition.Occurences.AllReferencedOccurrences(Document)
  • Trả về: ComponentOccurrences

Hàm này sẽ trả về tất cả các trường hợp của tài liệu cụ thể, ở bất kỳ cấp độ nào trong một Component Definition.

Ví dụ này lấy tên tệp và trả về tất cả các xuất hiện của nó. Nó sử dụng một cuộc gọi đến các tài liệu đã mở, hy vọng rằng nếu nó tồn tại, Inventor đã mở nó. Một số kiểm tra giới hạn tốt có thể được áp dụng để bắt lỗi nếu có bất kỳ lỗi nào liên quan đến một tệp chưa được mở.

Ví dụ:

' Get the active assembly.
Dim oAsmDoc As AssemblyDocument
oAsmDoc = ThisApplication.ActiveDocument

' Get the definition of the assembly.
Dim oAsmCompDef As AssemblyComponentDefinition
oAsmCompDef = oAsmDoc.ComponentDefinition

' Get the document to find occurrences for.
Dim sDocName as String

sDocName = “C:\designandmotion.ipt”

Dim oDoc As Document
oDoc = ThisApplication.Documents.ItemByName(sDocName)

' Get the occurrences that represent this document.
Dim oOccs As ComponentOccurrencesEnumerator
oOccs = oAsmCompDef.Occurrences.AllReferencedOccurrences(oDoc)

' Iterate through the Occurrences
Dim oOcc As ComponentOccurrence
For Each oOcc In oOccs
‘ ---------------------------------

‘ Do Something here with the Occurrence

‘ --------------------------------
Next

Tham khảo: https://designandmotion.net/


Truy cập iProperties

Có lẽ khu vực được sử dụng nhiều nhất của API của Inventor là iProperties và vì vậy, nó tạo ra nhiều câu hỏi hơn bất kỳ khu vực nào khác. Tôi muốn thử loại bỏ một số câu hỏi đó bằng cách cung cấp một tổng quan ngắn gọn về cách truy cập iProperties mà tôi hy vọng sẽ trả lời được hầu hết các câu hỏi. Bởi vì iProperties tương đối đơn giản, nó cũng là một sự giới thiệu rất tốt về API của Inventor. Trong ví dụ dưới đây, chúng ta sẽ xem xét những gì cần thiết để chỉnh sửa giá trị của thuộc tính Part (Part Number property).

iProperty Object Model

Khi làm việc với API của Inventor, bạn cần phải hiểu về Mô hình Đối tượng (Object Model). Mô hình đối tượng mô tả mối quan hệ giữa các đối tượng API khác nhau và được sử dụng để hiểu cách truy cập vào một đối tượng cụ thể. Toàn bộ mô hình đối tượng của Inventor khá lớn và có thể gây bực bội một chút, như có thể thấy ở trên. (Nhấp vào đây để truy cập vào tập tin PDF của toàn bộ biểu đồ.)

Tuy nhiên, khi lập trình với Inventor, bạn không cần phải hiểu toàn bộ mô hình đối tượng, mà chỉ cần phần của mô hình mà bạn đang sử dụng. Khi làm việc với iProperties, bạn chỉ sẽ sử dụng tối đa sáu đối tượng khác nhau. Một phiên bản đơn giản hóa của mô hình đối tượng cho sáu đối tượng này được hiển thị dưới đây.

Đối tượng Application là đối tượng cấp cao nhất và đại diện cho Inventor. Từ đó, bạn có thể lấy Đối tượng Documents cung cấp khả năng truy cập vào bất kỳ tài liệu nào đang mở và cũng để mở tài liệu và tạo tài liệu mới. Đối tượng Document đại diện cho bất kỳ tài liệu Inventor nào, tức là part, assembly, drawing, v.v. Từ biểu đồ mô hình đối tượng, chúng ta biết rằng Đối tượng PropertySets được truy cập từ một tài liệu. Điều này ngụ ý rằng các thuộc tính thuộc sở hữu của một tài liệu và mỗi tài liệu có một bộ thuộc tính duy nhất của riêng mình.

Truy cập một Tài liệu (Document)

Có nhiều cách để truy cập vào một tài liệu cụ thể nhưng trong ví dụ này, tôi sẽ giữ nó đơn giản bằng cách truy cập vào tài liệu đang mở để chỉnh sửa. Đây cũng là cách phổ biến nhất để truy cập vào một tài liệu. Bạn làm điều này bằng cách sử dụng thuộc tính ActiveDocument của Đối tượng Application . Nhìn vào biểu đồ mô hình đối tượng ở trên, việc sử dụng thuộc tính này đưa bạn từ Đối tượng Application và nhảy trực tiếp đến Đối tượng Document, bỏ qua Đối tượng Documents. Đoạn mã cho điều này được hiển thị dưới đây.

Public Sub ReadiProperty()
    ' Get the active document.
    Dim oDoc As Document
    Set oDoc = ThisApplication.ActiveDocument
End Sub

Truy cập iProperties

Từ mỗi tài liệu, bạn có thể truy cập vào các iProperties tương ứng của nó. iProperties được tổ chức thành các nhóm và API cung cấp quyền truy cập vào các nhóm này. Đối tượng đầu tiên liên quan đến iProperty là Đối tượng PropertySets. Bạn có thể nghĩ về Đối tượng PropertySets như là phiên bản tương đương của hộp thoại iProperties. Đó là cấp cao nhất cung cấp quyền truy cập vào tất cả thông tin iProperty.

Đoạn mã dưới đây cho thấy cách lấy Đối tượng PropertySets.

Public Sub ReadiProperty()
    ' Get the active document.
    Dim oDoc As Document
    Set oDoc = ThisApplication.ActiveDocument

    ' Get the PropertySets object.
    Dim oPropSets As PropertySets
    Set oPropSets = oDoc.PropertySets
End Sub

Đối tượng tiếp theo trong mô hình đối tượng là Đối tượng PropertySet. Bạn có thể nghĩ về đối tượng này như là tương đương của một tab trong hộp thoại iProperties.

Khi truy cập vào đối tượng PropertySet, có một chút thứ để quan tâm vì bạn phải chỉ định rõ bạn muốn PropertySet nào trong số các PropertySet hiện có. Có một vài cách khác nhau để làm điều này nhưng tôi khuyến nghị sử dụng tên của PropertySet. Điều này làm cho mã của bạn dễ đọc hơn sau này. Các tên của các bộ thuộc tính tiêu chuẩn là:

  • Inventor Document Summary Information
  • Inventor Summary Information
  • Design Tracking Properties
  • Inventor User Defined Properties

Đối với ví dụ này, tôi muốn lấy giá trị của thuộc tính Số phần (Part Number property). Điều này nằm trong bộ thuộc tính “Design Tracking Properties” (được xác định bằng cách nhìn vào biểu đồ ở cuối bài viết này). Đoạn mã dưới đây minh họa cách lấy bộ thuộc tính này thông qua tên.

Public Sub ReadiProperty()
    ' Get the active document.
    Dim oDoc As Document
    Set oDoc = ThisApplication.ActiveDocument

    ' Get the PropertySets object.
    Dim oPropSets As PropertySets
    Set oPropSets = oDoc.PropertySets

    ' Get the design tracking property set.
    Dim oPropSet As PropertySet
    Set oPropSet = oPropSets.Item("Design Tracking Properties")
End Sub

Đối tượng tiếp theo là Đối tượng Property. Đối tượng này đại diện cho một thuộc tính cụ thể, như minh họa dưới đây.

Các thuộc tính cũng được xác định bằng tên. Đoạn mã dưới đây minh họa cách truy cập vào thuộc tính Part Number.

Public Sub ReadiProperty()
    ' Get the active document.
    Dim oDoc As Document
    Set oDoc = ThisApplication.ActiveDocument

    ' Get the PropertySets object.
    Dim oPropSets As PropertySets
    Set oPropSets = oDoc.PropertySets

    ' Get the design tracking property set.
    Dim oPropSet As PropertySet
    Set oPropSet = oPropSets.Item("Design Tracking Properties")

    ' Get the part number iProperty.
    Dim oPartNumiProp As Property
    Set oPartNumiProp = oPropSet.Item("Part Number")
End Sub

Khi bạn có một đối tượng Property, bạn có thể sử dụng thuộc tính Value của nó để lấy giá trị hiện tại của nó và cũng để đặt giá trị nếu bạn muốn thay đổi iProperty. Đoạn mã dưới đây hiển thị part number của tài liệu hoạt động trong một hộp thoại tin nhắn.

Public Sub ReadiProperty()
    ' Get the active document.
    Dim oDoc As Document
    Set oDoc = ThisApplication.ActiveDocument

    ' Get the PropertySets object.
    Dim oPropSets As PropertySets
    Set oPropSets = oDoc.PropertySets

    ' Get the design tracking property set.
    Dim oPropSet As PropertySet
    Set oPropSet = oPropSets.Item("Design Tracking Properties")

    ' Get the part number iProperty.
    Dim oPartNumiProp As Property
    Set oPartNumiProp = oPropSet.Item("Part Number")

    ' Display the value.
    MsgBox "The part number is: " & oPartNumiProp.Value
End Sub

Đoạn mã dưới đây thay đổi giá trị của thuộc tính part number.

Public Sub SetiProperty()
    ' Get the active document.
    Dim oDoc As Document
    Set oDoc = ThisApplication.ActiveDocument

    ' Get the PropertySets object.
    Dim oPropSets As PropertySets
    Set oPropSets = oDoc.PropertySets

    ' Get the design tracking property set.
    Dim oPropSet As PropertySet
    Set oPropSet = oPropSets.Item("Design Tracking Properties")

    ' Get the part number iProperty.
    Dim oPartNumiProp As Property
    Set oPartNumiProp = oPropSet.Item("Part Number")

    ' Set the part number.
    oPartNumiProp.Value = "SamplePart001"
End Sub

Truy cập một iProperty đơn giản chỉ là việc điều hướng xuống mô hình đối tượng để đến được một đối tượng Property cụ thể. Phần khó khăn là biết được bộ thuộc tính mà thuộc tính bạn muốn nằm trong đó, và biết tên của bộ thuộc tính đó và tên của thuộc tính. Bảng dưới đây liệt kê tất cả các bộ thuộc tính tiêu chuẩn và tên của các thuộc tính chúng chứa. Điều này sẽ cung cấp đủ thông tin để truy cập các thuộc tính hiện có. Ngoài các tên, biểu đồ cũng liệt kê loại của mỗi thuộc tính. Điều này quan trọng khi đặt giá trị của một thuộc tính để bạn biết loại dữ liệu được mong đợi là gì.

Inventor Summary Information
Property NameType
AuthorString
CommentsString
KeywordsString
Last Saved ByString
ThumbnailIPictureDisp
Revision NumberString
SubjectString
TitleString
Inventor Document Summary Information
Property NameType
CategoryString
CompanyString
ManagerString
Design Tracking Properties
Property NameType
AuthorityString
Catalog Web LinkString
CategoriesString
Checked ByString
CostCurrency
Cost CenterString
Creation TimeDate
Date CheckedDate
Defer UpdatesBoolean
DescriptionString
Design StatusLong
DesignerString
Document SubTypeString
Document SubType NameString
EngineerString
Engr Approved ByString
Engr Date ApprovedDate
External Property Revision IdString
LanguageString
ManufacturerString
MaterialString
Mfg Approved ByString
Mfg Date ApprovedDate
Parameterized TemplateBoolean
Part IconIPictureDisp
Part NumberString
Part Property Revision IdString
ProjectString
Proxy Refresh DateDate
Size DesignationString
StandardString
Standard RevisionString
Standards OrganizationString
Stock NumberString
Template RowString
User StatusString
VendorString
Weld MaterialString
Inventor User Defined Properties

Tham khảo: https://modthemachine.typepad.com/


Truy Cập Assembly Components

Một nhu cầu phổ biến khi làm việc với một bộ phận lắp ráp là truy cập các thành phần tạo nên bộ phận lắp ráp đó. Lý do để làm điều này có thể là để tạo BOM tùy chỉnh của riêng bạn hoặc chỉnh sửa các giá trị tham số trong các bộ phận cụ thể. Dưới đây là một tổng quan nhanh về cách truy cập các thành phần của bộ phận lắp ráp. (Trong cuộc thảo luận này, tôi sẽ tập trung chỉ vào các bộ phận và các bộ lắp con trong một bộ phận lắp ráp và không đề cập đến bất kỳ điều gì khác có thể có trong một bộ phận lắp ráp; ràng buộc, tính năng lắp ráp, cấp độ chi tiết, v.v.)

Một bộ lắp ráp (Assembly) là gì?

Đối với chủ đề hiện tại, một bộ lắp ráp có thể được coi như một bộ chứa chứa các phiên bản (instances) của các bộ phận và các bộ lắp khác. Mỗi phiên bản (instance) (hoặc occurrence) xác định một vị trí trong bộ lắp và các thuộc tính khác xác định hình dạng và hành vi (màu sắc, khả năng nhìn thấy, linh hoạt, v.v.) của phiên bản. Một phiên bản không chứa bất kỳ hình học nào nhưng hiển thị hình học mà nó nhận được từ bộ phận được tham chiếu. Một bộ phận có thể được tham chiếu một lần và sau đó được tạo ra nhiều lần bằng cách hiển thị bộ phận duy nhất đó ở các vị trí khác nhau trong bộ lắp. Dưới đây là ví dụ về bộ lắp tôi sẽ sử dụng để minh họa.

Dưới đây là trình duyệt cho bộ lắp ráp này. Bạn có thể thấy rằng bộ lắp gồm 14 trường hợp trong đó hai trong số đó là các bộ lắp con và 12 trong số đó là các bộ phận. Có một bộ lắp con duy nhất và 5 bộ phận duy nhất, như được minh họa trong chế độ xem của Windows Explorer được hiển thị dưới đây. Hình học cho các bộ phận chỉ tồn tại trong năm tệp .ipt. Bộ lắp tham chiếu đến các bộ phận này và hiển thị hình ảnh của chúng tại các vị trí được xác định bởi vị trí của trường hợp (occurrence) đại diện cho bộ phận.

Dưới đây là một số thuật ngữ API bạn nên quen thuộc với phần còn lại của cuộc thảo luận:

  1. ComponentOccurrence: Đây là đối tượng API đại diện cho một trường hợp trong một bộ phận lắp ráp. Một ComponentOccurrence có thể đại diện cho một bộ lắp con hoặc một bộ phận và có thể ở bất kỳ cấp độ nào của bộ lắp. Ví dụ, bộ lắp ở trên được biểu diễn bằng 14 đối tượng API ComponentOccurrence.
  2. File Reference: Đây là liên kết giữa bộ lắp và các bộ lắp con và bộ phận mà nó chứa. Trong ví dụ ở trên, có sáu tham chiếu tệp trong bộ lắp đến các bộ lắp con và bộ phận khác nhau được tham chiếu. Chỉ có một tham chiếu tệp duy nhất cho một tệp cụ thể. Ví dụ, mặc dù có bốn phần Pillar, chỉ có một tham chiếu tệp giữa bộ lắp và tệp Pillar.ipt. Để biết thêm thông tin về tham chiếu tệp, xem bài viết trước đó Understanding File References.
  3. Leaf Occurrences: Đây là các trường hợp xác định cuối của mỗi nhánh khi bạn duyệt qua một bộ lắp. Trong Inventor, tất cả các parts đều được coi là các trường hợp cuối cùng (leaf occurrences).

Có một vài cách để truy cập các trường hợp của một bộ lắp. Cách nào để sử dụng phụ thuộc vào những gì bạn sẽ làm với kết quả. Dưới đây là các mô tả và mẫu minh họa cho mỗi cách:

Assembly Structure

Phương pháp đầu tiên là truy cập cấu trúc toàn bộ bộ lắp. Điều này cung cấp tất cả các trường hợp và cây bộ lắp đầy đủ, giống như bạn thấy trong trình duyệt. Điều này cung cấp cái nhìn hoàn chỉnh về bộ lắp và nên đủ thông tin cho bất kỳ nhiệm vụ nào cần cấu trúc hoàn chỉnh.

Viết một chương trình để truy cập cây bộ lắp đầy đủ là phương pháp khó nhất trong những cách tiếp cận được thảo luận ở đây. Điều này bởi vì một cây bộ lắp không có kích thước được xác định trước. Một bộ lắp có thể có bất kỳ số cấp độ nào với mỗi cấp độ có thể có bất kỳ số lượng trường hợp nào. Đó là một cây với bất kỳ số lượng nhánh nào. Để có được cấu trúc toàn bộ của bộ lắp, bạn cần đi xuống mỗi nhánh cho đến khi bạn đến mỗi lá. Để xử lý một vấn đề như vậy, bạn cần sử dụng một hàm đệ quy, như được thể hiện trong đoạn mã dưới đây.

Public Sub TraverseAssemblySample()
    ' Get the active assembly.
    Dim oAsmDoc As AssemblyDocument
    Set oAsmDoc = ThisApplication.ActiveDocument
    Debug.Print oAsmDoc.DisplayName

    ' Call the function that does the recursion.
    Call TraverseAssembly(oAsmDoc.ComponentDefinition.Occurrences, 1)
End Sub

Private Sub TraverseAssembly(Occurrences As ComponentOccurrences, _
                             Level As Integer)
    ' Iterate through all of the occurrence in this collection.  This
    ' represents the occurrences at the top level of an assembly.
    Dim oOcc As ComponentOccurrence
    For Each oOcc In Occurrences
        ' Print the name of the current occurrence.
        Debug.Print Space(Level * 3) & oOcc.Name

        ' Check to see if this occurrence represents a subassembly
        ' and recursively call this function to traverse through it.
        If oOcc.DefinitionDocumentType = kAssemblyDocumentObject Then
            Call TraverseAssembly(oOcc.SubOccurrences, Level + 1)
        End If
    Next
End Sub

TraverseAssemblySample sub nhận tài liệu bộ lắp hoạt động và gọi TraverseAssembly sub, truyền vào bộ sưu tập các trường hợp từ bộ lắp cấp cao nhất. Thuộc tính Occurrences của đối tượng AssemblyComponentDefinition và thuộc tính SubOccurrences của đối tượng ComponentOccurrence chỉ trả về các trường hợp trực tiếp trong bộ lắp đó, không phải trong bất kỳ bộ lắp con nào của nó. Phần TraverseAssembly sau đó thực hiện tất cả công việc để đi qua cây. Nó lặp lại qua mỗi trường hợp trong bộ sưu tập và cho ví dụ này, in ra tên của mỗi trường hợp, nhưng bất cứ điều gì có thể được thực hiện với trường hợp tại điểm đó. Việc tiếp theo nó là điều thú vị nhất; nó kiểm tra xem trường hợp đó có phải là một bộ lắp con hay một phần không và nếu đó là một bộ lắp con, nó gọi phần TraverseAssembly sub một lần nữa, truyền vào bộ sưu tập các trường hợp trong bộ lắp con đó. Sự thực là phần con đang gọi chính nó là đệ quy. Quá trình này tiếp tục cho đến khi hoàn toàn đi qua cây bộ lắp.

Khi chạy chương trình sử dụng bộ lắp mẫu trước đó, các dòng sau được viết vào cửa sổ Immediate của VBA. Bạn có thể so sánh điều này với chế độ xem của trình duyệt của bộ lắp và thấy rằng chúng khớp.

Sample.iam
   Floor:1
   Arch:1
      CurvedSupport:1
      CurvedSupport:2
      ArchTop:1
   Arch:2
      CurvedSupport:1
      CurvedSupport:2
      ArchTop:1
   Pillar:1
   Pillar:2
   Pillar:3
   Pillar:4
   Inventor:1

Có một vài điều cần chú ý trong chương trình. Một trong số đó là đối số “Level” của phần TraverseAssembly. Đối số này được sử dụng để theo dõi cấp độ của bộ lắp mà chương trình hiện đang ở đó để nó có thể căn lề đúng cho đầu ra của cây và không cần thiết để đi qua cây bộ lắp. Khu vực mã mà bạn sẽ thay thế để thực hiện công việc bạn muốn thực hiện với mỗi trường hợp là dòng mà nó in ra tên của trường hợp. Dòng này được thực thi cho mỗi trường hợp trong bộ lắp. Bạn có thể thay thế điều này bằng mã thực hiện bất kỳ chức năng nào bạn cần thực hiện. Ví dụ, nếu bạn cần tạo một BOM tùy chỉnh, mã của bạn có thể truy cập vào tài liệu được tham chiếu bởi trường hợp này và trích xuất một số giá trị iProperty và sau đó in ra như một phần của BOM có cấu trúc.

Occurrence Lists 

Trong vài phiên bản của Inventor, cách duy nhất để truy cập bộ lắp thông qua API là đi qua toàn bộ cây, như đã được thể hiện ở trên. Thường thì bạn không cần cấu trúc cây mà chỉ muốn một danh sách đơn giản của nội dung của bộ lắp. Có một vài thuộc tính cung cấp cách tiếp cận đơn giản hơn này đến nội dung của bộ lắp.

All Leaf Occurrences

Ví dụ đầu tiên này sử dụng thuộc tính AllLeafOccurrences của đối tượng ComponentOccurrences, thuộc tính này trả về một tập hợp chứa tất cả các trường hợp lá của toàn bộ bộ lắp. Các trường hợp lá tại mọi cấp độ của bộ lắp được trả về trong tập hợp duy nhất này. Hãy nhớ rằng các trường hợp lá là các bộ phận, do đó điều này sẽ không chứa bất kỳ trường hợp bộ lắp con nào. Thuộc tính AllLeafOccurrences cũng có một đối số tùy chọn, (không được sử dụng trong ví dụ dưới đây), cung cấp một số tính linh hoạt bổ sung bằng cách cho phép bạn chỉ nhận các trường hợp lá cho một bộ lắp con cụ thể được chỉ định.

Public Sub GetPartOccurrences()
    ' Get the active assembly.
    Dim oAsmDoc As AssemblyDocument
    Set oAsmDoc = ThisApplication.ActiveDocument

    ' Get the assembly component definition.
    Dim oAsmDef As AssemblyComponentDefinition
    Set oAsmDef = oAsmDoc.ComponentDefinition

    ' Get all of the leaf occurrences of the assembly.
    Dim oLeafOccs As ComponentOccurrencesEnumerator
    Set oLeafOccs = oAsmDef.Occurrences.AllLeafOccurrences

    ' Iterate through the occurrences and print the name.
    Dim oOcc As ComponentOccurrence
    For Each oOcc In oLeafOccs
        Debug.Print oOcc.Name
    Next
End Sub

Khi chạy chương trình trên bộ lắp mẫu, những dòng sau được ghi vào cửa sổ Immediate của VBA. Việc thực hiện cuộc gọi duy nhất đơn giản hơn nhiều so với việc đi qua toàn bộ bộ lắp để tìm các trường hợp của các bộ phận.

Floor:1
CurvedSupport:1
CurvedSupport:2
ArchTop:1
CurvedSupport:1
CurvedSupport:2
ArchTop:1
Pillar:1
Pillar:2
Pillar:3
Pillar:4
Inventor:1 

All Occurrences của một Component được chỉ định

Bạn cũng có thể lấy tất cả các trường hợp tham chiếu đến một tài liệu cụ thể. Ví dụ, bạn có thể cần truy cập mọi phiên bản của một ốc vít cụ thể trong một bộ lắp để thay thế nó bằng một cái khác. Để tìm mọi trường hợp tham chiếu đến một tài liệu được chỉ định, bạn có thể sử dụng thuộc tính AllReferencedOccurrences của đối tượng ComponentOccurrences. Thuộc tính này có một đối số bắt buộc duy nhất chỉ định bộ phận hoặc bộ lắp nào bạn muốn các trường hợp tham chiếu cho. Nó sẽ trả về tất cả các trường hợp ở mọi cấp độ của bộ lắp mà tham chiếu đến tài liệu được chỉ định. Ví dụ dưới đây minh họa điều này.

Public Sub FindOccurrences()
    ' Get the active assembly.
    Dim oAsmDoc As AssemblyDocument
    Set oAsmDoc = ThisApplication.ActiveDocument

    ' Get the definition of the assembly.
    Dim oAsmDef As AssemblyComponentDefinition
    Set oAsmDef = oAsmDoc.ComponentDefinition

    ' Get the document to find occurrences for. Since it’s assumed
    ' there is at least one occurrence in the assembly that 
    ' references this document, it will already be open since it
    ' was opened when the assembly was opened.
    Dim oDoc As Document
    Set oDoc = ThisApplication.Documents.ItemByName( _
                                "C:\AssemblySample\Pillar.ipt")

    ' Get the occurrences that represent this document.
    Dim oOccs As ComponentOccurrencesEnumerator
    Set oOccs = oAsmDef.Occurrences.AllReferencedOccurrences(oDoc)

    ' Print the occurrences to the Immediate window.
    Dim oOcc As ComponentOccurrence
    For Each oOcc In oOccs
        Debug.Print oOcc.Name
    Next
End Sub

Đầu ra cho chương trình này được hiển thị dưới đây.

Pillar:1
Pillar:2
Pillar:3
Pillar:4

Việc lấy một danh sách đơn của các trường hợp cụ thể dễ dàng hơn so với việc đi qua bộ lắp, nhưng bạn cũng mất ngữ cảnh của bộ lắp mà bạn nhận được khi đi qua. Tuy nhiên, có một vài thuộc tính được hỗ trợ bởi trường hợp cung cấp thông tin này theo các cách khác nhau. Nếu bạn cần thông tin loại này, hãy xem các thuộc tính ContainingOccurrence, OccurrencePath và ParentOccurrence của đối tượng ComponentOccurrence.

All Referenced Documents

Một nhu cầu phổ biến khác khi làm việc với một bộ lắp là truy cập các tài liệu duy nhất được tham chiếu bởi bộ lắp, vì trong nhiều trường hợp bạn không cần truy cập cá nhân vào mỗi trường hợp. Ví dụ, giả sử bạn muốn thay đổi vật liệu của tất cả các bộ phận thành một vật liệu nhất định. Bạn có thể làm điều đó bằng cách sử dụng một trong hai chương trình trước đó bằng cách thêm mã mà lấy một trường hợp nhất định, lấy tài liệu liên quan và thay đổi vật liệu của nó. Vấn đề là bạn sẽ phải làm nhiều công việc hơn là cần thiết. Ví dụ, trong bộ lắp mẫu, bạn sẽ phải đặt vật liệu cho pillar part bốn lần vì nó được sử dụng nhiều lần trong bộ lắp, trong khi thực sự bạn chỉ cần đặt nó một lần cho Pillar.ipt.

Bạn có thể làm điều này bằng cách sử dụng danh sách các tham chiếu thay vì các trường hợp vì có chỉ một tham chiếu đến mỗi tài liệu bất kể nó được sử dụng bao nhiêu lần trong bộ lắp. Thuộc tính AllReferencedDocuments của đối tượng AssemblyDocument cung cấp điều này. Nó trả về bộ tài liệu được tham chiếu đầy đủ cho toàn bộ bộ lắp bất kể cấp độ trong bộ lắp mà tham chiếu thực sự xảy ra.

Dưới đây là một ví dụ đơn giản minh họa điều này.

Public Sub ShowReferences()
    ' Get the active assembly.
    Dim oAsmDoc As AssemblyDocument
    Set oAsmDoc = ThisApplication.ActiveDocument

    ' Get all of the referenced documents.
    Dim oRefDocs As DocumentsEnumerator
    Set oRefDocs = oAsmDoc.AllReferencedDocuments

    ' Iterate through the list of documents.
    Dim oRefDoc As Document
    For Each oRefDoc In oRefDocs
        Debug.Print oRefDoc.DisplayName
    Next
End Sub

Và đây là kết quả khi chương trình mẫu này được chạy.

Pillar.ipt
Inventor.ipt
ArchTop.ipt
CurvedSupport.ipt
Arch.iam
Floor.ipt 

Dưới đây là một mẫu phức tạp hơn sử dụng điều này để minh họa việc đặt vật liệu của mỗi phần được tham chiếu thành vàng.

Public Sub ChangeAllPartMaterial()
    ' Get the active assembly document.
    Dim oAsmDoc As AssemblyDocument 
    Set oAsmDoc = ThisApplication.ActiveDocument

    ' Get the material to assign to all of the parts.
    Dim strMaterialName As String
    strMaterialName = "Gold"

    Dim oMaterial As Material
    On Error Resume Next
    ' Try to get the material of the specified name.
    Set oMaterial = oAsmDoc.Materials.Item(strMaterialName)
    If Err Then
        MsgBox "The material """ & strMaterialName & _
                     """ was not found in the library."
        Exit Sub
    End If
    On Error GoTo 0

    ' Iterate through all of the documents refrenced by the assembly.
    Dim oDoc As Document
    For Each oDoc In oAsmDoc.AllReferencedDocuments
        ' Check to see if this is a part.
        If oDoc.DocumentType = kPartDocumentObject Then
            Dim oPartDoc As PartDocument
            Set oPartDoc = oDoc

            ' Set the material.
            oPartDoc.ComponentDefinition.Material = oMaterial
        End If
    Next
End Sub 

Tham khảo: https://modthemachine.typepad.com/