最初由 mrbean13 发布
[B]执行你修改后的程序dh,在(command "dimlinear")后,由于需要等待用户拾取两点等一系列操作,故(command "exit")会返回错误,程序不能退回到command:提示符下,且(mkstr2)也不执行。若将(command "exit")放在(comman... [/B]
以前给你修改的程序,在(command "exit")前,需要你有固定的操作,也就是在DIM命令里面,你要有固定的操作,用变量,而不是用交互,这样程序流程才可以继续。
解决方法:
1. 若让程序自动执行(不在DIM命令里面和ACAD交互),那么你在执行DIM命令前,先用getXXX函数让用户输入具体信息,比如取点等放入变量,然后在(command "dimlinear")中,后面需要的参数用变量代替。
2. 很多情况下,希望用户在命令里面和ACAD交互,用户自己输入exit退出到命令行,那么要用技巧,论坛以前我贴过方法,就是动态的和ACAD交互命令,让程序知道什么时候命令结束退到命令行状态的方法,在命令里面使用cmdactive系统变量或者cmdname变量。
比如你的程序要用DIM命令,那么:
1. 先执行命令头,(command "dim") 或者上次说的(sldna "dimn"),执行后,进入dim:状态,这时候等待用户和ACAD交互,如何判断用户什么时候结束呢?
2. 做循环

- (while (= (getvar "cmdactive") 1)
- (command pause)
- )
-
系统变量cmdactive的值若为1,则表明当前正在执行某个命令而不是在COMMAND:状态下。上面的循环就是说,若一直在命令状态下,那么用pause等待用户输入,直到用户用某种方法退回到command:下,系统变量cmdactive=0,结束循环,进行下一步处理。
当然,若知道当前执行的是什么命令的前提下,也可以用cmdname代替cmdactive,系统变量cmdname的值是字符串,代表当前正在执行的命令名,上面的代码改为:

- (while (= "DIM" (getvar "cmdname"))
- (command pause)
- )
-
当然,使用cmdactive更灵活。
关于mkstr2函数的问题,天正系列采用了结构化处理,就是:
对于建筑3.X系列:
1、在程序开始的地方使用(pouts ..)函数保存现场,并设置初始化环境, 可以设置层等等。
2、在程序的最后调用(mkstr2)来恢复现场,“消尸灭迹”。
所以,(mkstr2)必须在程序的最后,不需要改变系统状态的位置调用,一般就在最后。
另外:跟你分析过了,天正建筑、结构、水、暖、电都用了同一套核心,只是同一个功能的函数在不同的软件里面名字不一样,故意给搞混了(当然要混,否则各个软件用一把钥匙通用了:) ),若你对天正核心很了解,那么完全可以把不同专业的LISP文件的天正核心都改到建筑下来,那样就真用一把锁开多个门了,这是题外话。 所以,建议你不要使用天正建筑的核心函数,它的名字没有任何规律,难记还不通用,若你把你程序要用到天正结构下,就不可以了。所以,再此还是推荐你用XDRX_API,天正的所有核心函数XDRX_API都有,并且还比天正的核心函数多了200多个函数。XDRX_API函数名字是按照实际的英文命名的,好记忆,通用。你写的函数可以在R14,2000+上版本的软件上任意使用。
若感兴趣,欢迎在论坛讨论XDRX_API的使用,我不会有任何保留的。
最后,谢谢你,希望常来,和大家交流。 |