[求助]请各位高手帮忙看一下这个程序问题出在哪里?
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt; mso-char-indent-count: 2.0;"><font size="3">写这个程序的最初设想是由程序自己处理件号。件号可任意输入两位字母<font face="Times New Roman">(</font>如<font face="Times New Roman">DA)</font>或是四位带数字的<font face="Times New Roman">(</font>如<font face="Times New Roman">D<chmetcnv wst="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1" unitname="a">01A</chmetcnv>),</font>程序自动识别输入。<font face="Times New Roman">.</font>如果是输入小于四位的件号或是不输入件号<font face="Times New Roman">,</font>则会多一个要求输入序号的步骤。<font face="Times New Roman"></font>程序自己从四位件号或是输入的序号中提取起始值,在下次没有输入件号和序号自动从前次累加。前三个步骤均可回车跳过也不中断退出。</font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 6pt; TEXT-INDENT: -6pt; mso-char-indent-count: -.5;"><font size="3">现在的问题是在“请输入件号首尾”这一步时,输入一个完整的件号,如<font face="Times New Roman">S<chmetcnv wst="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="5" unitname="a">05A</chmetcnv></font>,程序只取头尾两个字母<font face="Times New Roman">,</font>而对中间的两个序号不予理会。要改变序号只在“请输入序号值”这一步中输入序号。而在我设想中,如果输入了一个完整的件号,请“输入序号值”这一步是不应该出现的。</font></p><p> </p> w2是字串,用numberp函数总是nil。
;自动标件号
;件号可任意输入两位字母(如DA)或是四位带数字的(如D01A),程序自动识别输入.
;如果是输入小于四位的件号或是不输入件号,则会多一个要求输入序号的步骤.
;程序自己从四位件号或是输入的序号中提取起始值,在下次没有输入件号和序号时自动从前次累加
;前三个步骤均可回车跳过也不中断退出。
(defun c:jf (/ pt pt1 pt2 pt3 pt4 w1 w3 jh2)
(setvar "cmdecho" 0)
(if (= MoHao nil) (setq MoHao "如:D2-88273-TBX"))
(setq X1 MoHao)
(princ "\n 请输入模号:")(princ "<")(princ MoHao)(princ ">")
(setq MoHao (strcase (getstring) nil));所有输入的字符转为大写形式
(if (= MoHao "")(SETQ MoHao X1))
(if (= JianHao nil) (setq JianHao "如:D01A"))
(setq X2 JianHao)
(princ "\n 请输入件号首尾:")(princ "<")(princ JianHao)(princ ">");显示前一件号名称
(setq JianHao (strcase (getstring) nil));所有输入的字符转为大写形式
(if (= JianHao "") (SETQ JianHao X2))
(setq l1 (strlen JianHao)
w1 (substr JianHao 1 1)
w2 (substr JianHao 2 2)
w3 (substr JianHao l1 4))
(if (wcmatch w2 "##")
(setq XuHao (atoi w2)) ;W2是有效数
(setq XuHao (getint "\n 请输入序号值:"));W2不是有效数
);if end 如果输入的号号没有有效数字,则要求输入序号
(if (= counter nil) (setq counter 1))
(if (= XuHao nil)
(setq XuHao (itoa counter))
(setq counter XuHao XuHao (itoa XuHao)) ;同时计算两个表达式
); if end 一个条件表达式,计算三种表达式
(if (< counter 10)
(setq JianHao (strcat w1 "0" XuHao w3))
(setq JianHao (strcat w1 XuHao w3))
);IF END
(setq jh2 (strcat MoHao "-" JianHao))
(setq pt (getpoint "\n 请输入放置点:"))
(setq pt1 (list (car pt) (+ (cadr pt) 2.3));件号首字母位置
pt2 (list (car pt) (- (cadr pt) 1.4));件号后三字符位置
pt3 (list (+ (car pt) 66) (- (cadr pt) 97));材质位置
pt4 (list (+ (car pt) 15) (- (cadr pt) 2)));模号位置
(setq la (getvar "clayer"))
(vl-cmdf ".layer" "thaw" "dim" "set" "dim" "")
(vl-cmdf ".text" "s" "complex" "j" "mc" pt1 "2.8" "0" w1)
(vl-cmdf ".text" "s" "complex" "j" "mc" pt2 "2.8" "0" (substr JianHao 2))
(vl-cmdf ".style" "" "" "" "0.7" "" "" "" "")
(if (= w3 "M")
(vl-cmdf ".text" "s" "complex" "j" "mc" pt4 "2.2" "0" "SKD11 HRC60%%D%%")
(if (= w3 "A")
(if (wcmatch w1 "D,P")
(vl-cmdf ".text" "s" "complex" "j" "mc" pt4 "2.2" "0" "KD20HRA90%%D%%"))
(if (wcmatch w1 "S")
(vl-cmdf ".text" "s" "complex" "j" "mc" pt4 "2.2" "0" "G3 HRA90%%D%%"))
);end if
);if end
;;;(vl-cmdf ".style" "" "" "" "0.8" "" "" "" "")
(vl-cmdf ".layer" "thaw" "T" "set" "T" "")
(vl-cmdf ".text" "s" "romans" "j" "mc" pt3 "1.5" "0" jh2)
(vl-cmdf ".layer" "set" la "")
;;;(vl-cmdf ".style" "" "" "" "1.0" "" "" "" "")
(setq counter (1+ counter))
(setvar "cmdecho" 1)
(princ)
)
<p><strong><font face="Verdana" color="#000000">ZZXXQQ大侠,我把你改的这个程序运行了一下.发现我输入了一个件号之后.如果再运行一次程序,程序不会对序号进行累加.而是还停留在第一次输入的件号中.请再帮忙看一下是什么原因.</font></strong></p><p><font face="Verdana"><strong>还有你写的</strong><font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/if.htm" target="_black"><font color="#0000ff">if</font></a>
<font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/wcmatch.htm" target="_black"><font color="#0000ff">wcmatch</font></a> w2 <font color="#ff00ff">"##"</font><font color="#ff0000">) </font><font color="#000000">这个句子我不是很明白.请问"##"的用法是怎么样的?</font></font></p> <p>原程序有逻辑错误:</p><p> <font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/if.htm" target="_black"><font color="#0000ff">if</font></a>
<font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/61.htm" target="_black"><font color="#0000ff">=</font></a> counter nil<font color="#ff0000">)</font>
<font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/setq.htm" target="_black"><font color="#0000ff">setq</font></a> counter <font color="#008000">1</font><font color="#ff0000">)</font><font color="#ff0000">)</font><br/> <font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/if.htm" target="_black"><font color="#0000ff">if</font></a>
<font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/61.htm" target="_black"><font color="#0000ff">=</font></a> XuHao nil<font color="#ff0000">)</font><br/> <font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/setq.htm" target="_black"><font color="#0000ff">setq</font></a> XuHao <font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/itoa.htm" target="_black"><font color="#0000ff">itoa</font></a> counter<font color="#ff0000">)</font><font color="#ff0000">)</font><br/> <font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/setq.htm" target="_black"><font color="#0000ff">setq</font></a> counter XuHao XuHao <font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/itoa.htm" target="_black"><font color="#0000ff">itoa</font></a> XuHao<font color="#ff0000">)</font><font color="#ff0000">)</font>
<font color="#800080">; 同时计算两个表达式</font><br/> <font color="#ff0000">)</font><font color="#800080">; if end 一个条件表达式,计算三种表达式</font><br/>上面程序中当再次运行时,如果XuHao不为空,则将XuHao内容赋给counter,从而使counter已经加一的内容替换成XuHao的字串内容了。</p><p>至于<font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/if.htm" target="_black"><font color="#0000ff">if</font></a>
<font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/wcmatch.htm" target="_black"><font color="#0000ff">wcmatch</font></a> w2 <font color="#ff00ff">"##"</font><font color="#ff0000">)</font>中的"##"请看CAD的帮助。</p> <p>这才是我想要的效果啊.我的设想是如果我输入"D01A"后重复运行程序,只有没有再输入件号.序号就一直02,03,04...累加上去.而我再输入新的件号如"P01M"后,序号的起始值counter应该回到1.然后累加下去.直到我再输入一个带数值的件号来改变counter的值.</p><p>而且我还设想如果输入的件号只是两位的(如:DA),那么就要求输入序号.如果是四位的(如:D15A),则就提取15为序号值,同时把counter设为15.</p>
页:
[1]