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...
向导本身已经写得很详细,按照步骤操作即可。今天主要提示一下执行这个样例需要注意的内容,以及执行样例会是什么样的情景。
- 下载教程提供的完整源码工程,目前只有NET Core版本。您也可以根据云端自动化设计服务*的端口规范用其它语言写服务器端过程
https://github.com/Autodesk-F... - 打开工程designautomation.sln,注意需要网络应用forgesample 需要NER Core2.1,插件需要Framework 4.7 以上的环境
此工程包含AutoCAD, Revit, Inventor, 3DMax的插件样例,展示如果要使用云端自动化设计服务*,插件的结构应该是什么样的。可以卸载掉其其它 产品,只保留Revit插件UpdateRVTParam
- 通过NuGet安装好两个引用:DesignAutomationBridge 和 Newtonsoft.Json. 编译看看有无错误。
-
简单讲一下插件结构:
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执行的时候之用。
在下一篇文章,我们将讲解网络应用forgesample的内容。