您现在的位置是:首页 >其他 >Ansys Workbench二次开发:如何在Workbench中自定义菜单栏和对话框网站首页其他

Ansys Workbench二次开发:如何在Workbench中自定义菜单栏和对话框

qq_36140649 2024-09-17 12:01:06
简介Ansys Workbench二次开发:如何在Workbench中自定义菜单栏和对话框

      因为业务需求,我在workbench上开发了一个带有gui界面的小插件,安装好后能够在workbench上新增一个菜单栏,用户点击可以通过我编写的对话框输入数据并利用这些数据操作workbench。

      过程中我查了很多ACT的资料也看了官方文档,发现这种插件开发技术大部分都是针对,spaceClaim,machanical,fluent这样的软件的菜单栏的。对于Workbench的开发要么是单纯的安装之后生成一个新的流程,或者是开发一个创造流程的向导。我曾经以为向导的开发和直接在菜单栏开发是一样的,实际上不是,向导是需要通过ACT主页的启动向导进入,gui和workbench本身的不一样。而且我需要操作workbench本身的工程数据源,而不是仅仅操作一个流程的数据。而要达成这个目标,ACT文档中的函数都是不够用的,这可能就需要用到某些非常规的方式。这里我参考了Workbench开发指南:自定义菜单这篇文章,以及Github上找到的作者的代码GitHub - ansys-dev/Ansys_ACT_Examples: Ansys仿真与开发公众号的ACT案例源代码。在ansys workbench的文件中找到了workbench的定义gui的dll文件,并利用它开发出了我的小插件。这里把学习和用到的技术总结成了这篇文章。

一,ACT插件基础

ACT的源代码一般分为如下几个部分。

外层文件夹

----- XML配置文件

----- Plugin文件夹

---------images文件夹(用来放图片图标)

---------xxx.py文件们

其中XML配置文件给出了插件的名称及基本信息,引用的py文件路径,以及在哪个软件的哪个事件触发自定义的函数。images放图片文件。xxx.py为给每个事件写的ironpython代码。下面分别叙述。

XML文件一般如下面代码所示。

<!--Plugin.xml -->
<extension name="插件名称" icon="插件图标的文件路径,以Plugin文件夹作为根目录">
  <guid>这里是插件的id,不写的话构建会报错,把报错后给代码扔进来</guid>
  <script src="这里是引用的py文件路径,依然以Plugin文件夹作为根目录"/>
  <interface context="设置插件是安装在哪个软件,workbench用Project,其他软件和名字一样">
     <images>images</images>
     <!--下面是回调函数,有很多种-->
     <callbacks>
       <OnInit>初始化的时候调用的函数名(函数实现写在script中那个Py文件里)</OnInit>
       <OnTeminate>终止时调用的函数</OnTeminate>
       <!--如果不是workbench可以通过定义toolbar,在其中写按钮以及回调函数来做菜单插件-->
     </callbacks>
  </interface>
</extension>

关于脚本文件,功能就是提供XML文件中定义的回调函数的具体实现。IronPython这门语言实际上是用python写C#的代码,语法基本上和python2一样,只是可以通一个叫clr的包去调用dll文件。例如下面的代码就将Ans.UI,dll文件引入了到的Python中,然后通过from Ansys.UI import *导入了这个包里的所有函数。

import System
import clr
clr.AddReference("Ans.UI")
from Ansys.UI import *

那我们有了dll文件怎么知道哪些文件可以用呢,可以通过Visual Studio去打开查看如如何查看.dll文件的内容_qq_36140649的博客-CSDN博客,可以看到详细的类函数以及它们之间的继承关系。也可以通过dir(Ansys.UI)简单的看看里面的内容。对此可以利用它们编写初始化函数和终止和函数等等。

编写好插件后用下面方式安装即可看到成果。ansys workbench二次开发:怎么编译代码为wbex文件_qq_36140649的博客-CSDN博客

二,几个需要用到的dll文件和其中的类

开发用到的dll文件在我电脑的路径为D:Program FilesANSYS Incv211RSMinFramworkDependencies。具体文件是Ans.UI.dll,Ans.UI.Toolkit,Ans.UI.Toolkit.Base。我们将这几个文件用VS打开并查看它们的内容。

