Learn Forge 系列:Forge 雲端自動化設計服務 - 外掛部分

梁曉冬發表於2019-05-06

Forge Viewer已是耳熟能詳的行業技術,也是很多朋友關注Forge的原因,一些朋友常常把Forge 等同於Forge Viewer。其實Forge作為服務體系,涵蓋了多個類別的服務,Forge Viewer只是其中一個類別,使用CAD資料的某個方式而已。

今天,我們簡要介紹Forge的另外一個類別:雲端自動化設計服務。Forge在雲端提供多個設計軟體引擎:AutoCAD, Revit, Inventor, 3DMax。使用者無需再安裝設計軟體,即能夠在雲端進行資料(或模型)的建立,或是模型資料的修改,或是資料的提取等。您原有的外掛(或指令碼)業務功能仍舊如往常一樣執行。透過它,可以更大自由的操作模型和資料處理,更靈活的系統整合和整合。

其實,早在三年前,Forge就釋出了第一版的AutoCAD雲端自動化設計服務,客戶基於此服務,建立了很多應用,例如自動引數化建立模型,自動出圖,線上圖紙稽核,數字簽章,圖紙資料整合等。而今年1月,Forge正式推出了Revit, Inventor, 3DMax三個重量級設計軟體的自動化服務。藉此,您就可以直接在雲端執行AutoCAD, Revit, Inventor, 3DMax的外掛了!

雲端自動化設計服務原理很簡單,您的app提交任務請求,Forge從您任務設定的資料中下載到原始模型(或模板,或其它輔助資料),進而啟動對應設計軟體的沙箱環境,在此環境中,執行您上載好的外掛或指令碼,當任務成功結束後,Forge將把更新後的模型,或建立的資料傳送到您app指定的雲端儲存。

圖片描述

請參閱我們同事吳忠做的入門講解: https://v.youku.com/v_show/id...

我們團隊還建立了一個嚮導式教程,演示如何一步步的搭建出網路應用。此應用能讓客戶提供原始模型,透過網頁輸入的引數,修改其中某個實體的尺寸,最後提供更新後的模型。此教程是 Learn Forge tutorial - 嚮導式Forge進階教程的一個內容。
http://learnforge.autodesk.io...

圖片描述

嚮導本身已經寫得很詳細,按照步驟操作即可。今天主要提示一下執行這個樣例需要注意的內容,以及執行樣例會是什麼樣的情景。

  1. 下載教程提供的完整原始碼工程,目前只有NET Core版本。您也可以根據雲端自動化設計服務*的埠規範用其它語言寫伺服器端過程
    https://github.com/Autodesk-F...
  2. 開啟工程designautomation.sln,注意需要網路應用forgesample 需要NER Core2.1,外掛需要Framework 4.7 以上的環境
    此工程包含AutoCAD, Revit, Inventor, 3DMax的外掛樣例,展示如果要使用雲端自動化設計服務*,外掛的結構應該是什麼樣的。可以解除安裝掉其其它 產品,只保留Revit外掛UpdateRVTParam
    圖片描述
  3. 透過NuGet安裝好兩個引用:DesignAutomationBridgeNewtonsoft.Json. 編譯看看有無錯誤。
  4. 簡單講一下外掛結構:

    4.1) Revit外掛需要從IExternalDBApplication繼承,並實現OnStartup等虛擬函式。在雲端引擎環境啟動後,自動導引進入載入可用外掛,執行OnStartup, 在OnStartup委託引擎環境準備就緒的事件。在此事件中,最終執行外掛的自定義的操作。

    namespace Autodesk.Forge.Sample.DesignAutomation.Revit
    {
        //外掛基本屬性仍和普通本地外掛類似
        [Transaction(TransactionMode.Manual)]
        [Regeneration(RegenerationOption.Manual)]
    
        //Design Automation的外掛必須從 IExternalDBApplication 繼承
        public class Commands : IExternalDBApplication
        {
            //更新後的匯出檔名
            string OUTPUT_FILE = "OutputFile.rvt";
    
            //必須實現的虛擬函式,雲端引擎啟動後,載入此外掛後,會自動匯入到OnStartup,並傳入雲端Revit的Application控制程式碼
            public ExternalDBApplicationResult OnStartup(ControlledApplication application)
            {
                //在此委託引擎環境準備就緒的事件
                DesignAutomationBridge.DesignAutomationReadyEvent += HandleDesignAutomationReadyEvent;
                return ExternalDBApplicationResult.Succeeded;
            }
    
            //必須實現的虛擬函式, 引擎環境準備就緒, DesignAutomationReadyEventArgs提供原始Revit文件的控制程式碼
            private void HandleDesignAutomationReadyEvent(object sender, DesignAutomationReadyEventArgs e)
            {
                LogTrace("Design Automation Ready event triggered...");
                e.Succeeded = true;
    
                //在此開始執行外掛的自定義的操作
                EditWindowParametersMethod(e.DesignAutomationData.RevitDoc);
            }
    
            //必須實現的虛擬函式, 當任務結束,引擎開始終止
            public ExternalDBApplicationResult OnShutdown(ControlledApplication application)
            {
                return ExternalDBApplicationResult.Succeeded;
            }
            //......

    4.2) 由於本例會根據引數來修改牆體的尺寸,還要提供引數檔案,預設從執行路徑下拿到,在雲端執行的時候也是類似。

      private void EditWindowParametersMethod(Document doc)
            {
                //如果有額外的引數檔案,Design Automation在任務啟動初期,下載到執行路徑之中,透過相對路徑獲取檔案內容
                InputParams inputParameters = JsonConvert.DeserializeObject<InputParams>(File.ReadAllText("params.json"));
    
                //外掛的自定義的操作,是修改所有牆的高和寬,和普通外掛的執行類似
    
                using (Transaction trans = new Transaction(doc))
                {
                    //....
                    //....
                    trans.Commit();
                }
    
                //將修改後的模型儲存,如果和原始檔案同名,則加上OverwriteExistingFile標記
                ModelPath ProjectModelPath = ModelPathUtils.ConvertUserVisiblePathToModelPath(OUTPUT_FILE);
                SaveAsOptions SAO = new SaveAsOptions();
                SAO.OverwriteExistingFile = true;
    
                //儲存檔案
                LogTrace("Saving file...");
                doc.SaveAs(ProjectModelPath, SAO);
            }

    4.3) *.addin 檔案的定義和普通外掛主要不同是型別,必須是 DBApplication

    <?xml version="1.0" encoding="utf-8" standalone="no"?>
    <RevitAddIns>
      <AddIn Type="DBApplication">
        <Name>Modify Window Parameters</Name>
        <FullClassName>Autodesk.Forge.Sample.DesignAutomation.Revit.Commands</FullClassName>
        <Text>Revit for Design Automation</Text>
        <Description>Revit for Design Automation</Description>
        <VisibilityMode>AlwaysVisible</VisibilityMode>
        <Assembly>.\UpdateRVTParam.dll</Assembly>
        <AddInId>000BD853-36E4-461f-9171-C5ACEDA4E723</AddInId>
        <VendorId>ADSK</VendorId>
        <VendorDescription>Autodesk, Inc, www.autodesk.com</VendorDescription>
      </AddIn>
    </RevitAddIns>

    4.4) 本例中,提供了完整的外掛包結構,包括PackageContents.xml, *.addin 檔案。另外,當工程編譯後,會自動將此外掛包壓縮,並放置到網路應用 forgesample路徑之下,供給forgesample執行的時候之用。

    圖片描述

    圖片描述

下一篇文章,我們將講解網路應用forgesample的內容。

相關文章