Lisp应用于坐标标注中的若干问题解析

时间:2022-07-14 07:27:04

Lisp应用于坐标标注中的若干问题解析

摘要:随着CAD的广泛应用,设计师们对CAD的要求也越来越高。通过二次开发工具Lisp语言能够很好地解决日常工作中的许多小型问题。坐标标注这一程序在设计过程中,要充分考虑到图层、捕捉、坐标取位精度和引线位置计算等方面的问题,切实做到程序正确实用、操作方便、不破坏原图的参数环境,使CAD不仅是绘图工具,同时也是得心应手的高效设计平台。

关键词:图层捕捉控制取位精度引线方向加载

Autocad软件应用已经在建筑设计、城市规划、工程制图、机械设计、电子电路等单位普及,它为我们的工作带来了很大的便利。随着工作的不断细化,广大设计师对CAD的要求也在不断地增强,有些工作中需要的功能,在CAD软件中并没有提供,需要通过二次开发的功能来实现。Autocad二次开发的主要工具有LISP、VB/VBA的Activex及C/C++的ObjectARX。LISP以其简单、易于掌握的特点深受设计师的喜爱。LISP语言是人工智能学科领域中广泛采用的一种程序设计符号语言,这种语言在参数化绘图中有很大的灵活性。LISP开发出的程序可以像运行CAD普通命令一样在命令行中直接键入自己定义的命令运行,保持了用户的绘图习惯。

在设计中我们经常会遇到对图纸上的坐标进行标注的问题。对于市面上的专业软件如CASS软件、天正软件均具有该项功能,但对于广大设计师,他们使用的是普通CAD而非专业版的,并不具备这一功能,需要通过LISP语言进行二次开发来实现。一个好的LISP程序至少要保证三个条件:1、程序本身运行的正确性2、程序操作简单、界面清晰3、程序执行完后要还原所有改动过的CAD运行环境参数。因此在编写坐标标注这一程序时要考虑以下相关问题。

一、图层控制

程序执行所生成的坐标标注信息应该放在同一层内(如ZBBZ层),且不应破坏原有图层,这样便于对ZBBZ这一层进行开、关、冻结、删除等层控操制。

首先用(setq old-layer (getvar "clayer"))命令将程序执行前的当前图层名提取出来存入old-layer这个变量。由于同一张图可能会分几个时间段进行标注,先判断ZBBZ图层是否存在,如果存在,将它设为当前层,如果不存在,则新建层名,确定层的颜色。

(setq Labz (tblsearch "Layer" "ZBBZ"))

(IF (=Labz nil)

(progn (command "layer" "n" "ZBBZ" "" )

(command "layer" "s" "ZBBZ" "c" "1" "" ""))

(setvar "clayer" "ZBBZ"));;if结束

在程序执行完退出之前,需要将程序执行前的图层进行还原

(setvar "clayer" old-layer)

二、标注的字体样式

首先要清楚想要标注的字体样式如HZ、FS在windows系统的字库中是否存在(正常情况下都有),然后将当前字体样式名提取出来存入old-style这个变量,如果字体已加载到图形中,将其定为当前字体,如果字体未加载,则加载字体并确定字的宽度、倾斜角度等属性,最后在程序执行完退出之前将字体样式还原。

(setq old-style (getvar "textstyle"))

(setq newstyle (tblsearch "style" "hz"))

(IF (= newstyle nil)

(command "style" "hz" "rs,hztxt" "0.0" "0.8" "0" "n" "n" "n")

(setvar "textstyle" "hz"))

(setvar "textstyle" old-style);;还原字体

三、捕捉控制

在程序执行中,经常会遇到程序是正确的,但运行结果却不太符合自己的意愿,这其中一个主要原因是没有把对象捕捉关掉。坐标标注一般都需要捕捉到特征点上,要合理控制好捕捉的开与关才能达到想要的效果。CAD常用的捕捉及对应的位码设置有以下几种:

0 NON(无) 1 END(端点) 2 MID(中点)

4 CEN(圆心) 8 NOD(节点) 16 QUA(象限点)

32 INT(交点)64 INS(插入点)128 PER(垂足)

256 TAN(切点) 512 NEA(最近点) 1024 QUI(快速)

通过位码值的累加可以实现多个对象捕捉的打开。

首先要把程序执行前的捕捉模式提取出来,在捕捉的状态下点取需要标注的特征点,然后关闭对象捕捉,点取标注位置,进行标注引线及X、Y标注位置的计算,退出程序前将捕捉模式还原。

