找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1379|回复: 3

[他山之石] 几个 ax:XXX 函数

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-7-18 21:22:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 st788796 于 2013-10-5 06:10 编辑

  1. ;;;转换一个AutoLISP点到一个二维ActiveX点
  2. (defun ax:2DPoint (pt)
  3.   (vlax-make-variant
  4.     (vlax-safearray-fill
  5.       (vlax-make-safearray vlax-vbdouble '(0 . 1))
  6.       (list (car pt) (cadr pt))
  7.     )
  8.   )
  9. )
  10. ;;;返回一个单独图元的范围
  11. (defun ax:GetBoundingBox (ent / ll ur)
  12.   (vla-getboundingbox (vlax-ename->vla-object ent) 'll 'ur)
  13.   (mapcar 'vlax-safearray->list (list ll ur))
  14. )
  15. ;;;由ActiveX变体返回LISP值
  16. ;;;===================================================
  17. ;;;Copyright 2002 Vladimir Nesterovsky
  18. ;;;===================================================
  19. ;;;第一版
  20. ;;;This previous versions weren't working with empty
  21. ;;;(defun lisp-value (v)
  22. ;;;  (cond
  23. ;;;    ((= (type v) 'variant)
  24. ;;;     (lisp-value (vlax-variant-value v))
  25. ;;;    )
  26. ;;;    ((= (type v) 'safearray)
  27. ;;;     (mapcar 'lisp-value (vlax-safearray->list v))
  28. ;;;    )
  29. ;;;    (T v)
  30. ;;;  )
  31. ;;;)
  32. ;;;================================================
  33. ;;;第二版
  34. ;;;The previous versions weren't working with empty
  35. ;;;safearrays. This version seems to be better:
  36. (defun ax:lispValue (v)
  37.   (cond
  38.     ((= (type v) 'variant)
  39.      (ax:lispValue (variant-value v))
  40.     )
  41.     ((= (type v) 'safearray)
  42.      (mapcar 'ax:lispValue (safearray-value v))
  43.     )
  44.     (T v)
  45.   )
  46. )
  47. ;;;================================================
  48. ;;;Maybe its better to just write a fully recursive solution:
  49. ;;;第版
  50. ;;;作者:Vladimir Nesterovsky
  51. ;;;(defun ax:lispValue (var / vt)
  52. ;;;  (cond
  53. ;;;    ((/= (type var) 'variant) var)
  54. ;;;    ((zerop
  55. ;;;       (logand (setq vt (vlax-variant-type var)) vlax-vbarray)
  56. ;;;     )
  57. ;;;     (vlax-variant-value var)
  58. ;;;    )
  59. ;;;    ((zerop (logand vt vlax-vbvariant))
  60. ;;;     (vlax-safearray->list (vlax-variant-value var))
  61. ;;;    )
  62. ;;;    (t
  63. ;;;     (mapcar 'ax:lispValue
  64. ;;;      (vlax-safearray->list
  65. ;;;        (vlax-variant-value var)
  66. ;;;      )
  67. ;;;     )
  68. ;;;    )
  69. ;;;  )
  70. ;;;)

  71. ;;;转换列表为ActiveX变体数组
  72. ;;;
  73. ;;;功能
  74. ;;;
  75. ;;;转换列表为ActiveX变体数组
  76. ;;;
  77. ;;;参数
  78. ;;;
  79. ;;;lst: 列表。该列表可以有一层的嵌套深度。如(list "1" 2 (list 1.0 2.0 3.0))
  80. ;;;varType: SafeArray 的类型。
  81. ;;;
  82. ;;;返回值
  83. ;;;
  84. ;;;变体数组
  85. ;;;
  86. ;;;示例
  87. ;;;
  88. ;;;(listToVariantArray (list (list 2.0 3.0 0.0) 1 2.0 "String") vlax-vbVariant)
  89. ;;;
  90. ;;;注意
  91. ;;;
  92. ;;;如果列表中有不同的数据类型,可传递vlax-vbVariant给varType参数。
  93. ;;;要转换点列表到ActiveX坐标,可以这样写:
  94. ;;;(list->VariantArray (apply 'append ptlist) vlax-vbDouble)
  95. (defun list->VariantArray (lst varType)
  96.   (vlax-make-variant
  97.     (vlax-safearray-fill
  98.       (vlax-make-safearray varType (cons 0 (1- (length lst))))
  99.       (mapcar
  100. '(lambda (x)
  101.     (cond ((= (type x) 'list)
  102.     (vlax-safearray-fill
  103.       (vlax-make-safearray
  104.         (if (apply '= (mapcar 'type x))
  105.    (cond ((= (type (car x)) 'REAL) vlax-vbDouble)
  106.          ((= (type (car x)) 'INT) vlax-vbInteger)
  107.          ((= (type (car x)) 'STR) vlax-vbString)
  108.    )
  109.    vlax-vbVariant
  110.         )
  111.         (cons 0 (1- (length x)))
  112.       )
  113.       x
  114.     )
  115.    )
  116.    ((= (type x) 'ename)
  117.     (vlax-ename->vla-object x)
  118.    )
  119.    (t x)
  120.     )
  121.   )
  122. lst
  123.       )
  124.     )
  125.   )
  126. )
  127.   
  128. (defun ax:AXValue (var / vt)
  129.   (cond
  130.     ((= (type var) 'ename) (vlax-ename->vla-object var))
  131.     ((= (type var) 'list)
  132.      (list->VariantArray var vlax-vbVariant))
  133.     ('T var)
  134.   )
  135. )
  136. ;;;(setq *acad-object* nil)      ; Initialize global variable
  137. (defun acad-object ()
  138.   (cond (*acad-object*)   ; Return the cached object
  139. (t
  140.   (setq *acad-object* (vlax-get-acad-object))
  141. )
  142.   )
  143. )
  144. ;;;(setq *active-document* nil)  ; Initialize global variable
  145. (defun active-document ()
  146.   (cond (*active-document*)  ; Return the cached object
  147. (t
  148.   (setq *active-document* (vla-get-activedocument (acad-object)))
  149. )
  150.   )
  151. )
  152. ;;;(setq *model-space* nil)      ; Initialize global variable
  153. (defun model-space ()
  154.   (cond (*model-space*)   ; Return the cached object
  155. (t
  156.   (setq *model-space* (vla-get-modelspace (active-document)))
  157. )
  158.   )
  159. )
  160. ;;;用法:
  161. ;;;_$  (ax:get-property (list (acad-object) "activedocument" "activelayer" "name"))
  162. ;;;"0"
  163. ;;;_$  (ax:get-property (list (acad-object) 'activedocument 'activelayer 'name))
  164. ;;;"0"
  165. ;;;_$ (ax:get-property (list (entlast) 'layer))
  166. ;;;"0"
  167. ;;;_$ (ax:get-property (list (entlast) 'color))
  168. ;;;256
  169. ;;;_$ (ax:get-property (list (entlast) 'objectname))
  170. ;;;"AcDbPolyline"
  171. ;;;允许第一项是entity name
  172. (defun ax:get-property (PropertyPathList / root obj)
  173.   (setq root   (car PropertyPathList)
  174. propertyPathList (cdr PropertyPathList)
  175.   )
  176.   (if (= (type root) 'ename) (setq root (vlax-ename->vla-object root)))
  177.   (foreach obj PropertyPathList
  178.     (setq root (vlax-get-property root obj))
  179.   )
  180.   root
  181. )
  182. ;;;_$ (setq e (ax:invoke-method (list (active-document) 'modelspace 'addcircle) (list (vlax-3d-point '(3 0)) 500)))
  183. ;;;#<VLA-OBJECT IAcadCircle 0103faa4>
  184. (defun ax:invoke-method (MethodPathList ParamList / root method obj)
  185.   (setq MethodPathList (reverse MethodPathList)
  186. method        (car methodPathList)
  187. methodPathList (cdr MethodPathList)
  188. root (ax:get-property (reverse MethodPathList))
  189.   )
  190.   (apply 'vlax-invoke-method
  191.   (cons root (cons method paramlist))
  192.   )
  193. )
  194. ;;;_$ (ax:put-property (list (entlast) 'color) 2)
  195. ;;;nil
  196. (defun ax:Put-Property (PropertyPathList value / root Prop obj)
  197.   (setq PropertyPathList (reverse PropertyPathList)
  198. Prop        (car PropertyPathList)
  199. PropertyPathList (cdr PropertyPathList)
  200. root (ax:get-property (reverse PropertyPathList))
  201.   )
  202.   (vlax-put-property root prop value)
  203. )
  204. ;;; 转换选择集为变体数组
  205. ;;;
  206. ;;; 功能 返回一个由选择集内容填满的子对象的变体数组。
  207. ;;;
  208. ;;; 参数 ss: 选择集
  209. ;;;
  210. ;;; 返回值 变体数组
  211. ;;;
  212. ;;; 示例 (selectionsetToArray mySS)
  213. ;;;
  214. ;;; 注意 使用该函数可以将选择集转换为数组传递给ActiveX函数。
  215. ;;; 如果需要其它的子类型,只需更改引用vlax-vbObject。
  216. (defun selectionset->Array (ss / c r)
  217.   (vl-load-com)
  218.   (setq c -1)
  219.   (repeat (fix (sslength ss)) (setq r (cons (ssname ss (setq c (1+ c))) r)))
  220.   (setq r (reverse r))
  221.   (vlax-safearray-fill
  222.     (vlax-make-safearray vlax-vbObject (cons 0 (1- (length r))))
  223.     (mapcar 'vlax-ename->vla-object r)
  224.   )
  225. )
  226. ;;; 将对象选择集添加到现有的图块定义中
  227. ;;;
  228. ;;; 功能 将对象选择集添加到现有的图块定义中
  229. ;;;
  230. ;;; 参数 一个图块插入的图元名称和一个包含要添加的对象的选择集
  231. ;;;
  232. ;;; 示例 (ax:AddObjectsToBlock (car (entsel)) (ssget))
  233. ;;;
  234. ;;; 注意 在重新生成图形前现有的图块参照将不会显示更改内容
  235. (defun ax:AddObjectsToBlock (blk ss / doc blkref blkdef inspt refpt)
  236.   (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))
  237. blkref (vlax-ename->vla-object blk)
  238. blkdef (vla-Item (vla-get-Blocks doc) (vla-get-Name blkref))
  239. inspt (vlax-variant-value (vla-get-InsertionPoint blkref))
  240. ssarray (selectionset->array ss)
  241. refpt (vlax-3d-point '(0 0 0))
  242.   )
  243.   (if (not (equal inspt refpt))
  244.     (foreach ent (vlax-safearray->list ssarray) (vla-Move ent inspt refpt))
  245.   )
  246.   (vla-CopyObjects doc ssarray blkdef)
  247.   (foreach ent (vlax-safearray->list ssarray) (vla-Delete ent))
  248.   (princ)
  249. )
  250. ;;; 从图块定义中删除指定的子图元并返回在图块定义中所剩下的项目数
  251. ;;;  
  252. ;;; 功能 从图块定义中删除指定的子图元并返回在图块定义中所剩下的项目数
  253. ;;;
  254. ;;; 参数 所要删除的子图元名称
  255. ;;;
  256. ;;; 示例 (ax:DeleteObjectFromBlock (car (nentsel)))
  257. ;;;
  258. ;;; 注意 大家知道,可以使用NENTSEL函数获取图块中图元的名称。
  259. ;;; 在重新生成图形前现有的图块参照不能显示更改内容。
  260. (defun ax:DeleteObjectFromBlock (ent / doc blk)
  261.   (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))
  262. ent (vlax-ename->vla-object ent)
  263. blk (vla-ObjectIdToObject doc (vla-get-OwnerID ent))
  264.   )
  265.   (vla-Delete ent)
  266.   (vla-get-Count blk)
  267. )
  268. (defun ax:collection->list (co / item result)
  269.   (vlax-for item co
  270.     (if (vlax-property-available-p item 'Name)
  271.       (setq result (cons (vla-get-name item) result))
  272.     ) ;_ end of if
  273.   ) ;_ end of vlax-for
  274.   result
  275. ) ;_ end of defun

评分

参与人数 2D豆 +10 收起 理由
xshrimp + 5 很给力!经验;技术要点;资料分享奖!
wowan1314 + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-7-31 10:30:15 | 显示全部楼层
好好,谢谢分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 880个

财富等级: 财运亨通

发表于 2013-11-23 07:51:41 | 显示全部楼层
学习VL。LISP的水平停留于AutoLISP,快十年没编程了,甚至VL命令都没学,打开自己的编写程序,发现几乎都是2004年前的版本,连排序都是自己编的......再不学真的OUT了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1336个

财富等级: 财源广进

发表于 2014-3-23 22:17:15 | 显示全部楼层
最喜欢通用函数了!谢谢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-14 22:01 , Processed in 0.464941 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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