Learn Forge 系列:Forge 云端自动化设计服务 - 插件部分

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指定的云存储。

Learn Forge 系列:Forge 云端自动化设计服务 - 插件部分_第1张图片

请参阅我们同事吴忠做的入门讲解: https://v.youku.com/v_show/id...

我们团队还创建了一个向导式教程,演示如何一步步的搭建出网络应用。此应用能让客户提供原始模型,通过网页输入的参数,修改其中某个实体的尺寸,最后提供更新后的模型。此教程是 Learn Forge tutorial - 向导式Forge进阶教程的一个内容。
http://learnforge.autodesk.io...

Learn Forge 系列:Forge 云端自动化设计服务 - 插件部分_第2张图片

向导本身已经写得很详细,按照步骤操作即可。今天主要提示一下执行这个样例需要注意的内容,以及执行样例会是什么样的情景。

  1. 下载教程提供的完整源码工程,目前只有NET Core版本。您也可以根据云端自动化设计服务*的端口规范用其它语言写服务器端过程
    https://github.com/Autodesk-F...
  2. 打开工程designautomation.sln,注意需要网络应用forgesample 需要NER Core2.1,插件需要Framework 4.7 以上的环境
    此工程包含AutoCAD, Revit, Inventor, 3DMax的插件样例,展示如果要使用云端自动化设计服务*,插件的结构应该是什么样的。可以卸载掉其其它 产品,只保留Revit插件UpdateRVTParam
    Learn Forge 系列:Forge 云端自动化设计服务 - 插件部分_第3张图片
  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(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

    
    
      
        Modify Window Parameters
        Autodesk.Forge.Sample.DesignAutomation.Revit.Commands
        Revit for Design Automation
        Revit for Design Automation
        AlwaysVisible
        .\UpdateRVTParam.dll
        000BD853-36E4-461f-9171-C5ACEDA4E723
        ADSK
        Autodesk, Inc, www.autodesk.com
      
    

    4.4) 本例中,提供了完整的插件包结构,包括PackageContents.xml, *.addin 文件。另外,当工程编译后,会自动将此插件包压缩,并放置到网络应用 forgesample路径之下,供给forgesample执行的时候之用。

    Learn Forge 系列:Forge 云端自动化设计服务 - 插件部分_第4张图片

下一篇文章,我们将讲解网络应用forgesample的内容。

你可能感兴趣的:(autodesk-forge)