congcong96 发表于 2010-5-19 10:24:00

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

<p>这两天在考虑lisp自动设置画图环境。但是在编制lisp的过程还是遇到了拦路虎。</p><p>一、简单的图层建立问题</p><p>用以下的命令,最后的1~2个层会有下面的提示,但是检查了很多遍自己觉得语法和括号都没有问题,百般不得其解,只得上来请教,感觉问题很低级,但是不知道错在哪里了。</p><p>命令: tcsz1</p><p>颜色编号无效。<br/>; 错误: 函数被取消</p><p>新颜色 [真彩色(T)/配色系统(CO)] : *取消*<br/>输入选项 <br/>[?/生成(M)/设置(S)/新建(N)/开(ON)/关(OFF)/颜色(C)/线型(L)/线宽(LW)/打印(P)/冻结(<br/>F)/解冻(T)/锁定(LO)/解锁(U)/状态(A)]: *取消*</p><p>(defun mQ01粗线()(if (=&nbsp; Q01粗线 nil)(command "-layer" "new" "Q01粗线" "color" "84"&nbsp; "Q01粗线"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "")))<br/>(defun mQ02中线()(if (=&nbsp; Q02中线 nil)(command "-layer" "new" "Q02中线" "color" "231"&nbsp; "Q02中线"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "")))<br/>(defun mQ03轴线()(if (=&nbsp; Q03轴线 nil)(command "-layer" "new" "Q03轴线" "color" "55"&nbsp; "Q03轴线"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "")))<br/>(defun mQ04轴线圈()(if (=&nbsp; Q04轴线圈 nil)(command "-layer" "new" "Q04轴线圈" "color" "10"&nbsp; "Q04轴线圈"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "")))<br/>(defun mQ05细线()(if (=&nbsp; Q05细线 nil)(command "-layer" "new" "Q05细线" "color" "205"&nbsp; "Q05细线"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "")))<br/>(defun mQ06大填充()(if (=&nbsp; Q06大填充 nil)(command "-layer" "new" "Q06大填充" "color" "8"&nbsp; "Q06大填充"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "")))<br/>(defun mQ07小填充()(if (=&nbsp; Q07小填充 nil)(command "-layer" "new" "Q07小填充" "color" "129"&nbsp; "Q07小填充"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "")))<br/>(defun mQ08虚线()(if (=&nbsp; Q08虚线 nil)(command "-layer" "new" "Q08虚线" "color" "59"&nbsp; "Q08虚线"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "")))<br/>(defun mQ09特细线()(if (=&nbsp; Q09特细线 nil)(command "-layer" "new" "Q09特细线" "color" "239"&nbsp; "Q09特细线"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "")))<br/>(defun mQ10尺寸标注()(if (=&nbsp; Q10尺寸标注 nil)(command "-layer" "new" "Q10尺寸标注" "color" "122"&nbsp; "Q10尺寸标注"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "")))<br/>(defun mQ11文字标注()(if (=&nbsp; Q11文字标注 nil)(command "-layer" "new" "Q11文字标注" "color" "0"&nbsp; "Q11文字标注"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "")))<br/>(defun m01文字标注0()(if (=&nbsp; 01文字标注0 nil)(command "-layer" "new" "01文字标注0" "color" "0"&nbsp; "01文字标注0"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "")))<br/>(defun m02标注122()(if (=&nbsp; 02标注122 nil)(command "-layer" "new" "02标注122" "color" "122"&nbsp; "02标注122"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "")))</p><p>(defun C:tcsz1()<br/>(mQ01粗线)<br/>(mQ02中线)<br/>(mQ03轴线)<br/>(mQ04轴线圈)<br/>(mQ05细线)<br/>(mQ06大填充)<br/>(mQ07小填充)<br/>(mQ08虚线)<br/>(mQ09特细线)<br/>(mQ10尺寸标注)<br/>(mQ11文字标注)<br/>(m01文字标注0)<br/>(m02标注122)&nbsp;<br/>)</p><p>二、本想用形参的形式来简化lisp的编制过程,但是还是遇到了问题,似乎不支持两个形参还是不支持某种数据类型的传递。</p><p>(defun c:m71()&nbsp;&nbsp;<br/>&nbsp;(makelayer "ton" 2))</p><p>(defun makelayer(xx1 xx2)&nbsp; (if (=&nbsp; xx1 nil)(command "-layer" "new" xx1 "color" xx2&nbsp; xx1&nbsp; "")))</p>

陈伟 发表于 2020-5-29 23:42:24

谢谢楼主,对我帮助很大,终于找到设置图层不打印的方法了

caoyin 发表于 2010-5-19 10:41:00

<p>问题有2:</p><p>1.颜色0(也就是byblock)不适合图层对象,索引色必须为1~255的整数</p><p>2.if 语句的(=&nbsp;&nbsp;???? nil)没有任何意义,这并不能判断图层是否存在,况且command建层,无需判断层是否存在</p>

congcong96 发表于 2010-5-19 11:02:00

<p>谢谢caoyin 了!</p><p>对于第一个问题,我改了之后 提示</p><p>命令: tcsz</p><p>未找到匹配的图层名。<br/>nil</p><p>但是已经不影响了,还有就是原来用 0作为颜色码是错的,但是前面的都可以成功建立图层,只是最后面的层无法建立,估计可能是CAD前面自动设置为7的颜色刚好与我想要的一样。</p>

