Autodesk Inventor: Tổng quan về API

Bắt đầu với API của Inventor

Một API là gì?

API, hoặc Giao diện Lập trình Ứng dụng, là một thuật ngữ được sử dụng để mô tả các chức năng được tiết lộ bởi một ứng dụng, cho phép ứng dụng đó được sử dụng thông qua một chương trình. Ví dụ, bạn có thể sử dụng API của Inventor để viết một chương trình sẽ thực hiện cùng loại thao tác bạn có thể thực hiện khi sử dụng tương tác Inventor.

Có một API là quan trọng vì nó cho phép bạn thêm chức năng vào Inventor mà đặc biệt cho nhu cầu của bạn. Inventor, vì tính cần thiết, là một hệ thống CAD tổng quát, có nghĩa là nó không nhắm vào bất kỳ ngành công nghiệp cụ thể nào hoặc được sử dụng để mô hình hóa chỉ một số loại sản phẩm nhất định. Bằng cách cung cấp một API, Inventor cho phép bạn thêm chức năng bổ sung và tối ưu hóa các hoạt động lặp lại để làm cho nó hiệu quả hơn cho nhu cầu cá nhân của bạn.

Bằng cách cung cấp một API, Inventor cũng cung cấp cho bạn khả năng tích hợp Inventor vào quy trình Doanh nghiệp tổng thể của bạn tốt hơn. Ví dụ, bạn có thể viết một chương trình tương tác với cơ sở dữ liệu tồn kho của công ty để lấy giá hiện tại của các thành phần để giá hiển thị trong một part list luôn được cập nhật. Bạn cũng có thể viết một chương trình trích xuất dữ liệu từ assemblies để cung cấp thông tin cần thiết cho các hệ thống MRP. Tất cả điều này có thể được thực hiện thủ công, nhưng bằng cách tự động hóa nó bằng cách sử dụng một chương trình, bạn có thể tăng năng suất đáng kể và giảm thiểu lỗi.

Một API cũng quan trọng vì nó cho phép các ứng dụng bên thứ ba tích hợp với Inventor. Chính qua API, các sản phẩm cho PDM, NC và FEM có thể tương tác với Inventor.

Xin lưu ý: Nhà phát triển được khuyến cáo mạnh mẽ không sử dụng bất kỳ đối tượng, phương thức, thuộc tính, sự kiện hoặc hằng số của API Inventor nào được đánh dấu là ẩn, không được hỗ trợ hoặc chỉ dành cho sử dụng nội bộ. Những đối tượng này đã được tạo ra hoặc duy trì cho việc sử dụng nội bộ của Autodesk, và không có bảo đảm rằng chúng sẽ tiếp tục tồn tại (hoặc hoạt động tương tự) qua các bản phát hành tiếp theo.

Làm thế nào để truy cập vào API?

API của Inventor được tiết lộ bằng cách sử dụng công nghệ từ Microsoft gọi là “Automation.” (Trước đây, Microsoft đã gọi là “OLE Automation.”) Giao diện Automation là phổ biến trong các ứng dụng được viết cho Windows. Ví dụ, Microsoft Word và Excel tiết lộ giao diện Automation để cho phép bạn tùy chỉnh chúng. AutoCAD và Mechanical Desktop cũng tiết lộ giao diện Automation. (Họ gọi chúng là giao diện ActiveX.)

Có một số ưu điểm đáng kể khi cung cấp một API thông qua một giao diện Automation. Thứ nhất, nó cho phép bạn sử dụng gần như bất kỳ ngôn ngữ lập trình phổ biến nào hiện nay: Visual Basic, Visual C++, C#, Delphi, Python, Java, v.v. Thứ hai, nếu thiết kế đúng cách, nó tiết lộ chức năng sử dụng các khái niệm tiêu chuẩn. Điều này có nghĩa là nếu bạn đã có kinh nghiệm lập trình một giao diện Automation được thiết kế tốt như Word hoặc Excel, bạn đã hiểu rất nhiều các khái niệm được sử dụng bởi API của Inventor. Cuối cùng, nó tiết lộ chức năng của ứng dụng theo một cách hướng đối tượng. Khi hiểu các khái niệm chung về cách một API hướng đối tượng hoạt động, loại API này dễ học và sử dụng hơn so với các API hướng hàm.

Inventor tiết lộ chức năng thông qua API của nó, và có các cách khác nhau để truy cập vào API. Tất cả đều hữu ích trong một số trường hợp cụ thể, vì vậy quan trọng là phải hiểu cơ bản về các cách kết nối vào API để bạn có thể đưa ra quyết định tốt nhất về cách viết chương trình của mình. Hình dưới đây minh họa các cách truy cập API của Inventor khác nhau. Một cái nhìn tổng quan về mỗi phương pháp sẽ được trình bày sau đây. Thông tin chi tiết về chúng được cung cấp trong các phần dành cho mỗi phương pháp: VBA, Add-Ins và Apprentice Server.

Đầu tiên, một giải thích nhanh về hình ảnh dưới đây. Những hộp màu trắng đại diện cho các thành phần cung cấp quyền truy cập vào API của Inventor. Đó là Inventor và Apprentice Server. Chúng ta sẽ nói về Apprentice nhiều hơn trong một phút. Hình trụ màu xanh ở dưới đại diện cho dữ liệu Inventor bạn đang truy cập, tức là các file .ipt và .iam của bạn. Tất cả các hộp màu vàng đại diện cho các chương trình mà bạn viết. Khi một hộp bao quanh một hộp khác, điều này cho biết rằng hộp được bao quanh đang chạy trong cùng một quy trình với hộp bao quanh nó. Ví dụ, VBA chạy trong cùng một quy trình với Inventor. Một chương trình “trong quy trình” sẽ chạy nhanh hơn so với một chương trình chạy ngoài quy trình.

VBA

VBA, hoặc Visual Basic for Applications, là một môi trường lập trình được truy cập từ bên trong Inventor. Các chương trình được viết bằng VBA thường được gọi là “macros.” VBA thường được người dùng cuối sử dụng để viết các chương trình nhỏ để tự động hóa các công việc lặp lại, mặc dù nó chắc chắn không bị hạn chế chỉ riêng điều này. Một chương trình VBA có cùng quyền truy cập vào tất cả các tính năng của API như bất kỳ phương pháp nào khác để truy cập vào API (ngoại trừ Add-Ins, mà chúng ta sẽ thảo luận sau).

Khi quyết định sử dụng phương pháp nào khi lập trình Inventor, có một số ưu điểm cần xem xét khi sử dụng VBA. Thứ nhất, VBA được cung cấp cùng với Inventor và không yêu cầu bạn mua một ngôn ngữ lập trình bổ sung. Thứ hai, bạn có thể nhúng các chương trình vào trong tài liệu Inventor. Nếu bạn có một chương trình cụ thể cho dữ liệu, đây là một cách thuận tiện để giữ chương trình với dữ liệu mà nó được thiết kế sử dụng. (Bạn không bị buộc phải lưu các chương trình của mình trong tài liệu Inventor. Bạn cũng có thể lưu các chương trình trong các file riêng biệt để chia sẻ giữa các người dùng và documents.) Thứ ba, VBA chạy trong cùng một quy trình với Inventor nên bạn có được các lợi ích về hiệu suất khi nằm trong cùng một quy trình. Thứ tư, VBA được thiết kế để làm việc với các loại API Automation và là môi trường dễ sử dụng nhất để học API của Inventor.

Add-Ins

Add-Ins là một loại chương trình đặc biệt của Inventor. Một Add-In có thể thực hiện một điều mà không có phương pháp nào khác để truy cập vào API có thể làm; Inventor tự động khởi động Add-In mỗi khi Inventor được chạy. Điều này có một ưu điểm lớn là add-in có thể tự động chèn vào giao diện người dùng của Inventor và kết nối với các sự kiện để theo dõi và phản ứng với hoạt động trong Inventor. Điều này cho phép chức năng của add-in xuất hiện giống như chức năng được tích hợp trong Inventor. Add-In cũng có một ưu điểm đặc biệt so với VBA trong việc triển khai chương trình của bạn cho người dùng và quản lý mã nguồn của bạn.

Add-Ins có thể được viết bằng bất kỳ ngôn ngữ nào hỗ trợ việc tạo ra các DLL ActiveX, chẳng hạn như Visual Basic, C#, và Visual C++. Add-Ins không thể được tạo ra bằng VBA.

Standalone EXE

Một standalone EXE là một chương trình chạy độc lập và kết nối với Inventor. Loại chương trình này thường được sử dụng trong trường hợp bạn có một chương trình có giao diện riêng và không yêu cầu người dùng tương tác trực tiếp với Inventor. Ví dụ, một tiện ích tự động hàng loạt có thể là một EXE chạy độc lập khỏi Inventor. Nó có thể theo dõi một cơ sở dữ liệu để xem có bản ghi mới được thêm vào mô tả các tài liệu cần được in hàng loạt. Khi một bản ghi mới được tạo trong cơ sở dữ liệu, standalone EXE khởi động Inventor, nếu nó chưa chạy, mở tài liệu mong muốn và in nó, tất cả mà không cần bất kỳ tương tác nào từ người dùng.

Standalone EXEs chạy ngoài quy trình của Inventor, vì vậy có một số hình phạt hiệu suất, nhưng vì chúng thường không được sử dụng cho các quy trình tương tác nên điều này hiếm khi là một vấn đề. Ngay cả trong trường hợp hiệu suất là một vấn đề, có thể kết hợp việc sử dụng một add-in và một exe. Bạn có thể có một add-in thực hiện phần lớn công việc và một exe gọi add-in.

Bạn cũng chạy trong chế độ standalone EXE khi bạn viết các chương trình trong VBA của một ứng dụng khác. Ví dụ, nếu bạn viết một chương trình bằng VBA của Excel kết nối với Inventor, chương trình VBA của bạn đang chạy trong không gian quy trình của Excel và đang giao tiếp với Inventor ở ngoài quy trình.

Apprentice Server

Apprentice là một máy chủ ActiveX có thể được sử dụng bởi các ứng dụng khác để truy cập vào dữ liệu của Inventor. Apprentice về cơ bản là một phần nhỏ của Inventor chạy trong quá trình cho ứng dụng sử dụng nó. Apprentice không có giao diện người dùng và cách duy nhất để tương tác với nó là thông qua API của nó. Apprentice cung cấp quyền truy cập vào một tập hợp hạn chế của các chức năng đầy đủ của Inventor với các lĩnh vực chính là assembly structure, B-Rep, geometry và iProperties. Hầu hết việc truy cập thông tin thông qua Apprentice là chỉ đọc; (một vài ngoại lệ của điều này là iProperties và các tham chiếu file).

Apprentice hữu ích trong bất kỳ ứng dụng độc lập nào cần truy cập vào thông tin chứa trong các tài liệu của Inventor. Phương án thay thế là sử dụng Inventor. Sử dụng Apprentice hiệu quả hơn nhiều so với việc sử dụng Inventor để thực hiện các hoạt động tương tự vì Apprentice có thể chạy trong cùng một quy trình với ứng dụng của bạn và vì nó không có giao diện người dùng nên nó có thể thực hiện nhiều hoạt động nhanh hơn.

Một ưu điểm khác của Apprentice Server là nó có sẵn miễn phí và có sẵn trên public Autodesk website as part of Inventor View. Thêm thông tin chi tiết về Apprentice có thể được tìm thấy trong phần Apprentice Server.

Cơ bản về Lập trình Automation

