cjjh8301 发表于 2010-9-3 11:26:00

[求助] 求帮忙改程序!!

<p>朋友给了一个LISP小程序,可以根据命令自动将实体标注等归到指定层,但是程序只对CAD自有命令有用,对其他加载的程序命令不起作用,</p>
<p>哪位高手能帮忙改下,使它能识别自编程序命令,比如通过一个自编程序自动画个钢型才的剖面,输入命令后CAD 就自动跳掉指定的图层,如没有此图层则自动建立,画完以后再跳回命令前的图层,原程序如下:</p>
<p><font face="Verdana"></font>&nbsp;</p>
<p><font face="Verdana">(defun xlr-autolayer ()<br/>;&nbsp; (setvar "cmdecho" 0)<br/>;&nbsp; (if (null (tblsearch "layer" "text"))<br/>;&nbsp;&nbsp;&nbsp; (set_layer_list "text" 3 "continuous")<br/>;&nbsp; )<br/>;&nbsp; (if (null (tblsearch "layer" "dim"))<br/>;&nbsp;&nbsp;&nbsp; (set_layer_list "dim" 3 "continuous")<br/>;&nbsp; )</font></p>
<p><font face="Verdana">&nbsp; (vl-load-com)<br/>&nbsp; ;; 图层初始化列表 内容:commands layers color linetype plottable<br/>&nbsp; (setq *doc (vla-get-activedocument (vlax-get-acad-object)))<br/>&nbsp; (setq *lays (vla-get-layers *doc))<br/>&nbsp; (setq *laylst <br/>&nbsp; (list (list "DIMANGULAR" "DIM-MQ" 3 "continuous" T)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (list "DIMALIGNED" "DIM-MQ" 3 "continuous" T)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (list "DIMBASELINE" "DIM-MQ" 3 "continuous" T)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (list "DIMCENTER" "DIM-MQ" 3 "continuous" T)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (list "DIMCONTINUE" "DIM-MQ" 3 "continuous" T)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (list "DIMDIAMETER" "DIM-MQ" 3 "continuous" T)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (list "DIMLINEAR" "DIM-MQ" 3 "continuous" T)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (list "DIMORDINATE" "DIM-MQ" 3 "continuous" T)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (list "DIMRADIUS" "DIM-MQ" 3 "continuous" T)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (list "QDIM" "DIM-MQ" 3 "continuous" T)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (list "QLEADER" "DIM-MQ" 3 "continuous" T)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (list "BHATCH" "1-填充" 9 "continuous" T)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (list "HATCH" "1-填充" 9 "continuous" T)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(list "XLINE" "defpoints" 8 "continuous" T)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (list "mleader" "text" 3 "continuous" T)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp; )<br/>&nbsp; )<br/>&nbsp; (setq OldLayer nil)<br/>&nbsp; (setq *cmdlst (mapcar 'strcase (mapcar 'car *laylst)))<br/>&nbsp; (mapcar '(lambda (x) (vlr-command-reactor nil x))<br/>&nbsp;&nbsp; (list '((:vlr-commandWillStart . xlr-start))<br/>&nbsp; '((:vlr-commandEnded . xlr-end))<br/>&nbsp; '((:vlr-commandCancelled . xlr-cancel))<br/>&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; (vlr-editor-reactor<br/>&nbsp;&nbsp;&nbsp; nil<br/>&nbsp;&nbsp;&nbsp; '((:vlr-commandwillstart . xlr-edit))<br/>&nbsp; )<br/>)<br/>;;;----------------------------------------------------------------------------;;;<br/>(defun xlr-edit (CALL CALLBACK /)<br/>&nbsp; (foreach N *laylst<br/>&nbsp;&nbsp;&nbsp; (if (= (strcase (car CALLBACK)) (strcase (car N)))<br/>&nbsp;&nbsp;&nbsp;&nbsp; ; 命令反应器返回信息如果与设置的命令相同.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn&nbsp;&nbsp;&nbsp; ;建立图层<br/>(apply 'xsetlays (cdr N))<br/>&nbsp;&nbsp;&nbsp;&nbsp; ;(setvar "CLAYER" (cadr N));设为当前层.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>)<br/>;;;----------------------------------------------------------------------------;;;<br/>(defun xlr-start (calling-reactor xlr-startInfo /)<br/>&nbsp; (foreach N *laylst<br/>&nbsp;&nbsp;&nbsp; (if (= (strcase (car xlr-startInfo)) (strcase (car N)))<br/>&nbsp;&nbsp;&nbsp;&nbsp; ; 命令反应器返回信息如果与设置的命令相同.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn&nbsp;&nbsp;&nbsp; ;建立图层<br/>(apply 'xsetlays (cdr N))<br/>&nbsp;&nbsp;&nbsp;&nbsp; ;(setvar "CLAYER" (cadr N));设为当前层.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>)<br/>;;;----------------------------------------------------------------------------;;;<br/>(defun xlr-end (calling-reactor xlr-endInfo / cmd)<br/>&nbsp; (setq cmd (car xlr-endInfo))<br/>&nbsp; (if (member cmd *cmdlst)<br/>&nbsp;&nbsp;&nbsp; (if (/= oldlayer nil)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setvar "CLAYER" OldLayer)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq OldLayer nil)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>)<br/>;;;----------------------------------------------------------------------------;;;<br/>(defun xlr-cancel (calling-reactor xlr-cancelInfo / cmd)<br/>&nbsp; (setq cmd (car xlr-cancelInfo))<br/>&nbsp; (if (member cmd *cmdlst)<br/>&nbsp;&nbsp;&nbsp; (if (/= oldlayer nil)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setvar "CLAYER" OldLayer)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq OldLayer nil)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>)<br/>;;;----------------------------------------------------------------------------;;;<br/>;;;----------------------------------------------------------------------------;;; <br/>(defun xsetlays (LAY-NAM COLOR LTYPE plotk / LAYOBJ LTYPESOBJ)<br/>&nbsp; (if (tblobjname "layer" LAY-NAM)<br/>&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (/= (strcase (getvar "CLAYER"))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (strcase LAY-NAM)<br/>&nbsp;&nbsp; )<br/>(setq OldLayer (getvar "CLAYER"))<br/>(progn<br/>&nbsp;&nbsp; (if (= oldlayer nil)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq OldLayer LAY-NAM)<br/>&nbsp;&nbsp; )<br/>)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setvar "CLAYER" lay-nam)<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (progn&nbsp;&nbsp;&nbsp; ;添加图层.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vl-catch-all-error-p<br/>(vl-catch-all-apply 'vla-add (list *lays LAY-NAM))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq LAYOBJ (vla-item *lays LAY-NAM))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (not (tblobjname "ltype" LTYPE)) ;添加线型.<br/>(progn<br/>&nbsp;&nbsp; (setq LTYPESOBJ (vla-get-linetypes *doc))<br/>&nbsp;&nbsp; (vla-load LTYPESOBJ LTYPE (findfile "acad.lin"))<br/>&nbsp;&nbsp;&nbsp;&nbsp; ;&gt;&gt;&gt; 要加强,在多个*.lin寻找<br/>&nbsp;&nbsp; (vlax-release-object LTYPESOBJ)<br/>)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )&nbsp;&nbsp;&nbsp;&nbsp; ;解冻(如冻结),解锁,设图层为当前,设图层颜色,可打印特性.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-layeron layobj :vlax-true)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-lock layobj :vlax-false)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (= (strcase (getvar "CLAYER")) (strcase lay-nam)) ;解冻.<br/>(vla-put-freeze layobj :vlax-false)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-color layobj color)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-linetype layobj LTYPE)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-plottable<br/>layobj<br/>(if plotk<br/>&nbsp;&nbsp; :vlax-true<br/>&nbsp;&nbsp; :vlax-false<br/>)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>)<br/>(xlr-autolayer)&nbsp;&nbsp;&nbsp; ;加载启动!<br/>(princ "\n ----命令图层反应器已加载----")<br/>&nbsp;<br/></font></p>

