标签:and div 启用 mode 问题 引用类型 shape reac exp
DRAWEXE系OpenCASCADE中的脚本支撑项目,通过对TCL脚本语言的扩展可以便捷使用OpenCASCADE。
脚本显示方面的命令分两种:一种在组名DRAW Graphic Commands内,启用DRAWEXE之后立即加载可用,只能显示线框,不能渲染面;另外一种在组名ZeViewer内,是对AIS Viewer的扩展,可以线框或Shaded渲染。前一种太简单,这里主要讨论后一种,在窗口之内按Ctrl+鼠标左键,缩放,Ctrl+鼠标中键,平移,Ctrl+鼠标右键,旋转,这样对于交互显示来说就很重要了。
在浏览OpenCASCADE脚本命令实现的时候,可以发现除explode之外,还有nexplode命令。看注释相比explode,nexplode命令可以稳定命名爆炸出来的对象,该命令实现内部在计算质心之类的东西,然后通过质心的排序依次命名访问TopoDS_Shape下边的面、边、顶点之类的对象,而explode仅仅是按按遍历次序来的。
我感觉这种模式也不好用,能一下子就明白面、边、顶点质心之类的属性排序出来是怎样的吗,不能吧。比对ACIS里对Scheme语言的扩展,采用拾取定位清晰很多,不过如果还依靠真实地在窗口里边鼠标点击选择,有点失去脚本便捷的优势,如果能够实际鼠标点击,拾取到所需要的,那就更好了,这个在OCCT里边也可以做到吗?
例举以下语句:
box b1 0 0 -20 8 40 40
vselmode b1 2 1
set str1 [vconvert 8 40 0 window]
scan $str1 "Window Xp,Yp: %d %d" a b
vselect $a $b
vnbselected
vpickselected e2
上面vselmode语句是定义拾取边缘,vselect则是模拟鼠标点击拾取的过程,vconvert则是将三维点转换成为当前窗口像素点,这样才知道在哪个位置发起拾取,vnbselected返回拾取的数量,vpickselected会捆绑拾取的对象至名字e2。
最后说的自己使用TCL脚本的感受,TCL脚本对变量类型的扩充性不强,至少在OCCT里是这样,变量就是数量型,数组型,字符串型,列表型,字典型;后面的列表和字典也挺字符串的,OCCT是通过捆绑命名与Draw_Drawable3D派生类实例来对类型进行扩展,比如pi对应的是Draw_Number,赋值,所以得通过命令dval pi才能得到pi的值,并不能直接赋予pi。
再一个就是Tcl只支持参数的传值调用,不支持指针和引用类型,看教材的介绍要通过进行多一轮的替换,来模拟出引用的行为。有个专门的命令upvar命令。
然后,在实际使用中,我曾经想将explode爆炸出来的对象,搞成一个列表,再编写一个find_edge之类的过程,通过查询边缘的顶点与给定值比较精确定位边缘,搞一个通用的过程函数方便使用,但是传过去的边缘数组,在foreach循环里无法依据名字返回捆绑的边缘,无法使用,百丝不得其解呀,后面再去翻TCL脚本语言教程,看到传值,估计是这个原因吧,但是还是得不到理想的结果呀,而且不知道为什么whatis $edge可以得到边缘,再explode $edge v就不行了。
相比之下,ACIS的Scheme语言就好得多,(entity:edges s1)返回一个列表,存储s1里边的所有边缘,真的是边缘类型,OpenCASCADE的TCL里边用set elist [list {*}[explode b1 e]]语句也可以将b1里边的边缘打包成为列表,但是要注意的是elist列表里边的东西全是字符串的名字哦,它们不是边缘,只是在OCCT里边该名字捆绑了一个Draw_Drawable3D派生类实例,你可以对应过来用。
除此之外,Scheme语言对命令命名还支持‘:‘、‘?‘这些,可以较好对命令明确地分组,也容易理解些(比如edge?就是查询是否为边缘类型)。了解到这个我当时觉得开了眼界,只可惜ACIS是不开源的。
标签:and div 启用 mode 问题 引用类型 shape reac exp
原文地址:http://www.cnblogs.com/zale_lzj/p/7985453.html