Khái niệm về Lập trình Hướng đối tượng

Một giao diện Automation COM tiết lộ các chức năng của nó thông qua một tập hợp các đối tượng. Một đối tượng lập trình có nhiều điểm tương đồng với các đối tượng trong thế giới thực. Hãy xem xét một ví dụ đơn giản để hiểu cách thuật ngữ lập trình hướng đối tượng có thể được sử dụng để mô tả nó. Một công ty bán ghế có thể cho phép khách hàng tự thiết kế ghế của họ bằng cách điền thông tin vào một biểu mẫu đặt hàng, như trong ví dụ dưới đây.

Các tùy chọn trên biểu mẫu đặt hàng xác định các thuộc tính khác nhau của ghế mong muốn. Bằng cách đặt các thuộc tính vào các giá trị mong muốn, khách hàng có thể mô tả chi tiết ghế cụ thể họ muốn.

Ngoài các thuộc tính, các đối tượng cũng hỗ trợ các phương thức. Các phương thức về cơ bản là các hướng dẫn mà đối tượng hiểu. Trong thế giới thực, đây là các hành động bạn sẽ thực hiện với chiếc ghế. Ví dụ, bạn có thể di chuyển ghế, gấp nó lại hoặc vứt nó vào thùng rác. Trong thế giới lập trình, các đối tượng thông minh hơn và thay vì bạn thực hiện hành động, bạn bảo đối tượng thực hiện hành động đó một cách tự động; di chuyển, gấp và xóa.

Một khía cạnh thứ ba của các đối tượng là chúng có thể hỗ trợ các sự kiện. Trong thế giới thực, các sự kiện tương đương với việc lắp đặt cảm biến trên một đối tượng để theo dõi khi có những thứ cụ thể xảy ra với đối tượng. Ví dụ, bạn có thể gắn một cảm biến vào ghế để được thông báo mỗi khi có ai đó ngồi lên nó. Trong thế giới lập trình, bạn có thể sử dụng các sự kiện để được thông báo khi có những thứ cụ thể xảy ra trong Inventor.

Một khái niệm cuối cùng của lập trình hướng đối tượng là lớp (class). Trở lại với đối tượng ghế, bạn có thể xem lớp như biểu mẫu đặt hàng mà khách hàng điền để mô tả chi tiết ghế cụ thể họ muốn. Một lớp không phải là đối tượng chính mà là mẫu mô tả tất cả các thuộc tính, phương thức và sự kiện của một loại đối tượng cụ thể. Biểu mẫu đặt hàng đại diện cho lớp và ghế kết quả là đối tượng, hoặc một thể hiện của lớp.

Đối tượng và Inventor

Các đối tượng được tiếp cận thông qua giao diện lập trình của Inventor đại diện cho các thành phần trong Inventor mà bạn đã quen thuộc. Ví dụ, hãy xem tính năng extrude được hiển thị dưới đây. Đối với mỗi tính năng extrude bạn tạo trong một part, có một đối tượng lập trình ExtrudeFeature đại diện cho nó. Đối tượng ExtrudeFeature hỗ trợ các thuộc tính và phương thức khác nhau cho phép bạn truy vấn và chỉnh sửa extrusion. Các thuộc tính và phương thức này cung cấp chức năng tương đương với những gì bạn chỉ định khi tạo và chỉnh sửa một tính năng extrude trong giao diện người dùng. Ví dụ, đối tượng ExtrudeFeature hỗ trợ thuộc tính Name. Đây là tên của tính năng được hiển thị trong trình duyệt đối tượng. Bạn có thể lấy giá trị của thuộc tính này để xem tên hiện tại của tính năng và bạn có thể đặt giá trị của thuộc tính này để thay đổi tên của tính năng. Đối tượng ExtrudeFeature cũng hỗ trợ các thuộc tính ExtentType, Operation, Profile, và các thuộc tính khác. Thuộc tính ExtentType xác định rằng đây là một phạm vi khoảng cách. Phép toán chỉ định rằng đây là một hoạt động “solid mới”. Profile trả về thông tin bản vẽ mô tả hình dạng của tính năng. Đây là tương đương API của các tùy chọn được cung cấp trong hộp thoại nhỏ được hiển thị dưới đây.

Một điểm quan trọng cần nhấn mạnh ở đây là hầu hết API chỉ là một cách khác ngoài giao diện người dùng để truy cập vào các chức năng của Inventor. Bởi vì API cho phép bạn thực hiện những điều tương tự như bạn có thể làm thông qua giao diện người dùng, có sự tương đồng mạnh mẽ giữa hai phương pháp này. Việc hiểu biết tốt về Inventor từ góc độ của một người dùng cuối sẽ làm cho việc hiểu và sử dụng API dễ dàng hơn.

Truy cập vào các Đối tượng

Như đã thảo luận ở trên, API của Inventor được tiếp cận dưới dạng một tập hợp các đối tượng. Bằng cách truy cập vào các đối tượng này thông qua API, bạn có thể sử dụng các phương thức, thuộc tính và sự kiện khác nhau của chúng để điều khiển và phản ứng với Inventor. Hãy xem cách bạn truy cập vào các đối tượng này. Khái niệm đầu tiên cần hiểu trước khi đi sâu hơn là mô hình đối tượng (object model). Toàn bộ mô hình đối tượng Inventor được hiển thị dưới đây. Bạn có thể thấy rằng có rất nhiều đối tượng, nhưng hầu hết các chương trình sẽ chỉ sử dụng một phần nhỏ của chúng.

Mô hình đối tượng là một biểu đồ phân cấp minh họa các mối quan hệ giữa các đối tượng. Một trong những đối tượng quan trọng nhất trong cấp bậc này là đối tượng Application. Đối tượng Application đại diện cho ứng dụng Inventor và là đối tượng cao nhất trong cấp bậc. Đối tượng Application hỗ trợ các phương thức và thuộc tính cho phép bạn điều khiển Inventor nhưng quan trọng nhất, nó hỗ trợ các thuộc tính trả về các đối tượng Inventor khác. Do đó, sau khi bạn có đối tượng Application, bạn có thể truy cập vào bất kỳ đối tượng nào khác trong cấu trúc phân cấp. Hình minh họa của mô hình đối tượng hữu ích như một công cụ vì nó minh họa cách đi từ một đối tượng đến một đối tượng khác. Bạn chỉ cần hiểu cách điều hướng qua cấu trúc để đến được đối tượng cụ thể bạn muốn. Hình dưới đây minh họa phần của mô hình đối tượng cần thiết để truy cập vào tính năng extrude của part, (đối tượng ExtrudeFeature).

Đoạn code dưới đây minh họa việc sử dụng các mối quan hệ được chỉ ra trong biểu đồ mô hình đối tượng ở trên để truy cập vào tính năng extrude có tên là “Extrusion1”.

Public Sub GetExtrudeFeature()
   Dim partDoc as PartDocument
   Set partDoc = ThisApplication.ActiveDocument

   Dim extrude As ExtrudeFeature
   Set extrude = partDoc.ComponentDefinition.Features.ExtrudeFeatures.Item(1)
    
   MsgBox "Extrusion " & extrude.Name & " is suppressed: " & extrude.Suppressed
End Sub

Dựa vào đoạn code trên, có nhiều khái niệm cơ bản được sử dụng mà nhiều người gặp khó khăn khi bắt đầu sử dụng API của Inventor. Các khái niệm này bao gồm: lấy đối tượng Ứng dụng (Application), điều hướng mô hình đối tượng (object model), đối tượng bộ sưu tập (collection objects), và đối tượng phát sinh (derived objects). Dưới đây là một cái nhìn sâu hơn về mỗi khái niệm này.

Lấy Đối tượng Ứng dụng

Điều đầu tiên được minh họa trong mẫu là truy cập vào Đối tượng Ứng dụng (Application). Trong VBA của Inventor, bạn có thể sử dụng thuộc tính toàn cục ThisApplication để lấy Đối tượng Ứng dụng, đó là những gì mẫu làm. Khi viết một add-in, khi Inventor khởi động add-in, nó chuyển cho nó Đối tượng Ứng dụng. Khi viết một exe, bạn cần sử dụng các API khác để lấy Đối tượng Ứng dụng. Trong trường hợp này, bạn có thể chọn lấy Đối tượng Ứng dụng từ một phiên bản đang chạy của Inventor hoặc bắt đầu chạy Inventor và lấy Đối tượng Ứng dụng từ đó. Dưới đây là một số code VB.Net exe tương đương với code VBA ở trên. Phần đầu của code sử dụng phương thức GetActiveObject của .Net để lấy đối tượng ứng dụng Inventor. Điều này được bọc trong một câu lệnh Try Catch để xử lý trường hợp khi Inventor không chạy. Phần còn lại của code gần như giống với mẫu VBA.

Imports Inventor
Imports System.Runtime.InteropServices
------

Public Sub GetExtrudeFeature()
    ' Get the Inventor Application object.
    Dim inventorApp As Inventor.Application = Nothing
    Try
        inventorApp = Marshal.GetActiveObject("Inventor.Application")
    Catch ex As Exception
        MessageBox.Show("Cannot connect to Inventor")
        Exit Sub
    End Try

    Dim partDoc As PartDocument
    partDoc = inventorApp.ActiveDocument

    Dim extrude As ExtrudeFeature
    extrude = partDoc.ComponentDefinition.Features.ExtrudeFeatures.Item(1)

    MessageBox.Show("Extrusion " & extrude.Name & " is suppressed: " & extrude.Suppressed)
End Sub

Đây là ví dụ tương đương trong C#.

using Inventor;
using System.Runtime.InteropServices;
------

private void GetExtrudeFeature()
{
    Inventor.Application inventorApp = null;
    try 
    {
       // Attempt to get a reference to a running instance of Inventor.
       inventorApp =(Inventor.Application)Marshal.GetActiveObject("Inventor.Application");
    }
    catch 
    {
       MessageBox.Show("Unable to connect to Inventor.");
       return;
    }

    PartDocument partDoc = null;
    partDoc = (PartDocument)inventorApp.ActiveDocument;

    ExtrudeFeature extrude = null;
    extrude = partDoc.ComponentDefinition.Features.ExtrudeFeatures[1];

    MessageBox.Show("Extrusion " + extrude.Name + " is suppressed: " + extrude.Suppressed);
}

Điều Hướng Trong Mô Hình Đối Tượng

Khi đã có Đối tượng Ứng dụng, bước đầu tiên trong việc lấy một tính năng cụ thể là lấy tài liệu chứa tính năng đó. Trong ví dụ trên, có một sự khác biệt nhỏ giữa biểu đồ mô hình đối tượng và mã mẫu. Lưu ý rằng biểu đồ chỉ ra rằng Đối tượng Tài liệu (Documents) là bước tiếp theo từ Đối tượng Ứng dụng, nhưng mã mẫu không thực hiện điều này. Lý do cho điều này là có nhiều trường hợp trong API nơi cung cấp các phím tắt giúp dễ dàng truy cập vào các đối tượng cụ thể. Trong trường hợp này, thuộc tính ActiveDocument của Đối tượng Ứng dụng được sử dụng, nó trả về Đối tượng Tài liệu (Document) hiện đang được người dùng cuối làm việc, cho phép chúng ta bỏ qua Đối tượng Tài liệu.

