天天看點

Building Coder(Revit 二次開發) - 翻譯 Revit Tooltip

原文連結: Translate Revit Tooltips

由于 AutoDesk 已經将其大部分産品的底層架構統一了,是以 Kean Walmsley (譯者注:AutoCAD二次開發部落客 Through the Interface) 對 AutoCAD 界面定制的研究對于 Revit 同樣有效。本文從定制 Tooltip 入手,介紹如何利用 AdWindows.dll 定制化翻譯 Revit 的 Tooltip 文本。

AdWindows.dll 提供的命名空間 Autodesk.Windows 中提供了部分 Ribbon 使用者界面的定制接口。為了捕獲 Revit 顯示的 Tooltip,需要注冊針對所有 Tooltip 都會觸發的

Autodesk.Windows.ComponentManager.TooltipOpened 事件。

當然,僅僅是實作設定 Tooltip 的語言,我們也可以使用獨立應用程式調用 AdWindows.dll 的方式來實作。但是顯然使用 Revit Add-in 的方式會更加直覺(譯者注:因為我目前項目要求将一個數字平台與 Revit 環境無縫綁定,是以插件形式是必選。而且通過 AdWindows.dll,我可以實作将 Revit 環境标志位我自己的數字平台的效果)。

下面這段代碼展示的是主要邏輯:

Autodesk.Windows.ComponentManager.ToolTipOpened += ( s, e ) =>
    {
        Autodesk.Internal.Windows.ToolTip tt = s as Autodesk.Internal.Windows.ToolTip;
        if (tt != null)
        {
            if (tt.Content is RibbonToolTip)
            {
                RibbonToolTip rtt = (RibbonToolTip)tt.Content;

                if (rtt.Content == null && rtt.ExpandedContent == null)
                {
                    // 防止關閉 Revit 中的浏覽器控件 Tooltip
                    if (!rtt.Title.Contains(" : "))
                    {
                        CloseAndReshowTooltip(tt);
                    }
                }
                else
                {
                    rtt.Content =TranslateIfString(rtt.Content, GetId(rtt));
                    TranslateObjectContent(rtt.Content, GetId(rtt));

                    // 翻譯擴充内容(添加ID到結尾來将其與基本内容區分開)
                    rtt.ExpandedContent = TranslateIfString(rtt.ExpandedContent, GetExpandedId(GetId(rtt)));
                    TranslateObjectContent(rtt.ExpandedContent, GetExpandedId(GetId(rtt)));

                    // 強制為特定控件顯示 Tooltip(目前是寫死位移,更好的方式是基于目前滑鼠的尺寸)
                    tt.Show(System.Windows.Forms.Cursor.Position.X, System.Windows.Forms.Cursor.Position.Y + 16);
                }
            }
            else if (tt.Content is UriKey)
            {
                // 針對需要系統解析的 Tooltip 将顯示交給系統延時處理
                CloseAndReshowTooltip(tt);
            }
            else
            {
                // 基本的隻包含文本的 Tooltip
                tt.Content = TranslateIfString(tt.Content, null);
            }
        }
    }
           

請在 此處下載下傳完整代碼。

繼續閱讀