masterlong 发表于 2010-4-6 20:53:00

问一个多年以来一直不得其解的问题

<p>先打个比方</p><p>比如说旋转的时候</p><p>指定了旋转对象和基准点以后</p><p>旋转对象会随着鼠标的移动即时的显示</p><p>这个显示是非常平滑的</p><p>姑且称之为“实时拖放”<br/><br/><br/></p><p></p><p>而要在LISP里想做到这一点</p><p>除了调用command相关的命令外</p><p>靠grread函数只能做到“假拖放”</p><p>机子不够快或者对象复杂的时候</p><p>显示的效果就是一卡一卡的</p><p>所以不讨论这种方式<br/><br/><br/><br/><br/></p><p></p><p>而调用command命令会有一个缺撼</p><p>当你希望加入一些自定义的参数</p><p>那是不被接受的</p><p>如果你暂停command进程去获取自定义参数</p><p>“实时显示”也被暂停了<br/><br/><br/><br/><br/></p><p></p><p>那么</p><p>vlisp语言到底有没有办法做到</p><p>“实时拖放”的同时接受参数的输入</p><p></p>

masterlong 发表于 2010-4-6 20:57:00

<p>顺便说一个小知识</p><p>也许有不少人还不知道的吧</p><p>要求输入角度的时候</p><p>e=0</p><p>n=90</p><p>w=180</p><p>s=270</p>

caoyin 发表于 2010-4-7 17:05:00

<p>而调用command命令会有一个缺撼<br/>当你希望加入一些自定义的参数<br/>那是不被接受的<br/>如果你暂停command进程去获取自定义参数<br/>“实时显示”也被暂停了</p><p>楼主可以举个command缺憾的例子</p><p></p>

nonsmall 发表于 2010-4-7 18:03:00

masterlong发表于2010-4-6 20:53:00static/image/common/back.gif而调用command命令会有一个缺撼当你希望加入一些自定义的参数那是不被接受的如果你暂停command进程去获取自定义参数“实时显示”也被暂停了

<p>请参考 vlax-add-cmd 函数 , 可以透明调用个人自定义的函数</p>

masterlong 发表于 2010-4-7 21:58:00

<p>谢楼上两位</p><p>在猫的指点下正在学习vlax-add-cmd函数</p><p>不过老实说看了以后脑子里还是浆糊<br/><br/></p><p>举个例子</p><p>插入某个块在指定插入点以后</p><p>X和Y的比例均由程序自动指派</p><p>而最后的角度需要手动指定</p><p>这个时候</p><p>正如前面帖子里提到的</p><p>图块是随着鼠标的移动在即时显示</p><p>但在最后确定角度之前</p><p>可能需要改变图块的Y为负值</p><p>也就是希望图块插入后是镜像的</p><p><br/><br/>vlax-add-cmd这个函数是不是说</p><p>假如指定了某个函数为透明调用</p><p>在输入角度的这个阶段</p><p>调用这个函数</p><p>就可以做到即时将Y值改为负值?</p><p>待我实验一下不懂再来请教</p><p></p>

NetBee 发表于 2010-4-7 22:35:00

puase

masterlong 发表于 2010-4-7 23:36:00

