明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 77786|回复: 190

[【高飞鸟】] 【飞鸟集】心随我动--为LISP定制的动态输入,拖拉和动态信息函数(更新至20130731)

    [复制链接]
发表于 2011-11-16 22:12:10 | 显示全部楼层 |阅读模式
本帖最后由 highflybir 于 2013-8-1 09:09 编辑

源码已经贴在ObjectArx版块处!!
http://bbs.mjtd.com/thread-90552-1-1.html
arx程序和LISP样例

===========================================
2013.07.31日作重大更新新
把函数全部加上前缀 HFB_
增添了一些函数:
1、对图功能
C:CompareDwgs
2、状态栏开关函数
C:ShowDrawingStatusBar
3、进度条函数
HFB_SetProgressMeter
HFB_SetProgressMeterPos

4、带关键字回调的SSGet
HFB_SSGet
HFB_InitGet
HFB_SSFree

另外,对JIG,Monitor和Hook以及定时器事件都进行了优化和改进。
===========================================
12.9日更新,先附上beta版本,等各位测试后没问题,再替换。
增加了开关函数。具体演示如下:

===========================================
12.4更新,修正了动态输入的问题。消除了可能引起异常的几个bug.
增加了英文版本。
===========================================
11.29更新,修正了几个bug。增加了钩子和定时器。请重新下载新的arx和LISP.

现在可以卸载时候不弹出对话框和使得CAD崩溃了。
(setLIsptimer 回调函数 毫秒数)    ;增加一个定时器事件
(KillLispTimer)     ;关闭定时器
(RegisterHook  回调函数)  ;注册一个钩子
(removeHook)   ;移除钩子

===========================================
11.21更新,增加了R2000-2002版本。增加了几个新的函数。请重新下载新的arx和LISP.
(GetAperture)     ;靶框下的图元列表
(GetOSMode)     ;当前的捕捉模式(非系统变量)
(GetNested)      ;嵌套选择的图元列表
===========================================
ARX已经更新,有反映R2004不能用的请重新下载,并请反馈测试结果。
新增加R2007,R2008,R2009的64位版本。(dynArxFor2007-2009x64.arx)
===========================================
虽说LISP中已经提供了动态的输入采集函数grread,然而这个函数有诸多不足,譬如不支持捕捉,正交及动态输入。不能在图形外的菜单等处操作。等等。
而且在一定情况下受速度限制。
为此,我特意编写了几个函数,极大程度地扩张了CAD的动态函数。
有了这几个函数,你就可以自由地拖拉物体,既支持捕捉,也支持正交,等等。
还可以定制自己的tooltip(热信息),定制自己的光标(这个光标可以是CAD的任何图元);
可以随时采集输入信息,甚至可以让GetPoint,SSGet之类的函数能带有回调。

用法,先依据自己的CAD版本,加载相应的arx,然后运行附件中的测试样例。

说明:
这个arx提供了四个主要函数 HFB_PointMonitor, SSJIG , DragGen , XFormSS.其用法介绍参见下面的帖子。
其中以HFB_PointMonitor效果最好,SSJIG能动态输入,DragGen和XFormSS可执行大量选择集的变换。
这些函数在R2012版本上效果最好。
帖子会随时更新源码和演示,欢迎大家提意见,或者把自己的样例放上来。我会为样例加分。
在编写这个程序中,得到了FSXM的很多建议和支持,在此深表感谢。

