明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6974|回复: 13

[求助]lisp自动建立图层出错问题,及形参建立图层请教

  [复制链接]
发表于 2010-5-19 10:24:00 | 显示全部楼层 |阅读模式

这两天在考虑lisp自动设置画图环境。但是在编制lisp的过程还是遇到了拦路虎。

一、简单的图层建立问题

用以下的命令,最后的1~2个层会有下面的提示,但是检查了很多遍自己觉得语法和括号都没有问题,百般不得其解,只得上来请教,感觉问题很低级,但是不知道错在哪里了。

命令: tcsz1

颜色编号无效。
; 错误: 函数被取消

新颜色 [真彩色(T)/配色系统(CO)] : *取消*
输入选项
[?/生成(M)/设置(S)/新建(N)/开(ON)/关(OFF)/颜色(C)/线型(L)/线宽(LW)/打印(P)/冻结(
F)/解冻(T)/锁定(LO)/解锁(U)/状态(A)]: *取消*

(defun mQ01粗线()(if (=  Q01粗线 nil)(command "-layer" "new" "Q01粗线" "color" "84"  "Q01粗线"       "")))
(defun mQ02中线()(if (=  Q02中线 nil)(command "-layer" "new" "Q02中线" "color" "231"  "Q02中线"       "")))
(defun mQ03轴线()(if (=  Q03轴线 nil)(command "-layer" "new" "Q03轴线" "color" "55"  "Q03轴线"       "")))
(defun mQ04轴线圈()(if (=  Q04轴线圈 nil)(command "-layer" "new" "Q04轴线圈" "color" "10"  "Q04轴线圈"       "")))
(defun mQ05细线()(if (=  Q05细线 nil)(command "-layer" "new" "Q05细线" "color" "205"  "Q05细线"       "")))
(defun mQ06大填充()(if (=  Q06大填充 nil)(command "-layer" "new" "Q06大填充" "color" "8"  "Q06大填充"       "")))
(defun mQ07小填充()(if (=  Q07小填充 nil)(command "-layer" "new" "Q07小填充" "color" "129"  "Q07小填充"       "")))
(defun mQ08虚线()(if (=  Q08虚线 nil)(command "-layer" "new" "Q08虚线" "color" "59"  "Q08虚线"       "")))
(defun mQ09特细线()(if (=  Q09特细线 nil)(command "-layer" "new" "Q09特细线" "color" "239"  "Q09特细线"       "")))
(defun mQ10尺寸标注()(if (=  Q10尺寸标注 nil)(command "-layer" "new" "Q10尺寸标注" "color" "122"  "Q10尺寸标注"       "")))
(defun mQ11文字标注()(if (=  Q11文字标注 nil)(command "-layer" "new" "Q11文字标注" "color" "0"  "Q11文字标注"       "")))
(defun m01文字标注0()(if (=  01文字标注0 nil)(command "-layer" "new" "01文字标注0" "color" "0"  "01文字标注0"       "")))
(defun m02标注122()(if (=  02标注122 nil)(command "-layer" "new" "02标注122" "color" "122"  "02标注122"       "")))

(defun C:tcsz1()
(mQ01粗线)
(mQ02中线)
(mQ03轴线)
(mQ04轴线圈)
(mQ05细线)
(mQ06大填充)
(mQ07小填充)
(mQ08虚线)
(mQ09特细线)
(mQ10尺寸标注)
(mQ11文字标注)
(m01文字标注0)
(m02标注122) 
)

二、本想用形参的形式来简化lisp的编制过程,但是还是遇到了问题,似乎不支持两个形参还是不支持某种数据类型的传递。

(defun c:m71()  
 (makelayer "ton" 2))

(defun makelayer(xx1 xx2)  (if (=  xx1 nil)(command "-layer" "new" xx1 "color" xx2  xx1  "")))

发表于 2020-5-29 23:42:24 | 显示全部楼层
谢谢楼主,对我帮助很大,终于找到设置图层不打印的方法了
发表于 2010-5-19 10:41:00 | 显示全部楼层

问题有2:

1.颜色0(也就是byblock)不适合图层对象,索引色必须为1~255的整数

2.if 语句的(=  ???? nil)没有任何意义,这并不能判断图层是否存在,况且command建层,无需判断层是否存在

 楼主| 发表于 2010-5-19 11:02:00 | 显示全部楼层

