Autodesk Inventor: Tùy chỉnh Giao diện Người dùng

Tùy chỉnh thanh Ribbon bằng cách sử dụng API

Thuật ngữ về Ribbon và API

Dưới đây là một cái nhìn tổng quan về các thành phần của thanh Ribbon và các đối tượng API tương ứng.

Thanh Ribbon

Thanh Ribbon là toàn bộ khu vực được làm nổi bật dưới đây và được biểu diễn bởi đối tượng API Ribbon.

Nội bộ, có bảy thanh Ribbon khác nhau, chủ yếu một cho mỗi loại tài liệu. Bạn không thể tạo hoặc xóa các thanh Ribbon nhưng bạn có thể chỉnh sửa bảy thanh Ribbon hiện có bằng cách thêm và xóa các phần tử từ chúng. Thông thường, bạn truy cập vào một thanh Ribbon cụ thể thông qua API bằng cách sử dụng tên nội bộ của thanh Ribbon đó. Các tên nội bộ cho các thanh Ribbon là:

  • ZeroDoc (Hiển thị khi không có tài liệu nào được mở)
  • Part
  • Assembly
  • Drawing
  • Presentation
  • iFeatures
  • UnknownDocument (Được sử dụng cho môi trường xem sổ tay và bản vẽ.)

Ribbon Tab

Mỗi thanh Ribbon bao gồm một tập hợp các tab. Tab Tools của thanh Ribbon Assembly được làm nổi bật dưới đây. Các tab này được biểu diễn trong API bằng đối tượng RibbonTab. Có thể có bất kỳ số lượng tab nào, tuy nhiên có một giới hạn thực tế về những gì có thể hiển thị trên màn hình. Các tab có thể hiển thị hoặc không. Mỗi tab cũng có một tên nội bộ có thể được sử dụng để tìm kiếm nó.

Ribbon Panel

Mỗi tab bao gồm một tập hợp các panel. Panel Measure của tab Tools được làm nổi bật dưới đây. Các panel này được biểu diễn trong API bằng đối tượng RibbonPanel. Có thể có bất kỳ số lượng panel nào trong một tab, một lần nữa với một giới hạn thực tế, và chúng có thể hiển thị hoặc không. Mỗi panel cũng có một tên nội bộ có thể được sử dụng để tìm kiếm nó.

Command Control

Mỗi tab chứa một tập hợp các điều khiển. Điều khiển nút cho lệnh Distance được làm nổi bật dưới đây. Tất cả các điều khiển được biểu diễn trong API bằng đối tượng CommandControl. Mỗi điều khiển cũng có một tên nội bộ có thể được sử dụng để tìm kiếm nó; tuy nhiên, tên nội bộ của chúng không được định nghĩa một cách rõ ràng mà được kế thừa từ đối tượng ControlDefinition mà nó tham chiếu.

Cấu trúc thứ bậc của đối tượng API Ribbon:

Dưới đây là cấu trúc thứ bậc của một phần của API của Inventor liên quan đến thanh Ribbon. Các mục được làm nổi bật là các đối tượng cụ thể của thanh Ribbon. Các mục khác là các đối tượng cũng được sử dụng trong các lĩnh vực khác của API.

Xác định Nơi Đặt Nút Của Bạn

Bước đầu tiên trong việc hỗ trợ thanh Ribbon là quyết định nơi bạn muốn chèn nút của add-in vào thanh Ribbon. Một gợi ý là hãy cố gắng đặt mình vào vị trí của người dùng của add-in của bạn và tưởng tượng họ sẽ tìm kiếm lệnh của bạn ở đâu. Ví dụ, nếu add-in của bạn có một lệnh vẽ hình dạng khe cắm tùy chỉnh trong một bản phác thảo, bạn có thể muốn chèn nút của bạn vào bảng Vẽ của tab Phác thảo của các thanh Ribbon Part, Assembly, và Drawing. Nếu lệnh của bạn là duy nhất so với các lệnh khác của Inventor và không phù hợp thực sự, bạn có thể muốn tạo một tab mới hoặc một panel để phân tách nó một cách logic khỏi phần còn lại của các lệnh của Inventor. Ngoài thanh Ribbon, bạn cũng có thể thêm các lệnh của mình vào các menu Ứng dụng và Trợ giúp cũng như thanh công cụ QAT (Thanh Công cụ Truy cập Nhanh). Mục tiêu chính là đặt nút của bạn ở nơi người dùng sẽ tìm kiếm một cách tự nhiên.