Sau khi có Đối tượng PartDocument, phần còn lại của mã mẫu minh họa việc điều hướng qua mô hình đối tượng để đến được tính năng mong muốn. Thuộc tính ComponentDefinition của Đối tượng PartDocument được gọi, nó trả về một Đối tượng PartComponentDefinition. Thuộc tính Features của Đối tượng PartComponentDefinition được gọi, nó trả về một Đối tượng PartFeatures. Thuộc tính ExtrudeFeatures của Đối tượng PartFeatures được gọi, nó trả về một Đối tượng ExtrudeFeatures. Cuối cùng, phương thức Item của Đối tượng ExtrudeFeatures được gọi, nó trả về Đối tượng ExtrudeFeature có tên đã được chỉ định. Hy vọng bạn có thể thấy rằng mã đang sử dụng các mối quan hệ được xác định trong cấu trúc phân cấp đối tượng để điều hướng qua mô hình đối tượng đến đối tượng mong muốn.

Đối Tượng Bộ Sưu Tập

Đối tượng bộ sưu tập là một loại đặc biệt của đối tượng tiện ích trong API. Một đối tượng bộ sưu tập không đại diện cho một thực thể cụ thể trong Inventor mà thay vào đó cung cấp quyền truy cập vào một nhóm các đối tượng liên quan. Một đối tượng bộ sưu tập cũng hỗ trợ các phương thức cho phép bạn tạo ra các đối tượng mới. Phần của mô hình đối tượng để truy cập tính năng extrude được hiển thị dưới đây. Các hộp chữ nhật đại diện cho các đối tượng tiêu chuẩn trong khi các hộp có góc bo tròn đại diện cho các đối tượng bộ sưu tập. Các đối tượng bộ sưu tập cũng có thể được xác định bằng các tên số nhiều của chúng. Trong ví dụ này, các đối tượng bộ sưu tập là các đối tượng Documents, PartFeatures và ExtrudeFeatures.

Sự khác biệt chính giữa các đối tượng bộ sưu tập và các đối tượng khác là khái niệm rằng chúng cung cấp quyền truy cập vào một tập hợp các đối tượng. Họ làm điều này bằng cách hỗ trợ các thuộc tính Count và Item. Tất cả các đối tượng bộ sưu tập đều hỗ trợ hai thuộc tính này. Thuộc tính Count trả về số lượng đối tượng hiện có trong bộ sưu tập. Ví dụ, nếu bạn gọi thuộc tính Count của đối tượng bộ sưu tập ExtrudeFeatures, nó sẽ trả về số lượng tính năng extrude trong tài liệu đó. Thuộc tính Item trả về một đối tượng cụ thể trong bộ sưu tập. Thông thường, khi sử dụng thuộc tính Item, bạn chỉ định chỉ số của mục bạn muốn từ bộ sưu tập. Ví dụ, code dưới đây in ra tên của tất cả các đối tượng ExtrudeFeature trong tài liệu bằng cách duyệt qua nội dung của bộ sưu tập một cách từng bước bằng cách sử dụng các thuộc tính Count và Item của đối tượng bộ sưu tập ExtrudeFeatures.

Public Sub ShowExtrudeFeature()
   ' Get the active document.  This assumes it is a part document.
   Dim partDoc as PartDocument
   Set partDoc = ThisApplication.ActiveDocument

   ' Get the ExtrudeFeatures collection object.
   Dim extrudeFeatures As ExtrudeFeatures
   Set extrudeFeatures = partDoc.ComponentDefinition.Features.ExtrudeFeatures

   ' Iterate through the contents of the ExtrudeFeatures collection.
   Dim i As Integer
   For i = 1 to extrudeFeatures.Count
      ' Get a specific item from the ExtrudeFeatures collection.
      Dim extrude As ExtrudeFeature
      Set extrude = extrudeFeatures.Item(i)

      Debug.Print extrude.Name
   Next
End Sub

Khi thuộc tính Item được sử dụng với một giá trị chỉ số của mục, mục đầu tiên trong bộ sưu tập là 1 và mục cuối cùng là giá trị được trả về bởi thuộc tính Count của bộ sưu tập. Đối với một số bộ sưu tập, thuộc tính Item cũng hỗ trợ chỉ định tên của mục bạn muốn. Thay vì cung cấp chỉ số của mục, bạn có thể cung cấp một chuỗi chỉ định tên. Code dưới đây minh họa cách lấy tính năng extrude có tên “My Extrude”. Cuộc gọi sẽ thất bại nếu không có một extrusion nào có tên đó. Trợ giúp trực tuyến và trình duyệt đối tượng (cả hai được thảo luận dưới đây) có thể được sử dụng để xác định xem một Mục có hỗ trợ chỉ mục theo tên không. Tất cả các thuộc tính Item đều hỗ trợ chỉ mục theo giá trị.

Dim extrude As ExtrudeFeature
Set extrude = extrudeFeatures.Item("My Extrude")

Khi lặp qua các đối tượng chứa trong một bộ sưu tập, bạn cũng có thể sử dụng một câu lệnh For Each. Đoạn code sau thực hiện cùng việc với mẫu trước đó nhưng là một cách ngắn gọn hơn và thường sẽ nhanh hơn.

' Iterate through the contents of the ExtrudeFeatures collection.
Dim extrude As ExtrudeFeature
For Each extrude In extrudeFeatures
   Debug.Print extrude.Name
Next

Ngoài việc cung cấp quyền truy cập vào nội dung của chúng thông qua các thuộc tính Count và Item, nhiều bộ sưu tập cũng hỗ trợ các phương thức cho phép bạn tạo ra các đối tượng mới trong bộ sưu tập đó. Ví dụ, bộ sưu tập ExtrudeFeatures hỗ trợ phương thức Add, cho phép bạn tạo ra các extrusion mới.

Các Đối tượng Dẫn Xuất (Derived Objects)

Ý tưởng về các đối tượng lớp dẫn xuất và cơ bản thường là một khái niệm mới đối với hầu hết người dùng cuối muốn sử dụng API của Inventor. Để giúp mô tả khái niệm này, hãy xem xét một tương đồng gần với mà hầu hết mọi người sẽ quen thuộc; phân loại động vật hoặc hệ thống phân loại động vật. Ví dụ, trong Vương quốc Động vật, bạn có côn trùng, chim, động vật có vú, v.v. Trong phân loại động vật có vú, có nhiều loài khác nhau nhưng tất cả chúng đều có các đặc điểm chung của một động vật có vú; có lông, sản xuất sữa, v.v. Ý tưởng tương tự này có thể được sử dụng để hiểu khái niệm về các đối tượng lớp dẫn xuất và đối tượng lớp cơ bản (derived and base class objects).

Nếu chúng ta viết một chương trình đại diện cho việc phân loại động vật được thảo luận ở trên, chúng ta sẽ có các đối tượng Animal (Động vật), Insect (Côn trùng), Bird (Chim), và Mammal (Động vật có vú). Đối tượng Animal là một lớp cơ bản cho các đối tượng Insect, Bird, và Mammal. Đối tượng lớp cơ bản là một đối tượng hỗ trợ các phương thức và thuộc tính chung cho bất kỳ đối tượng nào được dẫn xuất từ nó. Đối tượng Animal có thể đại diện cho bất kỳ loài động vật nào, bất kể liệu đó có phải là một côn trùng, một con chim, hay một động vật có vú thực sự. Đối tượng Animal cũng hỗ trợ các phương thức và thuộc tính có thể áp dụng cho bất kỳ loài động vật nào, ví dụ như cân nặng, tên, v.v.

Các đối tượng Insect, Bird và Mammal được dẫn xuất từ đối tượng Animal, vì vậy chúng kế thừa tất cả các chức năng của đối tượng Animal. Ngoài ra, chúng hỗ trợ các phương thức và thuộc tính đặc biệt cho nhóm cụ thể đó. Nếu chúng ta tiếp tục phân loại thêm, chúng ta có thể thêm các đối tượng Human (Con người) và Dog (Chó). Đối tượng Mammal sẽ là đối tượng lớp cơ bản cho các đối tượng này và chúng kế thừa tất cả các chức năng của đối tượng Mammal. Khái niệm này hữu ích trong các chương trình nơi bạn làm việc với một tập hợp các đối tượng nhưng các đối tượng đó chia sẻ một số chức năng. Ví dụ, nếu bạn muốn lặp qua tất cả các động vật trong một vườn thú và lấy tên của chúng, bạn có thể sử dụng đối tượng Animal vì nó có thể đại diện cho bất kỳ loài động vật nào và hỗ trợ thuộc tính Name.

Hãy xem cách khái niệm này áp dụng vào Inventor. Inventor có các đối tượng lớp cơ bản và các đối tượng lớp dẫn xuất. Một ví dụ là các đối tượng Document (Tài liệu), PartDocument (Tài liệu Chi tiết), AssemblyDocument (Tài liệu Lắp ráp), và DrawingDocument (Tài liệu Bản Vẽ). Đối tượng lớp cơ bản là đối tượng Document. Đối tượng này có thể đại diện cho bất kỳ loại tài liệu nào. Các đối tượng loại tài liệu cụ thể được dẫn xuất từ đối tượng Document. Chúng hỗ trợ tất cả những gì đối tượng Document hỗ trợ cộng với các phương thức và thuộc tính bổ sung cụ thể cho loại tài liệu đó. Ví dụ, từ đối tượng Document, bạn có thể nhận được tên tệp, tài liệu tham chiếu và thông tin iProperty. Từ một đối tượng PartDocument, bạn có thể nhận được tất cả những điều đó, cộng với bạn có thể nhận được các bản vẽ, các đặc điểm và các tham số. Một ví dụ khác là đối tượng PartFeature. Đây là đối tượng lớp cơ bản cho tất cả các tính năng. Một lần nữa, nó có thể đại diện cho bất kỳ tính năng phần nào và hỗ trợ các chức năng chung cho tất cả các tính năng. Đoạn mã dưới đây minh họa cho khái niệm này khi sử dụng. Nó kiểm tra mọi tính năng trong phần đang hoạt động và bỏ vô hiệu hóa bất kỳ tính năng nào đang bị vô hiệu hóa.

Public Sub SuppressOff()
    ' Get the active part document.  Assumes a part is active.
    Dim partDoc As PartDocument
    Set partDoc = ThisApplication.ActiveDocument
    
    ' Iterate through all of the features.
    Dim feature As PartFeature
    For Each feature In partDoc.ComponentDefinition.Features
        ' Check to see if the feature is suppressed.
        If feature.Suppressed Then
            ' Unsuppress the feature.
            feature.Suppressed = False
        End If
    Next
End Sub

Trong ví dụ trên, biến feature được khai báo dưới dạng kiểu PartFeature. Đây là đối tượng lớp cơ bản cho tất cả các tính năng. Sau đó, nó lặp lại qua tất cả các tính năng trong part. Tất cả các tính năng có thể bị vô hiệu hóa, vì vậy thuộc tính Suppressed được hỗ trợ bởi đối tượng lớp cơ bản PartFeature. Ví dụ này kiểm tra trạng thái vô hiệu hóa của mỗi tính năng và bỏ vô hiệu hóa bất kỳ tính năng nào bị vô hiệu hóa bằng cách đặt thuộc tính Suppressed thành False.

Nếu lớp cơ bản PartFeature không tồn tại, để thực hiện điều tương tự bạn sẽ phải viết một vòng lặp tương tự cho mỗi loại tính năng. Khi các tính năng mới được thêm vào trong các phiên bản mới, bạn sẽ phải cập nhật code của mình để tính đến chúng. Việc có một lớp cơ sở đại diện cho bất kỳ loại tính năng nào giúp cho chương trình của bạn trở nên đơn giản hơn nhiều.

