找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: wdmzslw

[求助] 请高手帮我看看,不能设置系统变量“clayer”

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-4-6 00:09:00 | 显示全部楼层
本帖最后由 newer 于 2017-4-6 00:21 编辑

(dcl-sendstring .......)这个发送字符串执行,是和这行代码下的其他代码同步执行的,它并不是执行完(dcl-sendstring .......)这个后,再接着执行你 (dcl-sendstring .......)这行之后的代码,你可以理解多线程。
你的代码:
  1. ....
  2. ....
  3. (princ "点取线段经过的点,计算长度并复制到剪贴板")
  4.   (dcl-sendstring "pline\n")
  5.   (while (= 1 (getvar "cmdactive"))
  6.     (dcl-sendstring "(pp)\n")
  7.   )
  8. ....
  9. ...


(dcl-sendstring "pline\n") 和下面的 while循环是同时执行的,他们是没关的,相当于两个线程在同时做事,一个是在你的这个函数里面执行WHILE循环,同时发送的PLINE在另外一个线程同时在执行。

所以,你要解决,就是按我说的,把你的功能块,都放到(dcl-sendstring .......)发送的这个函数体里面,这个里面的是顺序执行的。


你还是没按我告诉你的结构去写。

你应该这样:
  1. (defun c:quantities/Form1/TextButton1#OnClicked        (/)
  2.     (dcl-sendstring "(abc)\n")
  3.     (princ)
  4. )
  5. (defun abc()
  6. (vl-load-com)
  7.   (setq ComboBox1V (atof (dcl-Control-GetText quantities/Form1/ComboBox1)))
  8.   (setq OldOS (getvar "osmode"))
  9.   (setvar "osmode" 431)
  10.   (setvar "cmdecho" 0)
  11.   (princ "点取线段经过的点,计算长度并复制到剪贴板")
  12.   (command "pline")
  13.   (while (= 1 (getvar "cmdactive"))
  14.    (command pause)
  15.   )
  16.   (setq entname (entlast))
  17.   (setq        len (vlax-curve-getdistatparam
  18.               entname
  19.               (vlax-curve-getendparam entname)
  20.             )
  21.   )
  22.   (setq len (* len ComboBox1V))
  23.   (princ (strcat "线段长度:" (rtos len 2 3)))
  24.   (setvar "osmode" OldOS)
  25.   (setvar "cmdecho" 1)
  26.   (dcl-Control-SetText quantities/Form1/TextBox1 len)
  27. )



意思就是点完按钮后,激活到回调函数c:quantities/Form1/TextButton1#OnClicked里面,在回调函数里面你就执行一个发送字符串(abc)给ACAD运行, 回调就结束了完成使命了,剩下的功能在你的函数体ABC里面去做,ABC里面的是保证顺序执行的。

非模式对话框,你所有的回调函数(接着要做和对话框无关的事情的时候,要让ACAD接管你的设置去做事情的,比如一些按钮),都这样写
  1. (defun c:xxxxxx        (/)
  2.     (dcl-sendstring .......)
  3.     (princ)
  4. )

这个回调函数只是被特定的事件激活后,然后你让他去命令行执行另外的功能函数。这样写的作用是为了能让ACAD窗口保持焦点运行你的主要的代码。不要在回调函数里面做过多的事情,你不知道哪下就冲突了。

你不要在一个函数里面多次用dcl-sendstring, dcl-sendstring的作用就是让ACAD保持焦点。只有非模式对话框,你才要用dcl-sendstring,
在模式对话框,你就可以写到一起了,因为模式对话框执行完,焦点是在ACAD窗口的。比如模式对话框的OK按钮,你可以把代码都写到OK按钮的回调函数里面,在关闭对话框的代码后面,你这些代码一样正常运行。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-6 08:46:09 来自手机 | 显示全部楼层
哦!!!我明白了,以前没有理解你说的dcl-sendstring ,昨晚睡前又想了一下您说的,早上又看到您的答复,现在好像明白了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-20 14:10 , Processed in 0.183037 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表