luowy 发表于 2010-5-1 00:26:00

[原创]关于command函数的调用

本帖最后由 作者 于 2010-5-1 0:46:35 编辑 <br /><br /> <p>虽然差不多1年没弄lsp了,但每次回来这个板块,还是见到很多lsp对command的调用感到不知所措,我权当抛砖引玉吧,在这里简单说说command的调用</p><p>原则1&nbsp; 非到万不得已,不要使用command函数<br/>原则2&nbsp; 一旦调用command函数后,就必须严格调试</p><p>事实上,一个command的调用仅仅是将lsp的控制转移给autocad,一旦你给的条件不匹配那个命令,将会触发一个错误,而这个错误可能会影响你后续代码的调用,因此原则1和原则2就说明了command的缺点。</p><p>那么在调用command的时候,需要注意什么呢?</p><p>首先,command就是autocad里面的命令行中的“命令”,因此command发出的指令也就是大家用的如line之类的命令了。<br/>其次,command后面的命令涉及的参数一定要匹配,如(command "_line" (getpoint) &nbsp;(getpoint )&nbsp; "" ), 这样的代码将会产生一条指定点的线段,注意最后面的&nbsp; "" ,这个代表了一个回车,假如没有这个回车,那将如何呢?因为command发出的line命令没有被确定终止,因此将停留在获取下一个点上,从而看上去好像暂停了动作一样。<br/>最后,诸如trim等复杂的命令来讲,函数匹配就需要转下弯,一个trim,需要点选2个实体和一个点,那实体如何呢?就是entsel!(command "trim" (entsel) (entsel) (getpoint) );又如插入一个属性块,假如有2个attdef (command "_insert" blockname (getpoint) xScale yScale zScale "属性1" "属性2" )</p><p>最最后,万一我不知道一个命令该如何传入参数呢?其实也不难,不是说了,command就是autocad的命令,假如一个命令为XXX,你不知道XXX究竟要传入什么东西,就可以现在cad中输入命令XXX,在看看XXX提示要什么东西,及什么选项,然后根据你的要求记下来,最后按过程写入command代码里面。如你输入line后,会提示输入一个点(一个点表),输入一个点后呢,会提示输入另外一个点(点表)及选项U是回退的,如输入U将撤销。到此的(command "_line" (getpoint) "U" )就跟上面的操作是一样的。其余命令同此推理。</p><p></p>

masterlong 发表于 2012-4-29 22:27:00

cabinsummer 发表于 2012-4-29 11:13 static/image/common/back.gif
肤浅

C大总会忘记一件事----
这里的最大多数人
并不是专业的程序员
而是工程人员
大家学习lisp的最初目的
不是要精通lisp
而是借助lisp提高的自己的工作效率
也因此
首先要教大家学会lisp
再才是深入了解直至精通

要完成一件事情
经常会有很多方法
也许初学者采用的方法
从编程角度来说不是最佳
但是那又如何
利用程序来处理一些事情
总比纯手工要快吧
已经节省了90%的时间
又何必为再省那9%
再多花900%的时间来学习

C大如果明白不了这个道理
那我要说你真的只适合搞技术

masterlong 发表于 2010-5-1 00:51:00

<p>command命令很好用啊</p><p>很多时候利用command调用命令来完成一些事情</p><p>比用其它方法要简单快捷的多</p><p>比如下面这个程序</p><p>;;简化转line/arc为pl线,和修改pl线宽度<br/>(defun c:pe()<br/>&nbsp;(setvar "cmdecho" 0)<br/>&nbsp;(princ "\n请选择直线、圆弧、复合线")<br/>&nbsp;(setq sels (ssget '((0 . "LINE,ARC,LWPOLYLINE"))))<br/>&nbsp;(if sels<br/>&nbsp; (progn<br/>&nbsp;&nbsp; (setq pls (ssget "p" '((0 . "LWPOLYLINE"))))<br/>&nbsp;&nbsp; (if pls<br/>&nbsp;&nbsp;&nbsp; (setq i (sslength pls))<br/>&nbsp;&nbsp;&nbsp; (setq i 0)<br/>&nbsp;&nbsp; )<br/>&nbsp;&nbsp; (if (setq plwide (getreal (strcat "\n输入新的宽度&lt;" (rtos (getvar "PLINEWID")) "&gt;:")))<br/>&nbsp;&nbsp;&nbsp; (setvar "PLINEWID" plwide)<br/>&nbsp;&nbsp;&nbsp; (setq plwide (getvar "PLINEWID"))<br/>&nbsp;&nbsp; )<br/>&nbsp;&nbsp; (if (= i (sslength sels))<br/>&nbsp;&nbsp;&nbsp; (command "pedit" "m" sels "" "w" plwide "")<br/>&nbsp;&nbsp;&nbsp; (command "pedit" "m" sels "" "y" "w" plwide "")<br/>&nbsp;&nbsp; ) <br/>&nbsp; )<br/>&nbsp;)<br/>(princ)<br/>)</p><p>虽然对其它语言不懂<br/>但是相信如果不借助command命令<br/>估计代码的长度会比这个要长很多</p><p></p>

qiiqii 发表于 2010-8-15 12:17:00

<p><font face="Verdana">请教一个问题</font></p>
<p><font face="Verdana">命令:(setq YY (ssget '((0 . "REGION"))))</font></p>
<p><font face="Verdana"><font face="Verdana"><font face="Verdana">命令:</font>(setq ZZ (ssname YY 0))</font></font></p>
<p><font face="Verdana">命令: (setq aa (command "area" "o" zz))<br/>area<br/>指定第一个角点或 [对象(O)/加(A)/减(S)]: o<br/>选择对象:<br/>面积 = 12.572,周长 = 17.141<br/>命令: nil<br/>命令: !aa<br/>nil</font></p>
<p>&nbsp;</p>
<p>以上,如何在程序中得到面积和周长的值</p>

lenlenq 发表于 2010-8-15 19:09:00

(getvar "perimeter")

chtword 发表于 2012-3-16 09:59:54

新手急需 感谢指导

smartstar 发表于 2012-4-29 10:58:03

谢谢,学习了。

cabinsummer 发表于 2012-4-29 11:13:01

masterlong 发表于 2010-5-1 00:51
command命令很好用啊很多时候利用command调用命令来完成一些事情比用其它方法要简单快捷的多比如下面这个程 ...

肤浅

lsjj 发表于 2012-4-29 22:40:07

程序的目的不就是為了提高效率,你們自以為高明的程序和用COMMAND寫出來的程序都能達到一樣的目的,你說本質不同有何意義?可知少了COMMAND的使用,初學LISP的人會遇到更多學習的障礙,你們常說AUTOLISP最適合工程師學習了,使用COMMAND減少開發的時間,容易得到程序帶來的成果,不也是LISP令人覺得容易入門的原因嗎?

cabinsummer 发表于 2012-4-29 23:27:42

在明经上发command命令构成的帖子还是比较少的,至少比其它方式少很多。由此推论,依某些人观点,明经里程序员远多于工程师。
页: [1] 2
查看完整版本: [原创]关于command函数的调用