[求助]如何双击一个块,就执行一个指定的lisp程序?
<p>比如,我双击一个“图框”的块,就运行一个我自已编的用来打印的lisp程序:dy.lsp</p> <p>根据以前论坛一个帖子改的<br/>有自己的注释<br/>改一下就可以满足你的要求<br/></p><p>(defun c:sw()<br/> (load "双击测试.lsp")<br/>(princ)<br/>)</p><p>(defun jb:LoadDoublClickReactor (/)<br/> (vl-load-com)<br/> ;0语句功能注释:::创建鼠标双击反应器<br/> (if (/= (type jbDoubleClickReactor) 'VLR-Mouse-Reactor)<br/> (setq jbDoubleClickReactor (VLR-Mouse-Reactor nil '((:VLR-beginDoubleClick . jb:beginDoubleClick))))<br/> vlr-editor-reactor<br/> )<br/> ;0语句功能注释:::测试反应器是否已激活<br/> (if (not (vlr-added-p jbDoubleClickReactor))<br/> (vlr-add jbDoubleClickReactor)<br/> )<br/> ;0语句功能注释:::卸载acdblclkedit.arx<br/> (if (member "acdblclkedit.arx" (arx)) (arxunload "acdblclkedit.arx" nil))<br/>(princ)<br/>)</p><p>(defun jb:beginDoubleClick ( reactorObject Listofsomething / point obj owner ownerobj command-list cmd gripset) ;;(princ "\n双击响应\n")<br/> (if (vl-catch-all-error-p (vl-catch-all-apply 'trans (list (car Listofsomething) 0 1)))<br/> (princ "PaperSpace")<br/> (progn<br/> (setq cmd "_.PROPERTIES" ; command default<br/> point Listofsomething<br/> obj (car (nentselp (trans (car point) 0 1)))<br/> owner (car (cadddr (nentselp (trans (car point) 0 1))))<br/> gripset (cadr (ssgetfirst))<br/> doc (vlax-get (vlax-get-acad-object) "activedocument")<br/> )</p><p> (if obj<br/> (progn<br/> (cond <br/> (owner (setq ownerobj (strcase (vlax-get (vlax-ename->vla-object owner) "objectname"))))<br/> ( T (setq ownerobj (strcase (vlax-get (vlax-ename->vla-object obj) "objectname"))))<br/> )<br/> ;0《《这里是被我替换修改部分的位置》》<br/> ;1我的修改,便于修改设置<br/> (setq command-list (get-com-list))<br/> <br/> (foreach x command-list<br/> (if (= (car x) ownerobj)(setq cmd(cdr x)))<br/> )<br/> ;2这个位置我要进行替换,加入图块内容识别,重点在“3”<br/> ;|<br/> (cond<br/> ( (= cmd "_.REFEDIT") (princ "1图块 ") (setq cmd "_.refedit (princ (cdr (nentselp (trans(car point)0 1)))) ") )<br/> ( (= cmd "_.ATTEDIT") (princ "2属性块") (setq cmd "_.attedit (princ obj) ") )<br/> ( (= cmd "_.EATTEDIT")(princ "3属性块") (setq cmd "_.eattedit (princ obj) ") )<br/> ( T (setq cmd(strcat cmd " ")))<br/> )<br/> |;<br/> ;0000我想直接用command函数,不能用<br/> ;;(vla-sendcommand doc cmd)<br/> <br/>;3以下是我替换的内容<br/>(cond<br/>;0----0----0图块或属性块,均经过识别后再分配新的程序<br/> ( (or (= cmd "_.REFEDIT")(= cmd "_.EATTEDIT")) (属性块识别) )<br/>;4以下内容可用,主要用途在于:当选择图块或属性块的非属性部分时,调用“参照编辑程序”。<br/>;4屏蔽的原因是,根据图块名称选择相应的程序。若开启这部分程序,需特殊处理的属性块必须选属性图元,不能选其它图元。<br/>;|<br/> <font color="#ff0000">( (= cmd "_.REFEDIT") ;;;楼主需要改的就是这段代码<br/> ;;(princ "1图块 ") <br/> ;;(setq cmd "_.refedit (princ (cdr (nentselp (trans(car point)0 1)))) ") <br/> (setq cmd "_.refedit ")<br/> (vla-sendcommand doc cmd) <br/> )<br/></font>|;<br/>;| 不调用这个命令<br/> ( (= cmd "_.ATTEDIT") <br/> (princ "2属性块") <br/> (setq cmd "_.attedit (princ obj) ")<br/> (vla-sendcommand doc cmd) <br/> )<br/>|;<br/> ( (= cmd "_.EATTEDIT")(属性块识别)) ;3替换的就是这一句<br/>;4上一句不替换情况下的程序段<br/>;|<br/> ( (= cmd "_.EATTEDIT")<br/> ;;(setq cmd "_.eattedit (princ obj) ")<br/> (setq cmd "_.eattedit ")<br/> (vla-sendcommand doc cmd)<br/> )<br/>|;<br/> ( T (setq cmd (strcat cmd " ")) (vla-sendcommand doc cmd) )<br/>)<br/> )<br/> )<br/> )<br/> )<br/>(princ)<br/>)</p><p>;0----0----0<br/>;1属性块识别将生成一个全局参数,用来给属性块相应程序调用<br/>;2该全局参数格式 ( 图元名 . 选取点 )<br/>;3图元名是主图元<br/>(defun 属性块识别( / a loop b b0) ;;(princ "\n--属性块识别--\n")<br/> ;;(setq cmd "_.eattedit ")(vla-sendcommand doc cmd);;<br/> (cond<br/> ;9999 owner为T时,代表主图元<br/> ( owner (setq ##双击图块## (cons owner point)) )<br/> ;9999 owner为nil时,需要另外获取主图元<br/> ( T <br/> (setq b obj)<br/> (setq loop T)<br/> (while loop<br/> (setq b (entnext b))<br/> (setq c (entget b))<br/> (setq c0 (cdr (assoc 0 c)))<br/> (if (= c0 "SEQEND")<br/> (setq cf2 (cdr (assoc -2 c)) loop Nil)<br/> )<br/> )<br/> (setq ##双击图块## (cons cf2 point))<br/> )<br/> )<br/> (princ "\n")(princ (setq blkname (cdr (assoc 2 (entget (car ##双击图块##))))))(princ "\n")<br/> (cond<br/> ( (wcmatch blkname "QGY_TK-*")<br/> (princ "轻工院图框....启动图框编辑器....")(princ "\n")<br/> (redraw (car ##双击图块##) 4)<br/> (setq ##QGYTK_obj## ##双击图块##) ;;临时设置<br/> (vla-sendcommand doc "##vf ")<br/> )<br/> ;;( () () )<br/> ;;( () () )<br/> ( T <br/> (setq ##双击图块## Nil)<br/> (cond<br/> ( (= cmd "_.REFEDIT" )(setq cmd "_.refedit ") (vla-sendcommand doc cmd) )<br/> ( (= cmd "_.EATTEDIT")(setq cmd "_.eattedit ") (vla-sendcommand doc cmd) )<br/> )<br/> )<br/> )<br/> ;;(princ "主图元=")(princ ##双击图块##)<br/>(princ)<br/>)</p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p><br/>;3我的修改<br/>(defun get-com-list(/ infile infp inf) ;;(princ "\n--get-com-list--\n")<br/> (setq infile (open "D:\\@@_new_lisp\\双击设置.no" "r") )<br/> (setq infp '() )<br/> (while (setq inf (read-line infile) )<br/> (setq inf (read inf) )<br/> (setq infp (cons inf infp) )<br/> )<br/> (close infile)<br/> (reverse infp)<br/>)<br/>;4我的修改<br/>;|<br/>双击设置.no 为文本文件<br/>放于CAD主程序根目录<br/>文件格式如下<br/>("ACDBBLOCKREFERENCE" . "_.REFEDIT") 图块<br/>("ACDBATTRIBUTE" . "_.ATTEDIT") 块属性<br/>|;</p><p>;0被我修改替换掉的部分<br/>;| <br/> (setq command-list<br/> (list <br/> (cons "ACDBBLOCKREFERENCE" "_.REFEDIT")<br/> (cons "ACDBATTRIBUTE" "_.ATTEDIT") ;;调用这个命令比较好,EATTEDIT<br/> (cons "ACDBMTEXT" "_.DDEDIT")<br/> (cons "ACDBTEXT" "_.DDEDIT")<br/> (cons "ACDBROTATEDDIMENSION" "_.DDEDIT")<br/> (cons "ACDBALIGNEDDIMENSION" "_.DDEDIT")<br/> (cons "ACDBORDINATEDIMENSION" "_.DDEDIT")<br/> (cons "ACDBDIAMETRICDIMENSION" "_.DDEDIT")<br/> (cons "ACDBRADIALDIMENSION" "_.DDEDIT")<br/> (cons "ACDB2LINEANGULARDIMENSION" "_.DDEDIT")<br/> (cons "ACDBMLINE" "_.MLEDIT")<br/> (cons "ACDBATTRIBUTEDEFINITION" "_.DDEDIT")<br/> (cons "ACDBHATCH" "_.HATCHEDIT")<br/> (cons "ACDBRASTERIMAGE" "_.IMAGEADJUST")<br/> (cons "AECDBWALL" "_.PROPERTIES")<br/> (cons "AECDBDOOR" "_.PROPERTYDATAEDIT")<br/> (cons "AECDBWINDOW" "_.PROPERTIES")<br/> (cons "AECDBWINDOWASSEMBLY" "_.PROPERTIES")<br/> (cons "AECDBCURTAINWALLLAYOUT" "_.PROPERTIES")<br/> (cons "AECDBSPACE" "_.PROPERTYDATAEDIT")<br/> (cons "AECDBSTAIR" "_.PROPERTIES")<br/> (cons "AECDBRAILING" "_.PROPERTIES")<br/> (cons "AECDBMVBLOCKREF" "_.PROPERTIES")<br/> (cons "AECDBOPENING" "_.PROPERTIES")<br/> (cons "AECDBCEILINGGRID" "_.PROPERTIES")<br/> (cons "AECDBCOLUMNGRID" "_.PROPERTIES")<br/> (cons "AECDBSLAB" "_.PROPERTIES")<br/> (cons "AECSDBMEMBER" "_.PROPERTIES")<br/> (cons "AECDBMASSELEM" "_.PROPERTIES")<br/> (cons "AECDBROOF" "_.PROPERTIES")<br/> (cons "AECDBROOFSLAB" "_.PROPERTIES")<br/> (cons "AECDBCAMERA" "_.PROPERTIES")<br/> (cons "AECDBSCHEDULETABLE" "_.PROPERTIES")<br/> )<br/> )<br/>|;</p><p>;;(progn (jb:LoadDoublClickReactor) (princ))<br/></p><p>;;;;;--------------------------------------------------------<br/>;;;双击设置.no<br/>("ACDBBLOCKREFERENCE" . "_.REFEDIT")<br/>("ACDBATTRIBUTE" . "_.EATTEDIT")<br/>("ACDBMTEXT" . "_.DDEDIT")<br/>("ACDBTEXT" . "_.DDEDIT")<br/>("ACDBROTATEDDIMENSION" . "_.DDEDIT")<br/>("ACDBALIGNEDDIMENSION" . "_.DDEDIT")<br/>("ACDBORDINATEDIMENSION" . "_.DDEDIT")<br/>("ACDBDIAMETRICDIMENSION" . "_.DDEDIT")<br/>("ACDBRADIALDIMENSION" . "_.DDEDIT")<br/>("ACDB2LINEANGULARDIMENSION" . "_.DDEDIT")<br/>("ACDBMLINE" . "_.MLEDIT")<br/>("ACDBATTRIBUTEDEFINITION" . "_.DDEDIT")<br/>("ACDBHATCH" . "_.HATCHEDIT")<br/>("ACDBRASTERIMAGE" . "_.IMAGEADJUST")<br/>("AECDBWALL" . "_.PROPERTIES")<br/>("AECDBDOOR" . "_.PROPERTYDATAEDIT")<br/>("AECDBWINDOW" . "_.PROPERTIES")<br/>("AECDBWINDOWASSEMBLY" . "_.PROPERTIES")<br/>("AECDBCURTAINWALLLAYOUT" . "_.PROPERTIES")<br/>("AECDBSPACE" . "_.PROPERTYDATAEDIT")<br/>("AECDBSTAIR" . "_.PROPERTIES")<br/>("AECDBRAILING" . "_.PROPERTIES")<br/>("AECDBMVBLOCKREF" . "_.PROPERTIES")<br/>("AECDBOPENING" . "_.PROPERTIES")<br/>("AECDBCEILINGGRID" . "_.PROPERTIES")<br/>("AECDBCOLUMNGRID" . "_.PROPERTIES")<br/>("AECDBSLAB" . "_.PROPERTIES")<br/>("AECSDBMEMBER" . "_.PROPERTIES")<br/>("AECDBMASSELEM" . "_.PROPERTIES")<br/>("AECDBROOF" . "_.PROPERTIES")<br/>("AECDBROOFSLAB" . "_.PROPERTIES")<br/>("AECDBCAMERA" . "_.PROPERTIES")</p><p></p> 具体怎么改?能不能帮忙改下,反应器我一不懂啊 <p>修改的部分不涉及反应器的知识</p><p>提取出图块名后判别是否图框块</p><p>是的话再判别块是否斜角度</p><p>否的话提取块的包围盒两对角坐标和比例</p><p>其余的就是打印设置的问题了</p><p>自己先研究下吧</p><p>实在不行再帮你改好了</p> 回复一下保存下来有时间学学 好好学习下! CAD2008打开“工具”“自定义”“界面”里面有双击块设置,默认是宏,你设成LISP函数名就行了,比如:定义(defun c:test(),就填上test就行了,记得加载LISP程序哦。 只听说反应器,还没涉及!观望学习下 (vl-load-com)(if (not (tblsearch "layer" "HATCH"))
(command "-layer" "m" "HATCH" "c" "254" "" "l" "continuous" "" "")
) ;加载图层HATCH
(if (not *dblclkReactor*)
(setq *dblclkReactor*
(VLR-Mouse-Reactor
nil
'((:VLR-beginDoubleClick . dblclkedit))
)
)
) ;0 = 打开反应器
(defun dblclkedit (reactorObject point)
(if dblclk-edit
(dblclk-edit point)
)
)
(defun dblclk-edit (dblclk_point / owner dblclk_etype p)
(setq owner (nentselp (setq p (trans (car dblclk_point) 0 1))))
;指定点来选择对象
(if (and (= owner nil) (= 0 (getvar 'cmdactive))) ;_有活动命令时不起作用
(vla-sendcommand
(vla-get-activedocument (vlax-get-acad-object))
(strcat (rtos (car p) 2 3)
","
(rtos (cadr p) 2 3)
" tianc "
)
)
)
)
(defun c:tianc (/ opt pt la)
(setvar "measurement" 1)
(setq opt
(mycadgetkword
"\n①实体/②钢筋砼/③素砼/④墙体/⑤阳台/⑥卫生间/⑦厨房:<1>"
'("1" "2" "3" "4" "5" "6" "7")
"1"
)
)
(cond
((= opt "1") (tianchong1))
((= opt "2") (tianchong2))
((= opt "3") (tianchong3))
((= opt "4") (tianchong4))
((= opt "5") (tianchong5))
((= opt "6") (tianchong6))
((= opt "7") (tianchong7))
)
(princ)
)
(defun tianchong1 ()
(prompt "\n实体填充,指定内部点\n")
(setq la (getvar "clayer"))
(command "layer" "s" "hatch" "")
(while (setq pt (getpoint))
(command "bhatch" "p" "solid" pt "")
)
(setvar "clayer" la)
) ;solid连续填充,指定内部点
(defun tianchong2 ()
(prompt "\n钢筋砼填充,指定内部点\n")
(setq la (getvar "clayer"))
(command "layer" "s" "hatch" "")
(while (setq pt (getpoint))
(command "bhatch" "p" "ar-conc" "4" "0" pt "")
(command "bhatch" "p" "ansi31" "160" "0" "@" "")
)
(setvar "clayer" la)
) ;ar-conc&ansi31连续填充,指定内部点
(defun tianchong3 ()
(prompt "\n素砼填充,指定内部点\n")
(setq la (getvar "clayer"))
(command "layer" "s" "hatch" "")
(while (setq pt (getpoint))
(command "bhatch" "p" "ar-conc" "4" "0" pt "")
)
(setvar "clayer" la)
) ;ar-conc连续填充,指定内部点
(defun tianchong4 ()
(prompt "\n墙体填充,指定内部点\n")
(setq la (getvar "clayer"))
(command "layer" "s" "hatch" "")
(while (setq pt (getpoint))
(command "bhatch" "p" "ansi31" "60" "0" pt "")
)
(setvar "clayer" la)
) ;ansi31连续填充,指定内部点
(defun tianchong5 ()
(prompt "\n阳台填充,指定内部点\n")
(setq la (getvar "clayer"))
(command "layer" "s" "hatch" "")
(while (setq pt (getpoint))
(command "bhatch" "p" "ansi37" "60" "0" pt "")
)
(setvar "clayer" la)
) ;ansi37连续填充,指定内部点
(defun tianchong6 ()
(prompt "\n卫生间填充,指定内部点\n")
(setq la (getvar "clayer"))
(command "layer" "s" "hatch" "")
(while (setq pt (getpoint))
(command "bhatch" "p" "cross" "30" "0" pt "")
)
(setvar "clayer" la)
) ;cross连续填充,指定内部点
(defun tianchong7 ()
(prompt "\n厨房填充,指定内部点\n")
(setq la (getvar "clayer"))
(command "layer" "s" "hatch" "")
(while (setq pt (getpoint))
(command "bhatch" "p" "angle" "30" "0" pt "")
)
(setvar "clayer" la)
) ;angle连续填充,指定内部点
(princ)
(defun MycadGetkword (pro lst def / kw val)
(setq lst (apply
'append
(mapcar '(lambda (e)
(list (ascii (strcase e)) (ascii (strcase e T)))
)
lst
)
)
def (ascii def)
)
(prompt pro)
(while (not (and (setq kw(grread nil)
val (car kw)
kw(cadr kw)
)
(member val '(2 11 25))
(if (or (= val 25)
(and (= val 11) (= kw 0))
(member kw '(13 32))
)
(setq kw def)
(member kw lst)
)
)
)
)
(strcase (vl-list->string (list kw)))
) 这个双击反应器可以直接运行,你可以慢慢研究,看看如何修改
页:
[1]