Nếu bạn cần thông tin cụ thể về một loại tính năng nhất định thì bạn sử dụng loại tính năng cụ thể đó. Ví dụ, nếu bạn cần lấy độ sâu của một extrusion bạn sử dụng đối tượng ExtrudedFeature, đối tượng này cung cấp các thông tin bổ sung cụ thể cho các tính năng extruded.

Thật không may, một danh sách về những gì là các lớp cơ bản và dẫn xuất là một lĩnh vực của API không được ghi chép lại tốt. Lý tưởng nhất, một biểu đồ khác, ngoài biểu đồ hệ thống đối tượng, sẽ tồn tại để hiển thị phân loại lớp này. Tài liệu tốt nhất hiện có mà mô tả các mối quan hệ này là biểu đồ mô hình đối tượng (object model diagram).

Công cụ lập trình

Có các công cụ sẵn có để giúp bạn khi làm việc với API của Inventor. Dưới đây là mô tả về mỗi công cụ này.

Object Browser

Đây là một công cụ mà bạn muốn tận dụng khi làm việc với API của Inventor. Bạn truy cập nó từ môi trường lập trình VBA bằng cách nhấn phím F2, nút Trình duyệt Đối tượng

Object Browser Button

, hoặc chọn Trình duyệt Đối tượng từ menu View. Trình duyệt Đối tượng được hiển thị như dưới đây.

Cột bên trái của trình duyệt, có tiêu đề “Lớp” (“Classes”), chứa một danh sách của tất cả các đối tượng có sẵn trong các thư viện được gắn kết hiện tại. Trong danh sách thả xuống ở phía trên bên trái của trình duyệt, “” trong ví dụ ở trên, bạn có thể chỉ định một thư viện cụ thể để giới hạn danh sách chỉ đến các đối tượng trong thư viện đó. Trong ví dụ này, lớp ExtrudeFeature đã được chọn.

Cột bên phải hiển thị một danh sách các phương thức, thuộc tính, và sự kiện được hỗ trợ bởi lớp đã chọn. Việc chọn một trong những mục này sẽ hiển thị thông tin về hàm đó ở dưới cùng của trình duyệt đối tượng. Trong ví dụ trên, thuộc tính HealthStatus đã được chọn. Ở dưới cùng của hộp thoại, chúng ta biết rằng thuộc tính này trả về một giá trị HealthStatusEnum. (Các giá trị Enum là danh sách các giá trị cũng được định nghĩa trong thư viện kiểu của Inventor.) Chúng ta cũng biết rằng thuộc tính này chỉ có thể đọc, có nghĩa là chúng ta có thể lấy giá trị nhưng không thể thay đổi nó. Một mô tả ngắn về hàm được chọn cũng được hiển thị ở dưới cùng của trình duyệt. Trợ giúp trực tuyến rất hữu ích khi kết hợp với trình duyệt vì nó được liên kết với ngữ cảnh. Nhấn F1 tại điểm này sẽ đưa ra trang trợ giúp cho thuộc tính HealthStatus.

Dưới đây là thêm ví dụ về thông tin được hiển thị ở dưới cùng của trình duyệt đối tượng và cách hiểu thông tin này. Trong ví dụ dưới đây, thuộc tính Name của đối tượng ExtrudeFeature đã được chọn. Thuộc tính trả về một chuỗi. Lưu ý rằng khác với ví dụ trước, nó không nói rằng nó chỉ có thể đọc nên thuộc tính này là đọc-viết. Sử dụng thuộc tính này, bạn có thể lấy tên của tính năng và bạn cũng có thể gán một chuỗi cho thuộc tính này để đặt tên cho tính năng.

Thuộc tính Item của một đối tượng bộ sưu tập đã được thảo luận trước đó. Hãy nhớ rằng bạn luôn có thể sử dụng một giá trị làm chỉ số để lấy một mục cụ thể và đôi khi bạn cũng có thể sử dụng tên của mục đó. Hai ví dụ dưới đây cho thấy một kỹ thuật để xác định xem việc sử dụng tên có được hỗ trợ hay không. Ví dụ đầu tiên là cho bộ sưu tập ExtrudeFeatures. Nó cho thấy thuộc tính Item có một đối số được gọi là index. Lưu ý rằng nó không nói rõ loại đối số này là gì. Khi loại không được chỉ định, điều đó có nghĩa là nó là một Variant. Một Variant là một loại đặc biệt có thể đại diện cho bất kỳ loại biến nào. Trong trường hợp này, index là một Variant để cho phép bạn cung cấp cả Long hoặc String. Thường, như trong trường hợp này, điều này cũng được chỉ ra trong mô tả và trong trợ giúp trực tuyến. Trong ví dụ thứ hai, index được chỉ định là một giá trị Long. Trong trường hợp này, bạn chỉ có thể cung cấp một giá trị. Việc cung cấp một chuỗi sẽ gây ra một lỗi.

Dưới đây là một đặc trưng phức tạp hơn và nhiều thông tin hơn về những gì có thể được học bằng cách nhìn vào đặc trưng trong trình duyệt đối tượng. Chúng ta sẽ sử dụng phương thức AddSpiral của đối tượng bộ sưu tập CoilFeatures. Phương thức này có một số đối số. Đối số đầu tiên được gọi là Profile và yêu cầu một đối tượng Profile như đầu vào. Đối số thứ hai gọi là AxisEntity không có một loại cụ thể mà sẽ chấp nhận bất kỳ đối tượng nào. Điều này có nghĩa là phương thức cụ thể này sẽ chấp nhận nhiều hơn một loại đối tượng cho đối số này nên không thể chỉ định một loại cụ thể. Trong ví dụ này, nó có thể là một đường viền sketch hoặc trục làm việc (work axis). Đối số Pitch không hiển thị loại vì nó là một Variant. Trong trường hợp này, bạn có thể sử dụng hoặc một Double chỉ định Pitch trong centimet hoặc bạn có thể sử dụng một String và chỉ định một phương trình có thể bao gồm giá trị tham số. Điều tương tự cũng đúng cho đối số Revolution; nó có thể là một Double hoặc một String. Đối số Operation mong đợi một giá trị từ một danh sách enum. Hai đối số cuối cùng là tùy chọn. Trong trường hợp này, cả hai đều là đối số Boolean và cả hai mặc định là False nếu không được cung cấp. Để biết thêm chi tiết về tất cả các chức năng và đối số của chúng, bạn có thể sử dụng trợ giúp API. Bạn có thể dễ dàng truy cập trợ giúp cho một đối tượng hoặc chức năng cụ thể bằng cách nhấn F1 khi sử dụng trình duyệt đối tượng.

Sử dụng VBA Debugger

Một công cụ rất hữu ích khác khi làm việc với API của Inventor là bộ gỡ lỗi VBA. Trong trường hợp này, chúng ta không sử dụng nó để gỡ lỗi một chương trình mà sử dụng một số tính năng của bộ gỡ lỗi để hiểu rõ hơn về mô hình đối tượng của Inventor. Để sử dụng bộ gỡ lỗi, chúng ta cần đang chạy một chương trình. May mắn thay, chúng ta không cần một chương trình nhiều để cho phép truy cập vào các đối tượng Inventor. Các bước cụ thể để sử dụng bộ gỡ lỗi được liệt kê dưới đây.

  1. Trong bất kỳ mô-đun mã nào, tạo một sub như sub Test được hiển thị dưới đây.
  2. Nhấp chuột bất kỳ nơi nào trong sub và nhấn F8 để bước vào mã. Bây giờ bạn đang chạy sub từng dòng một.
  3. Nhấp chuột bất kỳ nơi nào trong từ “ThisApplication”.
  4. Chạy lệnh Quick Watch từ menu Debug và nhấp vào “Add” trong hộp thoại Quick Watch.
  5. Cửa sổ gỡ lỗi sẽ xuất hiện và ThisApplication sẽ xuất hiện trong cửa sổ gỡ lỗi. Điều này đại diện cho một cái nhìn trực tiếp của đối tượng Ứng dụng Inventor (Inventor Application object). Bạn có thể nhấp vào dấu “+” bên cạnh ThisApplication để mở rộng nó và xem các thuộc tính và giá trị của chúng. Các thuộc tính trả về các đối tượng khác cũng sẽ có dấu “+” bên cạnh chúng, cho phép bạn tiếp tục mở rộng các đối tượng và xem các thuộc tính của chúng. Điều này cung cấp một cái nhìn trực tiếp về mô hình đối tượng (object model).

VBA Trong Autodesk Inventor

Visual Basic for Applications (VBA) của Microsoft được tích hợp vào Inventor. VBA là một công cụ phát triển mạnh mẽ để tùy chỉnh Inventor và tích hợp Inventor với các ứng dụng và dữ liệu khác. Visual Basic là một trong những công cụ phát triển phổ biến nhất hiện nay trên thế giới. Có một số phiên bản khác nhau của Visual Basic. Visual Basic 6 là phiên bản cuối cùng của môi trường phát triển cũ và đã được thay thế bằng VB.Net để tạo các add-in và các chương trình thực thi. VBA cung cấp các chức năng tương tự như VB 6 nhưng tích hợp môi trường phát triển vào ứng dụng chủ (host applciation). Trong trường hợp này, môi trường phát triển VBA được tích hợp vào Inventor. VBA được cung cấp như một phần của Inventor mà không tốn thêm chi phí nào, vì vậy bất kỳ ai sử dụng Inventor đều có khả năng viết và sử dụng các macro VBA. VBA không tạo ra các ứng dụng độc lập, mà luôn chạy từ bên trong Inventor. VBA là ngôn ngữ lập trình được sử dụng cho Microsoft Word và Excel cũng như nhiều ứng dụng phổ biến khác. Nếu bạn đã sử dụng VBA để viết các chương trình cho các ứng dụng khác, bạn đã biết ngôn ngữ VBA và môi trường lập trình. Để sử dụng nó trong Inventor, bạn chỉ cần học API của Inventor. Nếu bạn chưa sử dụng VBA trong các ứng dụng khác, việc học nó trong Inventor sẽ giúp bạn bắt đầu tùy chỉnh các ứng dụng khác hỗ trợ VBA.

Autodesk Inventor’s VBA

VBA được cung cấp bởi Microsoft và tích hợp vào Inventor. Mặc dù VBA là một công cụ phổ quát, nó có thể được tùy chỉnh một chút để đáp ứng nhu cầu của ứng dụng cụ thể mà nó tích hợp vào. Phần này sẽ thảo luận về những điều đặc biệt của việc tích hợp VBA vào Inventor. Thông tin về chức năng chung của VBA có thể được tìm thấy trong trợ giúp VBA do Microsoft cung cấp.

VBA cho phép bạn tạo các biểu mẫu, các module lớp và các module mã (forms, class modules, and code modules). Các module này được chứa trong các dự án. Trong hầu hết các môi trường phát triển, một dự án chứa toàn bộ mã nguồn được sử dụng để tạo ra một thành phần độc lập duy nhất. Vì VBA không tạo ra các thành phần độc lập, các dự án được sử dụng một cách khác biệt một chút. Một dự án VBA chỉ là một bộ chứa cho các module khác nhau. Do đó, một dự án VBA duy nhất có thể chứa rất nhiều chức năng không liên quan. Bất kỳ số lượng chức năng nào cũng có thể được viết trong một dự án duy nhất và thực thi một cách độc lập.