(setq pzyms (getvar "osmode"));;提取捕捉模式

(setvar "osmode" 0);;关闭捕捉

(setvar "osmode" pzyms) ;;还原

四、引线方向

点取标注点和标注位置后,用(setq ang (angle 标注点标注位置))计算两点连线与横轴之间的夹角,当ang的值处于0~1.57(π/2)和4.71(3π/2)~6.28(2π)之间,从标注位置这个点向东水平画一段引线,否则向西水平画一段引线,引线的长短视所标注坐标的位数来确定,即读取坐标的字符数。根据引线和标注字的高度计算出X和Y标注时的起点位置。

五、坐标取位精度并标注

由于CAD显示坐标的位数的限制,造成直接读取出来的X、Y测量坐标小数位数不够或采用了科学计数法,一则精度达不到二则表现不直观,需要用RTOS函数进行小数位数的控制并将X、Y值转换成字符型,在图上进行标注。

(setq 标注点 (getpoint "\n点取标注点:"))

(setq Y (car 标注点))

(setq X (nth 1 标注点))(PRINC)

(setq bzX(strcat "X=" (rtos X 2 3))) ;;取3位小数

(setq bzY(strcat "Y=" (rtos Y 2 3)))

(command "text" "s" "hz" "j" "c" X的起点标注位置 "1.5" "0" bzX)

(command "text" "s" "hz" "j" "c" Y的起点标注位置 "1.5" "0" bzY)

;;在图上展标X、Y坐标值

六、lisp程序加载

假设坐标标注程序的文件名为“坐标标注.lsp”,程序名为“BZ”,存放在D盘根目录下。 Lisp程序加载一般有4种方式,主要采用第三种和第四种的加载方式。

⑴ 自动加载

用记事本建立一个名为acad.lsp文件,放在CAD的安装目录下的support目录中,文件内容为(LOAD "d:/坐标标注")。设置好以后,当每次启动CAD时都会自动加载acad.lsp中定义的程序命令。由于目前一些CAD病毒是通过acad.lsp文件来进行传播的,对电脑的安全会产生危害,故不赞成采用这一加载方式。

⑵ 手工加载

启动CAD,在command命令行内输入语句(load "d:/坐标标注"),即可将程序加载到CAD中。在使用时,只需在command命令行内输入程序名BZ即可。在不退出CAD运行平台的情况下,程序只需加载一次,BZ命令可以随时反复调用,就相当于运行CAD本身的命令一样方便,但缺点是需要知道文件名存放的目录,或将程序拷贝到CAD支持的搜索目录下。

⑶ 拖动加载

用鼠标左键点击应用程序文件,按住鼠标不放,将文件直接拖放至AutoCAD绘图窗口后再松开鼠标,实现程序的加载。在不退出CAD运行平台的情况下,程序可反复调用。采用这种方式不受程序所存放的目录的限制,通过拖动能自动读取目录名,加载程序,比较实用可行。

⑷ 用菜单或工具条加载

用记事本建立一个名为add.mns的菜单文件,与CAD菜单文件放在同一目录下,将程序拷入CAD支持的搜索目录下。

菜单加载格式:

***MENUGROUP=用户菜单

***POP1

[用户菜单]

[坐标标注]^C^C(load "坐标标注");bz

……

// [--]

工具条加载格式:

***TOOLBARS

**用户工具条

ID__1_0 [_Toolbar("用户工具条", _Left, _Show, 1, 0, 1)]

ID_UserButton_1 [_Button("坐标标注", "图标.bmp", "ICON_16_NEW")]

^C^C(load "坐标标注"); bz (接上行)

……

// [--]

在command命令行内输入menuload命令进行add.mns菜单的加载。

这种方式适合于需要加载的应用程序较多,将它们放在同一个add.mns菜单中,进行一次性加载,方便实用。

七、结束语

Lisp语言具有坚固的理论基础,丰富的表达能力,较强的可塑性,但LISP程序的运行离不开CAD的平台,限制了它的应用。Lisp的交互运行方式非常适合于小型功能的开发。

采用LISP语言编写出适合工作需要的工具,可以有效减轻设计人员的劳动强度,使autocad不仅仅是绘图工具,同时也是设计人员得心应手的高效设计平台。

注:文章内所有公式及图表请用PDF形式查看。

上一篇:CFG桩在连霍高速郑州至洛阳段改建工程地基处理... 下一篇:高强度摩擦型螺栓节点板有限元分析