本帖最后由 newer 于 2017-4-6 00:21 编辑
(dcl-sendstring .......)这个发送字符串执行,是和这行代码下的其他代码同步执行的,它并不是执行完(dcl-sendstring .......)这个后,再接着执行你 (dcl-sendstring .......)这行之后的代码,你可以理解多线程。
你的代码:
- ....
- ....
- (princ "点取线段经过的点,计算长度并复制到剪贴板")
- (dcl-sendstring "pline\n")
- (while (= 1 (getvar "cmdactive"))
- (dcl-sendstring "(pp)\n")
- )
- ....
- ...
(dcl-sendstring "pline\n") 和下面的 while循环是同时执行的,他们是没关的,相当于两个线程在同时做事,一个是在你的这个函数里面执行WHILE循环,同时发送的PLINE在另外一个线程同时在执行。
所以,你要解决,就是按我说的,把你的功能块,都放到(dcl-sendstring .......)发送的这个函数体里面,这个里面的是顺序执行的。
你还是没按我告诉你的结构去写。
你应该这样:
- (defun c:quantities/Form1/TextButton1#OnClicked (/)
- (dcl-sendstring "(abc)\n")
- (princ)
- )
- (defun abc()
- (vl-load-com)
- (setq ComboBox1V (atof (dcl-Control-GetText quantities/Form1/ComboBox1)))
- (setq OldOS (getvar "osmode"))
- (setvar "osmode" 431)
- (setvar "cmdecho" 0)
- (princ "点取线段经过的点,计算长度并复制到剪贴板")
- (command "pline")
- (while (= 1 (getvar "cmdactive"))
- (command pause)
- )
- (setq entname (entlast))
- (setq len (vlax-curve-getdistatparam
- entname
- (vlax-curve-getendparam entname)
- )
- )
- (setq len (* len ComboBox1V))
- (princ (strcat "线段长度:" (rtos len 2 3)))
- (setvar "osmode" OldOS)
- (setvar "cmdecho" 1)
- (dcl-Control-SetText quantities/Form1/TextBox1 len)
- )
意思就是点完按钮后,激活到回调函数c:quantities/Form1/TextButton1#OnClicked里面,在回调函数里面你就执行一个发送字符串(abc)给ACAD运行, 回调就结束了完成使命了,剩下的功能在你的函数体ABC里面去做,ABC里面的是保证顺序执行的。
非模式对话框,你所有的回调函数(接着要做和对话框无关的事情的时候,要让ACAD接管你的设置去做事情的,比如一些按钮),都这样写
- (defun c:xxxxxx (/)
- (dcl-sendstring .......)
- (princ)
- )
这个回调函数只是被特定的事件激活后,然后你让他去命令行执行另外的功能函数。这样写的作用是为了能让ACAD窗口保持焦点运行你的主要的代码。不要在回调函数里面做过多的事情,你不知道哪下就冲突了。
你不要在一个函数里面多次用dcl-sendstring, dcl-sendstring的作用就是让ACAD保持焦点。只有非模式对话框,你才要用dcl-sendstring,
在模式对话框,你就可以写到一起了,因为模式对话框执行完,焦点是在ACAD窗口的。比如模式对话框的OK按钮,你可以把代码都写到OK按钮的回调函数里面,在关闭对话框的代码后面,你这些代码一样正常运行。
|