VBA của Inventor hỗ trợ ba loại dự án: tài liệu, ứng dụng và người dùng (document, application, and user). Sự khác biệt chính giữa các loại dự án này là vị trí mà dự án VBA được lưu trữ. Các dự án tài liệu được lưu trữ trong tài liệu Inventor. Các dự án ứng dụng và người dùng được lưu trữ trong các file bên ngoài. Bởi vì Inventor hỗ trợ việc lưu các dự án VBA trong các tài liệu Inventor hoặc trong các file bên ngoài, bạn có thể quyết định phương pháp nào phù hợp hơn cho tình hình cụ thể của bạn. Dưới đây là một số yếu tố cần xem xét khi đưa ra quyết định này.

Document Projects (Lưu trong Document)

Các dự án tài liệu cho phép bạn dễ dàng gửi mã nguồn cụ thể cho một tài liệu cùng với tài liệu đó. Ví dụ, nếu bạn có một bộ phận tiêu chuẩn được sử dụng để tạo các thành viên của một gia đình (members of a family) của các part, bạn có thể viết một chương trình để thiết lập các tham số của phần để tạo ra các thành viên gia đình khác nhau. Rất thuận tiện khi nhúng chương trình này vào tài liệu Inventor để chương trình sẽ luôn có sẵn cùng với tài liệu part.

Application and User Projects (Lưu trong file ngoài .ivb)

  • Cho phép các chương trình dễ dàng được chia sẻ giữa các tài liệu. Thường thì các chương trình được viết để tự động hóa các công việc lặp đi lặp lại. Sự hữu ích của những chương trình này không giới hạn trong một tài liệu cụ thể. Với một dự án ứng dụng hoặc người dùng, những chương trình này trở nên có sẵn cho tất cả các tài liệu.
  • Cho phép mã được chia sẻ dễ dàng với các người dùng khác. Một người có thể viết một chương trình, có thể bao gồm nhiều chức năng và biểu mẫu, và sau đó gửi dự án đó cho bất kỳ ai khác, người đó có thể tải dự án và truy cập vào các chức năng một cách dễ dàng. Không cần công việc phụ thêm. Trái lại, nếu bạn muốn chia sẻ một dự án tài liệu với người dùng khác, bạn cần gửi cho họ tài liệu Inventor chứa chương trình nhúng và họ phải sao chép và dán mã vào tài liệu Inventor mong muốn. Hoặc bạn có thể xuất từng module dưới dạng các tệp .frm, .bas và .cls và gửi chúng. Những tệp này sau đó có thể được nhập vào môi trường VBA của tài liệu Inventor nơi chúng cần. Như bạn có thể thấy, các dự án ứng dụng và người dùng cung cấp một cơ chế đơn giản hơn nhiều cho việc chia sẻ mã và tái sử dụng.
  • Cho phép quản lý mã nguồn dễ dàng hơn. Toàn bộ mã nguồn được chứa trong một tệp duy nhất, điều này làm cho việc cập nhật dễ dàng hơn nhiều. Trong trường hợp của các dự án tài liệu, mỗi tài liệu cần chức năng đều có chương trình nhúng bên trong nó. Khi chương trình được cập nhật và các lỗi được sửa, việc theo dõi xem tài liệu nào chứa chương trình và phiên bản nào của chương trình trong đó có thể rất khó khăn.

Cho đến nay, tất cả các hành vi chúng ta đã thảo luận khiến cho dự án ứng dụng và người dùng có vẻ giống nhau. Điều này chủ yếu là đúng, nhưng điểm khác biệt chính giữa chúng là cách chúng được tải vào môi trường VBA. Inventor sẽ tự động tải dự án ứng dụng mỗi khi người dùng bắt đầu Inventor. Điều này khiến cho các macro trong một dự án ứng dụng luôn có sẵn. Chỉ có thể xác định một dự án để làm dự án ứng dụng. File dự án được xác định là dự án ứng dụng sử dụng hộp thoại Tùy chọn Ứng dụng của Inventor, như được hiển thị dưới đây. Trường “Dự án VBA mặc định” trên tab File xác định dự án người dùng nào sẽ được sử dụng làm dự án ứng dụng.

Các dự án người dùng không được tải tự động mà phải được tải thủ công bằng cách sử dụng lệnh “Tải Dự án” trong menu File của VBA trong Inventor (Trong Inventor, chọn tab Tool, sau đó VBA Editor, sau đó File | Load Project…). Các dự án người dùng mới cũng có thể được tạo bằng cách sử dụng lệnh “New Project” trong menu File của VBA. Không có giới hạn về số lượng dự án người dùng có thể được tải.

Giao diện VBA của Inventor được truy cập bên trong Inventor thông qua lệnh VBA Editor trong tab Tool của thanh Ribbon. Lệnh Macros cho phép bạn chạy các macro hiện có và mở trình soạn thảo đến một macro cụ thể. Hai lệnh cũng có sẵn bằng các phím tắt Alt+F8 và Alt+F11.

Trước khi đi xa hơn, hãy định nghĩa một số thuật ngữ. Một Sub (Subroutine) đơn giản là một hàm mà không có giá trị trả về. Mã được bao quanh bởi các câu lệnh Sub và End Sub. Một Sub có thể có các đối số có thể là đầu vào và đầu ra nhưng nó không có giá trị trả về. Một macro là một trường hợp đặc biệt của một Sub mà không có bất kỳ đối số nào. Bất kỳ Sub nào không có đối số sẽ được coi là macro. Ví dụ, đoạn mã sau sẽ được VBA xem xét như một macro.

Public Sub SampleMacro()
    MsgBox "This is a sample."
End Sub

Lệnh “Running the Macros” trong Inventor hiển thị hộp thoại như dưới đây. Hộp thoại này hiển thị danh sách tất cả các macro hiện có. Danh sách này có thể được lọc bằng cách sử dụng hộp combo “Macros in”. Điều này cho phép bạn liệt kê các macro chứa trong một dự án cụ thể (dự án tài liệu, người dùng hoặc ứng dụng), hoặc liệt kê tất cả các macro trong tất cả các dự án đã tải.

Khi một macro được chọn từ danh sách, tất cả các nút ở bên phải, ngoại trừ một, đều được kích hoạt. Dưới đây là mô tả về hành vi của mỗi nút.

  • Run (Chạy) – Macro được chọn được thực thi mà không hiển thị môi trường lập trình VBA.
  • Cancel (Hủy) – Đóng hộp thoại.
  • Step Into (Bước vào) – Mở môi trường lập trình VBA và bắt đầu chạy macro được chọn bằng cách bước vào từng bước. Điều này hữu ích khi gỡ lỗi một macro.
  • Edit (Chỉnh sửa) – Mở môi trường lập trình VBA với con trỏ được đặt tại dòng đầu tiên của macro được chọn.
  • Create (Tạo) – Nếu một macro hiện có được chọn, nút này sẽ bị vô hiệu hóa. Nếu một tên mới được nhập vào trường “Tên macro”, nút này trở thành được kích hoạt và khi được nhấn sẽ tạo ra một macro với tên được chỉ định.
  • Delete (Xóa) – Xóa macro được chọn. Điều này sẽ loại bỏ hàm từ dự án.

Khi chạy lệnh “Running the VBA Editor” trong Inventor, một môi trường lập trình VBA được mở ra. Điều này thường được biết đến là “Môi trường Phát triển Tích hợp” hoặc IDE. Trong VBA IDE là “Project Explorer” cung cấp một chế độ xem giống như trình duyệt của các dự án đang mở, như được hiển thị dưới đây.

Trong Project Explorer, có một số khái niệm quan trọng về tích hợp VBA của Inventor được minh họa. Đầu tiên là “Dự án ứng dụng” (Application project). Như đã thảo luận trước đó, đây là một file dự án được lưu trữ trong một file bên ngoài và được tải tự động mỗi khi Inventor được chạy. Tên của file dự án được hiển thị trong dấu ngoặc đơn bên cạnh tên của dự án.

Dự án thứ hai trong danh sách là một dự án tài liệu (document project). Tên của tài liệu mà dự án được nhúng vào được hiển thị trong dấu ngoặc đơn bên cạnh tên của dự án. Dự án tài liệu được hiển thị cho các tài liệu hiện đang mở trong Inventor. Một sự khác biệt giữa dự án người dùng và dự án tài liệu mà có thể thấy khi xem Project Explorer là dự án tài liệu cho phép truy cập vào đối tượng “ThisDocument”. Điều này đại diện cho tài liệu chứa macro. Viết mã trong mô-đun ThisDocument cho phép truy cập trực tiếp vào tài liệu Inventor. Ví dụ, đoạn mã sau là hợp lệ trong mô-đun ThisDocument.

Public Sub DocDisplayName()
    Dim sDocDisplayName As String
    sDocDisplayName = DisplayName
End Sub

DisplayName là một thuộc tính của đối tượng Document. Khi viết mã trong mô-đun ThisDocument, các phương thức và thuộc tính của tài liệu có sẵn một cách trực tiếp. Tài liệu cũng có sẵn trong các mô-đun khác của dự án bằng cách sử dụng biến toàn cục ThisDocument. Ví dụ, đoạn mã dưới đây có thể được sử dụng trong các mô-đun khác của một dự án Tài liệu.

Public Sub DocDisplayName ()
    Dim sDocDisplayName As String
    sDocDisplayName = ThisDocument.DisplayName
End Sub

Biến toàn cục ThisDocument không khả dụng trong các dự án ứng dụng và người dùng. Trong các dự án này, cũng như trong các dự án tài liệu, bạn có thể sử dụng biến toàn cục “ThisApplication”. Điều này cung cấp truy cập trực tiếp vào đối tượng ứng dụng của Inventor. Mẫu mã sau có thể được sử dụng trong cả các dự án người dùng và ứng dụng để lấy tên hiển thị của tài liệu đang hoạt động hiện tại.

Public Sub DocDisplayName ()
    Dim sDocDisplayName As String
    sDocDisplayName = ThisApplication.ActiveDocument.DisplayName
End Sub

Autodesk Inventor: Tạo Một Add-In Inventor

Add-In Inventor là gì?

Chức năng Add-In Inventor là một cách để chương trình kết nối với Inventor và sử dụng API của nó. Các cách phổ biến khác để truy cập API của Inventor là từ VBA của Inventor và từ một exe bên ngoài. Tất cả đều là những cách hợp lệ để sử dụng API của Inventor và mỗi cách đều là có những ưu điểm và nhược điểm riêng. Việc sử dụng cái nào sẽ phụ thuộc vào chương trình của bạn cần làm gì và người dùng cuối sẽ sử dụng nó như thế nào. Các Add-In thường được sử dụng trong trường hợp bạn muốn thêm chức năng mới vào Inventor ở dạng lệnh tùy chỉnh. Add-In có các khả năng sau khiến chúng trở nên lý tưởng cho việc này.

  • Các Add-In được tải tự động khi khởi động Inventor. Hành động đơn giản này cung cấp một số khả năng mạnh mẽ. Đầu tiên, khi một phần bổ trợ đã được cài đặt trên máy tính, người dùng không cần phải làm bất kỳ điều gì đặc biệt hoặc biết bất kỳ điều gì về lập trình để có thể sử dụng có thể truy cập các khả năng mà nó cung cấp. Thứ hai, nó cho phép bổ trợ thêm giao diện người dùng của nó vào Inventor, tức là các ribbon button, tab trình duyệt, v.v. Thứ ba, bổ trợ có thể kết nối với các sự kiện để theo dõi và phản hồi với người dùng. hoạt động trong Inventor.
  • Các Add-In chạy trong quá trình của Inventor, mang lại hiệu suất tốt hơn nhiều so với exe bên ngoài.
  • Add-Ins có thể được viết bằng bất kỳ ngôn ngữ phổ biến nào để bạn không bị giới hạn trong việc sử dụng ngôn ngữ mà bạn không quen thuộc hoặc có thể đã lỗi thời nhưng có thể tận dụng các công nghệ lập trình mới nhất hiện có.