Một yếu tố khác mà bạn cần xem xét khi đặt vị trí cho các lệnh của mình là bố cục tổng thể của thanh Ribbon sau khi lệnh của bạn được thêm vào. Thực tế là màn hình có chiều rộng hạn chế và mỗi nút sẽ chiếm một số không gian. Một số thanh Ribbon có đầy đủ hơn các thanh khác, vì vậy nếu logic của bạn cho phép, nút của bạn có thể được đặt ở nhiều vị trí, bạn có thể muốn chọn vị trí có nhiều không gian nhất có sẵn.

Lấy Tên Nội Bộ của Các Thành Phần của Thanh Ribbon

Tạo Icon Của Bạn

Thanh Ribbon hỗ trợ hai kích thước icon; icon nhỏ là 16×16 pixel và icon lớn là 32×32 pixel. Bạn có các lựa chọn khác nhau để tạo biểu tượng của mình. Có lẽ định dạng tốt nhất là png vì nó hỗ trợ độ trong suốt và được hỗ trợ bởi hầu hết các ứng dụng chỉnh sửa hình ảnh. Bạn cũng có thể sử dụng các tệp .ico, cũng hỗ trợ độ trong suốt, hoặc thậm chí sử dụng các tệp .bmp.

Thêm Hỗ Trợ Ribbon vào Add-In của Bạn

Điều đầu tiên bạn cần làm là tạo định nghĩa điều khiển cho các điều khiển mà bạn muốn thêm vào thanh Ribbon. Thông thường, đây là các nút. Dưới đây là một số mã điển hình từ phương thức Activate của một add-in tạo định nghĩa điều khiển. Lưu ý rằng các định nghĩa điều khiển không phải là các điều khiển hiển thị mà là định nghĩa tất cả thông tin cần thiết ngoài vị trí để tạo một điều khiển. Mã trong hàm CreateUserInterface tạo các điều khiển hiển thị bằng cách sử dụng các định nghĩa điều khiển. Hàm CreateUserInterface chỉ được gọi khi cờ FirstTime là True. Hiện tại với giao diện người dùng thanh Ribbon, nó sẽ luôn là true.

Để mã sau đây hoạt động, bạn sẽ cần thêm các tham chiếu đến thư viện .Net stdole và System.Windows.Forms.

Private m_InventorApplication As Inventor.Application = Nothing
Private WithEvents m_buttonDef As ButtonDefinition = Nothing
Private WithEvents m_uiEvents As UserInterfaceEvents = Nothing
Private m_clientID As String = "{311a4c02-49df-4947-a01c-47765ec06b27}"

Public Sub Activate(...) Implements Inventor.ApplicationAddInServer.Activate
    ' Save reference to the Application object in member variable.
    m_inventorApplication = addInSiteObject.Application

    ' Get a reference to the UserInterfaceManager object. 
    Dim UIManager As Inventor.UserInterfaceManager = _ 
                                           m_inventorApplication.UserInterfaceManager

    ' Get a reference to the ControlDefinitions object. 
    Dim controlDefs As ControlDefinitions = _
                              m_inventorApplication.CommandManager.ControlDefinitions

    ' Get the images from the resources.  They are stored as .Net images and the
    ' PictureConverter class is used to convert them to IPictureDisp objects, which
    ' the Inventor API requires. 
    Dim smallPicture As stdole.IPictureDisp = _
            PictureConverter.ImageToPictureDisp(My.Resources.MySmallImage)

    Dim largePicture As stdole.IPictureDisp = _
            PictureConverter.ImageToPictureDisp(My.Resources.MyLargeImage)

    ' Create the button definition. 
    m_buttonDef = controlDefs.AddButtonDefinition("One", "UIRibbonSampleOne", _
                                         CommandTypesEnum.kNonShapeEditCmdType, _
                                         m_clientID, , , smallPicture, largePicture)

    ' Call the function to add information to the user-interface.
    If firstTime Then
        CreateUserInterface()
    End If

    ' Connect to UI events to be able to handle a UI reset.
    m_uiEvents = m_InventorApplication.UserInterfaceManager.UserInterfaceEvents
