- UID
- 118401
- 积分
- 2156
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2004-3-28
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2013-5-7 00:45:32
|
显示全部楼层
本帖最后由 Highflybird 于 2013-5-7 00:47 编辑
二、让LISP也能JIG,JIG是arx或者.net编程的一个函数,用来在采点过程中与用户交互的一个动态拖拉技术。
JIG的优势在于:可以动态输入,功能齐全,与用户交互性较好,直观方便。
[pcode=lisp,true]
;;;*********************************************************************
;;;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测试移动选择集
;;;*********************************************************************
(defun c:ttt(/ ss pt lst p0 ret i x ret)
(setq *error*_Old *error*) ;保存出错处理函数
(setq *error* *error*_New) ;设置新的出错处理
;;回调函数 for SSJig
(defun CallBack (dynpt)
(setq i (+ i 10000))
(setq x (entmakex
(list
'(0 . "LINE")
(cons 420 i)
(cons 10 (trans pt 1 0))
(cons 11 dynpt)
)
)
)
(if x (setq ss (ssadd x ss)))
(foreach obj lst
(vla-move obj (vlax-3d-point p0) (vlax-3d-point dynpt))
;;(vla-update obj) ;无需用vla-update更新
)
(setq p0 dynpt)
ss
)
(vla-StartUndoMark CurDoc) ;(command ".undo" "be")
(setq vv (ssadd))
(setq ss (ssget))
(setq pt (getpoint "\n基点:"))
(setq p0 (trans pt 1 0))
(setq lst (GetObjects ss))
(setvar "lastPoint" p0)
(setq i 0)
;;|
(setq ret (ssJIG "CallBack" ;回调函数名
"\n下一点(the next point): " ;提示符
"Set Exit" ;关键字
(+ 1 ;支持正交模式
2 ;允许空回车
4 ;Ctrl+C不作为取消
16 ;不限制点在图形外
128 ;接受3d坐标
2048 ;接受任意字符
65536 ;输入作为距离 131072输入作为角度
)
2 ;橡皮线效果
p0 ;基点
)
);;|;
;|
(setq ret (HFB_PointMonitor "CallBack" ss)) ;比较同HFB_PointMonitor函数效果
(setq ret (getpoint pt "\n第二点(2nd point): "))
(HFB_PointMonitor);;|;
;;(setq ret (dyndraw "CallBack" "\n下一点:" "Set" (+ 1 2 4 16 128 2048 8192) 2 p0)) ;Compare to Alexander Rivilis's
;;(setq ret (draggen ss p0 "CallBack" 0 0 T "\n下一点(the next point):")) ;Compare to DragGen mothed
;;(Fsxm-Jig "CallBack" "指定顶点") ;Compare to FSXM's
(cond
( (= (type ret) 'LIST)
(if (= (type (cdr ret)) 'STR)
(princ (strcat "\n你选择了关键字(You entered a keyword):" (cdr ret) "\n"))
(princ (strcat "\n最后返回点坐标是(The last position is): " (vl-princ-to-string ret)))
)
)
( (= (type ret) 'STR)
(princ (strcat "\n你输入了字符(You entered a string): " ret "\n"))
)
(t
(princ (strcat "\n其他返回值(Return other value):" (itoa ret) "\n"))
)
)
(vla-EndUndoMark curdoc) ;(command ".undo" "e")
(gc)
(princ)
)[/pcode]
下面以QJChen的一个双向动态阵列为例子,演示如何将以前用(grread)做的程序稍加修改就变成了JIG了。
在此感谢Qjchen,如有冒犯版权,多加原谅。
|
|