- 积分
- 39639
- 明经币
- 个
- 注册时间
- 2006-8-18
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
楼主 |
发表于 2011-11-16 22:14:07
|
显示全部楼层
本帖最后由 highflybir 于 2011-11-18 09:54 编辑
二、让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测试移动选择集
- ;;;*********************************************************************
- (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)
- )
下面以QJChen的一个双向动态阵列为例子,演示如何将以前用(grread)做的程序稍加修改就变成了JIG了。
在此感谢Qjchen,如有冒犯版权,多加原谅。原帖地址如下:
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=85752
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
|