Forge Viewer已经是耳熟能详的行业技术,也是不少朋友关注Forge的缘由,一些朋友经常把Forge 等同于Forge Viewer。其实Forge做为服务体系,涵盖了多个类别的服务,Forge Viewer只是其中一个类别,使用CAD数据的某个方式而已。html
今天,咱们简要介绍Forge的另一个类别:云端自动化设计服务。Forge在云端提供多个设计软件引擎:AutoCAD, Revit, Inventor, 3DMax。用户无需再安装设计软件,即可以在云端进行数据(或模型)的建立,或是模型数据的修改,或是数据的提取等。您原有的插件(或脚本)业务功能仍旧如往常同样执行。经过它,能够更大自由的操做模型和数据处理,更灵活的系統整合和集成。git
其实,早在三年前,Forge就发布了初版的AutoCAD云端自动化设计服务,客户基于此服务,建立了不少应用,例如自动参数化建立模型,自动出图,在线图纸审核,数字签章,图纸数据集成等。而今年1月,Forge正式推出了Revit, Inventor, 3DMax三个重量级设计软件的自动化服务。借此,您就能够直接在云端执行AutoCAD, Revit, Inventor, 3DMax的插件了!github
云端自动化设计服务原理很简单,您的app提交任务请求,Forge从您任务设置的数据中下载到原始模型(或模板,或其它辅助数据),进而启动对应设计软件的沙箱环境,在此环境中,执行您上载好的插件或脚本,当任务成功结束后,Forge将把更新后的模型,或建立的数据发送到您app指定的云存储。json
请参阅咱们同事吴忠作的入门讲解: https://v.youku.com/v_show/id...segmentfault
咱们团队还建立了一个向导式教程,演示如何一步步的搭建出网络应用。此应用能让客户提供原始模型,经过网页输入的参数,修改其中某个实体的尺寸,最后提供更新后的模型。此教程是 Learn Forge tutorial - 向导式Forge进阶教程的一个内容。
http://learnforge.autodesk.io...服务器
向导自己已经写得很详细,按照步骤操做便可。今天主要提示一下执行这个样例须要注意的内容,以及执行样例会是什么样的情景。网络
简单讲一下插件结构:app
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) 因为本例会根据参数来修改墙体的尺寸,还要提供参数文件,默认从执行路径下拿到,在云端执行的时候也是相似。spa
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的内容。