明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1713|回复: 3

图层切换反应器的崩溃问题?

[复制链接]
发表于 2008-4-16 13:13 | 显示全部楼层 |阅读模式

在不存在“txt”图层的前提下,运行22会崩溃,运行33却没问题(实现转层功能)

;;;;;;
(defun c:22 ()
  (command "text"  "110,110" "20" "0"  "5555555555" )
 )

;;;;;;
(defun c:33 ()
  (command "text"  "110,110" "20" "0"   )
 )
;;;==============================================
(defun qqqq ()
  (vl-load-com)
  (setq *doc (vla-get-activedocument (vlax-get-acad-object)))
  (setq *lays (vla-get-layers *doc))
       (setq *laylst
    (list
          (list "TEXT"  "txt" )
    )
        )
  (setq *cmdlst (mapcar 'strcase (mapcar 'car *laylst)))
  (mapcar '(lambda (x) (vlr-command-reactor nil x))
   (list '((:vlr-commandWillStart . bbb_start))
   )
  )
  (vlr-editor-reactor  nil  '((:vlr-commandwillstart . bbb_edit)))

)
;;;----------------------------------------------------------------------------;;;
(defun bbb_edit (CALL CALLBACK /)
  (foreach N *laylst
    (if (= (strcase (car CALLBACK)) (strcase (car N))) ; 命令反应器返回信息如果与设置的命令相同.
 (apply 'bbb_set (cdr N))
    )
  )
)
;;;----------------------------------------------------------------------------;;;
(defun bbb_start (calling-reactor bbb_startInfo /)
  (foreach N *laylst
    (if (= (strcase (car bbb_startInfo)) (strcase (car N)))  ; 命令反应器返回信息如果与设置的命令相同.
 (apply 'bbb_set (cdr N))
    )
  )
)

;;;----------------------------------------------------------------------------;;;
;;;----------------------------------------------------------------------------;;;
(defun bbb_set (LAY-NAM  / LAYOBJ LTYPESOBJ)
  (if (tblobjname "layer" LAY-NAM)
    (progn
      (if (/= (strcase (getvar "CLAYER"))
       (strcase LAY-NAM)
   )
 (setq OldLayer (getvar "CLAYER"))
 (if (= oldlayer nil) (setq OldLayer LAY-NAM))
      )
      (setvar "CLAYER" lay-nam)
    )
    (vl-catch-all-error-p (vl-catch-all-apply 'vla-add (list *lays LAY-NAM)))  ;添加图层
  )
)

;;;;;;
(qqqq)

发表于 2008-4-16 15:24 | 显示全部楼层
;;上面的解决方法就是:删除掉(vlr-editor-reactor  nil  '((:vlr-commandwillstart . bbb_edit)))
下面纯属个人意见:
(mapcar '(lambda (x) (vlr-command-reactor nil x))
   (list '((:vlr-commandWillStart . bbb_start))
   )
  )
;;上面什么意思?如果我有三十个命令对应三十个图层,你知道你用了多少个命令反应器吗????
;;达到自动切换图层的思路应该是在:
命令开始---如果是指定的命令-----记录最后一个图元(或者记录当前选择集合,看你监视的命令而定)-发送是指定命令的某个参数给命令结束反应器
命令结束--检查是否指定命令----获得新建的成批图元(或者刚才记录的选择集合)--设置他们的层为指定的层-----ok!
两个反应器解决一切,,,而且最好的原则就是第一不要在命令反应器里面使用什么setvar或者其他命令,直接用vla方法,,,,第二不要弄那么多的什么全局变量,直接利用反应器的数据代替全局变量----
;建议在开始编写反应器之前还是先理顺一下思路,正确的思路能减少很多弯路的,,,
;;
(vlr-command-reactor  vlrdata '((:vlr-commandWillStart . bbb_start)))
把你的命令和层的关联表放在vlrdata,,,,
 楼主| 发表于 2008-4-16 17:20 | 显示全部楼层

不行

删掉(vlr-editor-reactor  nil  '((:vlr-commandwillstart . bbb_edit)))后虽然可以建立txt图层,但写的文本不会自动放入txt层中

发表于 2008-4-17 14:59 | 显示全部楼层
本帖最后由 作者 于 2008-4-21 8:03:25 编辑

;;測試環境R2002,R2006會有下列問題(R2008,R2009不會有這種問題)
;;發現用acadiso.dwt樣板運行22會崩潰,用acad.dwt樣板運行22沒問題,
;;但在R2006運行22後馬上用中鍵平移會崩潰(執行其他指令沒問題)
;;應是R2006以下版本的Bug

;;解決方法1
;;改用R2008,R2009

;;解決方法2
(defun C:22 ()
  (command "text")
  (command)
  (command "text" "110,110" "20" "0" "5555555555")
  (princ)
)

;;解決方法3
;;先建圖層
(defun C:22 ()
  (if (not (tblsearch "layer" "txt"))
    (command "_.layer" "n" "txt" "")
  )
  (command "text" "110,110" "20" "0" "5555555555")
  (princ)
)

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-13 19:30 , Processed in 0.144956 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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