Tạo Một Add-In

Để tạo một add-in, bạn cần sử dụng Visual Studio. Mọi phiên bản đều được hỗ trợ. Có thể tạo add-in bằng bất kỳ ngôn ngữ nào hỗ trợ tạo thành phần dll COM, nhưng tất cả các mẫu và công cụ được cung cấp cùng với SDK. bị giới hạn ở Visual Basic, C# và C++. Có thể tạo các add-in bằng phiên bản Express miễn phí nhưng có một số hạn chế nghiêm trọng, chẳng hạn như không thể gỡ lỗi trong Visual Basic Express 2010. Vì điều này nên sử dụng phiên bản professional. Các phiên bản Express đủ để phát triển các tập tin thực thi độc lập và là một lựa chọn tuyệt vời để bắt đầu với API của Inventor. Nhưng để phát triển add-in, bạn nên dự định sử dụng Visual Studio Professional. Lựa chọn sử dụng một trong các phiên bản khác của Visual Studio với nhiều tính năng hơn phiên bản Professional sẽ hoàn toàn dựa trên nhu cầu của bạn và không phải là một yêu cầu của Inventor.

Đối với bước tiếp theo, hãy sử dụng mẫu Add-In của Inventor trong Visual Studio để tạo add-in của bạn. Để sử dụng mẫu add-in, bạn cần cài đặt SDK và sau đó cài đặt các wizard. Vị trí và hướng dẫn cài đặt cho SDK được mô tả trong bản tóm lược Inventor’s Programming Interface của Inventor.

Sau khi cài đặt các wizard add-in, bạn có thể tạo một dự án mới trong Visual Studio bằng cách chọn mẫu Autodesk Inventor AddIn như được hiển thị dưới đây. Ở phía trái của hộp thoại, bạn có thể cần chọn nút cấp cao nhất trong cây cho ngôn ngữ bạn đang sử dụng để xem tất cả các mẫu có sẵn.

Dự án được tạo bằng template là một add-in mẫu. Khi Inventor khởi động add-in của bạn, nó bắt đầu bằng cách gọi phương thức Activate, như được hiển thị trong hình dưới đây. Một điều quan trọng xảy ra trong cuộc gọi này, một đối tượng được truyền vào add-in của bạn thông qua đối số addInSite của phương thức Activate. Đối tượng này hỗ trợ một thuộc tính ứng dụng mà add-in của bạn có thể sử dụng để truy cập vào đối tượng Ứng dụng của Inventor và toàn bộ API. Bạn sẽ nhận thấy rằng mẫu đang gán tham chiếu được trả về bởi thuộc tính Application cho một biến thành viên cục bộ để add-in có thể duy trì một tham chiếu đến đối tượng Ứng dụng. Thông thường, trong phương thức Activate là nơi mà add-in của bạn sẽ thêm giao diện người dùng của nó vào giao diện người dùng của Inventor bằng cách sử dụng API của Inventor. Nó cũng sẽ kết nối với bất kỳ sự kiện nào mà nó cần theo dõi. Sau khi đã được tải và đang chạy, add-in không làm gì ngoài việc phản ứng lại các sự kiện khi chúng xảy ra. Ví dụ, nó sẽ phản ứng lại khi người dùng nhấp chuột vào một trong các lệnh tùy chỉnh của nó.

Để nhanh chóng kiểm tra xem việc sử dụng mẫu add-in đã dẫn đến việc tạo ra một add-in hoạt động, bạn có thể biên dịch dự án như hiện tại. Điều này sẽ biên dịch add-in của bạn thành một tập tin dll. Bước tiếp theo là làm cho add-in của bạn được biết đến trong Inventor.

Làm cho Add-In của Bạn Được Biết Đến trong Inventor

Mỗi khi Inventor khởi động, nó tìm kiếm các add-in đã được cài đặt và tải chúng. Trong các phiên bản cũ của Inventor trước năm 2012, nó sử dụng registry để tìm kiếm các add-in. Phương pháp tìm kiếm dựa trên registry này vẫn được hỗ trợ cho các add-in cũ, nhưng một phương pháp mới không cần sử dụng registry để làm cho add-in của bạn được biết đến trong Inventor đã được hỗ trợ và được khuyến nghị sử dụng. Khi một add-in được tạo bằng mẫu add-in, một add-in không cần sử dụng registry được tạo ra.

Để cho phép add-in của bạn được tìm thấy bởi Inventor, bạn cần đặt một tập tin đặc biệt trong một trong vài thư mục khác nhau. Tệp này mô tả add-in của bạn và cũng chỉ ra nơi tập ti dll của add-in của bạn đang nằm trên máy tính. Khi Inventor được khởi động, nó quét các thư mục này và đọc các tập tin này để xác định add-in nào sẽ được tải.

Tập tin mà Inventor tìm kiếm có phần mở rộng .addin. Một tập tin .addin đã được tự động tạo cho bạn khi bạn tạo dự án add-in của mình, như được minh họa dưới đây.

Nội dung của tập tin .addin được hiển thị dưới đây. Như bạn có thể thấy, nó sử dụng xml để định dạng dữ liệu.

<Addin Type="Standard">
<!--Created for Autodesk Inventor Version 17.0--> 
<ClassId>{51e6ad8e-5eaa-42a1-b845-a68802a26bf7}</ClassId>
<ClientId>{51e6ad8e-5eaa-42a1-b845-a68802a26bf7}</ClientId>
<DisplayName>SampleAddIn</DisplayName>
<Description>SampleAddIn</Description> 
<Assembly>SampleAddIn.dll</Assembly>
<OSType>Win64</OSType>
<LoadAutomatically>1</LoadAutomatically> 
<UserUnloadable>1</UserUnloadable>
<Hidden>0</Hidden> 
<SupportedSoftwareVersionGreaterThan>16..</SupportedSoftwareVersionGreaterThan>
<DataVersion>1</DataVersion> 
<LoadBehavior>2</LoadBehavior> 
<UserInterfaceVersion>1</UserInterfaceVersion>
</Addin>

Dưới đây mô tả các phần tử khác nhau của tập tin .addin:

  • Addin – (Bắt buộc) Phần tử ngoài cùng để bao gồm tất cả các phần tử khác. Thuộc tính Type xác định loại addin, các giá trị hợp lệ là “Standard” và “Translator”.
  • ClassId – (Bắt buộc) Xác định GUID ClassId liên kết với một Add-in. Điều này có thể thay đổi hoặc không từ một phiên bản sang phiên bản khác. Nếu bạn xem mã add-in của mình, bạn sẽ thấy điều này được chỉ định là một GuidAttribute cho lớp add-in của bạn. Trong hầu hết các trường hợp, bạn không cần phải làm gì ngoài việc sử dụng cái được cung cấp.
  • ClientId – (Bắt buộc) Xác định GUID được sử dụng như là định danh của add-in. Giá trị này nên được giữ nguyên không đổi qua các phiên bản và các phiên bản khác nhau của add-in. Giá trị này được sử dụng để xác định chủ sở hữu của các đối tượng được tạo bằng API như ribbon, thanh công cụ, v.v. Trong hầu hết các trường hợp, điều này sẽ giống như ClassId.
  • DisplayName – (Bắt buộc) Xác định tên hiển thị của add-in như nó sẽ xuất hiện trong trình quản lý Add-in. Thuộc tính Language có thể được chỉ định cho các ngôn ngữ địa phương, nếu không được chỉ định, nó mặc định thành tiếng Anh.
  • Description – (Bắt buộc) Đây là mô tả của add-in của bạn và được hiển thị ở dưới cùng của hộp thoại Trình quản lý Add-In khi add-in được chọn từ danh sách. Thuộc tính Language có thể được chỉ định cho các ngôn ngữ địa phương, nếu không được chỉ định, nó mặc định thành tiếng Anh.
  • Assembly – Đây là đường dẫn đến tập tin dll của add-in của bạn. Đây có thể là một đường dẫn đầy đủ hoặc một đường dẫn tương đối liên quan đến vị trí của tệp .addin của bạn. Nó cũng có thể là tương đối với thư mục Inventor\bin, tuy nhiên vì bạn không được phép cài đặt vào thư mục đó với quyền quản trị viên, nên không khuyến khích sử dụng thư mục đó.
  • OSType – (Tùy chọn) Xác định nếu add-in của bạn chỉ hoạt động với hệ điều hành 64 hoặc 32 bit. Các giá trị hợp lệ cho điều này là “Win32” hoặc “Win64”. Nếu giá trị này không được chỉ định, nó được giả định rằng add-in là hợp lệ cho cả hai.
  • LoadAutomatically – (Tùy chọn) Xác định xem add-in có được phép tải tự động theo các hành vi tải được xác định bởi add-in không. Giá trị có thể là 0 hoặc 1. Nếu không được chỉ định, giả định là true (1). Nếu được đặt thành false (0), add-in cần phải được tải thủ công bằng cách sử dụng trình quản lý Add-in.
  • LoadBehavior – (Tùy chọn) Xác định khi nào add-in sẽ được tải trong Inventor. Điều này quan trọng để có hiệu suất khởi động tốt hơn. Tùy chọn này có thể được chỉ định bằng một trong các giá trị sau:

0 – Tải ngay khi khởi động (không khuyến khích)
1 – Tải khi bất kỳ document nào được mở
1 – Tải khi một part document được mở (giống như trước đó)
2 – Tải khi một assembly document được mở
3 – Tải khi một presentation document được mở
4 – Tải khi một drawing document được mở
10 – Chỉ tải khi được yêu cầu, thông qua API hoặc sử dụng Trình quản lý Add-In.

Giả định là 0 nếu giá trị này không được chỉ định.

UserUnloadable – (Tùy chọn) Xác định liệu add-in có được phép tải tự động theo các hành vi tải được xác định bởi add-in hay không. Giá trị có thể là 0 hoặc 1. Giả định là đúng (1) nếu giá trị này không được chỉ định. Nếu đặt thành sai (0), add-in cần được tải thủ công bằng cách sử dụng trình quản lý add-in.

Hidden – (Tùy chọn) Xác định liệu add-in có nên được ẩn trong danh sách add-in của Trình quản lý Add-in hay không. Giả định là sai nếu giá trị này không được chỉ định (tức là add-in có thể nhìn thấy). Giá trị có thể là 0 hoặc 1.

SupportedSoftwareVersionEqualTo

SupportedSoftwareVersionGreaterThan

SupportedSoftwareVersionLessThan

SupportedSoftwareVersionNotEqualTo – (Tùy chọn) Xác định phiên bản(s) của Inventor mà add-in này nên có sẵn. Có thể sử dụng các kết hợp của chúng. Các giá trị này sẽ bị bỏ qua nếu tập tin manifest được đặt trong một thư mục cụ thể cho phiên bản. Các phiên bản được khai báo theo định dạng Major#.Minor#.ServicePack# / hoặc BuildIdentifier#. SupportedSoftwareVersionEqualTo và SupportedSoftwareVersionNotEqualTo hỗ trợ nhiều mục nhập phiên bản được phân tách bằng dấu chấm phẩy (;).