用到的第一个是Ans.UI.dll里面的Ans,UI包中的UIManager,它可以获取和操作和管理用户界面。先获取UIManager.Instance,再用UIManager.Instance.MenuManger来操作菜单栏。在其中通过AddDyanmicEntity来增加一个按钮,最后一个参数传入继承自IGuiOperation的类,它的Invoke方法里可以编写按钮点击事件。详见Workbench开发指南:自定义菜单

我需要新增自定义的对话框,输入一个我想要的值。通过查找,我在Ans.UI.dll找了包(可能是C#的命名空间?)Ansys.UI.Dialog,其中有一个TextEntryDialog满足我的要求。它的构造方法为TextEntryDialog(title,prompt,initialText,showButtons),title表示对话框的框头那里的字符,prompt相当于给的输入值前面的标签,initialText表示输入框默认值,showButton表示是不是显示按钮。我们在Invoke里面写下面代码,会发现点击菜单栏的按钮之后就会生成一个带有输入框的对话框。这里ShowDialog是Ansys.UI.Toolkit.Dialog中的方法,因为TextEntryDialog继承自Ansys.UI.Toolkit.Dialog,所以父类的方法也可以使用。(window见workbench开发指南里面的代码定义)

dialog=TextEntryDialog("对话框名字","标签:","默认值",True)
dialog.ShowDialog(window)

但是这个对话框没有事件,我没法做点击按钮之后的事件,怎么办呢?那就需要继承这个TextEntryDialog并重写它的OnClosed方法(OnClosed方法也是继承自Dialog的)。我们看到TextEntryDialog里面有一个EnteredText的成员,应该是表示输入的字符,输出它试试。

class MyInputDialog(TextEntryDialog):
      def OnClosed(self,args):
          MessageBox(self,self.EnteredText,"提示对话框头",MessageBoxType.Info,MessageBoxButtons.OK)
          super(MyInputDialog,self).OnClosed(args)

class AboutMeOperation(IGuiOperation):
      def Invoke(self,context):
          dialog=MyInputDialog("对话框头","标签:","默认值",True)
          dialog.ShowDialog(window)
          

实验可以发现,点击菜单之后会出现一个对话框,输入hello,点击确认,弹出框里是hello这个值,点击取消,弹出框是空值。那么我们可以通过判断输入框是否为空来进行下一步。

class MyInputDialog(TextEntryDialog):
      def OnClosed(self,args):
          if self.EnteredText is not None:
             MessageBox(self,"点击了确认","提示对话框头",MessageBoxType.Info,MessageBoxButtons.OK)
          else:
             MessageBox(self,"点击了取消","提示对话框头",MessageBoxType.Info,MessageBoxButtons.OK)
          super(MyInputDialog,self).OnClosed(args)

有的时候会发现,如果输入框的标签过长,对话框会吞掉一部分标签。这就需要调整对话框的大小。继续查看Dialog类,其中有一个参数叫Bounds,顾名思义就是边界,那就可以通过它来调整大小。Bounds的类型是Ansys.UI.Toolkit.Drawing.Rectangle,点击这个类查看,它的构造函数是Rectangle(x,y,width,height),表示了这个对话框的起始点,宽度和高度。那么我们试着设置一下

class AboutMeOperation(IGuiOperation):
      def Invoke(self,context):
          dialog=MyInputDialog("对话框头","标签:","默认值",True)
          dialog.Bounds=Rectangle(500,500,300,120)
          dialog.ShowDialog(window)

会发现这个对话框的大小和位置确实发生了变化。这里注意,用到的类必须导入它所在的dll文件和包。

除了弹出对话框以外,我还想要有一个文件夹选择的对话框。这个文件夹选择的对话框类叫FolderBrowserDialog,在Ansys.UI.Toolkit里面可以找到。使用下面代码可以弹出选择文件的框

FoldBrowserDialog.ShowFolderBrowserDialog(window)

仔细看FoldBrowserDialog.ShowFolderBrowserDialog的定义,会发现它有两个out值,out代表着输出,在ironPython里会转化成一个输出的tuple。第一个输出值是原始文件,第二个输出值是选择的路径,我们把这个路径取出来操作即可。

res=FoldBrowserDialog.ShowFolderBrowserDialog(window)
MessageBox(self,res[1],"提示对话框头",MessageBoxType.Info,MessageBoxButtons.OK)

三,Ansys workbench内部数据操作

点击Workbench的左上角文件,选择脚本,再选择录制脚本,把操作录制下来之后看看录制的代码,再查查ACT文档。基本上都能解决,没什么难度,这就不叙述了。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。