<p>pause?</p><p>怎么pause?</p><p>(defun c:sss()<br/>&nbsp;(setvar "cmdecho" 0)<br/>&nbsp;(command "insert" "temp"&nbsp;"0,0" "1" "1" pause)<br/>(princ)<br/>)</p><p>(defun ww()<br/>&nbsp;(command&nbsp;"insert" "temp" "0,0" "1" "-1" pause)<br/>)</p><p>(vlax-add-cmd "ww" 'ww "ww" 1)</p><p>执行SSS时<br/>在等待输入角度时输入'ww<br/>得不到想要的结果</p><p><br/>应该怎么改<br/>才能在输入一个参数后<br/>预览图块变成镜像后的<br/>最后再来确定角度?<br/></p>

caoyin 发表于 2010-4-9 02:03:00

<p>(defun C:TT1 ()<br/>(setq BNAME "11"<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INPNT (getpoint "\n插入点: ")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X&nbsp;&nbsp;&nbsp;&nbsp; 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Y&nbsp;&nbsp;&nbsp;&nbsp; 2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EN1&nbsp;&nbsp; (entlast)<br/>)<br/>(command "_.insert" BNAME "_NON" INPNT X Y "\\")<br/>(setq EN2 (entlast))<br/>(if (not (eq EN1 EN2))<br/>(progn<br/>(setq PNT (polar INPNT (cdr (assoc 50 (entget EN2))) 1))<br/>(initget "Yes No")<br/>(setq YORN (getkword "\n是否镜像 [是(Y)/否(N)] &lt;是&gt;: "))<br/>(if (/= YORN "No")<br/>&nbsp; (command "_.mirror" EN2 "" "_NON" INPNT "_NON" PNT "_YES")<br/>)<br/>)<br/>)<br/>)<br/><strong>;;放置两个<font color="#f73809">puase</font>,借助CMDNAMES命令是否被ESC<br/>;;当然还可以借助vl-catch-all-apply 判断后续动作是否需要继续</strong><br/>(defun C:TT2 ()<br/>(setvar "CMDECHO" 0)<br/>(setq BNAME "11"<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X&nbsp;&nbsp;&nbsp;&nbsp; 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Y&nbsp;&nbsp;&nbsp;&nbsp; 2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EN1&nbsp;&nbsp; (entlast)<br/>)<br/>(command "_.insert" BNAME "_NON")<br/>(princ "\n指定插入点: ")<br/>(command "\\")&nbsp; ;;这里ESC试试<br/>(if (/= (getvar "CMDNAMES") "")<br/>&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp; (setq INPNT (getvar "LASTPOINT"))<br/>&nbsp;&nbsp;&nbsp; (princ "\n指定旋转角度: ")<br/>&nbsp;&nbsp;&nbsp; (command&nbsp; X Y "\\");;这里ESC试试<br/>&nbsp;&nbsp;&nbsp; (setq EN2 (entlast))<br/>&nbsp;&nbsp;&nbsp; (if (not (eq EN1 EN2))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq PNT (polar INPNT (cdr (assoc 50 (entget EN2))) 1))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (initget "Yes No")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq YORN (getkword "\n是否镜像 [是(Y)/否(N)] &lt;是&gt;: "))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (/= YORN "No")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "_.mirror" EN2 "" "_NON" INPNT "_NON" PNT "_YES")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>)<br/>)</p><p></p>

masterlong 发表于 2010-4-10 18:19:00

<p>你的程序思路是“插入end”<br/>而我希望的是“插入ing”<br/>注意是“插入ing”<br/>不是“插入end”也不是“插入out”</p><p><br/>什么是“插入out”呢<br/>(command "insert" bknm inspo 1 2)<br/>(setq kk (getangle "指定插入角度:"))<br/>(if {kk是一个正确的角度输入} (command kk))<br/>它暂停了“插入”进程去接受一个角度的输入<br/>虽然可以在此基础上用initget函数获取其它的输入<br/>但在它提示你输入角度开始<br/>一直到你作出回应以前<br/>你是看不到图块的<br/>所以这种语句的思路就是“插入out”</p><p><br/>我想要的应该是类似以下的写法<br/>(initget "k1")<br/>(command "insert" bknm1 po1 1 2 pause)<br/>在提示输入角度的时候能看到图块<br/>如果输入是角度就完成插入<br/>如果输入是k1就将y比例由2改变为-2再等待角度输入<br/>程序流程上可以先中止本次的insert<br/>然后再执行一次新的insert<br/>严格来说这应该算“插入break-reins”<br/>不过只要眼睛看到的是预览的镜像图块就可以了</p><p>还有一种思路是“插入finish-undo-reins”<br/>不过似乎要做到也不是容易的事</p><p><br/>AUTOCAD可以在要求输入角度、坐标点等情况下<br/>(比如说copy、move时的第二点)<br/>继续显示预览的图形<br/>但它提供的lisp环境却只能显示十字光标<br/>所以很多想法都卡在了这个限制而无法实现</p>

hydkot99 发表于 2010-4-29 15:11:00

长见识了,希望高手们继续
页: [1] 2
查看完整版本: 问一个多年以来一直不得其解的问题