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

[ 本文原创发表于cnblogs ]

 

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         }

可以看出,首先是对指定名称的组件进行了一次搜索。这里搜索的语句并非只有这一种方式,其他搜索方法所规定的条件参数都不相同,可以根据自己需要的搜索条件去调用不同的搜索方法。

搜索完结果以后,将搜索结果选中,最后调用居中方法使视角固定在搜索结果上。但是该方法有一个问题,就是这个自动居中的方法并不能实现自动调整视角和缩放比例,也就是说,当对已选组件实行该方法后,可能展示出来的视角非常难看,而且大小也不合适。这一点如何进行优化还有待后期研究。

转载于:https://www.cnblogs.com/brandon988/p/5141444.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工业视觉系统相关知识和选型介绍(一):相机篇

工业视觉系统相关知识和选型介绍&#xff08;一&#xff09;&#xff1a;相机篇一、工业视觉系统二、工业相机三、关键名词解释四、工业相机选型五、工业相机品牌六、相机选型实例一、工业视觉系统 1.机器视觉就是用机器代替人眼来做测量和判断。机器视觉系统是指通过机器视觉…

天冷了思绪也飞远了

近日天冷&#xff0c;扎了有些时日的马尾&#xff0c;我的内心开始犹豫&#xff0c;要不要把它披散下来后稍作修剪&#xff0c;然后做成天然的围脖来保暖呢&#xff1f;不由得回想起多年的理发经历&#xff0c;其中中学的那一次理发仍然记忆犹新...... 常 言道&#xff0c;身体…

终于看见光的速度了:每秒一万亿帧的相机,拍摄到光的运行状态!

来源&#xff1a;机械发明爱好者我是谁&#xff0c;我在哪&#xff0c;我看到了什么&#xff0c;不会是手电筒照射的吧&#xff08;光移动的时候是在标签里面的&#xff0c;所以不可能是手电筒照射的&#xff09;。这个就是传说的中的飞秒拍摄技术飞秒&#xff08;femtosecond&…

win10下TensorFlow-GPU安装(GTX1660+CUDA10+CUDNN7.4)

首先安装anaconda Anaconda下载地址&#xff1a;https://www.anaconda.com/download/ 注意在安装时勾上第一项&#xff1a; 安装CUDA10.0&#xff1a; CUDA下载地址&#xff1a;https://developer.nvidia.com/cuda-toolkit-archive 安装CUDA前会先运行一个系统检查&#xff…

工业视觉系统相关知识和选型介绍(二):镜头篇

工业视觉系统相关知识和选型介绍&#xff08;二&#xff09;&#xff1a;镜头篇一、工业镜头介绍二、 关键名词解释二、图解镜头基本参数三、镜头选型四、常用工业镜头品牌一、工业镜头介绍 镜头的基本功能就是实现光束变换&#xff08;调制&#xff09;&#xff0c;在机器视觉…

《科学美国人》评出2019年十大突破性技术

来源&#xff1a;科技日报日前&#xff0c;著名科普杂志《科学美国人》公布了2019年十大突破性技术榜单。榜上有名的既有“高深莫测”的新型核反应堆和DNA存储&#xff0c;也有“平易近人”的新型肥料和食品包装。科技日报记者梳理后发现&#xff0c;这十大技术可分为清洁环境、…

破解百度云

BaiduPCS-Go 打开登录即可使用&#xff0c;这个是论坛大神基于BaiduPCS-Go制作的web版。 这是原贴地址https://www.52pojie.cn/thread-808876-1-1.html 谢谢大神将复杂简单化。&#xff08;不清楚360有没有报毒&#xff0c;有需要的自行测试。&#xff09;下载地址&#xff1a…

浅谈Tuple之C#4.0新特性

一、4.0新特性中的Tuple 大家可以回顾一下c#4.0中增加的一个新特性&#xff0c;元组Tuple&#xff0c;它是一种固定成员的泛型集合: 下面先看看官方的一个使用例子&#xff1a; 创建一个包含7个元素的Tuple数组 // Create a 7-tuple. var population new Tuple<string, int…

MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结

MFC 学习笔记&#xff08;一&#xff09;&#xff1a;MFC单文档程序运行流程梳理与总结 1.MFC单文档程序运行流程 1.首先利用全局变量对象 theApp 启动应用程序 &#xff08;这是因为这个全局对象&#xff0c;基类CWinApp中 this 的指针才能指向这个对象。&#xff09; 2.调…

对话清华教授孙茂松:第三代人工智能要处理“可解释性”问题

来源&#xff1a;澎湃新闻正如人类会综合利用视觉、听觉、触觉、语言等信息&#xff0c;让人工智能&#xff08;AI&#xff09;从多角度、多模态、多学科学习自然语言也是清华大学人工智能研究院的目标与任务。2019年7月1日&#xff0c;清华大学人工智能研究院第八个研究中心&a…

验证gpu版pytorch是否可用

import torchtorch.cuda.is_available() Truetorch.cuda.current_device() 0torch.cuda.device(0) <torch.cuda.device object at 0x0000023034332438>torch.cuda.device_count() 1torch.cuda.get_device_name(0) GeForce GTX 1660

oracle instr函数

语法&#xff1a;instr( fatherstr, sonstr [, start_position [, matchtimes ] ] )fatherstr&#xff1a;父字符串。要在此字符串中查找子字符串的位置。sonstr&#xff1a;要在fatherstr中查找的字符串. start_position&#xff1a;代表从fatherstr開始查找的的開始位置。此參…

QT学习笔记(一):VS2013 +QT 5.8 运行、编译问题解决

QT学习笔记&#xff08;一&#xff09;&#xff1a;VS2013 QT 5.8 运行、编译问题解决 jom: E:\C\4.QT\HelloWord\Makefile.Debug [debug\moc_predefs.h] Error 1 ‘cl’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 jom: E:\C\4.QT\HelloWord\Makefile…

使用清华镜像安装pytorch失败的解决方法

首先添加清华镜像至Anaconda仓库&#xff1a; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --set show_channel_urls yes …

受精卵或非“生命起始”?网友:教材是不是要改了……

来源&#xff1a;中国新闻网一直以来&#xff0c;科学家们都认为&#xff0c;精卵结合受精以后就是生命。但是&#xff0c;最近中美胚胎学家的一项最新联合研究成果表明&#xff0c;人类受精卵存在两套独立纺锤体&#xff0c;即从精卵结合到发生第一次有丝分裂期间&#xff0c;…

QT学习笔记(二):QT MinGW 和 MSVC 编译方式

QT学习笔记&#xff08;二&#xff09;&#xff1a;QT MinGW 和 MSVC 编译方式 Qt 中有两种方式编译&#xff1a;一种是MinGW &#xff0c;另一种MSVC&#xff0c;是使用两种不同的编译器。 1、MSVC是指微软的VC编译器&#xff1b; 2、MingGW是指是Minimalist GNU on Window…

利用Excel进行成对(配对)T检验

首先在Excel中添加数据分析工具 https://jingyan.baidu.com/article/c275f6ba74b69ee33d7567c8.html 在Excel添加要分析的两组数据&#xff1a; 点击数据——>数据分析&#xff0c;选择t-检验&#xff1a;平均值的成对二样本分析&#xff0c;分别选取两组要分析的数据和输…

垃圾要分类!我们的大脑如何处理垃圾呢?

来源&#xff1a;中国生物技术网最近&#xff0c;垃圾分类已经成了热点话题&#xff0c;但实行这一举措的最终目的还是为了保护我们赖以生存的地球环境。同样&#xff0c;大脑为了维持健康&#xff0c;也专门有一套自己的“垃圾清除系统”&#xff0c;即glymphatic&#xff08;…

Scala模式匹配和类型系统

Scala模式匹配和类型系统 1.模式匹配比java中的switch case强大很多&#xff0c;除了值&#xff0c;类型&#xff0c;集合等进行匹配&#xff0c;最常见的Case class进行匹配&#xff0c;Master.scala有大量的模式匹配。 Case "_"表示不满足上面的所有情况的体验&…