DataVersion – (Tùy chọn) Xác định phiên bản của dữ liệu add-in được chứa trong tài liệu Inventor mà phiên bản này của add-in hỗ trợ. Điều này được sử dụng bởi các add-in lưu trữ dữ liệu di động trong tài liệu Inventor, được chỉ ra bằng cách “DocumentInterests” được đặt trên tài liệu.

UserInterfaceVersion – (Tùy chọn) Xác định phiên bản của giao diện người dùng của add-in. Thay đổi phiên bản này sẽ làm cho tất cả giao diện người dùng của add-in được dọn dẹp trong quá trình khởi động Inventor.

Các yếu tố dưới đây đặc biệt dành cho các add-in translator.

FileExtensions – (Tùy chọn) Xác định các phần mở rộng tập tin mà add-in dịch có thể nhập từ hoặc xuất đến. Nếu có nhiều phần mở rộng tập tin được chỉ định, dấu phân cách chấm phẩy có thể được sử dụng giữa chúng. Dưới đây là mẫu để chỉ định FileExtensions:

<FileExtensions>.CATPart;.CATProduct;.cgr</FileExtensions>

FilterText – (Tùy chọn) Xác định văn bản bộ lọc cho add-in translator. Thuộc tính Ngôn ngữ có thể được chỉ định cho các ngôn ngữ địa phương, nếu không được chỉ định, nó mặc định thành tiếng Anh, ví dụ dưới đây thiết lập FilterText cho tiếng Pháp:

<FilterText Language=”1036″>Fichiers CATIA V5 (.CATPart;.CATProduct;*.cgr)</FilterText>

SupportsSaveCopyAs – (Tùy chọn) Xác định liệu add-in translator có hỗ trợ Lưu Bản Sao không. Giá trị có thể là 0 hoặc 1. Giả định là sai (0) nếu giá trị này không được chỉ định. Nếu đặt thành đúng (1), FilterText sẽ có sẵn trong hộp thoại Lưu Bản Sao.

SupportsSaveCopyAsFrom – (Tùy chọn) Xác định tài liệu nào add-in translator hỗ trợ xuất. Các giá trị hợp lệ là các phần mở rộng tài liệu Inventor với dấu chấm phẩy làm dấu phân cách. Dưới đây là mẫu để chỉ định SupportsSaveCopyAsFrom:

<SupportsSaveCopyAsFrom>.ipt;.iam</SupportsSaveCopyAsFrom>

SupportsOpen – (Tùy chọn) Xác định liệu add-in translator có hỗ trợ mở dữ liệu ngoại lai không. Giá trị có thể là 0 hoặc 1. Giả định là sai (0) nếu giá trị này không được chỉ định.

SupportsOpenInto – (Tùy chọn) Xác định tài liệu nào add-in translator hỗ trợ mở vào. Các giá trị hợp lệ là các phần mở rộng tài liệu Inventor với dấu chấm phẩy làm dấu phân cách. Dưới đây là mẫu để chỉ định SupportsOpenInto:

<SupportsOpenInto>.ipt;.iam</SupportsOpenInto>

SupportsImport – (Tùy chọn) Xác định liệu add-in translator có hỗ trợ nhập dữ liệu không. Giá trị có thể là 0 hoặc 1. Giả định là sai (0) nếu giá trị này không được chỉ định. Nếu đặt thành đúng (1), FilterText sẽ có sẵn trong hộp thoại Mở.

SupportsImportInto – (Tùy chọn) Xác định tài liệu nào add-in translator hỗ trợ nhập vào. Các giá trị hợp lệ là các phần mở rộng tài liệu Inventor với dấu chấm phẩy làm dấu phân cách. Dưới đây là mẫu để chỉ định SupportsImportInto:

<SupportsImportInto>.ipt;.iam</SupportsImportInto>

Nơi Đặt Các File Của Bạn

Bây giờ bạn đã có tập tin dll của add-in và đã tạo tập tin .addin, bạn cần biết nơi đặt những tập tin đó để Inventor có thể tìm và tải add-in của bạn.

Có bốn vị trí sau được hỗ trợ. Bạn có thể chọn bất kỳ một trong bốn tùy thuộc vào nhu cầu của add-in của bạn. Tập tin .addin của bạn có thể tồn tại trong bất kỳ một trong bốn vị trí sau đây hoặc trong bất kỳ thư mục con nào. Phần “%XXXX%” của mỗi đường dẫn là một biến được xác định bởi hệ điều hành. Khi sử dụng Explorer, bạn có thể nhập nó vào là một phần của đường dẫn và Explorer sẽ đánh giá nó để sử dụng đường dẫn thực tế được xác định bởi biến.

  1. All Users, Không phụ thuộc Version
    Windows 7/8.1/10 – %ALLUSERSPROFILE%\Autodesk\Inventor Addins\
  2. All Users, Phụ thuộc Version
    Windows 7/8.1/10 – %ALLUSERSPROFILE%\Autodesk\Inventor 20xx\Addins\
  3. Mỗi User, Phụ thuộc Version
    In Window 7/8.1/10 – %APPDATA%\Autodesk\Inventor 20xx\Addins\
  4. Mỗi User, Không phụ thuộc Version
    In Window 7/8.1/10 – %APPDATA%\Autodesk\ApplicationPlugins

Có một số điều cần xem xét khi xác định nơi đặt add-in của bạn. Nếu bạn chọn một vị trí có sẵn cho tất cả người dùng, nó sẽ yêu cầu quyền quản trị viên để cài đặt add-in của bạn. Trong hầu hết các trường hợp, máy tính hiếm khi được chia sẻ giữa nhiều người dùng nên cài đặt theo từng người dùng thường là đủ.

Nếu bạn có kế hoạch cập nhật thường xuyên cho add-in của mình cho mỗi phiên bản mới của Inventor thì việc làm cho nó phụ thuộc vào phiên bản có thể là lựa chọn tốt để người dùng chỉ có quyền truy cập vào add-in được viết cho và được kiểm tra với phiên bản của Inventor họ đang sử dụng. Bởi vì nỗ lực đáng kể được thực hiện để cho phép API tương thích với các phiên bản mới hơn, bạn nên có thể chạy các add-in cũ với các phiên bản mới hơn của Inventor. Do đó, bạn có thể cung cấp một add-in và không ràng buộc nó với một phiên bản cụ thể giả sử rằng nó sẽ tiếp tục hoạt động khi các phiên bản Inventor mới được phát hành.

Ngoài ra, vì bạn có thể chỉ định các phiên bản mà add-in của bạn tương thích trong tập tin .addin, bạn vẫn có thể sử dụng một vị trí .addin không phụ thuộc vào phiên bản và kiểm soát phiên bản thông qua tập tin .addin.

Triển khai Add-In bằng Cách Kéo và Thả

Một tính năng mới được thêm vào trong Inventor 2013 là khả năng tạo và triển khai một add-in chỉ bằng cách sao chép một thư mục vào một vị trí cụ thể trên máy tính của người dùng. Thay đổi được thực hiện để kích hoạt tính năng này là Inventor tìm kiếm các file .addin trong bốn thư mục ở trên và hiện giờ cũng tìm kiếm trong bất kỳ thư mục con nào trong bốn thư mục đó. Nếu bạn tạo một thư mục chứa file .addin và file dll của addin của bạn và thiết lập phần Assembly của file .addin của bạn để chỉ chứa tên của file dll của bạn mà không có bất kỳ đường dẫn nào, bạn có thể sao chép thư mục đó vào bất kỳ một trong bốn thư mục ở trên và Inventor sẽ tìm và tải addin của bạn. Dưới đây là một ví dụ về các thư mục và file cho một add-in có tên “MyAddin”. Đây là đường dẫn đầy đủ cho vị trí “%APPDATA%\Autodesk\ApplicationPlugins”.

Cũng có thể tạo cấu hình phức tạp hơn cho một loại add-in có thể kéo và thả. Ví dụ, bạn có thể có một add-in trong đó bạn có một file dll cho 32-bit và một file khác cho 64-bit. Bạn cũng có thể có một file dll dành cho một phiên bản cụ thể của Inventor và một file dll khác cho một phiên bản Inventor khác. Cấu trúc thư mục có thể hỗ trợ điều này được hiển thị dưới đây. Để hỗ trợ nhiều phiên bản của Inventor, bạn phải đặt thư mục trong một trong hai thư mục không phụ thuộc vào phiên bản. Một ví dụ về cách các thư mục có thể trông như cho một add-in như thế này được minh họa trong hình dưới đây. Điều đang xảy ra ở đây là bạn đang cung cấp bản add-in khác nhau bốn bản, mỗi bản có file .addin và dll riêng của nó. Phiên bản nào và hệ điều hành nào mà các add-in tải được kiểm soát bởi nội dung của file .addin cho mỗi add-in.

Debugging Add-In của Bạn

Sau khi bạn đã biên dịch add-in của mình và có một file dll, bạn sẽ cần tuân theo các bước dưới đây để kích hoạt chế độ gỡ lỗi. Với các add-in không yêu cầu đăng ký, không có sự khác biệt nào giữa việc gỡ lỗi với Inventor 32 hoặc 64-bit.

  1. Bạn cần sao chép file .addin của bạn và file dll của add-in vào một trong những vị trí mà Inventor tìm kiếm các file .addin, như mô tả ở trên. Điều này cho phép Inventor tìm thấy add-in của bạn.
  2. Bạn cần thay đổi cài đặt trong dự án của mình để khi bạn biên dịch dự án của mình, file dll được xuất ra thư mục ở trên. Điều này để Visual Studio và Inventor sử dụng cùng một file dll. Cài đặt dự án cần thay đổi được hiển thị dưới đây.

3. Bạn cần thiết lập cài đặt gỡ lỗi sao cho khi bạn bắt đầu dự án của mình từ Visual Studio, nó sẽ tự động khởi động Inventor. Cài đặt dự án cần thay đổi được hiển thị dưới đây.

Bây giờ bạn có thể thêm các điểm dừng vào add-in của mình và bắt đầu gỡ lỗi (F5) từ Visual Studio. Inventor sẽ bắt đầu chạy và các điểm dừng của bạn sẽ được kích hoạt khi những dòng đó được thực thi.

Viết Code Add-In của Bạn

Mã thực tế của add-in của bạn không có gì cụ thể cho một add-in mà sử dụng API của Inventor để tương tác với Inventor. Điều duy nhất hơi đặc biệt đối với một add-in là một số cuộc gọi API có một đối số cho ClientId. Đây là ClientID của add-in của bạn như được xác định trong file .addin của bạn. Điều này thường được sử dụng khi bạn đang tạo các thành phần giao diện người dùng trong Inventor. Inventor sử dụng điều này để nhớ rằng add-in nào đã tạo ra cái gì.

Chuyển đổi một Add-In Hiện có để Không Cần Đăng Ký vào Registry

Dưới đây là quá trình chuyển đổi một add-in tiêu chuẩn thành một add-in không cần đăng ký vào Registry. Vì quá trình này khác nhau tùy thuộc vào ngôn ngữ lập trình sử dụng, nên quá trình được mô tả cho Visual Basic, C# và VC++.

Làm cho Add-In của bạn bằng Visual Basic không cần đăng ký vào Registry

