找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1576|回复: 16

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

[复制链接]
发表于 2017-4-5 18:07:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
;;;设置比例因数
(defun c:quantities/Form1/TextButton7#OnClicked (/)
  (setvar "cmdecho" 0)
  (setq OldOS (getvar "osmode"))
  (setvar "osmode" 431)
  (setq OldLayer (getvar "clayer"))
  (if (not (TBLSEARCH "layer" "quantities"))
    (progn
      (entmake (list '(0 . "LAYER")
                     '(100 . "AcDbSymbolTableRecord")
                     '(100 . "AcDbLayerTableRecord")
                     '(70 . 0)
                     '(6 . "Continuous")
                     '(62 . 150)
                      (cons 2 "quantities")
               );list
      );entmake
      (setvar "clayer"  "quantities")
    );prign
    (setvar "clayer"  "quantities")
  );if
  (setq pt1 (getpoint "点取图上第一点:"))
  (setq pt2 (getpoint pt1 "\n点取图上第二点:"))
  (setq dist (distance pt1 pt2))
  (setq Rdist (getreal (strcat "\n图上长度为:"(rtos dist 2 3)",请输入实际长度:")))
  (setq scale (rtos (/ Rdist dist) 2 3))
  (princ (strcat "\n比例因数为:"scale))
  (dcl-Control-SetText quantities/Form1/ComboBox1 scale)
  (setvar "osmode" OldOS)
  (setvar "clayer" OldLayer)
  (setvar "cmdecho" 1)
  (princ)
)


运行时出现错误如下:
错误: AutoCAD 变量设置被拒绝: "clayer" "quantities"

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-4-5 18:42:01 | 显示全部楼层
你应该说明你这个程序是做OPENDCL下用的,
你用的是非模式对话框?

如果是非模式的,你把回调函数里面的setvar等等那些恢复状态的代码单独写个函数,都放那里面,然后做回调里面用(dcl-sendstring "(函数名)\n") 去调用恢复现场的函数, 括号里面的函数名用你写的函数名替代。


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-5 19:47:05 | 显示全部楼层

果然好用,newer您真是高人啊,万分感谢。这几天一直在学OpenDCL,初级水平,很多地方都不是很懂,幸好有您耐心的解答,再次表示感谢。再问一个问题“系统变量在OpenDCL下为什么要这样处理,好像OSmode、cmdecho没有这个问题”
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-4-5 20:19:32 | 显示全部楼层

CLAYER系统变量和OSMODE等变量不一样,CLAYER变量要打开层表记录进行写操作,非模式对话框状态下,如果焦点在对话框,不在ACAD窗口,那么会发生文档锁定错误的,

所以在你不清楚哪些是需要焦点要在ACAD窗口的下,就所有的回调处理都用(dcl-sendingstring.....) ,你在回调函数里面就两行代码就行

  1. (defun c:回调函数(...)
  2.      (dcl-sendtring "函数处理\n")
  3.     (princ)
  4. )


就行了。回调里面别太多代码。

不知道你怎么设计的非模式对话框,你试试在设计对话框的时候,非模式对话框保持焦点那个选择框别勾。你在用你原来的代码试试看正常不。
无论如何,都建议你用我上面说的方法。

QQ截图20170405201543.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-4-5 20:29:32 | 显示全部楼层
帖子在OPENDCL论坛比较合适,给你挪过去了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-5 20:33:22 | 显示全部楼层

回调函数可以带参数么?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-4-5 20:41:05 | 显示全部楼层

当然可以了,很多都带参数的,比如那些编辑框,组合框的回调

QQ截图20170405203729.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-5 20:47:10 | 显示全部楼层

