码迷,mamicode.com
首页 > Windows程序 > 详细

.NET通过NavisWorks API将.nwc文件在窗口中打开及交互

时间:2016-01-19 12:35:22      阅读:936      评论:0      收藏:0      [点我收藏+]

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!