1.Tạo một file mới trong cùng thư mục với file dự án của bạn và đặt tên là “MyOEMApp.X.manifest”, trong đó MyOEMApp sẽ được thay thế bằng tên của add-in của bạn. Thêm đoạn sau vào file manifest. Các phần được làm nổi bật màu vàng cần được chỉnh sửa để phù hợp với add-in của bạn.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity name="MyOEMApp" version="1.0.0.0" />
  <clrClass clsid="{2bf59d73-5170-4524-b0e1-391760aaffa5}" 
            progid="MyOEMApp.StandardAddInServer" 
            threadingModel="Both" 
            name="MyOEMApp.MyOEMApp.StandardAddInServer" 
            runtimeVersion="" />
  <file name="MyOEMApp.dll" hashalg="SHA1" />
</assembly>

Thuộc tính “name” của phần tử clrClass bao gồm ba phần, được phân tách bởi dấu chấm. Phần đầu tiên là tên của không gian tên gốc, được làm nổi bật dưới đây.

Phần thứ hai là không gian tên mà lớp COM được định nghĩa bên trong. Trong ví dụ này, đó là MyOEMApp và được làm nổi bật dưới đây. Phần cuối cùng là tên của lớp thực hiện giao diện ApplicationAddInServer, trong trường hợp này là “StandardAddInServer” và cũng được làm nổi bật dưới đây.

2.Bước tiếp theo là thêm một quy trình sau khi xây dựng để tích hợp manifest này vào file dll của bạn. Quy trình sau khi xây dựng gọi mt.exe, một tiện ích của Microsoft sẽ nhúng manifest vào dll của add-in của bạn. Bạn định nghĩa một bước sau khi xây dựng thông qua tab Compile của hộp thoại Properties của ứng dụng. Trên tab Compile, nhấp vào nút “Build Events…” và sau đó trên hộp thoại “Build Events” nhấp vào nút “Edit Post-build…”. Cuối cùng, nhập các dòng dưới đây vào hộp thoại “Post-build Event Command Line”, như được hiển thị dưới đây; OEMTestAddin là tên của add-in của bạn.

call "%VS100COMNTOOLS%vsvars32"
mt.exe -manifest "$(ProjectDir)OEMTestAddin.X.manifest" -outputresource:"$(TargetPath)";#2

3.Loại bỏ bất kỳ mã nào liên quan đến việc đăng ký add-in trong registry. Thông thường, điều này chỉ đơn giản là loại bỏ các phương thức Register và Unregister khỏi lớp add-in của bạn. Thuộc tính AddInGuid nằm trong cùng vùng với các hàm đăng ký, vì vậy nếu bạn dự định sử dụng thuộc tính này trong các khu vực khác của add-in của bạn, bạn cần cẩn thận để không xóa nó.

Chuyển đến bước 4 dưới đây, bước này giống nhau cho tất cả các ngôn ngữ.

Làm cho Add-In của bạn bằng C# không cần đăng ký vào Registry

1.Tạo một file mới trong cùng thư mục với tệp dự án của bạn và đặt tên là “CSharpOEMAddIn.X.manifest”, trong đó CSharpOEMAddIn là tên của add-in của bạn. Thêm đoạn sau vào file manifest. Các phần được làm nổi bật màu vàng cần được chỉnh sửa để phù hợp với add-in của bạn.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity name="InvAddIn" version="1.0.0.0" />
  <clrClass clsid="{2bf59d73-5170-4524-b0e1-391760aaffa5}" 
            progid="CSharpOEMAddIn.StandardAddInServer" 
            threadingModel="Both" 
            name="CSharpOEMAddIn.StandardAddInServer" 
            runtimeVersion="" />
  <file name="InvAddIn.dll" hashalg="SHA1" />
</assembly>

Thuộc tính “name” của phần tử assemblyIdentity là tên của assembly, được làm nổi bật dưới đây.

Thuộc tính “name” của phần tử clrClass bao gồm hai phần, được phân tách bởi dấu chấm. Phần đầu tiên là tên của không gian tên mà lớp COM được định nghĩa trong đó. Trong ví dụ này, đó là CSharpOEMAddIn. Phần thứ hai là tên của lớp thực hiện giao diện ApplicationAddInServer, trong trường hợp này là “StandardAddInServer”. Cả hai đều được làm nổi bật dưới đây.

2.Bước tiếp theo là thêm một quy trình sau khi xây dựng để tích hợp manifest này vào file dll của bạn. Quy trình sau khi xây dựng gọi mt.exe, một tiện ích của Microsoft sẽ nhúng manifest vào dll của add-in của bạn. Bạn định nghĩa một bước sau khi xây dựng thông qua tab Build Events của hộp thoại Properties của ứng dụng. Trên tab Build Events, nhấp vào nút “Edit Post-build…”. Nhập chuỗi dưới đây vào hộp thoại “Post-build Event Command Line”, như được hiển thị dưới đây. Thay thế InvAddin bằng tên của add-in của bạn.

call "%VS100COMNTOOLS%vsvars32"
mt.exe -manifest $(ProjectDir)INVAddin.X.manifest -outputresource:"$(TargetPath)";#2

3.Loại bỏ bất kỳ mã nào liên quan đến việc đăng ký add-in trong registry. Thông thường, điều này chỉ đơn giản là loại bỏ các phương thức Register và Unregister khỏi lớp add-in của bạn. Hàm AddInGuid nằm trong cùng vùng với các hàm đăng ký, vì vậy nếu bạn dự định sử dụng thuộc tính này trong các khu vực khác của add-in của bạn, bạn cần cẩn thận để không xóa nó.

Chuyển đến bước 4 dưới đây, bước này giống nhau cho tất cả các ngôn ngữ.

Làm cho Add-In của bạn bằng C++ không cần đăng ký vào Registry

1.Tạo một file mới trong cùng thư mục với tệp dự án của bạn và đặt tên là “CPPOEMAddIn.X.manifest”, trong đó CPPOEMAddIn là tên của add-in của bạn. Thêm đoạn sau vào tệp manifest. Các phần được làm nổi bật màu vàng cần được chỉnh sửa để phù hợp với add-in của bạn.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity name="CPPOEMAddIn" version="1.0.0.0" />
  <clrClass clsid="{2bf59d73-5170-4524-b0e1-391760aaffa5}" 
            progid="CppOEMAddIn.CppOEMAddInAddInServer" 
            threadingModel="Both" 
            name="CppOEMAddIn.CppOEMAddInAddInServer" 
            runtimeVersion="" />
  <file name="CppOEMAddIn.dll" hashalg="SHA1" />
</assembly>

Thuộc tính “name” của phần tử assemblyIdentity là tên của dự án, được làm nổi bật dưới đây.

Clsid là mã lớp (Class ID) cho add-in của bạn và có thể được tìm thấy trong file .idl liên kết với add-in của bạn, như được hiển thị dưới đây. Hãy nhớ rằng các dấu ngoặc nhọn là bắt buộc trong file manifest.

Thuộc tính “name” của phần tử clrClass bao gồm hai phần, được phân tách bởi dấu chấm. Phần đầu tiên là tên của dự án của bạn. Trong ví dụ này, nó là CppOEMAddIn. Phần thứ hai là tên của lớp thực hiện giao diện ApplicationAddInServer, trong trường hợp này là “CppOEMAddInAddInServer” như được hiển thị dưới đây.

2.Bước tiếp theo là cấu hình một số thiết lập dự án để manifest được nhúng đúng cách trong file dll. Hai thiết lập đầu tiên thuộc phần cài đặt Linker. Các thiết lập và giá trị để thay đổi chúng được làm nổi bật trong hình dưới đây. Một số thiết lập này có thể đã có giá trị đúng.

Thiết lập tiếp theo là của cài đặt Công cụ Manifest (Manifest Tool). Đảm bảo rằng cài đặt “Embed Manifest” được đặt thành “Yes”, như được hiển thị dưới đây.

Cuối cùng, bạn muốn loại bỏ bước sau khi xây dựng đăng ký add-in trong registry. Điều này được tìm thấy trong phần Build Events của các thiết lập. Xóa bỏ bất kỳ văn bản nào trong trường Lệnh dòng lệnh (Command Line), như được hiển thị dưới đây.

3.Xóa bỏ bất kỳ mã nào liên quan đến việc đăng ký add-in trong registry. Thông thường, điều này chỉ đơn giản là loại bỏ các phương thức Register và Unregister từ lớp add-in của bạn. Hàm AddInGuid nằm trong cùng khu vực với các hàm đăng ký, vì vậy nếu bạn dự định sử dụng thuộc tính này trong các khu vực khác của add-in của bạn, bạn cần cẩn thận để không xóa nó.

Chuyển đến bước 4 dưới đây, bước này giống nhau cho tất cả các ngôn ngữ.

====== Các bước sau áp dụng cho tất cả các ngôn ngữ. ======

4.Biên dịch dự án của bạn. Điều này sẽ làm cho manifest được nhúng vào trong dll của bạn. Nếu bạn gặp bất kỳ lỗi nào khi biên dịch, hãy xác nhận rằng dòng lệnh bạn nhập phù hợp với dòng lệnh đã được nêu ở trên.

Bạn có thể xác nhận rằng manifest đã được nhúng đúng cách bằng cách kéo file dll của add-in vào Visual Studio. Bạn sẽ thấy thư mục “RT_MANIFEST”, như được hiển thị dưới đây. Nhấp đúp vào biểu tượng “2” sẽ mở một cửa sổ để hiển thị dữ liệu manifest thực tế.

5.Một yêu cầu cho tất cả các add-in không cần đăng ký vào registry là phải có một file .addin. Với một add-in dựa trên registry, Inventor hoàn toàn phụ thuộc vào registry để lấy thông tin về add-in. File .addin thay thế registry cho cùng thông tin này. Tên file addin có dạng Autodesk.TênAddIn.Inventor.addin. Dưới đây là file .addin cho một add-in chính ví dụ với các phần cần thay đổi được làm nổi bật.

Xin lưu ý: Khi bạn sao chép nội dung vào một file .addin, hãy đảm bảo rằng không có dấu cách dẫn và dòng trống trong đó.

<?xml version="1.0" encoding="utf-16"?>
<Addin Type="Standard">
	<ClassId>{2bf59d73-5170-4524-b0e1-391760aaffa5}</ClassId>
	<ClientId>{2bf59d73-5170-4524-b0e1-391760aaffa5}</ClientId>
	<DisplayName>MyOEMApp</DisplayName>
	<Description>Inventor OEM Sample App</Description>
	<Assembly>MyOEMApp\MyOEMApp.dll</Assembly>
	<Hidden>0</Hidden>
</Addin>

Đối với hầu hết các add-in, các phần ClassId ClientId sẽ có cùng một giá trị, đó là GUID ở đầu của lớp StandardAddInServer.

Giá trị của phần DisplayName có thể là bất cứ điều gì và là tên của add-ins như được hiển thị trong Add-In Manager.

Phần Description cũng có thể là bất cứ điều gì và là mô tả của add-in như được hiển thị trong Add-In Manager.

Phần Assembly xác định tên của file dll của add-in. Nó cũng xác định đường dẫn đến dll, tương đối với thư mục OEM bin, nhưng thư mục con phải luôn có cùng tên với file dll của add-in.

Phần Hidden xác định liệu add-in có hiển thị trong Add-In Manager hay không. Giá trị của 1 chỉ ra rằng nó bị ẩn, tuy nhiên người dùng cuối vẫn có thể nhấp chuột phải trong Add-In Manager và chọn “Show hidden members” để hiển thị tất cả các add-in.

Còn một số phần khác mà bạn có thể thấy được xác định cho các add-in khác mà không áp dụng hoặc bị bỏ qua cho một add-in chính OEM.

6.Xem chủ đề Creating an Inventor Add-In để biết thêm thông tin về nơi các file được đặt.