AutoCAD实体导出Glyph2脚本的实现
2016-07-21罗小美
罗小美
(杜尔涂装系统工程(上海)有限公司,上海200233)
AutoCAD实体导出Glyph2脚本的实现
罗小美
(杜尔涂装系统工程(上海)有限公司,上海200233)
摘要:目前CFD网格划分软件Pointwise不能导入AutoCAD图纸,无法实现数据重用。为了提高工作效率,需要开发一个能在Pointwise中重建AutoCAD实体对象的程序。这个程序作为AutoCAD的扩展运行,把AutoCAD图纸中的实体对象逐个翻译成能重新创建 Pointwise实体对象的Glyph2脚本语句,在Pointwise中执行该脚本可以得到AutoCAD实体对象的等价物。实际运行该扩展程序证明该实现是切实可行的,避免了重复建模工作。
关键词:AutoCADObjectARX导出Glyph2
在流体仿真过程中,需要对不同设计方案或设计参数分别进行计算。每次计算如果都重建模型,将非常繁琐低效。
CFD网格划分领域最流行的是采用自顶向下方法的ICEM和采用自底向上方法的Pointwise。Pointwise严格按照点、线、面、体的方式来生成网格,学习曲线平坦[1]。每个网格分区里的网格可以做详细的调整,网格质量很好,支持最复杂、网格质量最苛刻的模型,这是ICEM难以比拟的。
在实际应用的过程中,Pointwise和AutoCAD之间缺乏数据交换工具,需要实现一个AutoCAD的扩展,把图纸里的实体信息提取出来,生成一个Glyph2的脚本,然后在Pointwise里执行脚本,重建模型,从而实现模型重用。
1Glyph2脚本概念
Pointwise的脚本语言Glyph2是通用解释型脚本语言Tcl/Tk的扩展。它提供了一个基于文本、面向对象的过程化接口。Pointwise读取Glyph2脚本后,依次执行其中的命令,不容错。
Glyph2脚本由命令组成。每一行都包含命令和若干参数,用空格分开。命令到行尾结束。一个长命令分布到多行上使用反斜杠()作为连续行指示符。多个命令写在同一行使用分号(;)分割。
表达式加中括号表示计算这个表达式的值并代换。表达式可嵌套,最深的表达式先计算。同嵌套层级的表达式从左至右执行。
多个词可用双引号和大括号组成一个单一参数。双引号允许变量和命令替换。大括号用于不希望代换或者延迟代换的时候。大括号可标识奇异的变量名,如果变量名的字符不属于规定的类型,如果包含了连字符,就要加上大括号解除常规命名限制。
大括号和双引号的作用范围覆盖前后符号之间,包括分号和换行符。双引号内部嵌套的大括号仍然执行代换功能,大括号内的内容都当成一个常规字符。在大括号和双引号前面加反斜杠()把它们转义成常规字符。
#符号表示从这里到行末是注释,如果行末是反斜杠表示下一行还是注释。如果想在一行的中间开始加入注释,用分号标识这一行前面的命令到此结束[2]。
2Pointwise中的实体
Pointwise中的实体包括Database、Connector、Domain和Block。Database指的是那些将要被划分网格的几何对象,Connector是线网格,Domain是面网格,Block才是最终需要的体网格[1]。
为了简化AutoCAD直线和曲线到Database的翻译过程,这里仅讨论AutoCAD的两种简单线类型:直线段和圆弧。
3简单Glyph2脚本的结构
下面介绍在创建一根直线型database的最简脚本模式[2]:
第一行是:
package require PWI_Glyph
这是所有Pointwise脚本的首行,它令Pointwise加载Glyph2模块和库。注意Glyph2只是Tcl的一个包,Pointwise还可以灵活加载其它Tcl包。
第二行开始创建Database[3]:
set oneDatabaseObj [pw::Application begin Create]
Glyph2脚本中,一个实体的标准创建过程叫做一个Creation Mode。在Glyph2脚本中使用Creation Mode并不是必须的,但它提供了一种安全措施。比如,如果在一个Creation Mode中创建一个Connector,而这个Connector和这个Creation Mode外部已经存在的某个Connector共享两个端点坐标,那么Pointwise会激活重复性检查,而这两个Connector会合并成一个Connector。在这里,创建了一个名为oneDatabaseObj的Creation Mode。
第三行创建一个Segment对象:
set oneDatabaseObjSeg [pw::SegmentSpline create]
这是一个SegmentSpline类型的派生对象,为了脚本的可读性,这个Segment对象的名字只是在所属的Creation Mode的名字后面加上“Seg”后缀。
第四行和第五行为这个SegmentSpline对象添加两个定义点:
两个定义点的添加顺序是:起点、终点。注意点坐标表达格式,它们是list函数的参数。
第六行创建一个Curve对象:
set oneDatabaseObjCurve [pw::Curve create]
Curve对象才是真正在面板区列出的Database对象,它可以包含一个或多个Segment对象。为了脚本的可读性,这个Curve对象的名字同样只是在所属的Creation Mode的名字后面加上“Curve”后缀。
第七行向Curve对象添加前面创建的Segment对象:
第八行结束当前的Creation Mode:
第九行是重置图形区:
pw::Display resetView; # Zoom to geometry
Database对象创建之后,其大小和图形区的大小经常是不匹配的。重置图形区本质上是最大化显示。
第十行,也是最后一行,结束脚本:
Exit; # END SCRIPT
以上就是一个最简单的创建直线型Database Curve对象的脚本的全部内容。
创建圆弧型Database对象的时候,需要创建的Segment对象应该是SegmentCircle类型的:
set oneDatabaseObjSeg [pw::SegmentCircle create]
SegmentCircle对象需要按顺序添加4个参数:首先用addPoint命令添加圆弧的起点和圆弧的终点:
然后用setCenterPoint命令添加圆弧的圆心点和圆弧的法向矢量。
这样就设置了一个起点在(10,0,0),终点在(10,0,0),圆心在(0,0,0,),法向矢量指向Z轴,位于第一和第二象限的半圆弧Segment。
4程序实现
AutoCAD的二次开发可以选择原生语言C++、.NET语言C#和VB.NET、脚本语言VBA和Visual Lisp。这里选择了C#语言,因为它在功能和难度之间比较平衡。
AutoCAD和Pointwise使用同样的坐标系,所以不需考虑坐标系变换。
使用C#开发的AutoCAD扩展是后缀名“dll”的类库文件。类库文件中至少包含一个类声明,在其中实现一个方法。为了能够从AutoCAD的命令行调用这个方法,需要给这个方法加上命令属性[4]。
[CommandMethod("GENGLPH", CommandFlags.UsePickSet | CommandFlags.Redraw | CommandFlags.Modal)]
static public void GenerateGlyphScript()
此处方法名称是GenerateGlyphScript,调用的命令是缩写"GENGLPH"。
方法在执行过程中要执行三个任务:
1)选择对象;
2)让用户指定Glyphs脚本文件存放的路径;
3)选择集中的对象逐个翻译成Glyph2脚本语句并写入指定的文件。
因为只转换AutoCAD直线段和圆弧,所以构建一个选择过滤器[5]。首先创建一个PromptSelectionOptions对象:
PromptSelectionOptions pso = new PromptSelectionOptions();
它的作用是显示屏幕提示:
pso.MessageForAdding = "Plese select lines or arcs";
创建使用逻辑运算符的过滤器选择多个类型的AutoCAD实体:
TypedValue[] filterValue = new TypedValue[]
{
new TypedValue((int)DxfCode.Operator, " new TypedValue((int)DxfCode.Start,"Line"), new TypedValue((int)DxfCode.Start,"Arc"), new TypedValue((int)DxfCode.Operator, "OR>") }; SelectionFilter entityFilter = new SelectionFilter(filterValue); 然后把PromptSelectionOptions对象和SelectionFilter对象作为参数,让Editor对象执行选择交互: PromptSelectionResult psr = ed.GetSelection(pso, entityFilter); 创建一个SelectionSet对象保存选择集: SelectionSet ss = psr.Value; 接下来需要用户指定Glyph2脚本的完整路径。 创建一个PromptSaveFileOptions对象,它用于设置文件保存对话框: PromptSaveFileOptions psfo = new PromptSaveFileOptions("Specigy Glayph2 file name"); 这里的构造函数带有一个字符串参数,它是文件保存对话框的标题。Glyph2脚本文件的名字默认地取当前AutoCAD图纸的名字: psfo.DeriveInitialFilenameFromDrawingName = true; 为了让Glyph2脚本文件自动地取得扩展名“glf”,这里设置一个文件扩展名过滤列表: psfo.Filter = "Pointwise Glyph Script (*.glf)|*.glf|All files (*.*)|*.*"; 过滤列表定义了两个项目:glf文件和所有文件。为了让“glf”成为默认选项,按索引数值通知文件保存对话框该默认选择哪一个: psfo.FilterIndex = 0; 然后把PromptSaveFileOptions对象作为参数,让Editor对象执行交互: PromptFileNameResult pfnr = ed.GetFileNameForSave(psfo); 用户指定保存目录和文件名之后,创建一个FileStream对象表示这个文件: FileStream fs = new FileStream(pfnr.StringResult, FileMode.Create, FileAccess.Write); 接着创建一个StreamWriter对象执行写入操作: StreamWriter sw = new StreamWriter(fs); 现在让StreamWriter对象写入任何Glyph2脚本的统一的首行[6]: sw.WriteLine("package require PWI_Glyph"); 再把前面选择的对象逐个翻译成Glyph2脚本语句并写入脚本文件。因为需要写入多个AutoCAD实体对象对应的脚本语句,所以creation mode的命名需要改为随机字符串。 以一根AutoCAD直线段为例子,初始化直线型对象的引用: Line oneLine = id.GetObject(OpenMode.ForRead) as Line; 调用GUID的方法生成一个无格式随机字符串作为creation mode的命名[7]: string creationModeName = System.Guid.NewGuid().ToString("N"); 接下来按照前述Creation mode结构模板调用StreamWriter对象的WriteLine()方法写入这个AutoCAD直线段对应的Glyph2语句。 AutoCAD圆弧的处理方法是一样的,只是圆弧读取的参数不一样而已。 选择集中所有的AutoCAD实体对象都处理完毕后,关闭FileStream对象和StreamWtriter对象: sw.Close(); fs.Close(); 最后,让Editor对象在命令行中写入执行完毕的通知: ed.WriteMessage("Save a script file successfully!"); 图1是AutoCAD绘制的一个容器,一头流入,另一头流出。 图2是Pointwise执行Plyph2脚本之后生成的Database对象。 5结语 使用C#语言开发的Glyph2脚本生成工具,在实际使用中,成功利用了已有的AutoCAD图纸,避免了使用Pointwise进行重复的它并不擅长的几何建模工作,提高了工作效率。 参考文献 [1]Pointwise, Inc. Pointwise User Manual[M/CD]. USA: Pointwise, Inc. 2014:16-17. [2]Pointwise, Inc. Pointwise Glyph Reference Manual [M/CD]. USA: Pointwise, Inc. 2014:14-21. [3]Pointwise, Inc. Glyph2[EB/OL]. http://www.pointwise.com/glyph2/files/Glyph/cxx/GgGlyph-cxx.html [4]曾洪飞,卢择临,张帆. AutoCAD VBA&VB.NET开发基础与实例教程(第二版)[M].北京:中国电力出版社,2013:12-22. [5]Autodesk Inc. ObjectARX for AutoCAD 2013 : Managed Class Reference[M/OL]. http://usa.autodesk.com/adsk/servlet/item?siteID=123112&id=785550. [6]Karli Watson, Christian Nagel. C#入门经典(第5版) [M]. 齐立波,译. 北京:清华大学出版社,2010:598-619. [7]Microsoft Corporation. Visual C# [EB/OL]. https://msdn.microsoft.com/en-us/library/vstudio/system.guid.newguid%28v=vs.110%29.aspx. 中图分类号:TH12;TP39 文献标识码:B 文章编号:1002-6886(2016)03-0091-05 作者简介:罗小美(1977-),女,机械工程师,就职于杜尔涂装系统工程(上海)有限公司。 收稿日期:2015-11-03 The implementation of generating Glyph2 scripts from AutoCAD entities LUO Xiaomei Abstract:Currently, mesh generation software for CFD cannot import AutoCAD drawings, so work data cannot be reused. In order to improve work efficiency, it is necessity to develop a program that can rebuild AutoCAD entity objects in Pointwise. This program will run as the extension of AutoCAD, and translate AutoCAD entity objects one by one into Glyph2 script sentences that can rebuilt Pointwise entities, and the equivalents of AutoCAD entity objects can be gotten after Glyph2 script is executed in Pointwise. Practical running of this extender proves that this implementation is practicable and avoids repeating modeling work. Keywords:AutoCAD; ObjectARX; export; Glyph2