Bootstrap

块内拉升lisp_多重插入块的炸开问题? - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - Powered by Discuz!...

很多个cad文件,被别人加了密,每个cad文件都生成了很多个多重插入块,在论坛找了个xxi的程序,可以炸开多重插入块,但是,文件太多,块也太多,不能一个一个炸,而且,每个多重插入块执行一下xxi命令之后,变成了块参照,我需要再对它执行一次explode命令,

希望高人指点一下,我对lisp程序不是很懂,我的思路是这样的:

1.找到多重插入块集合.

2.遍历集合,对每个块执行xxi命令,

3.对执行了xxi命令的再执行explode命令....

谢谢

附:xxi函数如下

;| (xxi) = 分解多重插入块 v1-------lxx.2005.4.

|;

(defun c:xxi (/ a ent elst el nm pt xsc ysc zsc ang xi yi xd yd i ii eli)

(setq a (car(entsel)));;块.

(setq ent (entget a)

elst '(100 66 0 2 10 41 42 43 50 210 330 8 -3)

el   (vl-remove-if-not '(lambda(x)(member (car x) elst)) ent)

el   (mapcar '(lambda(x)

(if (equal x '(100 . "AcDbInsertBlock")) '(100 . "AcDbBlockReference") x))

el

)

)

(mapcar '(lambda(x y)(set x (cdr(assoc y ent))))

'(nm pt  xsc ysc zsc ang xi  yi  xd  yd)

'(2  10  41  42  43  50  70  71  44  45)

);;返回实例

"*U1" (0.0 0.0 0.0) 1.0 1.0 1.0 0.0 2 2 0.0 0.0)

(vl-cmdf ".ucs" "_ob" a)

(cond

((and (equal xd 0. 1e-4)(equal yd 0. 1e-4))(entmake el))

((not(= 0 xi yi))

(setq i 0 ii 0)

(repeat yi

(repeat xi

(entmake(subst (cons 10 (trans (list (* i xd)(* ii yd) 0.) 1 0))(assoc 10 el)el))

(setq i (1+ i))

)

(setq i 0 ii (1+ ii))

)

)

(T nil)

)

(entdel a)

(vl-cmdf ".ucs" "p")

(princ)

)

(defun c:tt2 (/ a ent elst el nm pt xsc ysc zsc ang xi yi xd yd i ii eli)

(setq a (car(entsel)));;块.

(setq ent (entget a)

elst '(100 66 0 2 10 41 42 43 50 210 330 8 -3)

el   (vl-remove-if-not '(lambda(x)(member (car x) elst)) ent)

el   (mapcar '(lambda(x)

(if (equal x '(100 . "AcDbInsertBlock")) '(100 . "AcDbBlockReference") x))

el

)

)

(mapcar '(lambda(x y)(set x (cdr(assoc y ent))))

'(nm pt  xsc ysc zsc ang xi  yi  xd  yd)

'(2  10  41  42  43  50  70  71  44  45)

);;返回实例

"*U1" (0.0 0.0 0.0) 1.0 1.0 1.0 0.0 2 2 0.0 0.0)

;(vl-cmdf ".ucs" "_ob" a)

(cond

((and (equal xd 0. 1e-4)(equal yd 0. 1e-4))(entmake el))

((not(= 0 xi yi))

(setq i 0 ii 0)

(repeat yi

(repeat xi

(entmake(subst (cons 10 (trans(list (* i xd)(* ii yd) 0.) a 0))(assoc 10 el)el))

(setq i (1+ i))

)

(setq i 0 ii (1+ ii))

)

)

(T nil)

)

(entdel a)

;(vl-cmdf ".ucs" "p")

(princ)

)

;| dxf =帮助:insert实体(包含minsert插入的块实体)

组码 说明

100 子类标记 (AcDbBlockReference)

66  可变属性跟随标志(可选;默认值 = 0);如果属性跟随标志的值为 1,则跟随

插入的将是一系列属性图元,并以一个 seqend 图元终止

2   块名

10  插入点(在 OCS 中)DXF:X 值;APP:三维点

20, 30  DXF:插入点的 Y 值和 Z 值(在 OCS 中)

41  X 缩放比例(可选;默认值 = 1)

42  Y 缩放比例(可选;默认值 = 1)

43  Z 缩放比例(可选;默认值 = 1)

50  旋转角度(可选;默认值 = 0)

70  列计数(可选;默认值 = 1)

71  行计数(可选;默认值 = 1)

44  列间距(可选;默认值 = 0)

45 行间距(可选;默认值 = 0)

210 拉伸方向(可选;默认值 = 0, 0, 1)  DXF:X 值;APP:三维矢量

220, 230   DXF:拉伸方向的 Y 值和 Z 值(可选)

|;

;