congcong96 发表于 2010-5-19 11:16:00

caoyin发表于2010-5-19 10:41:00static/image/common/back.gif问题有2:1.颜色0(也就是byblock)不适合图层对象,索引色必须为1~255的整数2.if 语句的(=&nbsp;&nbsp;???? nil)没有任何意义,这并不能判断图层是否存在,况且command建层,无需判断层是否存在

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

danxingpen 发表于 2010-5-19 14:00:00

<p>请注意:变量和字符串的区别,,,,,,,,,,</p>

sailorcwx 发表于 2010-5-19 19:32:00

<p>(defun c:m71()&nbsp;&nbsp;<br/>&nbsp;(makelayer "ton" 2))</p><p>(defun makelayer(xx1 xx2)&nbsp; (if (=&nbsp; xx1 nil)(command "-layer" "new" xx1 "color" xx2&nbsp; xx1&nbsp; "")))</p><p>实际上你的程序运行到makelayer的时候会把"ton"传递给xx1,2传递给xx2,所以你的xx1是不可能为nil的,所以根本不会运行你后面建立图层的语句</p>

czx663 发表于 2010-5-19 20:17:00

<p>不用判断也能创建,但会干扰原来的同名图层,如:原图层是红色的,创建相同名称的图层是黄的,那么原来的图层就被改了</p><p>要判断可以如下处理:</p><p>;|用途:创建新图层<br/>参数: LayerName 图层名称 类型 字符串<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Color 图层颜色号 类型 整数|;</p><p>(defun MakeLayer(LayerName Color / xt app doc layers)<br/>&nbsp; (vl-load-com)<br/>&nbsp; (setq xt (getvar "cmdecho"))<br/>&nbsp; (setvar "cmdecho" 0)<br/>&nbsp; (setq app (vlax-get-acad-object)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;doc (vla-get-activedocument app)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; layers (vla-get-layers doc))<br/>&nbsp; (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-item '(layers LayerName)))<br/>&nbsp;&nbsp;&nbsp; (command "layer" "n" LayerName "color" Color LayerName "")<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; (setvar "cmdecho" xt)<br/>&nbsp; (princ)<br/>&nbsp; );defun MakeLayer</p>

czx663 发表于 2010-5-19 20:49:00

<p>(vl-catch-all-error-p (vl-catch-all-apply 'vla-item '(layers LayerName)))出问题了,他总是为真的,修改如下:</p><p>;|用途:创建新图层<br/>参数: LayerName 图层名称 类型 字符串<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Color 图层颜色号 类型 整数|;</p><p>(defun MakeLayer (LayerName Color / xt app doc layer&nbsp;layers Name&nbsp;flag)<br/>&nbsp; (vl-load-com)<br/>&nbsp; (setq xt (getvar "cmdecho"))<br/>&nbsp; (setvar "cmdecho" 0)<br/>&nbsp; (setq flag t)<br/>&nbsp; (setq&nbsp;app&nbsp;&nbsp;&nbsp; (vlax-get-acad-object)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;doc&nbsp;&nbsp;&nbsp; (vla-get-activedocument app)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; layers (vla-get-layers doc)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp; (vlax-for Layer layers<br/>&nbsp;&nbsp;&nbsp; (setq Name (vla-get-name layer))<br/>&nbsp;&nbsp;&nbsp; (if&nbsp;(= LayerName Name)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq flag nil)<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;vlax-for<br/>&nbsp; (if flag<br/>&nbsp;&nbsp;&nbsp; (command "layer" "n" LayerName "color" Color LayerName "")<br/>&nbsp; )<br/>&nbsp; (setvar "cmdecho" xt)<br/>&nbsp; (princ)<br/>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;defun MakeLayer</p><p><br/>(defun c:create&nbsp;(/ LayerNameList Layer LayerName Color)<br/>&nbsp; (setq&nbsp;LayerNameList<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (list (list "图层1" 111)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (list "图层2" 250)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (list "图层3" 160)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;;list<br/>&nbsp;&nbsp;&nbsp;&nbsp; )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;setq<br/>&nbsp; (foreach Layer LayerNameList<br/>&nbsp;&nbsp;&nbsp; (setq LayerName (car Layer))<br/>&nbsp;&nbsp;&nbsp; (setq Color (cadr Layer))<br/>&nbsp;&nbsp;&nbsp; (MakeLayer LayerName Color)<br/>&nbsp;&nbsp;&nbsp; &nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;foreach&nbsp; <br/>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;create</p>

danxingpen 发表于 2010-5-20 10:39:00

(tblsearch "layer" layername);为什么要那么判断?这个不行?

小妹丁 发表于 2010-5-20 12:23:00

(entmake (list '(0 . "LAYER")<br/>&nbsp;&nbsp; '(100 . "AcDbSymbolTableRecord")<br/>&nbsp;&nbsp; '(100 . "AcDbLayerTableRecord")<br/>&nbsp;&nbsp; '(70 . 0)<br/>&nbsp;&nbsp; (cons 2 "中心线")&nbsp;;层名<br/>&nbsp;&nbsp; (cons 62 1)&nbsp;&nbsp;;颜色<br/>&nbsp;&nbsp; (cons 6 "dashdot")&nbsp;;线型<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )
页: [1] 2
查看完整版本: [求助]lisp自动建立图层出错问题,及形参建立图层请教