“转自:结构设计-公众号“
熟悉Rhino或SketchUp的朋友,应该会留意到他们在文字显示方面的独特之处。
在Rhino中,无论进行怎样的三维旋转,标注的文字始终朝向使用者,并不会随标注物件转动而转动。
在SketchUp中,可以在“编辑组件”定义时,勾选“总是面对视窗”选项,从而达到物件随视角转动的效果(跟上述Rhino的显示效果类似)。
那么,在AutoCAD中能否实现类似的显示效果?这种显示功能又有何用处呢?
▲
犀牛标注的文字始终与视窗平面保持一致
第一个视频是对某单层网壳屋盖的节点编号标注。从视频中可以看到,所有节点编号基本是与网壳曲面贴合标注,且所有文字平面的法向是一致的(统一指向我们所需的自定义视角)。
▲
第二个视频是对屋面支撑和倾向钢柱的节点编号标注。在这个例子中,只要我们选择好一个合适的视角平面,就可以使多个空间交错放置的构件绘制在同一张图纸上。
▲
屋面支撑、倾向钢柱的节点编号标注效果
二、AutoCAD中的各种坐标系统
在介绍代码之前,有一些基本概念需要我们先了解的。大家熟知AutoCAD中的WCS和UCS这两个坐标系统,但其实还有其它的坐标系统。
用户坐标系统是一个工作坐标系统。它是由用户自行设定的坐标系统,使绘图编辑工作变得更容易。
● 对像坐标系统(OCS)
对像坐标系统又称为图元坐标系统,它用于描述图元在三维空间中的位置。由 AutoLISP的entget 函数返回得到的点坐标值,就是处于该坐标系统。
● 显示坐标系统(DCS)
显示坐标系统是图片在显示前所转换的坐标系统。此坐标系统的原点为标的点,而Z轴为观测方向。所以,在 DCS 中的图像永远都是平面视图。
● 图纸空间显示坐标系统(PSDCS)
该坐标系统只是用于在图纸空间和活动模型空间视区之间进行点的转换。它基本上是一种二维的转换。
三、对象坐标系统
对象坐标系统OCS具有以下特性:
(1)OCS的原点与WCS原点是重合的。
(2)对于同一个Z轴的方向矢量,只有一个OCS。即若两个OCS定义的Z轴方向矢量是相同,则视这两个OCS为同一个坐标系统。
(3)OCS的X轴和Y轴的方向由AutoCAD 内部的任意轴算法确定(这里不涉及到该算法,暂不介绍)。
由对象坐标系统的定义和特性可知,对于文字类的图元,只需确定其OCS的Z轴方向矢量和插入点,然后转换到WCS中,即可确定该文字图元在三维空间中的位置与放置方向。那不同坐标系统之间是怎么转换呢?
四、不同坐标系统之间的转换
AutoCAD不同坐标系之间的转换,最常用的就是在命令栏输入“WCS”或者“UCS”。但如果你输入“OCS”,不好意思了!AutoCAD是没有这个命令的。这是因为OCS属于AutoCAD内部定义的一种坐标系统。如果要对OCS转换的话,就需要使用到LISP的trans函数了。
语法:(trans pt from to [disp])
● 参数pt:三维实数列表。当disp为nil或不存在时,pt表示点坐标。当disp为T时,pt表示三维位移量。
● 参数from:pt所处于的原坐标系统。
● 参数to:把pt转换到新的坐标系统。
● from和to:整数参数,取值范围0~3。它们分别代表不同坐标系统,其中0代表WCS、1代表UCS、2代表DCS、3代表PSDCS。
● 参数disp:可选参数,控制pt代表坐标值or位移量。
根据AutoLISP函数手册说明,from与to仅能在0~3之间取值,但这里面并没包含OCS。那怎么对文字的OCS与其它坐标系统进行转换呢?经在官方论坛AutoLISP板块里搜索相关信息后,发现from和to还可以是一个三维实数列表,用于表示OCS的Z轴方向。
五、自定义视角标注文字代码
实现步骤大致可以分为以下四步:
Step2:将UCS的Z轴转换到WCS坐标系统中
具体代码和注释如下:
;;文字标准前必须处于WCS系统,且文字插入点的原坐标也需要是WCS下的值。
;;Step1:定义所需的UCS坐标系统
(setq OriginNew (getpoint "n点取新坐标原点:"))
(while (not OriginNew)
(setq OriginNew (getpoint "n点取新坐标原点:"))
)
(setq Xnew (getpoint "n点取新坐标X轴上的点:"))
(while (not Xnew)
(setq Xnew (getpoint "n点取新坐标X轴上的点:"))
)
(setq YY (getpoint "n点取新坐标XY平面上的点:"))
(while (not YY)
(setq YY (getpoint "n点取新坐标XY平面上的点:"))
)
(command "ucs" "3p" OriginNew Xnew YY)
;;Step2:将当前UCS的Z轴转换到WCS中
(setq OCS_Zdir (trans (list 0 0 1) 1 0))
;;Step3:对文字插入点进行转换
(setq Origin_coord (list Mark_x Mark_y Mark_z)) ;;Mark_x,Mark_y,Mark_z为文字插入点在WCS中的三维坐标值
(setq UCS_coord (trans Origin_coord 0 1)) ;;将文字插入点的坐标值由WCS坐标转换到UCS坐标中。
(setq Draw_coord_OCS (trans UCS_coord 1 OCS_Zdir)) ;;将文字插入点的坐标值由UCS坐标转换到OCS坐标中,其中OCS的Z轴为自定义的UCSZ轴。
;;Step4:采用群代码的方式生成文字图元
(entmake (list (cons 0 "TEXT") (cons 100 "AcDbText") (cons 1 Mark_text) (cons 7 FontName) (cons 8 "JointNum")
(cons 10 Draw_coord_OCS) (cons 11 Draw_coord_OCS) (cons 40 TS) (cons 41 WidthFac) (cons 50 AngText)
(cons 72 1) (cons 73 2) (cons 210 OCS_Zdir)
)
)
;;其中一些变量解释如下:
;;变量Mark_text是字符串变量,用于存储需要标注的文字内容
;;变量FontName是字符串变量,用于存储标注文字样式的信息
;;"JointNum"为字符串,表示文字所在的图层名称
;;变量TS、WidthFac、AngText均为实数型变量,分别表示文字的高度、宽带因子和平面转角
;;(cons 210 OCS_Zdir)表示文字的拉伸方向(亦即文字所在平面的法向)为自定义UCS的Z轴方向
The End
来源:Nikko结构空间,作者:Nikko Ho,如有侵权请联系我们。
转自:结构设计-公众号
公众号:MyStructure
“转自:结构设计-公众号”公众号,致力于推广建筑结构新理论、新技术、新工艺、新材料及大量工程实例,介绍建筑结构知识和行业资讯,搭建一个建筑结构行业交流的平台。