我试验了一下,带参数执行错误。另外我的程序加了一行  (entmake (list '(0 . "LINE") (cons 10 pt1) (cons 11 pt2))),如下
;;;设置比例因数
(defun c:quantities/Form1/TextButton7#OnClicked (/)
  (setvar "cmdecho" 0)
  (setq OldOS (getvar "osmode"))
  (setvar "osmode" 431)
  (setq *OldLayer* (getvar "clayer"))
  (dcl-sendstring "(curlayer)\n")
  (setq pt1 (getpoint "点取图上第一点:"))
  (setq pt2 (getpoint pt1 "\n点取图上第二点:"))
  (entmake (list '(0 . "LINE") (cons 10 pt1) (cons 11 pt2)))
  (setq dist (distance pt1 pt2))
  (setq Rdist (getreal (strcat "\n图上长度为:"(rtos dist 2 3)",请输入实际长度:")))
  (setq scale (rtos (/ Rdist dist) 2 3))
  (princ (strcat "\n比例因数为:"scale))
  (dcl-Control-SetText quantities/Form1/ComboBox1 scale)
  (setvar "osmode" OldOS)
  (dcl-sendstring "(oldlayer)\n")
  (setvar "cmdecho" 1)
  (princ)
)


执行后cad显示错误,直接崩溃退出了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-4-5 20:57:53 | 显示全部楼层

回调是否有参数,要看控件和你要的操作。你严格按照OPENDCL STUDIO里面的,拷贝粘贴代码就行了。

回调里面就两行代码,一行 dcl-sendstring 去执行你要的操作,后面接个 princ .

你添加的entmake是创建实体,是写数据库操作,必须要在dcl-sendstring 发送的那个外面函数里面去执行。 非模式对话框,你不要在回调函数里面做任何写的操作。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-4-5 21:02:30 | 显示全部楼层
你这个
(defun c:quantities/Form1/TextButton7#OnClicked (/)

就是点击按钮的回调函数,这个里面包括其他的,以后你就写

(defun c:quantities/Form1/TextButton7#OnClicked (/)
   (dcl-sendstring "(xxxx)\n")
   (princ)
)

  1. (defun xxxx ()
  2.   (setvar "cmdecho" 0)
  3.   (setq OldOS (getvar "osmode"))
  4.   (setvar "osmode" 431)
  5.   (setq *OldLayer* (getvar "clayer"))
  6.   (dcl-sendstring "(curlayer)\n")
  7.   (setq pt1 (getpoint "点取图上第一点:"))
  8.   (setq pt2 (getpoint pt1 "\n点取图上第二点:"))
  9.   (entmake (list '(0 . "LINE") (cons 10 pt1) (cons 11 pt2)))
  10.   (setq dist (distance pt1 pt2))
  11.   (setq Rdist (getreal (strcat "\n图上长度为:"
  12.                                (rtos dist 2 3)
  13.                                ",请输入实际长度:"
  14.                        )
  15.               )
  16.   )
  17.   (setq scale (rtos (/ Rdist dist) 2 3))
  18.   (princ (strcat "\n比例因数为:" scale))
  19.   (dcl-Control-SetText quantities/Form1/ComboBox1 scale)
  20.   (setvar "osmode" OldOS)
  21.   (dcl-sendstring "(oldlayer)\n")
  22.   (setvar "cmdecho" 1)
  23.   (princ)
  24. )

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-5 21:06:29 | 显示全部楼层

(defun c:回调函数(...)     (dcl-sendtring "函数处理\n")   
(princ)
)


是这个回调函数里可以带参数么?
(defun c:回调函数(参数1 参数2 ... / )   
(dcl-sendtring "函数处理\n")   
(princ)
)

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-4-5 21:19:39 | 显示全部楼层
(defun c:回调函数(参数1 参数2 ... / )   
(dcl-sendtring "函数处理\n")   
(princ)
)

这个是你那些按钮,什么的回调函数,带不带参数,你要按OPENDCL的语法来,OPENDCL STUDIO里面都帮回调函数给你写好了,你复制粘贴过来就行,带不带参数是控件决定的,不是你想加就加的。

下面這個回調函數是拷貝粘貼過來的。按鈕回調沒參數。
(defun c:ÎT±êìa/Form1/TextButton1#OnClicked (/)
  (dcl-MessageBox "To Do: code must be added to event handler\r\nc:ÎT±êìa/Form1/TextButton1#OnClicked" "To do")
)
QQ截图20170405211443.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-5 21:27:08 | 显示全部楼层

懂了,谢谢newer老师,你的讲解让我顿时醒悟了,非常感谢您
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-4-5 21:43:21 | 显示全部楼层

非模式對話框爲什麽要用dcl-sendstring, 因爲這個函數的作用是往ACAD命令行窗口發送字符串去執行,相當你手輸入函數加回車
(dcl-sendstring "(abc)") 相當于你輸入了(abc)到命令行,爲什麽最後要加個\n,這個相當于回車,執行了。
(dcl-sendstring "(abc)\n")


發送到命令行,不管非模式對話框是否保持焦點,都保證先讓ACAD窗口保持焦點,然後發送字符串執行。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-5 22:54:07 | 显示全部楼层
本帖最后由 wdmzslw 于 2017-4-5 23:00 编辑
newer老师,再向您请教一个问题:
;;;量取长度
(defun c:quantities/Form1/TextButton1#OnClicked        (/)
  (vl-load-com)
  (setq ComboBox1V (atof (dcl-Control-GetText quantities/Form1/ComboBox1)))
  (setq OldOS (getvar "osmode"))
  (setvar "osmode" 431)
  (setvar "cmdecho" 0)
  (princ "点取线段经过的点,计算长度并复制到剪贴板")
  (dcl-sendstring "pline\n")
  (while (= 1 (getvar "cmdactive"))
    (dcl-sendstring "(pp)\n")
  )
  (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)
)

(defun pp()
  (command pause)
)


执行时不能在 (dcl-sendstring "pline\n")处暂停,等待多段线画完再执行下面代码,我在DCL就可以,opendcl中就不行,怎么解决这个问题?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-29 15:36 , Processed in 0.193293 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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