明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: cheng5276

(原创)通用函数若干

    [复制链接]
发表于 2011-12-11 09:16:59 | 显示全部楼层
本帖最后由 caoyin 于 2011-12-11 09:23 编辑

;4 vla方法构造的选择集
删除VLA选择集只要一行代码
(vlax-map-collection SS 'vla-delete)
----------------------------------------------------
原位置复制一个ename
(entmake (entget ename))
原位置复制一个VLA对象
(vla-copy OBJ)
原位置复制VLA选集
(vlax-map-collection SS 'vla-copy)
----------------------------------------------------
vla-Explode方法不能分解的东西太多了,例如MTEXT\MLINE,无法替代(command "Explode"...)

点评

曹版强悍,好好学习曹版精髓  发表于 2012-6-14 22:45
 楼主| 发表于 2011-12-11 17:04:22 | 显示全部楼层
多谢曹版的指点,哈哈不甚感激
发表于 2011-12-12 08:46:38 | 显示全部楼层
代码很多,有的学了,谢谢楼主分享
发表于 2011-12-12 21:28:54 | 显示全部楼层
很不错,学习啦
发表于 2011-12-12 22:39:23 | 显示全部楼层
真是厉害,先收下慢慢学。
 楼主| 发表于 2012-3-1 23:53:47 | 显示全部楼层
本帖最后由 cheng5276 于 2012-3-2 11:09 编辑

七 DBX 系列
   1、DBX创建
;file-文件的地址
;返回值:DBX对象
   (defun cheng5276-dbx (file / dbxstr dbx)
(setq DbxStr (if (< (atof (getvar "ACADVER")) 16.0) 
"ObjectDBX.AxDbDocument" 
(strcat "ObjectDBX.AxDbDocument." (substr (getvar "acadver") 1 2))
) 
) 
(setq dbx (Vlax-Get-Or-Create-Object DbxStr))
(if file (vla-open dbx file))
dbx
)

2、DBX复制特定文件的块名列表至本图
;file-文件名 namelst-块名列表
(defun cheng5276-dbx-copyblocks (file namelst / blk dbx dbxblocks name num)
(setq dbx (cheng5276-dbx file))
(setq DBXBLOCKS (vla-get-blocks DBX))
(if (not namelst)
(vlax-for BLK DBXBLOCKS
(if  (and (not (wcmatch (substr (vla-get-name BLK) 1 1) "`*")) (= (vla-get-isxref BLK) :vlax-false)) ;去除系统块、匿名块和参照类对象
                              (setq namelst (append namelst (list (vla-get-name BLK)) ))
                            );结束IF
)
)

(foreach name namelst
(setq num (vla-item DBXBLOCKS name))
(vla-copyobjects DBX (vlax-safearray-fill (vlax-make-safearray vlax-vbobject '(0 . 0)) (list num)) (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
)
(vlax-release-object dbx)
)


3 、取得特定布局vla对象列表
;+++++++参数说明
;+++++++dbx——被打开DBX对象      ;+++++++space——模型或图纸空间对象,当为NIL时,则取模型空间
;++++++图太大时,获取可能会比较慢,所以加入了进度条显示(需DOSLIB支持),若无需可注释掉

(defun cheng5276-dbx-objlst (dbx space / blocks dwg_path erro nam obj objlst pspace)
(if (not space) (setq space  (Vlax-Get dbx 'ModelSpace)))
(dos_getprogress "正在提取图元" "请耐心等待" (Vlax-Get space  'Count ) t);显示进度条
(setq i 0)
(vlax-for obj space
  (setq objlst (append objlst (list obj)))
(setq i (1+ i))
(dos_getprogress i);前进进度条
  )
  (dos_getprogress T) ;关闭进度条
objlst
)


4、超强大的 任意图元选择集转为块
;支持天正等任意自定义对象
;DOC ——nil则对当前图操作; 为DBX时,则可实现不开图处理(今天试了下,好像有点问题)
;PT ——nil直接取原点,;blockname——nil则生成匿名块
;layout ——nil 则为当前激活的布局中
;函数中均采用VLISP方法,不可用ENTMAKE,否则当有自定义对象时会处理不了
;(cheng5276-make-block (getpoint) nil (ssget) doc layout)

(defun cheng5276-make-block (pt blockname ss doc layout / blkobj name objlst sarray)
(setq objlst (A->objlst ss))
(if (not pt) (setq pt '(0 0 0)))
(if (not blockname) (setq blockname "*U"))
(if (not doc) (setq doc (Vlax-Get (Vlax-Get-Acad-Object) 'ActiveDocument)))
(if (not layout) (setq layout (Vlax-Get (Vlax-Get doc 'ActiveLayout) 'Block)))
(setq blkobj (vla-add (Vlax-Get doc 'Blocks) (vlax-3d-point pt) blockname))
(setq sArray
(vlax-safearray-fill
(vlax-make-safearray
vlax-vbObject
(cons 0 (1- (length objlst)))
)
objlst
)
)
(vla-copyobjects doc sArray blkobj)
(mapcar 'Vla-Delete objlst)
(setq name (vla-get-name blkobj))
(Vla-InsertBlock layout (vlax-3d-point pt) name 1 1 1 0)  ;返回VLA对象,( DBX模式好像有问题,没能插入成功,请高手指正)
)


;5、任意对象转obj 选择集(上个函数中调用)
(DEFUN A->OBJLST (A / count enm i len obj objlst ss style x)
(if A
(PROGN
(setq STYLE (type A) SS (SSADD))
;以下根据A的类型分类
(cond
;1 单个图元名对象
((= style 'ENAME)
(SetQ OBJLST (LIST (vlax-ename->vla-object A)))
)
;2、SSGET选择集
((= STYLE 'PICKSET)
(setq len (sslength A) i 0)
(repeat len
(setq obj (vlax-ename->vla-object (ssname A i)))
(setq OBJLST (append OBJLST (list obj)))
(setq i (1+ i))
)
)

;3 图元名表,还可增加OBJ表类
((= STYLE 'LIST)
(if (= (TYPE (car A)) 'VLA-OBJECT)
(setq OBJLST A)
(SETQ OBJLST (mapcar 'vlax-ename->vla-object A))
)
)

;4 VLA选择集
((and (= STYLE 'VLA-OBJECT) (not (vl-catch-all-error-p (vl-catch-all-apply '(lambda () (SETQ COUNT (Vlax-Get A 'Count)))))))
(vlax-map-collection A '(lambda (x) (setq OBJLST (append OBJLST X))))
)
;5 单个OBJ对象
((= style 'VLA-OBJECT)
(setq OBJLST (list A))
)
)
OBJLST
)
nil
)
)
;新手们(其实我自己也是)把以上函数弄懂了,DBX也就不难了。




发表于 2012-3-2 09:45:04 | 显示全部楼层
楼主很强悍
发表于 2012-3-2 20:03:15 | 显示全部楼层
多谢分享,学习了!!!!
发表于 2012-3-3 12:01:47 | 显示全部楼层
,准备学习中,收藏,研究下
发表于 2012-3-8 09:41:24 | 显示全部楼层
多谢楼主分享,收藏了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-23 21:29 , Processed in 0.167313 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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