[求助]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 (= Q01粗线 nil)(command "-layer" "new" "Q01粗线" "color" "84" "Q01粗线" "")))<br/>(defun mQ02中线()(if (= Q02中线 nil)(command "-layer" "new" "Q02中线" "color" "231" "Q02中线" "")))<br/>(defun mQ03轴线()(if (= Q03轴线 nil)(command "-layer" "new" "Q03轴线" "color" "55" "Q03轴线" "")))<br/>(defun mQ04轴线圈()(if (= Q04轴线圈 nil)(command "-layer" "new" "Q04轴线圈" "color" "10" "Q04轴线圈" "")))<br/>(defun mQ05细线()(if (= Q05细线 nil)(command "-layer" "new" "Q05细线" "color" "205" "Q05细线" "")))<br/>(defun mQ06大填充()(if (= Q06大填充 nil)(command "-layer" "new" "Q06大填充" "color" "8" "Q06大填充" "")))<br/>(defun mQ07小填充()(if (= Q07小填充 nil)(command "-layer" "new" "Q07小填充" "color" "129" "Q07小填充" "")))<br/>(defun mQ08虚线()(if (= Q08虚线 nil)(command "-layer" "new" "Q08虚线" "color" "59" "Q08虚线" "")))<br/>(defun mQ09特细线()(if (= Q09特细线 nil)(command "-layer" "new" "Q09特细线" "color" "239" "Q09特细线" "")))<br/>(defun mQ10尺寸标注()(if (= Q10尺寸标注 nil)(command "-layer" "new" "Q10尺寸标注" "color" "122" "Q10尺寸标注" "")))<br/>(defun mQ11文字标注()(if (= Q11文字标注 nil)(command "-layer" "new" "Q11文字标注" "color" "0" "Q11文字标注" "")))<br/>(defun m01文字标注0()(if (= 01文字标注0 nil)(command "-layer" "new" "01文字标注0" "color" "0" "01文字标注0" "")))<br/>(defun m02标注122()(if (= 02标注122 nil)(command "-layer" "new" "02标注122" "color" "122" "02标注122" "")))</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) <br/>)</p><p>二、本想用形参的形式来简化lisp的编制过程,但是还是遇到了问题,似乎不支持两个形参还是不支持某种数据类型的传递。</p><p>(defun c:m71() <br/> (makelayer "ton" 2))</p><p>(defun makelayer(xx1 xx2) (if (= xx1 nil)(command "-layer" "new" xx1 "color" xx2 xx1 "")))</p> 谢谢楼主,对我帮助很大,终于找到设置图层不打印的方法了 <p>问题有2:</p><p>1.颜色0(也就是byblock)不适合图层对象,索引色必须为1~255的整数</p><p>2.if 语句的(= ???? nil)没有任何意义,这并不能判断图层是否存在,况且command建层,无需判断层是否存在</p> <p>谢谢caoyin 了!</p><p>对于第一个问题,我改了之后 提示</p><p>命令: tcsz</p><p>未找到匹配的图层名。<br/>nil</p><p>但是已经不影响了,还有就是原来用 0作为颜色码是错的,但是前面的都可以成功建立图层,只是最后面的层无法建立,估计可能是CAD前面自动设置为7的颜色刚好与我想要的一样。</p> caoyin发表于2010-5-19 10:41:00static/image/common/back.gif问题有2:1.颜色0(也就是byblock)不适合图层对象,索引色必须为1~255的整数2.if 语句的(= ???? nil)没有任何意义,这并不能判断图层是否存在,况且command建层,无需判断层是否存在<p>取消 if 语句的(= ???? nil) 确实可以简化程序了,但是为什么会取消这句才能通过呢?本来是想着如果有层就不用重复建层的,减轻画图中的重复电脑操作。好像以前是可以判断图层是否存在的</p> <p>请注意:变量和字符串的区别,,,,,,,,,,</p> <p>(defun c:m71() <br/> (makelayer "ton" 2))</p><p>(defun makelayer(xx1 xx2) (if (= xx1 nil)(command "-layer" "new" xx1 "color" xx2 xx1 "")))</p><p>实际上你的程序运行到makelayer的时候会把"ton"传递给xx1,2传递给xx2,所以你的xx1是不可能为nil的,所以根本不会运行你后面建立图层的语句</p> <p>不用判断也能创建,但会干扰原来的同名图层,如:原图层是红色的,创建相同名称的图层是黄的,那么原来的图层就被改了</p><p>要判断可以如下处理:</p><p>;|用途:创建新图层<br/>参数: LayerName 图层名称 类型 字符串<br/> Color 图层颜色号 类型 整数|;</p><p>(defun MakeLayer(LayerName Color / xt app doc layers)<br/> (vl-load-com)<br/> (setq xt (getvar "cmdecho"))<br/> (setvar "cmdecho" 0)<br/> (setq app (vlax-get-acad-object)<br/> doc (vla-get-activedocument app)<br/> layers (vla-get-layers doc))<br/> (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-item '(layers LayerName)))<br/> (command "layer" "n" LayerName "color" Color LayerName "")<br/> )<br/> (setvar "cmdecho" xt)<br/> (princ)<br/> );defun MakeLayer</p> <p>(vl-catch-all-error-p (vl-catch-all-apply 'vla-item '(layers LayerName)))出问题了,他总是为真的,修改如下:</p><p>;|用途:创建新图层<br/>参数: LayerName 图层名称 类型 字符串<br/> Color 图层颜色号 类型 整数|;</p><p>(defun MakeLayer (LayerName Color / xt app doc layer layers Name flag)<br/> (vl-load-com)<br/> (setq xt (getvar "cmdecho"))<br/> (setvar "cmdecho" 0)<br/> (setq flag t)<br/> (setq app (vlax-get-acad-object)<br/> doc (vla-get-activedocument app)<br/> layers (vla-get-layers doc)<br/> )<br/> (vlax-for Layer layers<br/> (setq Name (vla-get-name layer))<br/> (if (= LayerName Name)<br/> (setq flag nil)<br/> )<br/> ) ;vlax-for<br/> (if flag<br/> (command "layer" "n" LayerName "color" Color LayerName "")<br/> )<br/> (setvar "cmdecho" xt)<br/> (princ)<br/>) ;defun MakeLayer</p><p><br/>(defun c:create (/ LayerNameList Layer LayerName Color)<br/> (setq LayerNameList<br/> (list (list "图层1" 111)<br/> (list "图层2" 250)<br/> (list "图层3" 160)<br/> ) ;list<br/> ) ;setq<br/> (foreach Layer LayerNameList<br/> (setq LayerName (car Layer))<br/> (setq Color (cadr Layer))<br/> (MakeLayer LayerName Color)<br/> ) ;foreach <br/>) ;create</p> (tblsearch "layer" layername);为什么要那么判断?这个不行? (entmake (list '(0 . "LAYER")<br/> '(100 . "AcDbSymbolTableRecord")<br/> '(100 . "AcDbLayerTableRecord")<br/> '(70 . 0)<br/> (cons 2 "中心线") ;层名<br/> (cons 62 1) ;颜色<br/> (cons 6 "dashdot") ;线型<br/> )<br/> )
页:
[1]
2