End Sub


' Creates the add-in’s UI in the ribbon.
Private Sub CreateUserInterface()
    ' Get a reference to the UserInterfaceManager object. 
    Dim UIManager As Inventor.UserInterfaceManager = _
                                           m_inventorApplication.UserInterfaceManager

    ' Get the zero doc ribbon.
    Dim zeroRibbon As Inventor.Ribbon = UIManager.Ribbons.Item("ZeroDoc")

    ' Get the getting started tab.
    Dim startedTab As Inventor.RibbonTab = zeroRibbon.RibbonTabs.Item("id_GetStarted")

    ' Get the new features panel.
    Dim newFeaturesPanel As Inventor.RibbonPanel
    newFeaturesPanel = startedTab.RibbonPanels.Item("id_Panel_GetStartedWhatsNew")

    ' Add a button to the panel, using the previously created button definition.
    newFeaturesPanel.CommandControls.AddButton(m_buttonDef, True)
End Sub

Bên ngoài lớp StandardAddInServer, hãy thêm lớp dưới đây. Lớp này bao gồm một số chức năng có sẵn trong một trong các lớp .Net không thường được tiết lộ, cho phép bạn chuyển đổi một đối tượng Ảnh .Net thành một đối tượng IPictureDisp, đó là điều mà Inventor yêu cầu khi làm việc với hình ảnh.

<System.ComponentModel.DesignerCategory("")> _
Friend Class PictureConverter
    Inherits System.Windows.Forms.AxHost

    Private Sub New()
        MyBase.New(String.Empty)
    End Sub

    Public Shared Function ImageToPictureDisp( _
                           ByVal image As System.Drawing.Image) As stdole.IPictureDisp
        Return CType(GetIPictureDispFromPicture(image), stdole.IPictureDisp)
    End Function
End Class

Kết quả của việc tải add-in này được hiển thị dưới đây.

Dấu phân cách

Dấu phân cách cũng được hỗ trợ bởi thanh Ribbon mặc dù chúng không phổ biến bằng các panel vì các panel có cùng mục đích nhóm các lệnh lại với nhau. Chúng phổ biến nhất trong các menu Ứng dụng và Trợ giúp. Hình dưới đây hiển thị menu Trợ giúp trong thanh Ribbon với ba dấu phân cách của nó. Để tạo một dấu phân cách, bạn sử dụng phương thức AddSeparator của đối tượng CommandControls.

Xử lý Đặt lại trong Giao diện Ribbon

Người dùng có thể đặt lại giao diện thanh Ribbon để khôi phục nó về trạng thái ban đầu. Điều này có hiệu ứng phụ là loại bỏ bất kỳ tùy chỉnh nào mà các add-in đã thực hiện. Hầu hết người dùng sẽ mong đợi một lệnh đặt lại sẽ đưa Inventor về giao diện ban đầu của nó cộng với bất kỳ tùy chỉnh nào mà các add-in đã thực hiện để thêm các nút của họ. Để thực hiện điều này, một add-in cần phản ứng với một sự đặt lại bằng cách tái tạo lại bất kỳ tùy chỉnh nào mà nó đã thực hiện. Một add-in thực hiện điều này bằng cách lắng nghe các sự kiện. Trong giao diện thanh Ribbon, người dùng có thể sử dụng lệnh Đặt lại Ribbon để đặt lại toàn bộ giao diện thanh Ribbon về trạng thái ban đầu của nó. Lệnh Đặt lại Ribbon được gọi thông qua menu ngữ cảnh của thanh Ribbon như được hiển thị dưới đây.

Để add-in xử lý lệnh Đặt lại Ribbon, nó cần lắng nghe sự kiện OnResetRibbonInterface. Tất cả những gì bạn cần làm khi nhận được sự kiện này chính xác như bạn đã làm khi add-in được thực thi lần đầu tiên. Mã dưới đây minh họa điều này bằng cách gọi cùng một hàm đã được gọi trong phương thức Activate của add-in.

Private Sub m_uiEvents_OnResetRibbonInterface(...) Handles m_uiEvents.OnResetRibbonInterface
    CreateUserInterface()
End Sub