asdfxx 发表于 2009-9-11 17:22:00
不死猫 发表于 2009-9-11 18:57:00
<p>Lisp 其实还有很多可以扩展的功能:</p><p>增强型getpoint函数:保留原有getpoint系统自带捕捉和临时捕捉点修改功能</p><p>嵌入即使坐标点返回功能! 超越增强型带有自己写捕捉的grread函数.</p>xhq1954425 发表于 2009-9-12 04:03:00
<p><strong><font face="Verdana" color="#61b713">献花一朵对asdfxx的源码表示谢意,本人自学功底太浅,问两个不懂的问题:</font></strong></p><p><strong><font face="Verdana" color="#61b713">1,这个函数怎么调用,按下面的方式不行呀?</font></strong></p><p>(defun C:test( )<br/>(vl-load-com)<br/>(ko->entsel) <br/>(princ) <br/>)</p><p><strong><font face="Verdana" color="#61b713">2,关健字是在哪儿设定的?</font></strong></p>asdfxx 发表于 2009-9-16 13:39:00
xhq1954425 发表于 2009-9-16 20:13:00
<strong><font face="Verdana" color="#61b713">感谢asdfxx的回复 谢谢!</font></strong>xhq1954425 发表于 2009-9-17 05:37:00
<p><font face="Verdana" color="#61b713"><strong>请asdfxx再给指点一下,下面这个测试程序当输入X和H时确实立刻响应了,但是并没有执行</strong><font color="#000000">(alert "等于字符串X你要执行的程序一")</font><font color="#61b713"><strong>,不知是何原因?谢谢!</strong></font></font></p><p>(defun c:tt()<br/> (setq xh t)<br/> (while xh<br/> (setq ent (ko->entsel "\n测试ko->entsel函数(X)/(H):" "X H" T '((0 . "*LINE,CIRCLE,ARC")) nil))<br/> (cond ((= ent "X") (alert "等于字符串X你要执行的程序一") ent)<br/> ((= ent "H") (alert "等于字符串H你要执行的程序二") ent)<br/> ((= (type ent) 'ENAME) (alert "这个功能是返回图元名") (setq xh nil) ent)<br/> ((numberp ent) (alert (strcat "此项功能是判断输入的是否是实数或整理,<br/> 用于不用进入子选项而直接设置一个值" "\n"<br/> "请选择要拉伸的对象或[当前默认值(500)或直接输入值回车改变默认值]"))<br/> ent<br/> )<br/> ((= ent nil) (setq xh nil))<br/> )<br/> )<br/>)</p>asdfxx 发表于 2009-9-17 08:56:00
asdfxx 发表于 2009-9-17 08:58:00
xhq1954425 发表于 2009-9-17 09:50:00
<p></p><p>加载下面程序:</p><p>(defun ko->entsel (msg keyword action filter_list errmsg / olderr firstss mode ns entsel-ena gr ga gb pt2 ws asc real kossgetstr lastend s keylst str x koerr)<br/> (defun koerr (s)<br/> (setq *error* olderr)<br/> (princ)<br/> ) <br/> (setq olderr *error*)<br/> (setq *error* koerr)<br/> (setq mode t entsel-ena nil)<br/> (while mode<br/> (if msg (princ msg) (prompt "\n选择对象:"))<br/> (setvar "SHORTCUTMENU" 2)<br/> (setq gr (grread nil 12 2)<br/> ga (car gr)<br/> gb (cadr gr)<br/> )<br/> (cond <br/> ((= ga 3);;控制鼠标点击动态事件<br/> (cond<br/> ((setq entsel-ena (ko-entsel-subfunction gb filter_list));第一击时点中对象的判断及循环<br/> (setq mode nil) <br/> )<br/> ((not entsel-ena);第一击没点中对象或不符合过滤表要求时的提示,再次进入循环,直到空格退出<br/> (if errmsg <br/> (princ errmsg)<br/> (princ (strcat "\n无效对象"))<br/> )<br/> )<br/> ) <br/> ) <br/> ((and (or (member gr '((2 13)(2 32))) (= 25 ga))) ;;空格32或回车13或右键25下结束程序返回nil<br/> (setq mode nil)<br/> )<br/> ((and keyword (member (ascii (strcase (chr gb))) (vl-string->list keyword)));;关键字的动态输入控制<br/> (setq keylst (ko->str-symlst keyword " "))<br/> (if (not action)<br/> (progn<br/> (setq ws (vlax-Create-Object "WScript.Shell"))<br/> (setq str (getstring (car (list "" (vlax-invoke-method ws 'sendkeys (chr gb))))))<br/> (if str (setq mode nil))<br/> (setq kossgetstr (car (vl-remove-if '(lambda (x) (not (member (ascii (strcase str)) (vl-string->list x)))) keylst)))<br/> )<br/> (progn<br/> (setq mode nil)<br/> (setq kossgetstr (car (vl-remove-if '(lambda (x) (not (member (ascii (strcase (chr gb))) (vl-string->list x)))) keylst)))<br/> )<br/> )<br/> )<br/> ((and (= ga 2) (or (= gb 39) (and (>= gb 43) (<= gb 57)) (= gb 59) (= gb 61) (and (>= gb 91) (<= gb 93))));;数字输入的控制<br/> (setq ws (vlax-Create-Object "WScript.Shell"))<br/> (setq real (getreal (car (list "" (vlax-invoke-method ws 'sendkeys (chr gb))))))<br/> (if real (setq mode nil))<br/> (setq kossgetstr real)<br/> )<br/> (t (princ "*无效关键字*,请重新输入")) <br/> );end_cond</p><p> );end_while <br/> (setq *error* olderr) <br/> (cond<br/> (kossgetstr kossgetstr);;关键字或词的字符串或实数的返回<br/> (entsel-ena (list entsel-ena gb))<br/> (t nil)<br/> );end_cond<br/>);ko_end</p><p>(defun ko-entsel-subfunction (pt filter_list / mode ns ent);第一击时,判断对象或过滤对象<br/> (setq mode t)<br/> (while mode<br/> (setq ent (nentselp pt))<br/> (cond<br/> ((and (listp ent) (/= ent nil));<br/> (if (/= (type (car (last ent))) 'ENAME)<br/> ;+++++++++++++++++++++++++++++++++判断不是点中块++++++++++++++++++++++++++++++++++<br/> (if filter_list;不是块的情况,考虑有没有过滤要求<br/> (progn ;;考虑有过滤要求<br/> (if (= (dxf 0 (entget (car ent))) "VERTEX");;判断是二维多段线则提出组码330图元名<br/> (setq ns (dxf 330 (entget (car ent))))<br/> (setq ns (car ent))<br/> ) <br/> (cmd0)<br/> (vl-cmdf "select" ns "")<br/> (if (ssget "p" filter_list);;用过滤表来过滤对象<br/> (progn<br/> (setq mode nil) <br/> ns<br/> )<br/> (setq mode nil)<br/> )<br/> )<br/> (progn ;;考虑没有有过滤要求 <br/> (setq mode nil) <br/> (car ent)<br/> )<br/> );end_if<br/> (progn <br/>;++++++++++++++++++++++++++++++++++点击的是块情况++++++++++++++++++++++++++++++++++<br/> (setq mode nil)<br/> (setq bloena (last (last ent)));取出块的图元名<br/> (if filter_list ;;考虑过滤表的情况<br/> (progn<br/> (vl-cmdf "select" bloena "")<br/> (if (ssget "p" filter_list) bloena)<br/> )<br/> bloena <br/> )<br/> );end_progn<br/> );end_if<br/> )<br/> ((= ent nil) (setq mode nil)<br/> )<br/> );end_cond<br/> );end_while <br/>);ko_end</p><p></p><p>(defun c:tt()<br/> (setq xh t)<br/> (while xh<br/> (setq ent (ko->entsel "\n测试ko->entsel函数(X)/(H):" "X H" T '((0 . "*LINE,CIRCLE,ARC")) nil))<br/> (cond ((= ent "X") (alert "等于字符串X你要执行的程序一") ent)<br/> ((= ent "H") (alert "等于字符串H你要执行的程序二") ent)<br/> ((= (type ent) 'ENAME) (alert "这个功能是返回图元名") (setq xh nil) ent)<br/> ((numberp ent) (alert (strcat "此项功能是判断输入的是否是实数或整理,<br/> 用于不用进入子选项而直接设置一个值" "\n"<br/> "请选择要拉伸的对象或[当前默认值(500)或直接输入值回车改变默认值]"))<br/> ent<br/> )<br/> ((= ent nil) (setq xh nil))<br/> )<br/> )<br/>)</p><p></p><p><br/></p>xhq1954425 发表于 2009-9-17 09:54:00
<p>1先输入非关健字X、H有错误提示<img alt="" src="http://www.mjtd.com/bbs/Skins/default/topicface/face2.gif"/></p><p>2输入关健字就立刻结束了,没有消息框出现<img alt="" src="http://www.mjtd.com/bbs/Skins/default/topicface/face14.gif"/><img alt="" src="http://www.mjtd.com/bbs/Skins/default/topicface/face13.gif"/></p><p> </p>
页:
1
[2]