AutoCAD三维实体转二维视图方法的研讨
2021-07-01韩希国
韩希国
(辽宁科技学院 机械工程学院,辽宁 本溪 117004)
在机械设计过程中,先进行三维设计再导出二维视图的设计理念已经被多数设计者所认可,而如何将三维实体快速生成二维视图已倍受关注,目前,一般采用文献〔1〕、〔2〕中所提到的方法来生成二维图,其缺点是操作复杂,且绘图效率低。
本文基于Auto LISP、Visual LISP、Dialog Control Language等程序语言,并结合AutoCAD中的flatshot命令,开发出将三维实体快速生成二维视图的AutoCAD插件,从而使二维工程图样的绘制变得简单、快捷、可靠。
本文重点论述了程序设计的主要方法和步骤。
1 视图数量及线型属性设置
考虑到三视图的使用频率高于其它视图配置模式,并兼顾提高绘图效率,插件默认为生成主、俯、左三个视图(图1),节省了操作时间。对于其它视图配置模式是通过输入关键字“E”调用话框进行设置,其中线型属性默认值更改后将会自动保存于注册表中,并成为下次使用时的默认值,尽量适应各类用户的使用习惯。
图1 AutoCAD命令窗口操作提示截图
2 当前dwg文件中原有对象的显示与隐藏方法
在dwg图形文件中,为了既允许存在多个三维或二维对象,又不影响被选定的三维目标对象转换成二维视图,编程时应按下述方法进行。
2.1 保存当前视口状态
(1)保存当前图层
(setq clayer_bak (getvar "clayer"))
(2)保存当前视口中的显示
程序代码为:(command "view" "s" "stx")
(3)关闭坐标系
程序代码为:(command "ucsicon" "off")
图2 视图、线型属性选项对话框截图
2.2 新建三维目标对象存放图层
为了控制二维视图的生成的中间过程为不可见模式,可新建“ 3→2专用”图层,使其置为当前且关闭。程序代码为:
(command "_layer" "m" “3→2专用” "off" “3→2专用” "y" "")。
2.3 冻结除当前图层以外的所有图层
单选三维实体并复制,然后将复制后的三维实体更改到“3→2专用”图层中, 此时,冻结除当前图层外的所有图层,以避免autocad当前dwg文件中其它对象参与操作,程序代码为:
(vla-put-layer (vlax-ename->vla-object mx) “3→2专用”)
(command "layer" "f" "*" "")。
3 获取编程必要数据
目标对象的长、宽、高和各视图的间距尺寸是程序处理时的必要数据,获取方法如下:
首先在西南等轴测世界坐标系下,分别获取目标对象在俯视方向(Z轴负向)和主视方向(Y轴方向)最小正交包围框(图3中双点划线所示的假想矩形),并且计算出沿俯视或主视方向观察时,假想矩形左下角点和右上角点坐标p1、p2。然后再求出三维实体长(L)、宽(W)、高(H)和视图间距尺寸d。
图3 西南等轴测世界坐标系下立体包围框和z轴矢量位置图
程序代码如下:
(defun bound (/ blk_bound )
(setq blk_bound (acet-geom-ss-extents ss t))
(setq p1 (car blk_bound))
(setq p2 (cadr blk_bound)) )
(defun c: example1 ()
(command "-view" "swiso" )
(command "ucs" "w")
(setq en (car (entsel "ː 选择三维实体")))
(command "copy" en "" "0,0,0" "0,0,0")
(setq ss (ssget "L")) (bound)
(setq W(- (cadr p2) (cadr p1)))
(command "ucs" "x" 90) (bound)
(setq L(- (car p2) (car p1)))
(setq H(- (cadr p2) (cadr p1)))
(setq d(/ (+ W H) 5)))
4 旋转复制“3→2专用”图层中的三维实体
先切换为主视图,再根据图2中钩选视图的数量,分别按图3中箭头所示的位置和方向变换USC的Z轴矢量,最后旋转复制三维实体,最多可以生成主、俯、左、右、仰、后六个不同视角下的三维实体〔3〕(见图4)。
以生成主、俯、左三个视角下的三维实体为例,程序代码如下:
(if (= fustz 1) (progn
(command "UCS" "ZA" (list (car p1) (- (cadr p1) d) (caddr p1)) (list (+(car p1) 10) (- (cadr p1) d) (caddr p1)))
(command "rotate" en "" "0,0,0" "C" 90)
(command "UCS" "p")
))
(if (= zuostz 1) (progn
(command "UCS" "ZA" (list (+(car p2) d) (cadr p2) (caddr p1)) (list (+(car p2) d) (+(cadr p2) 10) (caddr p1)))
(command "rotate" en "" "0,0,0" "C" 90)
(command "UCS" "p")))
以此类推,可得到其它三维实体(图4)。
当没选择主视图时,删除生成主视图的立体
(if (= zustz 0) (command "erase" en "" ))
图4 按六视图规则旋转复制三维实体
5 执行flatshot命令创建二维视图
(1) 将“3→2专用”图层中的n个三维实体在视口中最大化命令为(command "zoom" "e")
(2) 将对象铅直向上移动
移动距离为当前视口高度尺寸的2倍,使其在视口内不可见。程序代码为:
(command "move" (ssget "x" '((8 . “3→2专用”))) "" "0,0" (list 0 (* 2 (getvar "viewsize "))))
(3) 打开“3→2专用”图层
程序代码为:(Command "_.-layer" "_on" “3→2专用” "")
(4) 执行平面摄影flatshot命令
程序代码为:(command "_.flatshot" (list 0 hhh) "" "" "")
(5) 删除“3→2专用”图层中所有三维立体
程序代码为:(command "_.erase" (ssget "x" '((0 . "3dsolid") (8 . “3→2专用”))) "")
(6) 带基点复制由flatshot命令生成的视图块,然后再粘贴到视口内
程序代码如下:
(setq m (ssget "L"))
(bound)
(if (= (+ zustz fustz zuostz youstz yangstz houstz) 1)
(command "copybase" p1 (entlast) "" ) (command "copybase" (polar p1 (angle p1 p2) (* 0.5 (distance p1 p2))) (entlast) "" ) )
(command "erase" (entlast) "" )
(command "view" "r" "stx")
(command "layer" "t" "*" "")
(command "_layer" "m" clayer_bak "")
(command "ucs" "v")
(command "pasteclip" pause)
至此,程序运行完毕
图5 执行flatshot命令创建二维视图
6 结束语
本文所给论述的编程方法,经过了反复的实验和应用,其视图的生成速度以秒计,大幅度提高了二维工程图样的绘图效率,具有一定的实用价值。