前段时间项目需要展示一个dwf格式的建模文件,并能动态改变模型个部件的隐藏和显示。网上找了半天没有相关资料,但是有一个api文档,照了研究了半天,算是会用了点皮毛。总结的有点乱,大家闲乱的话可以看他的文档,我参考的是Autodesk design Review 2013 API Reference这个文档,网上搜一下,还是好找的。
前提是先安装了Autodesk design Review,然后在文档中找到c#相关的,提示要导入一下,引用:
截图大小限制 还是上代码吧:
AdCommon 1.0 Type Library
DwfComposer EPlot Common 1.0 Type Library
DwfComposer EPlot Core 1.0 Type Library
DwfComposer EPlot Model 1.0 Type Library
DwfComposer EPlot Renderer 1.0 Type Library
DwfComposer EPlot Viewer 1.0 Type Library
ECompositeViewer 1.0 Type Library
添加上如上引用,我没有找到第二个,但找到了DwfComposer Common 1.0 Type Library,就引入了这个代替。
目前工具箱中可能看不到相关的工具,在工具类最下面的常规中,鼠标右键,点击选择项,在com组件中选择Autodesk DWF Viewer Control这项
选择后再工具箱中就可以看到新的控件了,如下:
将这个控件拖入到form窗体中即可使用,不过要注意的是使用这个控件会很卡,不要用鼠标过多操作他,经常会卡死,也不要看这个控件的属性,也会卡死,具体原因我不知道,希望有知道的朋友给解惑一下。接下来就是代码了:
//应该是代表在画布canvas中的一个dwf文件对象吧
//api描述:An object expression that represents the DWF currently loaded within the canvas
private ECompositeViewer.IAdECompositeViewer CompositeViewer;
//api中是这样描述的An object expression that represents a specific section (page) within a DWF file
private ECompositeViewer.IAdSection Section;
private ECompositeViewer.IAdContent ObjectContent;
private AdCommon.IAdCollection MyObjects, MyObjectProperties, TempObjectProperties;
private AdCommon.IAdUserCollection MyObjectsNamedCollection;
具体代表了什么我也不是很清楚,仿照api来调用的,大家可以在使用的使用领悟琢磨吧。
如下代码,比较零碎,实现了我目前知道的几个主要功能(使用的时候一定要注意安装步骤声明出各个变量)。
CompositeViewer = (ECompositeViewer.IAdECompositeViewer)axCExpressViewerControl1.ECompositeViewer;
this.axCExpressViewerControl1.SourcePath = "11C.dwfx";
Section = (ECompositeViewer.IAdSection)CompositeViewer.Section;
ObjectContent = (ECompositeViewer.IAdContent)Section.Content;
MyObjectsNamedCollection = (AdCommon.IAdUserCollection)ObjectContent.CreateUserCollection();
//Get all the objects in the currentsection
MyObjects = (AdCommon.IAdCollection)ObjectContent.get_Objects(0);//获取所有的对象集合
MyObjects = (AdCommon.IAdCollection)ObjectContent.get_Objects(1);//是获取当前选中的对象集合。
this.axCExpressViewerControl1.SourcePath = "11C.dwfx";//这个是设置显示的dwf文件的路径,
//axCExpressViewerControl1是之前我们添加的控件的名字
//一下代码是获得所有有标高属性并且标高值为7的对象的集合,将其设置为被选择的,然后将其因此,若再次执行一次HIDE就是显示,
根据现有状态交替变换。
foreach (ECompositeViewer.IAdObject MyObject in MyObjects)
{
MyObjectProperties = (AdCommon.IAdCollection)MyObject.Properties;
foreach (AdCommon.IAdProperty MyObjectProperty in MyObjectProperties)
{
if ((MyObjectProperty.Name == "标高") && (MyObjectProperty.Value == "7"))
{
ObjectName = MyObjectProperty.Name + " " + Idx++;
//Add the named object to a selection set
MyObjectsNamedCollection.AddNamedItem(MyObject, ObjectName);
}
}
}
ObjectContent.set_Objects(1, MyObjectsNamedCollection);
AdCommon.IAdCollection Commands = (AdCommon.IAdCollection)CompositeViewer.Commands;
Idx = 1;
foreach (ECompositeViewer.IAdCommand Command in Commands)
{
if (Commands.get_ItemName(Idx++) == "HIDE")
{
Command.Enabled = true;
}
}
CompositeViewer.ExecuteCommand("HIDE");
MyObjectsNamedCollection.Flush();
ObjectContent.set_Objects(1, MyObjectsNamedCollection);
以上就是我目前知道的和项目中主要用到的功能,但是我整体运行下来感觉卡的要命,不知道有没有朋友有好的建议改善或者能代替的。