ARX精华帖.docx
- 文档编号:27119598
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:19
- 大小:21.23KB
ARX精华帖.docx
《ARX精华帖.docx》由会员分享,可在线阅读,更多相关《ARX精华帖.docx(19页珍藏版)》请在冰豆网上搜索。
ARX精华帖
虽说LISP中已经提供了动态的输入采集函数grread,然而这个函数有诸多不足,譬如不支持捕捉,正交及动态输入。
不能在图形外的菜单等处操作。
等等。
而且在一定情况下受速度限制。
为此,我特意编写了几个函数,极大程度地扩张了CAD的动态函数。
有了这几个函数,你就可以自由地拖拉物体,既支持捕捉,也支持正交,等等。
还可以定制自己的tooltip(热信息),定制自己的光标(这个光标可以是CAD的任何图元);
可以随时采集输入信息,甚至可以让GetPoint,SSGet之类的函数能带有回调。
用法,先依据自己的CAD版本,加载相应的arx,然后运行附件中的测试样例。
---arx文件
---lisp样例
说明:
这个arx提供了四个主要函数HFB_PointMonitor,SSJIG,DragGen,XFormSS.其用法介绍参见下面的帖子。
其中以HFB_PointMonitor效果最好,SSJIG能动态输入,DragGen和XFormSS可执行大量选择集的变换。
这些函数在R2012版本上效果最好。
一、输入点监视函数HFB_PointMonitor
用来动态采集CAD中光标的位置,并反馈给用户处理。
这样以来,你就可以拥有自己的鼠标。
用来动态采集Getpoint,getangle,getdist,getorient,getcorner,entsel,nentsel,nentselp,ssget之类的函数时光标所在位置,并对其反应,形成各种特殊的效果,譬如动态拖拉,动态信息等等。
这个函数的优点在于,回调函数不一定要在命令状态下就可以运行,就像非模态一样。
(vl-load-com)
(if(nullCurDoc)
(setqCurDoc
(vla-get-ActiveDocument(vlax-get-acad-object)))
)
;;;*********************************************************************
;;;HFB_PointMonitor用法:
;;;(HFB_PointMonitor[回调函数][选择集/图元])
;;;不带参数的(HFB_PointMonitor)为关闭监视事件
;;;第一个参数为回调函数名称,应该为字符串,且存在的函数
;;;回调函数只有一个参数,这个参数为三维点,代表你现在鼠标所在位置.如果返
;;;回值为选择集或者图元,将更改鼠标捕捉排除的物体为你返回值所代表的物体.
;;;如果返回值为字符串,说明将把字符串的信息附加到CAD的tooltip上。
;;;第二个参数可以缺省,缺省的话,将不排除鼠标捕捉,不过你以后仍可指定.
;;;*********************************************************************
;;;*********************************************************************
;;;图元信息显示
;;;*********************************************************************
(defunc:
Info(/ret)
(defunInfoCallback(dynpt/txtlstdat)
(setqtxt(vl-princ-to-string(mapcar'rtosdynpt)))
(setqtxt(strcat"\n当前点的坐标是:
"txt))
(if(setqlst(nentselpdynpt))
(progn
(setqdat(entget(carlst)))
(strcattxt"\n这个图元的类型是:
"(cdr(assoc0dat)))
)
txt
)
)
(setqret(HFB_PointMonitor"InfoCallback"))
(prompt"\n如果要关闭监视,请用函数(HFB_PointMonitor)")
(princ)
)
;;;*********************************************************************
;;;自定义光标
;;;*********************************************************************
(defunC:
MyCursorOn(/retent);打开光标
(defunCursorCallback(dynpt/heightinsPnt)
(if(not(vlax-erased-ptxtobj))
(progn
(setqheight(/(getvar'viewsize)50))
(setqinsPnt(mapcar'+dynpt(list(/height2)(/height2)0)))
(vlax-puttxtobj'InsertionPointinspnt)
(vlax-puttxtobj'heightheight)
)
(HFB_PointMonitor)
)
)
(setqent(entmakex
(list
'(0."text")
'(1."highflybird")
'(62.3)
(cons10(getvar'lastpoint))
(cons40(/(getvar'viewsize)50));forastandarddwg
)
)
)
(setqtxtobj(vlax-ename->vla-objectent))
(setqret(HFB_PointMonitor"CursorCallback"ent))
(prompt"\n如果要关闭自定义光标,请用命令MyCursorOff.")
(princ)
)
(defunC:
MyCursorOff(/ret);关闭光标
(HFB_PointMonitor)
(and(not(vlax-erased-ptxtobj))(vla-erasetxtobj))
(setqtxtobjnil)
(princ)
)
;;;*********************************************************************
;;;带回调函数的GetXXX测试(模拟move命令)
;;;*********************************************************************
(defunC:
GetXXX(/OBJLSTP0PTSS)
(setq*error*_Old*error*);保存出错处理函数
(setq*error**error*_New);设置新的出错处理
(defunPointCallback(dynpt);回调函数
(foreachobjobjlst
(vla-moveobj(vlax-3d-pointp0)(vlax-3d-pointdynpt));移动物体
)
(setqp0dynpt)
)
(vla-StartUndoMarkCurDoc);撤销编组开始
(if(and(setqss(ssget))
(setqpt(getpoint"\n第一点(1stPoint):
"))
)
(progn
(setqobjlst(GetObjectsss))
(setqp0(transpt10));需要转化到世界坐标系
;;设置回调函数名和需要排除捕捉的选择集
(setqret(HFB_PointMonitor"PointCallback"ss));第一个参数是回调函数名,第二个参数是可以省略(如果不需要排除捕捉的话)
;;现在就可以看到动态效果了
(setqret(getpointpt"\n第二点(2ndpoint):
"));此处可以是lisp的交互函数,例如getpoint,getangle之类。
;;最后关闭监视
(HFB_PointMonitor)
(princret)
)
)
(vla-EndUndoMarkcurdoc);编组结束
(princ)
)
二、让LISP也能JIG,JIG是arx或者.net编程的一个函数,用来在采点过程中与用户交互的一个动态拖拉技术。
JIG的优势在于:
可以动态输入,功能齐全,与用户交互性较好,直观方便。
;;;*********************************************************************
;;;SSJIG用法:
;;;(SSJIG回调函数[提示][关键字][控制类型][光标类型][基点][选择集])
;;;除第一个参数必须外,其他的可以缺省。
;;;---------------------------------------------------------------------
;;;1.回调函数应该为字符串,且代表存在的函数,回调函数只有一个参数,这个
;;;参数为三维点,代表你现在鼠标所在位置.如果回调函数返回一个三维点,将更
;;;改基点位置,如果再附加一个字符串,将更改你的回调函数为字符串代表的函数.
;;;---------------------------------------------------------------------
;;;2.提示--STR类型,拖动过程中提示的信息。
;;;---------------------------------------------------------------------
;;;3.关键字--STR类型,具体用法可参考initget的关键字说明
;;;---------------------------------------------------------------------
;;;4.控制类型:
--INT类型
;;;kGovernedByOrthoMode=1,正交模式是否设置
;;;kNullResponseAccepted=2,空回车响应输入请求
;;;kDontEchoCancelForCtrlC=4,Ctrl+C不作为取消
;;;kDontUpdateLastPoint=8,不更新lastpoint变量
;;;kNoDwgLimitsChecking=16,点不作限制,可在图形外
;;;kNoZeroResponseAccepted=32,不允许输入零
;;;kNoNegativeResponseAccepted=64,不允许输入负值
;;;kAccept3dCoordinates=128,接受三维坐标点
;;;kAcceptMouseUpAsPoint=256,鼠标松开为输入点
;;;kAnyBlankTerminatesInput=512,任何空白中断输入
;;;kInitialBlankTerminatesInput=1024,初始空白中断输入
;;;kAcceptOtherInputString=2048,接受其他字符
;;;kGovernedByUCSDetect=4096,
;;;kNoZDirectionOrtho=8192,
;;;kImpliedFaceForUCSChange=16384,
;;;kUseBasePointElevation=32768,
;;;kAcqureDist=65536,输入作为距离,相当于getdist
;;;kAcqureAngle=131072,输入作为角度,相当于getangle
;;;---------------------------------------------------------------------
;;;5.光标类型:
--INT类型
;;;kNoSpecialCursor=-1,//普通类型
;;;kCrosshair=0,//全屏十字光标
;;;kRectCursor=1,//矩形
;;;kRubberBand=2,//橡皮筋
;;;kNotRotated=3,//未旋转形状
;;;kTargetBox=4,//选取形状
;;;kRotatedCrosshair=5,//旋转的形状.
;;;kCrosshairNoRotate=6,//强制为未旋转的十字形状.
;;;kInvisible=7,//光标不可见.
;;;kEntitySelect=8,//拾取目标形状.
;;;kParallelogram=9,//平行四边形状.
;;;kEntitySelectNoPersp=10,//选择框,透视图中不可用.
;;;kPkfirstOrGrips=11,//自动选择光标.
;;;kCrosshairDashed=12//虚线的十字光标
;;;---------------------------------------------------------------------
;;;6.基点:
--LIST类型,三维点表
;;;用来动态输入时的基点(第一点)
;;;如果指定了基点,则表明指定点为第一点,否则读取变量LASTPOINT
;;;---------------------------------------------------------------------
;;;7.选择集:
--ENAME类型或者PICKSRT类型,暂时保留
;;;(如果指定了选择集,则对这个选择集更新)
;;;---------------------------------------------------------------------
;;;SSJIG函数的返回值,正常情况下返回三维点坐标,如果设置了可接受任意字符
;;;则输入字符结束后返回输入的字符串,如果设置了关键字,而用户输入了关键字
;;;则返回关键字。
其他情况则返回整数值,代表意义如下:
;;;kModeless=-17,
;;;kNoChange=-6,
;;;kCancel=-4,
;;;kOther=-3,
;;;kNull=-1,
;;;*********************************************************************
;;;*********************************************************************
;;;JIG测试移动选择集
;;;*********************************************************************
(defunc:
ttt(/ssptlstp0retixret)
(setq*error*_Old*error*);保存出错处理函数
(setq*error**error*_New);设置新的出错处理
;;回调函数forSSJig
(defunCallBack(dynpt)
(setqi(+i10000))
(setqx(entmakex
(list
'(0."LINE")
(cons420i)
(cons10(transpt10))
(cons11dynpt)
)
)
)
(ifx(setqss(ssaddxss)))
(foreachobjlst
(vla-moveobj(vlax-3d-pointp0)(vlax-3d-pointdynpt))
;;(vla-updateobj);无需用vla-update更新
)
(setqp0dynpt)
ss
)
(vla-StartUndoMarkCurDoc);(command".undo""be")
(setqvv(ssadd))
(setqss(ssget))
(setqpt(getpoint"\n基点:
"))
(setqp0(transpt10))
(setqlst(GetObjectsss))
(setvar"lastPoint"p0)
(setqi0)
;;|
(setqret(ssJIG"CallBack";回调函数名
"\n下一点(thenextpoint):
";提示符
"SetExit";关键字
(+1;支持正交模式
2;允许空回车
4;Ctrl+C不作为取消
16;不限制点在图形外
128;接受3d坐标
2048;接受任意字符
65536;输入作为距离131072输入作为角度
)
2;橡皮线效果
p0;基点
)
);;|;
;|
(setqret(HFB_PointMonitor"CallBack"ss));比较同HFB_PointMonitor函数效果
(setqret(getpointpt"\n第二点(2ndpoint):
"))
(HFB_PointMonitor);;|;
;;(setqret(dyndraw"CallBack""\n下一点:
""Set"(+1241612820488192)2p0));ComparetoAlexanderRivilis's
;;(setqret(draggenssp0"CallBack"00T"\n下一点(thenextpoint):
"));ComparetoDragGenmothed
;;(Fsxm-Jig"CallBack""指定顶点");ComparetoFSXM's
(cond
((=(typeret)'LIST)
(if(=(type(cdrret))'STR)
(princ(strcat"\n你选择了关键字(Youenteredakeyword):
"(cdrret)"\n"))
(princ(strcat"\n最后返回点坐标是(Thelastpositionis):
"(vl-princ-to-stringret)))
)
)
((=(typeret)'STR)
(princ(strcat"\n你输入了字符(Youenteredastring):
"ret"\n"))
)
(t
(princ(strcat"\n其他返回值(Returnothervalue):
"(itoaret)"\n"))
)
)
(vla-EndUndoMarkcurdoc);(command".undo""e")
(gc)
(princ)
)
下面以QJChen的一个双向动态阵列为例子,演示如何将以前用(grread)做的程序稍加修改就变成了JIG了。
在此感谢Qjchen,如有冒犯版权,多加原谅。
原帖地址如下:
三、DragGen函数让你的拖动大量物体时候更给力。
XFormSS函数让你的对大量物体进行矩阵变换时快速有效。
;;;*********************************************************************
;;;Draggen用法:
;;;(DragGen选择集/图元[基点][回调函数][光标类型][拖动模式][执行]
;;;除第一个参数必须外,其他的可以缺省。
;;;选择集/图元,基点和回调函数同SSJIG的用法。
;;;光标类型--INT类型,只有三种,0,十字;1,无;2,选取状
;;;拖动模式--INT类型,0,平移;1,旋转;2,缩放;3镜像;以后再添加
;;;执行与否--如果此参数空或为nil,仅显示拖动效果,而不实际执行变换
;;;此函数用以对大量选择集进行拖动等变换效果,尤为明显,快于SSJIG.
;;;关键字和控制位的设置请在前面加initget,同getpoint之类的函数。
;;;---------------------------------------------------------------------
;;;回调函数返回值,如果返回点,依据拖动模式对选择集作几何变换.
;;;如果返回选择集/图元,则对他们作更新。
如果返回一个标准的CAD变换矩阵,则
;;;对选择集/图元做指定的矩阵变换。
(如错切,镜像,透视等)
;;;---------------------------------------------------------------------
;;;函数最终返回值为当前点位置和变换的矩阵表。
;;;这个函数要求用户对矩阵变换有一定了解。
;;;需要特殊说明的是:
回调函数传入的点,是一个UCS下的点坐标。
;;;*********************************************************************
;;;自定义的回调函数forDragGen
(defunCallBack1(DynPt)
(redraw)
(grdrawptdynpt-1)
(transdynpt10)
)
(vl-acad-defun'CallBack1)
;;;*********************************************************************
;;;测试Draggen--移动
;;;*********************************************************************
(defunC:
TCC(/ssp0retpt)
(if(and(setqss(ssget))
(RedrawSelss3)
(setqpt(get
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARX 精华帖