标签:
NavisWorks API的内容大部分为二次开发,在NavisWorks软件中增加所需要的功能。
而我所接到的工作任务是,将.nwc等格式的文件通过窗口打开并且可交互。也就是说,需要有一个程序去调用API,从而打开NavisWorks文件。
在.NET API Reference Guide中其实已经有了比较完善的示例,可以实现很多功能,这里我将结合API文档以及一些其他我在网络上查找到的资料,专门针对这一方面来进行说明,一方面是给自己的工作内容留下记录,另一方面希望有类似开发任务的朋友可以共同交流。
首先需要在程序中引入两个dll:Autodesk.Navisworks.Api和Autodesk.Navisworks.Controls。这两个dll文件都可以在 "~\Autodesk\Navisworks Manage 2014" 目录下找到。
Program.cs文件直接按照文档中的sample来写即可:
1 using System; 2 using System.Windows.Forms; 3 using Autodesk.Navisworks.Api.Controls; 4 5 namespace Viewer 6 { 7 static class Program 8 { 9 /// <summary> 10 /// The main entry point for the application. 11 /// </summary> 12 [STAThread] 13 static void Main() 14 { 15 //Set to single document mode 16 Autodesk.Navisworks.Api.Controls.ApplicationControl.ApplicationType = ApplicationType.SingleDocument; 17 18 //Initialise the api 19 Autodesk.Navisworks.Api.Controls.ApplicationControl.Initialize(); 20 21 Application.EnableVisualStyles(); 22 Application.SetCompatibleTextRenderingDefault(false); 23 Application.Run(new Viewer()); 24 25 //Finish use of the API. 26 Autodesk.Navisworks.Api.Controls.ApplicationControl.Terminate(); 27 } 28 } 29 }
在窗口设计中添加一个ViewControl控件,这是用来实现文件显示的;然后添加一个DocumentControl控件,这是用来控制文件的。
把ViewControl控件的DocumentControl属性设置为刚刚添加的DocumentControl控件,用来指定该ViewControl展示的是DocumentControl的内容。
添加菜单栏或者按键,实现打开文件的功能。这里可以通过打开一个文件浏览窗口去选择文件,也可以直接在后台指定需要打开的文件。我这次的任务是要求直接加载指定文件,不允许用户自由选择打开的文件。因此我省略了打开文件浏览窗口的代码。使DocumentControl打开指定文件的代码如下:
1 // 打开对话框dlg中选定的文件 2 documentControl.Document.TryOpenFile(dlg.FileName); 3 4 // OR 5 // 直接打开指定文件 6 documentControl.Document.TryOpenFile("res\\测试文件.nwc");
通过以上的操作,就可以实现在一个窗口中打开指定的.nwc文件。
接下来补充说明如何与打开的文件进行交互。
首先别忘了在窗口设计器的程序中添加引用:
using Autodesk.Navisworks.Api.Controls; using Autodesk.Navisworks.Api;
在窗口中加入几个按键,来实现对图像的平移等功能。如果喜欢追求视觉效果,也可以使用ToolBar。
这里我实现了最基本的几项功能,总体来讲都是通过类似的语句去调用方法。详细能够实现的方法可以参考API手册中的Tool Enumeration。
1 #region Navigate View 2 // 旋转模型 3 private void Orbit_Click(object sender, EventArgs e) 4 { 5 documentControl.Document.Tool.Value = Autodesk.Navisworks.Api.Tool.NavigateFreeOrbit; 6 } 7 8 // 缩放模型 9 private void Zoom_Click(object sender, EventArgs e) 10 { 11 documentControl.Document.Tool.Value = Autodesk.Navisworks.Api.Tool.NavigateZoom; 12 } 13 14 // 平移模型 15 private void Pan_Click(object sender, EventArgs e) 16 { 17 documentControl.Document.Tool.Value = Autodesk.Navisworks.Api.Tool.NavigatePan; 18 } 19 20 // 复位模型 21 private void reset_Click(object sender, EventArgs e) 22 { 23 //API中没有复位方法,这里调用加载文件以实现复位 24 LoadDocument(); 25 } 26 27 // 组件单选选取 28 private void SinSelect_Click(object sender, EventArgs e) 29 { 30 documentControl.Document.Tool.Value = Autodesk.Navisworks.Api.Tool.Select; 31 } 32 33 // 组件选框选取 34 private void MulSelect_Click(object sender, EventArgs e) 35 { 36 documentControl.Document.Tool.Value = Autodesk.Navisworks.Api.Tool.SelectBox; 37 } 38 39 #endregion
另外,在本次的开发任务中,还需要实现能够将镜头聚焦在指定组件上的功能。由于我之前没有使用过NavisWorks,所以其实并不是很清楚是否已经存在这样的功能。最终我只能使用一个很笨的方法去实现,但是这个方法是非常不完善的,首先看下面的代码:
1 private void Location_Click(object sender, EventArgs e) 2 { 3 //Create a new search 4 Search s = new Search(); 5 6 //set the selection to everything 7 s.Selection.SelectAll(); 8 9 //Add a search condition 10 //修改组件名以实现选中不同组件的功能 11 s.SearchConditions.Add(SearchCondition.HasPropertyByName(PropertyCategoryNames.Item, DataPropertyNames.ItemName) 12 .EqualValue(VariantData.FromDisplayString("组件名"))); 13 14 //get the resulting collection by applying this search 15 ModelItemCollection searchResults = s.FindAll(Autodesk.Navisworks.Api.Application.ActiveDocument, false); 16 17 //清空当前所选 18 Autodesk.Navisworks.Api.Application.ActiveDocument.CurrentSelection.Clear(); 19 20 21 //show the results 22 foreach (ModelItem mi in searchResults) 23 { 24 Autodesk.Navisworks.Api.Application.ActiveDocument.CurrentSelection.Add(mi); 25 } 26 27 //自动居中搜索结果 28 Autodesk.Navisworks.Api.Application.ActiveDocument.ActiveView.FocusOnCurrentSelection(); 29 }
可以看出,首先是对指定名称的组件进行了一次搜索。这里搜索的语句并非只有这一种方式,其他搜索方法所规定的条件参数都不相同,可以根据自己需要的搜索条件去调用不同的搜索方法。
搜索完结果以后,将搜索结果选中,最后调用居中方法使视角固定在搜索结果上。但是该方法有一个问题,就是这个自动居中的方法并不能实现自动调整视角和缩放比例,也就是说,当对已选组件实行该方法后,可能展示出来的视角非常难看,而且大小也不合适。这一点如何进行优化还有待后期研究。
.NET通过NavisWorks API将.nwc文件在窗口中打开及交互
标签:
原文地址:http://www.cnblogs.com/brandon988/p/5141444.html