谢谢caoyin 了!

对于第一个问题,我改了之后 提示

命令: tcsz

未找到匹配的图层名。
nil

但是已经不影响了,还有就是原来用 0作为颜色码是错的,但是前面的都可以成功建立图层,只是最后面的层无法建立,估计可能是CAD前面自动设置为7的颜色刚好与我想要的一样。

 楼主| 发表于 2010-5-19 11:16:00 | 显示全部楼层
caoyin发表于2010-5-19 10:41:00问题有2:1.颜色0(也就是byblock)不适合图层对象,索引色必须为1~255的整数2.if 语句的(=  ???? nil)没有任何意义,这并不能判断图层是否存在,况且command建层,无需判断层是否存在

取消 if 语句的(=  ???? nil) 确实可以简化程序了,但是为什么会取消这句才能通过呢?本来是想着如果有层就不用重复建层的,减轻画图中的重复电脑操作。好像以前是可以判断图层是否存在的

发表于 2010-5-19 14:00:00 | 显示全部楼层

请注意:变量和字符串的区别,,,,,,,,,,

发表于 2010-5-19 19:32:00 | 显示全部楼层

(defun c:m71()  
 (makelayer "ton" 2))

(defun makelayer(xx1 xx2)  (if (=  xx1 nil)(command "-layer" "new" xx1 "color" xx2  xx1  "")))

实际上你的程序运行到makelayer的时候会把"ton"传递给xx1,2传递给xx2,所以你的xx1是不可能为nil的,所以根本不会运行你后面建立图层的语句

发表于 2010-5-19 20:17:00 | 显示全部楼层

不用判断也能创建,但会干扰原来的同名图层,如:原图层是红色的,创建相同名称的图层是黄的,那么原来的图层就被改了

要判断可以如下处理:

;|用途:创建新图层
参数: LayerName 图层名称 类型 字符串
      Color 图层颜色号 类型 整数|;

(defun MakeLayer(LayerName Color / xt app doc layers)
  (vl-load-com)
  (setq xt (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (setq app (vlax-get-acad-object)
        doc (vla-get-activedocument app)
        layers (vla-get-layers doc))
  (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-item '(layers LayerName)))
    (command "layer" "n" LayerName "color" Color LayerName "")
    )
  (setvar "cmdecho" xt)
  (princ)
  );defun MakeLayer

发表于 2010-5-19 20:49:00 | 显示全部楼层

(vl-catch-all-error-p (vl-catch-all-apply 'vla-item '(layers LayerName)))出问题了,他总是为真的,修改如下:

;|用途:创建新图层
参数: LayerName 图层名称 类型 字符串
      Color 图层颜色号 类型 整数|;

(defun MakeLayer (LayerName Color / xt app doc layer layers Name flag)
  (vl-load-com)
  (setq xt (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (setq flag t)
  (setq app    (vlax-get-acad-object)
        doc    (vla-get-activedocument app)
        layers (vla-get-layers doc)
                )
  (vlax-for Layer layers
    (setq Name (vla-get-name layer))
    (if (= LayerName Name)
      (setq flag nil)
    )
  )     ;vlax-for
  (if flag
    (command "layer" "n" LayerName "color" Color LayerName "")
  )
  (setvar "cmdecho" xt)
  (princ)
)     ;defun MakeLayer


(defun c:create (/ LayerNameList Layer LayerName Color)
  (setq LayerNameList
           (list (list "图层1" 111)
                 (list "图层2" 250)
                 (list "图层3" 160)
                 )    ;list
     )     ;setq
  (foreach Layer LayerNameList
    (setq LayerName (car Layer))
    (setq Color (cadr Layer))
    (MakeLayer LayerName Color)
     )     ;foreach 
)     ;create

发表于 2010-5-20 10:39:00 | 显示全部楼层
(tblsearch "layer" layername);为什么要那么判断?这个不行?
发表于 2010-5-20 12:23:00 | 显示全部楼层
(entmake (list '(0 . "LAYER")
   '(100 . "AcDbSymbolTableRecord")
   '(100 . "AcDbLayerTableRecord")
   '(70 . 0)
   (cons 2 "中心线") ;层名
   (cons 62 1)  ;颜色
   (cons 6 "dashdot") ;线型
    )
  )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-17 23:23 , Processed in 0.241134 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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