《acad超快选图元,超等炸开,匿名块操纵[资料].pdf》由会员分享,可在线阅读,更多相关《acad超快选图元,超等炸开,匿名块操纵[资料].pdf(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、acad 超快选图元,超等炸开,匿名块操纵资料 acad 超快选图元,超级炸开,匿名块操作(prompt n*按 TJK 统计指定块数量*)(defun c:tjk()(setq Ent nil)(while(=nil Ent)(setq Ent(entsel n统计块数量,请选中一个样板块)(setq Obj(car Ent);获取图元名 (setq Objtyp(cdr(assoc 0(entget Obj);获取图元类型(if(=INSERT Objtyp)(progn (setq Blkname(cdr(assoc 2(entget Obj);获取块名称 (prompt 请选定要统计的
2、范围:)(setq en(ssget(list(cons 0 INSERT)(if(=nil en);空选则对整个图纸中的块建立选择集 (progn ;(setq en(ssget X(list(cons 0 INSERT)(cons 2 BlkName)非匿名块写法 (setq en(ssget X(list(cons 0 INSERT);list 不能选取匿名块(*号打头)所以不加(cons 2 BlkName)过滤规则 (command _zoom e);调用缩放命令);结束 if (setq i 0);计数器归零 (repeat(sslength en);对选择集重复(setq ena
3、me(ssname en i);取得单个物体图元名(if(/=Blkname(cdr(assoc 2(entget ename)(setq en(ssdel ename en);块名与样板块不同的从选择集滤除 (setq i(1+i);否则计数器加 1 )(sssetfirst nil nil);清理所有高亮激活的图元(sssetfirst nil en);设置高亮激活选择集的图元(command _regen);调用重生成完成高亮激活(TEXTSCR);弹出命令框 ;(setq sumen(sslength en);获得选择集中图元的个数 (princ 统计结果如下:n);显示结果 (pro
4、mpt (strcat 块参照【BlkName 】共计:(itoa i)个);(sumen 与 i 等效)(princ);结束 progn (prompt 错误:选定的图元不是INSERT类型!);结束 if)(prompt n*按 TJSZ 数字文字统计求和*)(defun c:tjsz()(setq HOLDECHO(getvar cmdecho)(setq HOLDBLIP(getvar blipmode)(setvar cmdecho 0)(setvar blipmode 0)(prompt 请选定要统计的范围:)(setq en(ssget(list(cons 0 TEXT)(if(
5、=nil en);空选则对整个图纸中的块建立选择集(progn (setq en(ssget X(list(cons 0 TEXT)(command _zoom e);调用缩放命令);结束 if (setq i 0);计数器归零 (setq qh 0);和归零 (repeat(sslength en);对选择集重复 (setq ename(ssname en i);取得单个物体图元名(setq qh(+qh(atof(cdr(assoc 1(entget ename);字符串转数字并求和 (setq i(1+i);计数器加 1 )(TEXTSCR);弹出命令框 (princ 统计结果如下:n)
6、;显示结果 (prompt (strcat 选定区域的数字总和:(rtos qh)(setvar blipmode HOLDBLIP)(setvar cmdecho HOLDECHO)(command _.undo _end)(princ)(prompt n*按 XZTY 选择同参数图元*)(defun c:xzty()(setvar cmdecho 0)(setq Obj nil)(while(=nil Obj)(setq Obj(car(entsel n 选择同参数图元,请指定一个样板图元n);获取图元名 (setq Ent(entget Obj);获取图元信息数列(setq Objtyp
7、(cdr(assoc 0 Ent);获取图元类型(cond (=Objtyp INSERT)(xzk Obj);块参照图元(or(=TEXT Objtyp)(=MTEXT Objtyp)(xzwz Obj);文本类型图元 (or(=LWPOLYLINE Objtyp);多段线 (=LINE Objtyp);直线 (=CIRCLE Objtyp);园 (=ARC Objtyp);圆弧 (=ELLIPSE Objtyp);椭圆类 (=SPLINE Objtyp);样条曲线 )(cdqh Obj);长度类型图元 )(t(xztx Obj);其他类型图元 )(setvar cmdecho 1)(pro
8、mpt n*按(xztx nil)选择同类型图元*)(defun xztx(Obj)(setvar cmdecho 0)(while(=nil Obj)(setq Obj(car(entsel n 选择同类型图元,请指定一个样板图元n);获取图元名 (setq Ent(entget Obj);获取图元信息数列(setq Objtyp(cdr(assoc 0 Ent);获取图元类型(prompt 请划定要选择的范围:)(setq en(ssget(list(cons 0 Objtyp)(if(=nil en);空选则对整个图纸中的同类型图元建立选择集 (progn (setq en(ssget
9、X(list(cons 0 Objtyp)(command _zoom e);调用缩放命令);结束 if (sssetfirst nil nil);清理所有高亮激活的图元(sssetfirst nil en);设置高亮激活选择集的图元(command _regen);调用重生成完成高亮激活(setvar cmdecho 1)(prompt n*按(cdqh nil)同层图元(长度类型)求长度总和计算*)(defun cdqh(Obj)(setvar cmdecho 0)(setq ObjLyr nil)(while(=nil Obj)(setq Obj(car (entsel n 统计同层长度
10、类型图元的长度总和,请指定一个样板图元n )(if(/=nil Obj)(setq ObjLyr(assoc 8(entget Obj);nil 调用时的层条件 );获取图元名 (setq Ent(entget Obj);获取图元信息数列(setq Objtyp(cdr(assoc 0 Ent);获取图元类型(while(and(/=LWPOLYLINE Objtyp);多段线(/=LINE Objtyp);直线 (/=CIRCLE Objtyp);园 (/=ARC Objtyp);圆弧 (/=ELLIPSE Objtyp);椭圆类 (/=SPLINE Objtyp);样条曲线 )(setq
11、Obj(car (entsel n 错误:选定的图元不是长度类型!请重新指定n)(setq Ent(entget Obj);获取图元信息数列(setq Objtyp(cdr(assoc 0 Ent);获取图元类型);结束 while (if ObjLyr (setq listcond (list(0.LWPOLYLINE,LINE,CIRCLE,ARC,ELLIPSE,SPLINE)ObjLyr );设置为同层所有长度类型图元的筛选条件)(setq listcond(list(cons 0 Objtyp);选择同类型长度图元 )(setq Ent(entget Obj);获取图元信息数列(se
12、tq Objtyp(cdr(assoc 0 Ent);获取图元类型(command lengthen Obj);调用长度计算命令(setq Obj_length(getvar perimeter)(prompt 请划定要选择的范围:)(setq en(ssget listcond)(if(=nil en);空选则对整个图纸中的同类图元建立选择集 (progn (setq en(ssget X listcond)(command _zoom e);调用缩放命令);结束 if (setq i 0);计数器归零 (setq Sum_lenth 0);长度总和归零 (repeat(sslength e
13、n);对选择集重复 (setq ename(ssname en i);取得单个物体图元名(command lengthen ename);调用长度计算命令(if(and(=nil ObjLyr);非 nil 参量调用时才作长度检验 (or(-Obj_length 0.0001)(getvar perimeter);允许?0.0001 的误差 )(setq en(ssdel ename en);超出允差的从选择集滤除(progn (setq i(1+i);否则计数器加 1;并作长度求和计算(setq Sum_lenth(+(getvar perimeter)Sum_lenth)(if ObjLy
14、r (TEXTSCR);nil 参量调用时会弹出命令框)(princ n 统计结果如下:n);显示结果 (prompt (strcat 选定了 (itoa i)个图元,长度总和:(rtos Sum_lenth)(sssetfirst nil nil);清理所有高亮激活的图元(sssetfirst nil en);设置高亮激活选择集的图元(command _regen);调用重生成完成高亮激活(setvar cmdecho 1)(prompt n*按(xzk nil)选择指定同名块参照*)(defun xzk(Obj)(setvar cmdecho 0)(setq ObjLyr nil)(whi
15、le(=nil Obj)(setq Obj(car(entsel n 选择同层同名块,请指定一个样板块参照n)(if(/=nil Obj)(setq ObjLyr(assoc 8(entget Obj);nil 调用时的层条件 );获取图元名 (setq Ent(entget Obj);获取图元信息数列(setq Objtyp(cdr(assoc 0 Ent);获取图元类型(while(/=INSERT Objtyp)(setq Obj (car (entsel n 错误:选定的图元不是INSERT类型!请重新指定n)(setq Ent(entget Obj);获取图元信息数列(setq Ob
16、jtyp(cdr(assoc 0 Ent);获取图元类型);结束 while (setq Blkname(cdr(assoc 2 Ent);获取块名称(if ObjLyr (setq listcond(list(cons 0 INSERT)ObjLyr)(setq listcond(list(cons 0 INSERT);nil 调用时附加层条件 (prompt 请划定要选择的范围:)(setq en(ssget listcond)(if(=nil en);空选则对整个图纸中的块建立选择集(progn (setq en(ssget X listcond)(command _zoom e);调用
17、缩放命令);结束 if (setq i 0);计数器归零 (repeat(sslength en);对选择集重复 (setq ename(ssname en i);取得单个物体图元名(if(/=Blkname(cdr(assoc 2(entget ename)(setq en(ssdel ename en);块名与样板块不同的从选择集滤除 (setq i(1+i);否则计数器加 1 )(sssetfirst nil nil);清理所有高亮激活的图元(sssetfirst nil en);设置高亮激活选择集的图元(command _regen);调用重生成完成高亮激活(setvar cmdech
18、o 1)(prompt n*按(xzwz nil)选择指定内容文字*)(defun xzwz(Obj)(setvar cmdecho 0)(while(=nil Obj)(setq Obj(car(entsel n 选择同内容文字,请指定一个样板文字n);获取图元名 (setq Ent(entget Obj);获取图元信息数列(setq Objtyp(cdr(assoc 0 Ent);获取图元类型(while(and(/=TEXT Objtyp);单行文本 (/=MTEXT Objtyp);多行文本 )(setq Obj(car(entsel n 错误:选定的图元不是文字类型!请重新指定n)(
19、setq Ent(entget Obj);获取图元信息数列(setq Objtyp(cdr(assoc 0 Ent);获取图元类型);结束 while (setq Text(cdr(assoc 1 Ent);获取文字内容(prompt 请划定要选择的范围:)(setq en(ssget(list(cons 1 Text)(if(=nil en);空选则对整个图纸中的同内容文字建立选择集 (progn (setq en(ssget X(list(cons 1 Text)(command _zoom e);调用缩放命令);结束 if (sssetfirst nil nil);清理所有高亮激活的图元
20、(sssetfirst nil en);设置高亮激活选择集的图元(command _regen);调用重生成完成高亮激活(setvar cmdecho 1)(prompt n*按 CAB 创建匿名块*)(defun C:cab(/ss insertpt*APP*DOC*MSP blocks name)(princ 创建匿名块【*U】块名打头)(vl-load-com)(setq*APP(vlax-get-acad-object)*DOC(vla-get-activeDocument*APP)*MSP(vla-get-Modelspace*DOC)(setq blocks(vla-get-blo
21、cks*DOC);得到文件的块集合;做无名块 (setq ss(ssget);取得选择集 (if(=nil ss)(progn (princ n 你没选择图元!)(alert 你没选择图元,程序将自动把全图作为选择集!)(setq ss(ssget X)(setq insertpt nil)(while(=nil insertpt)(setq insertpt(getpoint n 请输入插入点:);取得插入点 )(progn (princ n 已经做了一个名为)(princ(cadr(Nblock ss insertpt);做匿名图块(princ 的匿名图块!)(sssetfirst nil
22、 nil)(sssetfirst nil(ssadd(entlast);亮显刚做的匿名块(command _regen);调用重生成完成亮显激活(princ);插入全部匿名块(在(0 0 0);(vlax-for n blocks ;(setq name(vla-get-name n);(if(or(=(substr name 1 2)*D)(=(substr name 1 2)*U);(vla-insertblock*MSP(vlax-3d-point(0 0 0)name 1 1 1 0););)(princ);把选择集加进来并得到匿名块-(defun Nblock(ss insertpt
23、/InstPt blk i ename obj Objs name)(setq InstPt(vlax-3d-point insertpt);转化为 ActiveX 的点 (setq blkobj(vla-add blocks InstPt*U);定义匿名图块(setq i 0);计数器归零 (repeat(sslength ss);对选择集重复 (setq ename(ssname ss i);取得单个物体图元名(setq obj(vlax-ename-vla-object ename);转化为 vla-object (setq objs(cons obj objs);添加到 vla-obj
24、ect 集(setq i(1+i);计数器加 1 )(vlax-invoke*Doc copyobjects objs blkobj);把选择集的物体加入到匿名图块 (mapcar vla-delete objs);删除选择集 (setq name(vla-get-name blkobj);取得块名 (list(vla-insertblock*MSP InstPt name 1 1 1 0)name);返回插入块物体和名字列表 (prompt n*按 RNB 批量改匿名块*)(defun C:RNB(/ss2 ss1*APP*DOC A ename vObj i allb bbb)(promp
25、t n1.改成匿名块 2.匿名块恢复为普通块(随机时间块名):)(setq ss2(getint)(if ss2 (setq ss2 ss2)(setq ss2 1)(if(=1 ss2)(setq A n 选要改成匿名块的图元:)(setq A n 选要恢复为普通块的图元:)(setq ss1 nil)(while(=nil ss1)(prompt A)(setq ss1(ssget(list(cons 0 INSERT);选图元)(progn (setq osmode(getvar osmode)(setvar osmode 0)(vl-load-com)(setq*APP(vlax-ge
26、t-acad-object)(setq*DOC(vla-get-activeDocument*APP)(setq Blocks(vla-get-blocks*DOC)(setq A(rtos(*(getvar CDATE)1E8)(setq allb nil)(vlax-for n Blocks (setq allb(append allb(list(vla-get-name n)(setq i 0)(setq bbb nil)(while (setq ename(ssname ss1 i)(if(not(member(cdr(assoc 2(entget ename)bbb)(progn (
27、if(=1 ss2)(setq A*U)(progn(setq A(rtos(1+(atof A)(while(member A allb)(setq A(rtos(1+(atof A)(setq vObj(vlax-ename-vla-object ename)(if(=(vla-get-objectname vObj)AcDbBlockReference)(progn (vla-put-name (vla-item Blocks(vla-get-name vObj)A )(setq bbb(append bbb(list(vla-get-name vObj)(setq i(1+i)(vla
28、-auditinfo*Doc:vlax-true);去除教育版标志(setvar osmode osmode)(princ);defun (prompt n*按 iii 绑定参照块*)(DEFUN C:iii(/INSKEY LST*DOC NAMELST X I J STRING)(vl-load-com);必须先加载 (SETQ*DOC(VLA-GET-ACTIVEDOCUMENT (VLAX-GET-ACAD-OBJECT)(SETQ J 0)(WHILE J (SETQ I 0 STRING LST NIL NAMELST NIL );_ 结束 SETQ (VLAX-FOR X(VLA
29、-GET-BLOCKS*DOC)(IF(=:VLAX-TRUE(VLA-GET-ISXREF X)(SETQ LST(CONS X LST)NAMELST(CONS(VLA-GET-NAME X)NAMELST);_ 结束 SETQ );_ 结束 if );_ 结束 vlax-for (IF LST (PROGN (TEXTSCR);弹出命令框 (PRINC n 序号 参照块名称)(FOREACH STR NAMELST (SETQ STRING(STRCAT STRING (STRCAT n (ITOA I)STR n)I(1+I);_ 结束 SETQ );_ 结束 FOREACH (PRI
30、NC(STRCAT n STRING)(IF(SETQ J(GETINT n 选择要绑定的参照块名称的序号:)(LENGTH LST)(VLA-BIND(NTH J LST):VLAX-TRUE)(PROGN (SETQ J NIL)(Prompt n 你输入的编号超出范围!n);VL-EXIT-WITH-ERROR 不支持 );_ 结束 PROGN );_ 结束 IF );_ 结束 PROGN (SETQ J NIL);_ 结束 IF );_ 结束 WHILE (PRINC);_ 结束 defun ;-;由 huawencai 于 2008 年 6 月 5 日编写.转换“多重插入块”为“普通
31、块”。(prompt n*按 exm 超级炸开命令*)(DEFUN C:exm()(setvar cmdecho 0)(SETQ STM(car(ENTSEL n 点取需炸开图元)(while stm (setq e(entget stm)(sssetfirst nil nil)(if(and(=(cdr(assoc 0 e)INSERT)(member(100.AcDbMInsertBlock)e)(PROGN (setq r_dist_zm44(assoc 44 e)(setq c_dist_zm45(assoc 45 e)(setq e(subst(cons 44 0)r_dist_zm
32、44 e)(setq e(subst(cons 45 0)c_dist_zm45 e)(setq r_zm70(assoc 70 e)(setq c_zm71(assoc 71 e)(setq e(subst(cons 70 0)r_zm70 e)(setq e(subst(cons 71 0)c_zm71 e)(setq e(subst(cons 100 AcDbBlockReference)(cons 100 AcDbMInsertBlock)e)(entmake e);创建块 (entdel stm);删除多重块(sssetfirst nil(ssadd(entlast);选择集是刚创建
33、的块)(sssetfirst nil(ssadd stm);选择集是点取图元)(command _explode(ssget);砸开块(SETQ STM(car(ENTSEL n 点取下一图元)(setvar cmdecho 1);-;-;转换“多重插入块”为“普通块”(prompt n*按 unlockb 多重插入块转为普通块*)(DEFUN C:unlockb()(setvar cmdecho 0)(SETQ STM(car(ENTSEL 点取块)(while stm (setq e(entget stm)(setq stlx(cdr(assoc 0 e)(if(=stlx INSERT)
34、(PROGN (setq r_dist_zm44(assoc 44 e)(setq c_dist_zm45(assoc 45 e)(setq e(subst(cons 44 0)r_dist_zm44 e)(setq e(subst(cons 45 0)c_dist_zm45 e)(setq r_zm70(assoc 70 e)(setq c_zm71(assoc 71 e)(setq e(subst(cons 70 0)r_zm70 e)(setq e(subst(cons 71 0)c_zm71 e)(setq e(subst(cons 100 AcDbMInsertBlock)(cons
35、 100 AcDbBlockReference)e)(entmake e)(entdel stm)(SETQ STM(car(ENTSEL 点取下一块)(setvar cmdecho 1);-;-;转换“普通块”为“多重插入块”(prompt n*按 lockb 普通块转为多重插入块*)(DEFUN C:lockb()(setvar cmdecho 0)(SETQ STM(car(ENTSEL 点取块)(while stm (setq e(entget stm)(setq stlx(cdr(assoc 0 e)(if(=stlx INSERT)(PROGN (setq r_zm70(assoc 70 e)(setq c_zm71(assoc 71 e)(setq e(subst(cons 70 1)r_zm70 e)(setq e(subst(cons 71 1)c_zm71 e)(setq e(subst(cons 100 AcDbMInsertBlock)(cons 100 AcDbBlockReference)e)(entmake e)(entdel stm)(SETQ STM(car(ENTSEL 点取下一块)(setvar cmdecho 1)