SpaceClaim中常用的操作就那么几个,软件提供了各种方便的快捷键,可以极大的提高操作效率,而唯独使用频率极高的隐藏命令没有快捷键,非常恼火。瞎点的时候,发现它还提供插件支持。除了官网提供的几个官方插件以外,还可以自己开发插件。
ANSYS安装完成后,在安装目录下可以找到插件开发所需的API文档,默认路径是C:\Program Files\ANSYS Inc\v182\scdm,在该目录下,可以看到历代版本的API文档文件夹。
每个版本的文件夹内容大致相同,主要文件包括:
Developers Guide.pdf:SpaceClaim API 及相关基本概念的介绍,尤其是SCDM文件结构与文档对象的介绍,开发插件之前需主要阅读该文档;SpaceClaim_API.chm:介绍如何开发一个插件,同时提供类库的说明文档;SpaceClaim.Api.V17.dll:用于开发的程序集;Building Sample Add-Ins.pdf:使用VS调试与生成插件的指南。一个SCDM文件包含如下对象:
其中,最常接触到的是Parts对象。一个文件通常包含至少一个Part,这个Part为 main part,part下面通常包含组件、体、线等文档对象。Part的结构如下所示:
其中,component下面又可以包含components和组件、体、线等文档对象,因此是一个树形结构。
这里Part和Component对象貌似有点冲突,文档中说,A component is an instance of a template part,我理解为每一个Part都是独立的,而Component就是它的容器,代替Part组成文档树的结点,每一个Component的content就是一个part。它自带一个转换矩阵,它的作用就像一个中间件和粘合剂,将所有的的Part拼接起来,显示出一个完整的场景视图。当存在多级结构时,自然也就存在多级的转换,如下图所示:
生成的插件被SpaceClaim识别后,会在Ribbon菜单里面多生成一个tab,然后在里面再生成一个Group,Group里面新增一个按钮,点击按钮会执行相应的Command,同时可以给该Command绑定想要的快捷键,以实现最初的需求。
SpaceClaim_API.chm中的Getting Started章节描述了开发插件所需的基本要素:
SpaceClaim.Api.V17.dll程序集;AddIn并实现IExtensibility;ICommandExtensibility接口;IRibbonExtensibility接口,在GetCustomUI中需要返回一个XML字符串,该字符串用于描述自定义的Ribbon菜单;这些基本要素可以自行编写,也可以用SpaceClaim提供的模板生成,然后直接编写要实现的Command即可。
311protected override void OnInitialize(Command command)2{3 base.OnInitialize(command);45 // Add a keyboard shortcut for this command.6 // 绑定快捷键Y7 const Keys shortcut = Keys.Y;8 if (Command.GetCommand(shortcut) == null) //如果该快捷键没有被其他命令绑定9 command.Shortcuts = new[] { shortcut };10}1112protected override void OnUpdate(Command command)13{14 //当窗口中选择某对象后,激活该按钮15 command.IsEnabled = Window.ActiveWindow.ActiveContext.Selection.Count > 0;16}1718protected override void OnExecute(Command command, ExecutionContext context, Rectangle buttonRect)19{20 Window window = Window.ActiveWindow; //获取当前窗口21 if (window == null) return;22 //获取当前窗口中选中的对象23 ICollection<IDocObject> selectItems = window.ActiveContext.Selection;24 foreach (var selecteditem in selectItems) //遍历所选对象25 {26 IDesignBody visibleItem = selecteditem as IDesignBody ?? selecteditem.GetAncestor<IDesignBody>(); //向上寻找,如果选择的对象为点、线、面、体,则找到DesignBody对象27 if (visibleItem != null ) visibleItem.SetVisibility(null,false); //设置其Visibility属性为false28 }29 window.ActiveContext.Selection = null;30 window.ActiveContext.Preselection = null;31}