ZZXXQQ 发表于 2010-9-3 19:55:00

<p>这个没法改,提供的资料太少。下面是程序中命令与图层对应的数据表,可参照修改。</p>
<p><font face="Verdana">(setq *laylst <br/>&nbsp;'(("DIMANGULAR" "DIM-MQ" 3 "continuous" T)<br/>&nbsp;&nbsp; ("DIMALIGNED" "DIM-MQ" 3 "continuous" T)<br/>&nbsp;&nbsp; ("DIMBASELINE" "DIM-MQ" 3 "continuous" T)<br/>&nbsp;&nbsp; ("DIMCENTER" "DIM-MQ" 3 "continuous" T)<br/>&nbsp;&nbsp; ("DIMCONTINUE" "DIM-MQ" 3 "continuous" T)<br/>&nbsp;&nbsp; ("DIMDIAMETER" "DIM-MQ" 3 "continuous" T)<br/>&nbsp;&nbsp; ("DIMLINEAR" "DIM-MQ" 3 "continuous" T)<br/>&nbsp;&nbsp; ("DIMORDINATE" "DIM-MQ" 3 "continuous" T)<br/>&nbsp;&nbsp; ("DIMRADIUS" "DIM-MQ" 3 "continuous" T)<br/>&nbsp;&nbsp; ("QDIM" "DIM-MQ" 3 "continuous" T)<br/>&nbsp;&nbsp; ("QLEADER" "DIM-MQ" 3 "continuous" T)<br/>&nbsp;&nbsp; ("BHATCH" "1-填充" 9 "continuous" T)<br/>&nbsp;&nbsp; ("HATCH" "1-填充" 9 "continuous" T)<br/>&nbsp;&nbsp; ("XLINE" "defpoints" 8 "continuous" T)<br/>&nbsp;&nbsp; ("mleader" "text" 3 "continuous" T)<br/>&nbsp; )<br/>&nbsp;)<br/></font>第一列参数为命令名</p>
<p>第二列参数为图层名</p>
<p>第三列是颜色</p>
<p>第四列是线型</p>

cjjh8301 发表于 2010-9-4 10:18:00

这个我知道,上面的是我自己该的,这些都是 CAD 自带命令,对于自编命令就没用。

ZZXXQQ 发表于 2010-9-4 11:08:00

试下用<font face="Verdana">vlax-add-cmd</font>将你的命令添加到ACAD内置命令集中

cjjh8301 发表于 2010-9-7 20:40:00

本帖最后由 作者 于 2010-9-9 20:49:41 编辑 <br /><br /> <p>楼上的命令 没什么反应么?</p>
页: [1]
查看完整版本: [求助] 求帮忙改程序!!