一、输入点监视函数HFB_PointMonitor


    用来动态采集CAD中光标的位置,并反馈给用户处理。这样以来,你就可以拥有自己的鼠标。
    用来动态采集Getpoint,getangle,getdist,getorient,getcorner,entsel,nentsel,nentselp,ssget之类的函数时光标所在位置,并对其反应,形成各种特殊的效果,譬如动态拖拉,动态信息等等。
    这个函数的优点在于,回调函数不一定要在命令状态下就可以运行,就像非模态一样。
  1. (vl-load-com)
  2. (if (null CurDoc)
  3.   (setq CurDoc
  4. (vla-get-ActiveDocument (vlax-get-acad-object)))
  5. )


  6. ;;;*********************************************************************
  7. ;;;HFB_PointMonitor用法:                                                
  8. ;;;(HFB_PointMonitor [回调函数] [选择集/图元])                          
  9. ;;;不带参数的(HFB_PointMonitor)为关闭监视事件                           
  10. ;;;第一个参数为回调函数名称,应该为字符串,且存在的函数                 
  11. ;;;回调函数只有一个参数,这个参数为三维点,代表你现在鼠标所在位置.如果返
  12. ;;;回值为选择集或者图元,将更改鼠标捕捉排除的物体为你返回值所代表的物体.
  13. ;;;如果返回值为字符串,说明将把字符串的信息附加到CAD的tooltip上。      
  14. ;;;第二个参数可以缺省,缺省的话,将不排除鼠标捕捉,不过你以后仍可指定.   
  15. ;;;*********************************************************************
  16. ;;;*********************************************************************
  17. ;;;图元信息显示                     
  18. ;;;*********************************************************************
  19. (defun c:Info(/ ret)
  20.   (defun InfoCallback (dynpt / txt lst dat)
  21.     (setq txt (vl-princ-to-string (mapcar 'rtos dynpt)))
  22.     (setq txt (strcat "\n当前点的坐标是:" txt))
  23.     (if (setq lst (nentselp dynpt))
  24.       (progn
  25. (setq dat (entget (car lst)))
  26.         (strcat txt "\n这个图元的类型是:" (cdr (assoc 0 dat)))
  27.       )
  28.       txt
  29.     )
  30.   )
  31.   (setq ret (HFB_PointMonitor "InfoCallback"))
  32.   (prompt "\n如果要关闭监视,请用函数(HFB_PointMonitor)")
  33.   (princ)
  34. )
  35. ;;;*********************************************************************
  36. ;;;自定义光标                       
  37. ;;;*********************************************************************
  38. (defun C:MyCursorOn(/ ret ent)      ;打开光标
  39.   (defun CursorCallback (dynpt / height insPnt)
  40.     (if (not (vlax-erased-p txtobj))
  41.       (progn
  42.         (setq height (/ (getvar 'viewsize) 50))
  43.         (setq insPnt (mapcar '+ dynpt (list (/ height 2) (/ height 2) 0)))
  44.         (vlax-put txtobj 'InsertionPoint inspnt)
  45.         (vlax-put txtobj 'height  height)
  46.       )
  47.       (HFB_PointMonitor)
  48.     )
  49.   )
  50.   (setq ent (entmakex
  51.        (list
  52.         '(0 . "text")
  53.         '(1 . "highflybird")   
  54.         '(62 . 3)
  55.         (cons 10 (getvar 'lastpoint))
  56.         (cons 40 (/ (getvar 'viewsize) 50))   ;for a standard dwg
  57.       )
  58.     )
  59.   )
  60.   (setq txtobj (vlax-ename->vla-object ent))
  61.   (setq ret (HFB_PointMonitor "CursorCallback" ent))
  62.   (prompt "\n如果要关闭自定义光标,请用命令MyCursorOff.")
  63.   (princ)
  64. )
  65. (defun C:MyCursorOff(/ ret)      ;关闭光标
  66.   (HFB_PointMonitor)
  67.   (and (not (vlax-erased-p txtobj)) (vla-erase txtobj))
  68.   (setq txtobj nil)
  69.   (princ)
  70. )
  71. ;;;*********************************************************************
  72. ;;;带回调函数的GetXXX测试(模拟move命令)                                 
  73. ;;;*********************************************************************
  74. (defun C:GetXXX(/ OBJLST P0 PT SS)
  75.   (setq *error*_Old *error*)      ;保存出错处理函数
  76.   (setq *error* *error*_New)      ;设置新的出错处理
  77.   (defun PointCallback (dynpt)      ;回调函数
  78.     (foreach obj objlst
  79.       (vla-move obj (vlax-3d-point p0) (vlax-3d-point dynpt))  ;移动物体
  80.     )
  81.     (setq p0 dynpt)      
  82.   )
  83.   (vla-StartUndoMark CurDoc)      ;撤销编组开始
  84.   (if (and (setq ss (ssget))
  85.     (setq pt (getpoint "\n第一点(1st Point): "))
  86.       )
  87.     (progn
  88.       (setq objlst (GetObjects ss))
  89.       (setq p0 (trans pt 1 0))      ;需要转化到世界坐标系
  90.      
  91.       ;;设置回调函数名和需要排除捕捉的选择集
  92.       (setq ret (HFB_PointMonitor "PointCallback" ss))   ;第一个参数是回调函数名,第二个参数是可以省略(如果不需要排除捕捉的话)
  93.       ;;现在就可以看到动态效果了
  94.       (setq ret (getpoint pt "\n第二点(2nd point): "))   ;此处可以是lisp的交互函数,例如getpoint,getangle之类。
  95.       ;;最后关闭监视
  96.       (HFB_PointMonitor)      
  97.       
  98.       (princ ret)
  99.     )
  100.   )
  101.   (vla-EndUndoMark curdoc)      ;编组结束  
  102.   (princ)
  103. )

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

动态tooltip信息能够选择状态就好了,还有信息最好能设置不同的颜色 .  发表于 2014-3-18 15:27
64位2010版不能加载dynArxFor2007-2009x64.arx,加载提示无法找到所需的程序!飞版请查看一下原因!  发表于 2011-11-20 18:59

评分

参与人数 22明经币 +25 金钱 +120 收起 理由
Nico + 1
zctao1966 + 1 能够不受命令行限制,很好!
langjs + 20
jicqj + 1 很给力!
lrd1861 + 1 赞一个!
wwwliuyu + 50 很给力!能否做一个在非命令状态下,当有选择.
yanshengjiang + 1 + 10 赞一个!
crazylsp + 1 赞一个!虽然不太懂
kwok + 1 很给力!
cabinsummer + 1 LISP算法世界第一高手

查看全部评分

"觉得好,就打赏"
    共1人打赏

本帖被以下淘专辑推荐:

发表于 2011-11-17 09:27:37 | 显示全部楼层
给力.
CAD2004加载不成功. 2006加载成功.
回复 支持 0 反对 1

使用道具 举报

发表于 2011-11-19 10:58:25 | 显示全部楼层
本帖最后由 Gu_xl 于 2013-5-20 22:54 编辑

动态信息查询,由一个经典的yad动态信息查询函数改编而来!
  1. ;;;飞鸟集]心随我动--为LISP定制的动态输入,动态拖拉和动态信息函数之应用---动态信息查询
  2. ;;;由一个经典的yad动态信息查询函数改编而来!改编: Gu_xl 2011.11.19
  3. (defun InfoCallBak (PT /  TOANG    DIS ENT)
  4.   (defun toang(ang i)
  5.     (if (= i 1)
  6.       (* ang (/ 180 pi))
  7.       (* ang (/ pi 180))
  8.     )
  9.   )
  10. (defun gxl-dxf (ent i)
  11. (cdr (assoc i (entget ent)))
  12. )
  13.   (defun dis (ENT / MJBL OBJ LAYNM NAME LST)
  14.     (if (= mjdw 1000) (setq mjbl 1000000) (setq mjbl 1))
  15.     (setq obj (vlax-ename->vla-object ent))
  16.     (setq laynm (strcat "图层:" (gxl-dxf ent 8)) name (gxl-dxf ent 0))
  17.     (cond
  18.       ((= name "3DFACE")
  19.         (setq lst (list "【三维面】" laynm))
  20.       )
  21.       ((= name "3DSOLID")
  22.         (setq lst (list "【三维实体】" laynm (strcat "格式版本号:" (itoa (gxl-dxf ent 70)))))
  23.       )
  24.       ((= name "ACAD_PROXY_ENTITY")
  25.         (setq lst (list "【代理】" laynm))
  26.       )
  27.       ((= name "ARC")
  28.         (setq lst (list "【圆弧】" laynm (strcat "半径:" (rtos (vla-get-radius obj) 2 0))
  29.                                          (strcat "圆心角:" (rtos (toang (vla-get-TotalAngle obj) 1) 2 1) "度")
  30.                                          (strcat "起始角:" (rtos (toang (vla-get-StartAngle obj) 1) 2 1) "度")
  31.                                          (strcat "终止角:" (rtos (toang (vla-get-EndAngle obj) 1) 2 1) "度")
  32.                                          (strcat "总弧长:" (rtos (vla-get-ArcLength obj) 2 0))
  33.                                          (strcat "面积:" (rtos (/ (vla-get-Area obj) mjbl) 2 2) "㎡")
  34.         ))
  35.       )
  36.       ((= name "ATTDEF")
  37.         (setq lst (list "【属性定义】" laynm (strcat "标签:" (vla-get-TagString obj))
  38.                                              (strcat "提示:" (vla-get-PromptString obj))
  39.                                              (strcat "缺省值:" (vla-get-TextString obj))
  40.                                              (strcat "高度:" (rtos (vla-get-Height obj) 2 0))
  41.                                              (strcat "角度:" (rtos (toang (vla-get-Rotation obj) 1) 2 1) "度")
  42.                                              (strcat "文字样式:" (vla-get-StyleName obj))
  43.         ))
  44.       )
  45.       ((= name "ATTRIB")
  46.         (setq lst (list "【属性】" laynm (strcat "标签:" (vla-get-TagString obj))
  47.                                          (strcat "缺省值:" (vla-get-TextString obj))
  48.                                          (strcat "高度:" (rtos (vla-get-Height obj) 2 0))
  49.                                          (strcat "角度:" (rtos (toang (vla-get-Rotation obj) 1) 2 1) "度")
  50.                                          (strcat "文字样式:" (vla-get-StyleName obj))
  51.         ))
  52.       )
  53.       ((= name "BODY")
  54.         (setq lst (list "【体】" laynm (strcat "格式版本号:" (itoa (gxl-dxf ent 70)))))
  55.       )
  56.       ((= name "CIRCLE")
  57.         (setq lst (list "【圆】" laynm (strcat "半径:" (rtos (vla-get-radius obj) 2 0))
  58.                                        (strcat "周长:" (rtos (vla-get-Circumference obj) 2 0))
  59.                                        (strcat "面积:" (rtos (/ (vla-get-Area obj) mjbl) 2 2) "㎡")
  60.         ))
  61.       )
  62.       ((= name "DIMENSION")
  63.         (setq lst (list "【尺寸标注】" laynm (strcat "标注样式:" (vla-get-StyleName obj))
  64.                                              (strcat "文字样式:" (vla-get-TextStyle obj))
  65.                                              (strcat "文字高度:" (rtos (vla-get-TextHeight obj) 2 1))
  66.                                              (strcat "替带文字:" (if (= (gxl-dxf ent 1) "") "无" (gxl-dxf ent 1)))
  67.         ))
  68.       )
  69.       ((= name "ELLIPSE")
  70.         (setq lst (list "【椭圆】" laynm (strcat "长轴半径:" (rtos (vla-get-MajorRadius obj) 2 0))
  71.                                          (strcat "短轴半径:" (rtos (vla-get-MinorRadius obj) 2 0))
  72.                                          (strcat "起始角:" (rtos (toang (vla-get-StartAngle obj) 1) 2 1) "度")
  73.                                          (strcat "终止角:" (rtos (toang (vla-get-EndAngle obj) 1) 2 1) "度")
  74.                                          (strcat "面积:" (rtos (/ (vla-get-Area obj) mjbl) 2 2) "㎡")
  75.         ))
  76.       )
  77.       ((= name "HATCH")
  78.         (setq lst (list "【图案填充】" laynm (strcat "图案名称:" (vla-get-PatternName obj))
  79.                                              (strcat "角度:" (rtos (toang (vla-get-PatternAngle obj) 1) 2 1))
  80.                                              (strcat "比例:" (rtos (vla-get-PatternScale obj) 2 0))
  81.                                              (strcat "关联:" (if (= (vla-get-AssociativeHatch obj) :vlax-false) "关闭" "打开"))
  82.                                              (strcat "填充样式:" (nth (vla-get-HatchStyle obj) '("普通" "外部" "忽略")))
  83.         ))
  84.       )
  85.       ((= name "IMAGE")
  86.         (setq lst (list "【图像】" laynm (strcat "图像大小:" (rtos (car (gxl-dxf ent 13)) 2 0) "X" (rtos (cadr (gxl-dxf ent 13)) 2 0))))
  87.       )
  88.       ((= name "INSERT")
  89.         (setq lst (list "【图块】" laynm (strcat "名称:" (gxl-dxf ent 2))
  90.                                          (strcat "X比例:" (rtos (gxl-dxf ent 41) 2 1))
  91.                                          (strcat "Y比例:" (rtos (gxl-dxf ent 42) 2 1))
  92.                                          (strcat "Z比例:" (rtos (gxl-dxf ent 43) 2 1))
  93.                                          (strcat "角度:" (rtos (toang (vla-get-Rotation obj) 1) 2 1) "度")
  94.         ))
  95.       )
  96.       ((= name "LEADER")
  97.         (setq lst (list "【引线】" laynm (strcat "标注样式:" (vla-get-StyleName obj))
  98.                                          (strcat "引线类型:" (gxl-dxf (list (cons 0 "折线") (cons 1 "样条曲线")) (gxl-dxf ent 72)))
  99.         ))
  100.       )
  101.       ((= name "LINE")
  102.         (setq lst (list "【直线】" laynm (strcat "长度:" (rtos (vla-get-length obj) 2 0))
  103.                                          (strcat "角度:" (rtos (toang (vla-get-angle obj) 1) 2 1) "度")
  104.         ))
  105.       )
  106.       ((= name "LWPOLYLINE")
  107.         (setq lst (list "【多段线】" laynm (strcat "常量宽度:" (if (gxl-dxf ent 43) (rtos (vla-get-ConstantWidth obj) 2 0) "变宽度"))
  108.                                             (strcat "多段线:" (if (= (vla-get-Closed obj) :vlax-false) "不闭合" "闭合"))
  109.                                             (strcat "面积:" (rtos (/ (vla-get-Area obj) mjbl) 2 2) "㎡")
  110.         ))
  111.       )
  112.       ((= name "MLINE")
  113.         (setq lst (list "【多线】" laynm (strcat "多线样式:" (vla-get-StyleName obj))
  114.                                          (strcat "比例因子:" (rtos (gxl-dxf ent 40) 2 1))
  115.                                          (strcat "对齐:" (nth (gxl-dxf ent 70) '("上" "零" "下")))
  116.         ))
  117.       )
  118.       ((= name "MTEXT")
  119.         (setq lst (list "【多行文字】" laynm (strcat "高度:" (rtos (vla-get-Height obj) 2 0))
  120.                                              (strcat "角度:" (rtos (toang (vla-get-Rotation obj) 1) 2 1) "度")
  121.                                              (strcat "样式:" (vla-get-StyleName obj))
  122.         ))
  123.       )
  124.       ((or (= name "OLEFRame") (= name "OLE2FRame"))
  125.         (setq lst (list "【OLE边框】" laynm (strcat "格式版本号:" (itoa (gxl-dxf ent 70)))))
  126.       )
  127.       ((= name "POINT")
  128.         (setq lst (list "【点】" laynm))
  129.       )
  130.       ((= name "POLYLINE")
  131.         (setq lst (list "【三维多段线】" laynm))
  132.       )
  133.       ((= name "RAY")
  134.         (setq lst (list "【射线】" laynm))
  135.       )
  136.       ((= name "REGION")
  137.         (setq lst (list "【面域】" laynm (strcat "格式版本号:" (itoa (gxl-dxf ent 70)))))
  138.       )
  139.       ((= name "SHAPE")
  140.         (setq lst (list "【形】" laynm (strcat "高度:" (rtos (vla-get-Height obj) 2 0))
  141.                                        (strcat "宽度系数:" (rtos (vla-get-ScaleFactor obj) 2 1))
  142.                                        (strcat "角度:" (rtos (toang (vla-get-Rotation obj) 1) 2 1) "度")
  143.         ))
  144.       )
  145.       ((= name "SOLID")
  146.         (setq lst (list "【实体】" laynm))
  147.       )
  148.       ((= name "SPLINE")
  149.         (setq lst (list "【样条曲线】" laynm (strcat "多段线:" (if (= (vla-get-Closed obj) :vlax-false) "不闭合" "闭合"))
  150.                                              (strcat "阶数:" (rtos (vla-get-Degree obj) 2 0))
  151.                                              (strcat "面积:" (rtos (/ (vla-get-Area obj) mjbl) 2 2) "㎡")
  152.         ))
  153.       )
  154.       ((= name "TEXT")
  155.         (setq lst (list "【文字】" laynm (strcat "高度:" (rtos (vla-get-Height obj) 2 0))
  156.                                          (strcat "宽度系数:" (rtos (vla-get-ScaleFactor obj) 2 1))
  157.                                          (strcat "角度:" (rtos (toang (vla-get-Rotation obj) 1) 2 1) "度")
  158.                                          (strcat "样式:" (vla-get-StyleName obj))
  159.                                          (strcat "对齐:" (nth (vla-get-Alignment obj) '("Left" "Center" "Right" "Aligned" "Middle" "Fit" "TopLeft" "TopCenter" "TopRight"
  160.                                                                                         "MiddleLeft" "MiddleCenter" "MiddleRight" "BottomLeft" "BottomCenter" "BottomRight")))
  161.         ))
  162.       )
  163.       ((= name "TOLERANCE")
  164.         (setq lst (list "【公差】" laynm (strcat "标注样式:" (vla-get-StyleName obj))
  165.                                          (strcat "文字样式:" (vla-get-TextStyle obj))
  166.                                          (strcat "文字高度:" (rtos (vla-get-TextHeight obj) 2 1))
  167.         ))
  168.       )
  169.       ((= name "TRACE")
  170.         (setq lst (list "【宽线】" laynm))
  171.       )
  172.       ((= name "VERTEX")
  173.         (setq lst (list "【顶点】" laynm (strcat "起始宽度:" (rtos (gxl-dxf ent 40) 2 0))
  174.                                          (strcat "结束宽度:" (rtos (gxl-dxf ent 41) 2 0))
  175.                                          (strcat "凸度:" (rtos (gxl-dxf ent 42) 2 1))
  176.         ))
  177.       )
  178.       ((= name "XLINE")
  179.         (setq lst (list "【构造线】" laynm))
  180.       )
  181.       (T
  182.         (setq lst (list "【未知对象】" laynm))
  183.       )
  184.     )
  185.     (apply 'strcat (mapcar '(lambda (x)(strcat x "\n")) lst))
  186.   )
  187. (if (setq ent (nentselp pt)
  188.             ent (if (and ent (= (type (last (last ent))) 'ename))
  189.                   (last (last ent))
  190.                   (car ent)
  191.                 )
  192.       )
  193. (dis ent)
  194.    )
  195. )
  196. (defun c:DynInfo  (/ loaded openview closeview)
  197.   (defun openview  (/ arxs)
  198.     (VL-ACAD-DEFUN 'InfoCallBak)
  199.     (if (null mjdw)
  200.       (progn
  201. (INITget 7 "Yes No  ")
  202. (setq Mjdw (getKword "\n以毫米为单位?[<Yes/No>]<No>:"))
  203. (if (= mjdw "Yes")
  204.    (setq mjdw 1000)
  205.    (setq mjdw 999)
  206. )
  207.       )
  208.     )
  209.     (HFB_PointMonitor)
  210.     (HFB_PointMonitor "InfoCallBak")
  211.     (princ "\n动态信息查看打开!")
  212.     (setq *dynViewEnt* t)
  213.     )
  214.   (defun closeview  ()
  215.     (HFB_PointMonitor)
  216.     (princ "\n动态信息查看关闭!")
  217.     (setq *dynViewEnt* nil)
  218.     )
  219.   (cond ((= 16 (atoi (getvar 'acadver)))
  220.   (if (not (member "dynarxfor2004-2006.arx" (arx)))
  221.     (if (setq fn (findfile "dynarxfor2004-2006.arx"))
  222.       (setq loaded (arxload fn "1"))
  223.       (setq loaded "2")
  224.       )
  225.     (setq loaded "3") ;_ 已加载
  226.     )
  227.   )
  228. ((= 17 (atoi (getvar 'acadver)))
  229.   (if (not (member "dynarxfor2007-2009.arx" (arx)))
  230.     (if (setq fn (findfile "dynarxfor2007-2009.arx"))
  231.       (setq loaded (arxload fn "1"))
  232.       (setq loaded "2")
  233.       )
  234.     (setq loaded "3")
  235.     )
  236.   )
  237. ((= 18 (atoi (getvar 'acadver)))
  238.   (if (= "x86" (getenv "PROCESSOR_ARCHITECTURE"))
  239.     (if (not (member "dynarxfor2010-2012x32.arx" (arx)))
  240.       (if (setq fn (findfile "dynarxfor2010-2012x32.arx"))
  241.         (setq loaded (arxload fn "1"))
  242.         (setq loaded "2")
  243.         )
  244.       (setq loaded "3")
  245.       )
  246.     (if (not (member "dynarxfor2010-2012x64.arx" (arx)))
  247.       (if (setq fn (findfile "dynarxfor2010-2012x64.arx"))
  248.         (setq loaded
  249.         (arxload (findfile "dynarxfor2010-2012x64.arx")
  250.           "1"))
  251.         (setq loaded "2")
  252.         )
  253.       (setq loaded "3")
  254.       )
  255.     )
  256.   )
  257. (t (setq loaded "2"))
  258. )
  259.   (if (not (or (= "1" loaded) (= "2" loaded)))
  260.     (if *dynViewEnt*
  261. (closeview)
  262. (openview)
  263. )
  264.     )
  265.   (princ)
  266.   )

点评

64位的R2010要加载DynArxFor2010-2012x64,至于2008下的SSJIG不能运行,等下我查下缘故。可能是各个版本编译的时候搞混了。  发表于 2011-11-20 19:09

评分

参与人数 1明经币 +1 金钱 +30 收起 理由
highflybir + 1 + 30 赞一个!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2011-11-17 09:11:31 | 显示全部楼层
支持,很给力
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2011-11-16 22:14:07 | 显示全部楼层
本帖最后由 highflybir 于 2011-11-18 09:54 编辑

二、让LISP也能JIG,JIG是arx或者.net编程的一个函数,用来在采点过程中与用户交互的一个动态拖拉技术。
JIG的优势在于:可以动态输入,功能齐全,与用户交互性较好,直观方便。
  1. ;;;*********************************************************************
  2. ;;;SSJIG用法:                                                               
  3. ;;;(SSJIG 回调函数 [提示][关键字][控制类型][光标类型][基点][选择集])        
  4. ;;;除第一个参数必须外,其他的可以缺省。                                 
  5. ;;;---------------------------------------------------------------------
  6. ;;;1.  回调函数应该为字符串,且代表存在的函数,回调函数只有一个参数,这个
  7. ;;;参数为三维点,代表你现在鼠标所在位置.如果回调函数返回一个三维点,将更
  8. ;;;改基点位置,如果再附加一个字符串,将更改你的回调函数为字符串代表的函数.
  9. ;;;---------------------------------------------------------------------
  10. ;;;2.  提示--STR 类型,拖动过程中提示的信息。                           
  11. ;;;---------------------------------------------------------------------
  12. ;;;3.  关键字--STR 类型,具体用法可参考initget的关键字说明               
  13. ;;;---------------------------------------------------------------------
  14. ;;;4.  控制类型: --INT 类型                                                
  15. ;;;    kGovernedByOrthoMode           = 1,     正交模式是否设置            
  16. ;;;    kNullResponseAccepted           = 2,     空回车响应输入请求         
  17. ;;;    kDontEchoCancelForCtrlC           = 4,     Ctrl+C不作为取消            
  18. ;;;    kDontUpdateLastPoint           = 8,     不更新lastpoint变量         
  19. ;;;    kNoDwgLimitsChecking           = 16,    点不作限制,可在图形外      
  20. ;;;    kNoZeroResponseAccepted           = 32,    不允许输入零               
  21. ;;;    kNoNegativeResponseAccepted = 64,    不允许输入负值              
  22. ;;;    kAccept3dCoordinates           = 128,   接受三维坐标点              
  23. ;;;    kAcceptMouseUpAsPoint           = 256,   鼠标松开为输入点            
  24. ;;;    kAnyBlankTerminatesInput           = 512,   任何空白中断输入            
  25. ;;;    kInitialBlankTerminatesInput= 1024,  初始空白中断输入            
  26. ;;;    kAcceptOtherInputString           = 2048,  接受其他字符               
  27. ;;;    kGovernedByUCSDetect        = 4096,                              
  28. ;;;    kNoZDirectionOrtho          = 8192,                              
  29. ;;;    kImpliedFaceForUCSChange    = 16384,                             
  30. ;;;    kUseBasePointElevation      = 32768,                             
  31. ;;;    kAcqureDist                 = 65536, 输入作为距离,相当于getdist
  32. ;;;    kAcqureAngle                = 131072,输入作为角度,相当于getangle
  33. ;;;---------------------------------------------------------------------
  34. ;;;5.  光标类型:--INT 类型                                             
  35. ;;;    kNoSpecialCursor = -1,      // 普通类型                          
  36. ;;;    kCrosshair = 0,             // 全屏十字光标                     
  37. ;;;    kRectCursor = 1,            // 矩形                              
  38. ;;;    kRubberBand = 2,            // 橡皮筋                           
  39. ;;;    kNotRotated = 3,            // 未旋转形状                        
  40. ;;;    kTargetBox = 4,             // 选取形状                          
  41. ;;;    kRotatedCrosshair = 5,      // 旋转的形状.                       
  42. ;;;    kCrosshairNoRotate = 6,     // 强制为未旋转的十字形状.           
  43. ;;;    kInvisible = 7,             // 光标不可见.                       
  44. ;;;    kEntitySelect = 8,          // 拾取目标形状.                     
  45. ;;;    kParallelogram = 9,         // 平行四边形状.                     
  46. ;;;    kEntitySelectNoPersp = 10,  // 选择框,透视图中不可用.           
  47. ;;;    kPkfirstOrGrips = 11,       // 自动选择光标.                     
  48. ;;;    kCrosshairDashed = 12       // 虚线的十字光标                    
  49. ;;;---------------------------------------------------------------------
  50. ;;;6.  基点: --LIST 类型,三维点表                                      
  51. ;;;    用来动态输入时的基点(第一点)                                   
  52. ;;;    如果指定了基点,则表明指定点为第一点,否则读取变量LASTPOINT        
  53. ;;;---------------------------------------------------------------------
  54. ;;;7.  选择集:--ENAME 类型或者 PICKSRT类型,暂时保留                    
  55. ;;;    (如果指定了选择集,则对这个选择集更新)                           
  56. ;;;---------------------------------------------------------------------
  57. ;;;SSJIG函数的返回值,正常情况下返回三维点坐标,如果设置了可接受任意字符
  58. ;;;则输入字符结束后返回输入的字符串,如果设置了关键字,而用户输入了关键字
  59. ;;;则返回关键字。其他情况则返回整数值,代表意义如下:                  
  60. ;;;    kModeless       = -17,                                          
  61. ;;;    kNoChange       = -6,                                            
  62. ;;;    kCancel         = -4,                                            
  63. ;;;    kOther          = -3,                                            
  64. ;;;    kNull           = -1,                                            
  65. ;;;*********************************************************************


  66. ;;;*********************************************************************
  67. ;;;JIG测试移动选择集                                                        
  68. ;;;*********************************************************************
  69. (defun c:ttt(/ ss pt lst p0 ret i x ret)
  70.   (setq *error*_Old *error*)                                                ;保存出错处理函数
  71.   (setq *error* *error*_New)                                                ;设置新的出错处理
  72.   ;;回调函数 for SSJig
  73.   (defun CallBack (dynpt)
  74.     (setq i (+ i 10000))
  75.     (setq x (entmakex
  76.               (list
  77.                 '(0 . "LINE")
  78.                 (cons 420 i)
  79.                 (cons 10 (trans pt 1 0))
  80.                 (cons 11 dynpt)
  81.               )
  82.             )
  83.     )
  84.     (if x (setq ss (ssadd x ss)))
  85.     (foreach obj lst
  86.       (vla-move obj (vlax-3d-point p0) (vlax-3d-point dynpt))
  87.       ;;(vla-update obj)                                                ;无需用vla-update更新
  88.     )
  89.     (setq p0 dynpt)
  90.     ss
  91.   )
  92.   
  93.   (vla-StartUndoMark CurDoc)                                                ;(command ".undo" "be")
  94.   (setq vv (ssadd))
  95.   (setq ss (ssget))
  96.   (setq pt (getpoint "\n基点:"))
  97.   (setq p0 (trans pt 1 0))
  98.   (setq lst (GetObjects ss))
  99.   (setvar "lastPoint" p0)
  100.   (setq i 0)
  101.   
  102.   ;;|
  103.   (setq ret (ssJIG "CallBack"                                                ;回调函数名
  104.                    "\n下一点(the next point): "                                ;提示符
  105.                    "Set Exit"                                                ;关键字
  106.                    (+ 1                                                        ;支持正交模式
  107.                       2                                                        ;允许空回车
  108.                       4                                                        ;Ctrl+C不作为取消
  109.                       16                                                ;不限制点在图形外
  110.                       128                                                ;接受3d坐标
  111.                       2048                                              ;接受任意字符
  112.                       65536                                                 ;输入作为距离  131072输入作为角度
  113.                    )
  114.                    2                                                        ;橡皮线效果
  115.                    p0                                                        ;基点
  116.             )
  117.   );;|;

  118.   ;|
  119.   (setq ret (HFB_PointMonitor "CallBack" ss))                                ;比较同HFB_PointMonitor函数效果
  120.   (setq ret (getpoint pt "\n第二点(2nd point): "))
  121.   (HFB_PointMonitor);;|;

  122.   ;;(setq ret (dyndraw "CallBack" "\n下一点:" "Set" (+ 1 2 4 16 128 2048 8192) 2 p0))        ;Compare to Alexander Rivilis's
  123.   ;;(setq ret (draggen ss p0  "CallBack"  0 0 T   "\n下一点(the next point):"))              ;Compare to DragGen mothed
  124.   ;;(Fsxm-Jig "CallBack" "指定顶点")                                                        ;Compare to FSXM's
  125.   (cond
  126.     ( (= (type ret) 'LIST)
  127.       (if (= (type (cdr ret)) 'STR)
  128.         (princ (strcat "\n你选择了关键字(You entered a keyword):" (cdr ret)  "\n"))
  129.         (princ (strcat "\n最后返回点坐标是(The last position is): " (vl-princ-to-string ret)))
  130.       )
  131.     )
  132.     ( (= (type ret) 'STR)
  133.       (princ (strcat "\n你输入了字符(You entered a string): " ret "\n"))
  134.     )
  135.     (t
  136.       (princ (strcat "\n其他返回值(Return other value):" (itoa ret) "\n"))
  137.     )
  138.   )
  139.   (vla-EndUndoMark curdoc)                                                ;(command ".undo" "e")
  140.   (gc)
  141.   (princ)
  142. )



下面以QJChen的一个双向动态阵列为例子,演示如何将以前用(grread)做的程序稍加修改就变成了JIG了。
在此感谢Qjchen,如有冒犯版权,多加原谅。原帖地址如下:
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=85752




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

第二次上传的arx文件SSJIG函数不能正确运行!第一次的可以!测试环境2008版本!  发表于 2011-11-20 18:37
 楼主| 发表于 2011-11-16 22:17:21 | 显示全部楼层
本帖最后由 highflybir 于 2011-11-18 01:01 编辑

三、DragGen函数让你的拖动大量物体时候更给力。
      XFormSS函数让你的对大量物体进行矩阵变换时快速有效。

  1. ;;;*********************************************************************
  2. ;;;Draggen用法:                                                         
  3. ;;;(DragGen 选择集/图元 [基点] [回调函数] [光标类型] [拖动模式] [执行]  
  4. ;;;除第一个参数必须外,其他的可以缺省。                                 
  5. ;;;选择集/图元,基点和回调函数同SSJIG的用法。                           
  6. ;;;光标类型--INT 类型,只有三种,0,十字;1,无;2,选取状                    
  7. ;;;拖动模式--INT 类型,0,平移;1,旋转;2,缩放;3镜像;以后再添加            
  8. ;;;执行与否--如果此参数空或为nil,仅显示拖动效果,而不实际执行变换        
  9. ;;;此函数用以对大量选择集进行拖动等变换效果,尤为明显,快于SSJIG.      
  10. ;;;关键字和控制位的设置请在前面加initget,同getpoint之类的函数。        
  11. ;;;---------------------------------------------------------------------
  12. ;;;回调函数返回值,如果返回点,依据拖动模式对选择集作几何变换.         
  13. ;;;如果返回选择集/图元,则对他们作更新。如果返回一个标准的CAD变换矩阵,则
  14. ;;;对选择集/图元做指定的矩阵变换。(如错切,镜像,透视等)              
  15. ;;;---------------------------------------------------------------------
  16. ;;;函数最终返回值为当前点位置和变换的矩阵表。                           
  17. ;;;这个函数要求用户对矩阵变换有一定了解。                              
  18. ;;;需要特殊说明的是:回调函数传入的点,是一个UCS下的点坐标。            
  19. ;;;*********************************************************************

  20. ;;;自定义的回调函数 for DragGen
  21. (defun CallBack1 (DynPt)
  22.   (redraw)
  23.   (grdraw pt dynpt -1)
  24.   (trans dynpt 1 0)
  25. )
  26. (vl-acad-defun 'CallBack1)


  27. ;;;*********************************************************************
  28. ;;;测试Draggen--移动                                                        
  29. ;;;*********************************************************************
  30. (defun C:TCC(/ ss p0 ret pt)
  31.   (if (and (setq ss (ssget))
  32.            (RedrawSel ss 3)
  33.            (setq pt (getpoint "\n指定基点:"))
  34.       )
  35.     (progn
  36.       (setq p0 (trans pt 1 0))
  37.       (setvar "lastPoint" pt)
  38.       (prompt "\n指定第二个点:")   
  39.       (setq ret (draggen ss p0 "CallBack1" 0 0 T))
  40.       (princ ret)
  41.       (RedrawSel ss 4)
  42.     )
  43.   )
  44.   (redraw)
  45.   (princ)
  46. )

  47. ;;;*********************************************************************
  48. ;;;测试Draggen--旋转                                                        
  49. ;;;*********************************************************************
  50. (defun C:TRR(/ ss p0 ret pt)
  51.   (if (and (setq ss (ssget))
  52.            (RedrawSel ss 3)
  53.            (setq pt (getpoint "\n指定基点:"))
  54.       )
  55.     (progn
  56.       (setq p0 (trans pt 1 0))
  57.       (setvar "lastPoint" pt)
  58.       (initget "Copy Reference")
  59.       (prompt "\n指定旋转角度,或 [复制(C)/参照(R)]:")
  60.       (setq ret (draggen ss p0 "CallBack1" 1 0 T))
  61.       (princ ret)
  62.       (RedrawSel ss 4)
  63.     )
  64.   )
  65.   (redraw)
  66.   (gc)
  67.   (princ)
  68. )

  69. ;;;*********************************************************************
  70. ;;;测试Draggen--图元更新                                                  
  71. ;;;*********************************************************************
  72. (defun C:TGG(/ ss p0 pt lst ret)
  73.   ;;自定义回调函数  for draggen --更新选择集
  74.   (defun CallBack (DynPt)
  75.     (redraw)
  76.     (grdraw pt dynpt -1)
  77.     (foreach obj lst
  78.       (vla-move obj (vlax-3d-point p0) (vlax-3d-point (trans dynpt 1 0)))
  79.     )
  80.     (setq p0 (trans dynpt 1 0))
  81.     ss
  82.   )

  83.   (vla-StartUndoMark curDoc)
  84.   ;;程序执行部分
  85.   (if (and (setq ss (ssget))
  86.            (RedrawSel ss 3)
  87.            (setq pt (getpoint "\n指定基点:"))
  88.       )
  89.     (progn
  90.       (setq p0 (trans pt 1 0))
  91.       (setvar "lastPoint" pt)
  92.       (setq lst (GetObjects ss))
  93.       (setq ret (draggen ss p0 "CallBack" 0 0 T "\n指定第二个点:"))
  94.       (princ ret)
  95.       (RedrawSel ss 4)
  96.     )
  97.   )
  98.   (vla-EndUndoMark curdoc)
  99.   (redraw)
  100.   (gc)
  101.   (princ)
  102. )

  103. ;;;*********************************************************************
  104. ;;;测试Draggen--矩阵变换                                                
  105. ;;;*********************************************************************
  106. (defun C:TMM(/ ss p0 pt ret)
  107.   ;;自定义回调函数  for draggen --矩阵变换
  108.   (defun CallBack (DynPt / vec)
  109.     (redraw)
  110.     (grdraw pt dynpt -1)
  111.     (setq vec (mapcar '- (trans dynpt 1 0) p0))
  112.     (list
  113.       (list 1. 0. 0. (car vec))
  114.       (list 0. 1. 0. (cadr vec))
  115.       (list 0. 0. 1. 0.)
  116.       (list 0. 0. 0. 1.)
  117.     )
  118.   )
  119.   
  120.   ;;程序执行部分
  121.   (if (and (setq ss (ssget))
  122.            (RedrawSel ss 3)
  123.            (setq pt (getpoint "\n指定基点:"))
  124.       )
  125.     (progn
  126.       (setq p0 (trans pt 1 0))
  127.       (setvar "lastPoint" pt)
  128.       (prompt "\n指定第二个点:")
  129.       (setq ret (draggen ss p0 "CallBack" 0 0 T))
  130.       (princ ret)
  131.       (RedrawSel ss 4)
  132.     )
  133.   )
  134.   (redraw)
  135.   (gc)
  136.   (princ)
  137. )

  138. ;;;*********************************************************************
  139. ;;;测试XForm                                                               
  140. ;;;此函数用来对大量选择集的变换。因为vla-transformby,vla-move,vla-rotate
  141. ;;;对这样的需求在速度上不能满足要求时,需要用一个arx来高效地执行。      
  142. ;;;另外,也用于command命令不能使用的场合。                              
  143. ;;;经测试速度,对大量图元的变换,用此能提高速度20倍,甚至更多。         
  144. ;;;用法:(Xfrom Selection Matrix_List)                                   
  145. ;;;            Selection   ------非空选择集        PICKSET              
  146. ;;;            Matrix_List ------变换矩阵表(4X4)   LIST                 
  147. ;;;两个参数不能缺省,变换矩阵为标准的CAD等比矩阵.                       
  148. ;;;返回T代表成功变换,nil变换失败,此时请检测选择集中是否有被锁定的图元,
  149. ;;;或者变换矩阵为标准的CAD矩阵,为统一比例变换的矩阵。                  
  150. ;;;*********************************************************************
  151. (defun C:TXX (/ sel pt1 pt2 vec)
  152.   (if (and (setq sel (ssget))
  153.            (setq pt1 (getpoint "\n基点:"))
  154.            (setq pt2 (getpoint "\n目标点:"))  
  155.       )
  156.     (progn
  157.       (redraw)
  158.       (setq vec (mapcar '- pt2 pt1))
  159.       (setq vec (trans vec 1 0 T))
  160.       (grdraw pt1 pt2 1)
  161.       (XformSS sel
  162.             (list
  163.               (list 1. 0. 0. (car vec))
  164.               (list 0. 1. 0. (cadr vec))
  165.               (list 0. 0. 1. 0.)
  166.               (list 0. 0. 0. 1.)
  167.             )  
  168.       )
  169.     )
  170.   )
  171. )

发表于 2011-11-16 22:39:09 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2011-11-16 22:51:45 | 显示全部楼层
敬仰不止
以前我都只能是用外国人的程序实现,现在高飞鸟兄带来更好的程序
谢谢~

发表于 2011-11-16 22:54:08 | 显示全部楼层
支持,很给力,对LISP来说是一种弥补.
发表于 2011-11-16 23:20:33 | 显示全部楼层
感觉grread函数外国人用得出神入化,有了版主的函数,我们也可以做出出神入化的动态效果
发表于 2011-11-17 09:16:20 | 显示全部楼层
非常强悍,一直想学习C#就是为了解决两大难题:
1. grread函数的局限。
2. DCL无法实现非模态。

谢谢高飞鸟
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 12:38 , Processed in 0.226133 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表