明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5494|回复: 17

[源码] AUTOLISP转成VLISP代码

  [复制链接]
发表于 2008-8-13 16:56 | 显示全部楼层 |阅读模式
本帖最后由 artken 于 2011-3-20 04:38 编辑

下面是ET工具里的分解属性块BURST命令(用AUTOLISP写的),作了点修改(改成是加载后自动选物体执行了)。
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;以下是函数定义;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. (Defun PBOBURST (/ item bitset bump att-text lastent burst-one burst
  3.                   BCNT BLAYER BCOLOR ELAST BLTYPE ETYPE PSFLAG ENAME )
  4.    ;-----------------------------------------------------
  5.    ; Item from association list
  6.    ;-----------------------------------------------------
  7.    (Defun ITEM (N E) (CDR (Assoc N E)))
  8.    ;-----------------------------------------------------
  9.    ; Error Handler
  10.    ;-----------------------------------------------------
  11.   (acet-error-init
  12.     (list
  13.       (list "cmdecho" 0
  14.             "highlight" 1
  15.       )
  16.       T     ;flag. True means use undo for error clean up.
  17.     );list
  18.   );acet-error-init
  19.    ;-----------------------------------------------------
  20.    ; BIT SET
  21.    ;-----------------------------------------------------
  22.    (Defun BITSET (A B) (= (Boole 1 A B) B))
  23.    ;-----------------------------------------------------
  24.    ; BUMP
  25.    ;-----------------------------------------------------
  26.    (Setq bcnt 0)
  27.    (Defun bump (prmpt)
  28.       (Princ
  29.          (Nth bcnt '("\r-" "\r\" "\r|" "\r/"))
  30.       )
  31.       (Setq bcnt (Rem (1+ bcnt) 4))
  32.    )
  33.    ;-----------------------------------------------------
  34.    ; Convert Attribute Entity to Text Entity
  35.    ;-----------------------------------------------------
  36.    (Defun ATT-TEXT (AENT / TENT ILIST INUM)
  37.       (Setq TENT '((0 . "TEXT")))
  38.       (ForEach INUM '(8
  39.             6
  40.             38
  41.             39
  42.             62
  43.             67
  44.             210
  45.             10
  46.             40
  47.             1
  48.             50
  49.             41
  50.             51
  51.             7
  52.             71
  53.             72
  54.             73
  55.             11
  56.             74
  57.          )
  58.          (If (Setq ILIST (Assoc INUM AENT))
  59.             (Setq TENT (Cons ILIST TENT))
  60.          )
  61.       )
  62.       (Setq
  63.          tent (Subst
  64.                  (Cons 73 (item 74 aent))
  65.                  (Assoc 74 tent)
  66.                  tent
  67.               )
  68.       )
  69.       (EntMake (Reverse TENT))
  70.    )
  71.    ;-----------------------------------------------------
  72.    ; Find True last entity
  73.    ;-----------------------------------------------------
  74.    (Defun LASTENT (/ E0 EN)
  75.       (Setq E0 (EntLast))
  76.       (While (Setq EN (EntNext E0))
  77.          (Setq E0 EN)
  78.       )
  79.       E0
  80.    )
  81.    ;-----------------------------------------------------
  82.    ; Burst one entity
  83.    ;-----------------------------------------------------
  84.    (Defun BURST-ONE (BNAME / BENT ANAME ENT ATYPE AENT AGAIN ENAME
  85.                      ENT SS-COLOR SS-LAYER SS-LTYPE mirror ss-mirror
  86.                      mlast)
  87.       (Setq
  88.          BENT   (EntGet BNAME)
  89.          BLAYER (ITEM 8 BENT)
  90.          BCOLOR (ITEM 62 BENT)
  91.          BCOLOR (Cond
  92.                    ((> BCOLOR 0) BCOLOR)
  93.                    ((= BCOLOR 0) "BYBLOCK")
  94.                    ("BYLAYER")
  95.                 )
  96.          BLTYPE (Cond ((ITEM 6 BENT)) ("BYLAYER"))
  97.       )
  98.       (Setq ELAST (LASTENT))
  99.       (If (= 1 (ITEM 66 BENT))
  100.          (Progn
  101.             (Setq ANAME BNAME)
  102.             (While (Setq
  103.                       ANAME (EntNext ANAME)
  104.                       AENT  (EntGet ANAME)
  105.                       ATYPE (ITEM 0 AENT)
  106.                       AGAIN (= "ATTRIB" ATYPE)
  107.                    )
  108.                (bump "正在转换属性")
  109.                (ATT-TEXT AENT)
  110.             )
  111.          )
  112.       )
  113.          (Progn
  114.             (bump "分解块")
  115.             (acet-explode BNAME)
  116.             ;(vla-explode (vlax-ename->vla-object BNAME))
  117.             ;(command "_.explode" bname)
  118.          )
  119.       (Setq
  120.          SS-LAYER (SsAdd)
  121.          SS-COLOR (SsAdd)
  122.          SS-LTYPE (SsAdd)
  123.          ENAME    ELAST
  124.       )
  125.       (While (Setq ENAME (EntNext ENAME))
  126.          (bump "收集片")
  127.          (Setq
  128.             ENT   (EntGet ENAME)
  129.             ETYPE (ITEM 0 ENT)
  130.          )
  131.          (If (= "ATTDEF" ETYPE)
  132.             (Progn
  133.                (If (BITSET (ITEM 70 ENT) 2)
  134.                   (ATT-TEXT ENT)
  135.                )
  136.                (EntDel ENAME)
  137.             )
  138.             (Progn
  139.                (If (= "0" (ITEM 8 ENT))
  140.                   (SsAdd ENAME SS-LAYER)
  141.                )
  142.                (If (= 0 (ITEM 62 ENT))
  143.                   (SsAdd ENAME SS-COLOR)
  144.                )
  145.                (If (= "BYBLOCK" (ITEM 6 ENT))
  146.                   (SsAdd ENAME SS-LTYPE)
  147.                )
  148.             )
  149.          )
  150.       )
  151.       (If (> (SsLength SS-LAYER) 0)
  152.          (Progn
  153.             (bump "固定图层")
  154.             (Command
  155.                "_.chprop" SS-LAYER "" "_LA" BLAYER ""
  156.             )
  157.          )
  158.       )
  159.       (If (> (SsLength SS-COLOR) 0)
  160.          (Progn
  161.             (bump "固定颜色")
  162.             (Command
  163.                "_.chprop" SS-COLOR "" "_C" BCOLOR ""
  164.             )
  165.          )
  166.       )
  167.       (If (> (SsLength SS-LTYPE) 0)
  168.          (Progn
  169.             (bump "固定线型")
  170.             (Command
  171.                "_.chprop" SS-LTYPE "" "_LT" BLTYPE ""
  172.             )
  173.          )
  174.       )
  175.    )
  176.    ;-----------------------------------------------------
  177.    ; BURST MAIN ROUTINE
  178.    ;-----------------------------------------------------
  179.    (Defun BURST (/ SS1)
  180.       (setq PSFLAG (if (= 1 (caar (vports)))
  181.                        1 0
  182.                    )
  183.       )

  184.       (pbossget);;;;自动选择要分解的物体
  185.       (If SS1
  186.          (Progn
  187.             (Setvar "highlight" 0)
  188.             (terpri)
  189.             (Repeat
  190.                (SsLength SS1)
  191.                (Setq ENAME (SsName SS1 0))
  192.                (SsDel ENAME SS1)
  193.                (BURST-ONE ENAME)
  194.             )
  195.             (princ "\n")
  196.          )
  197.       )
  198.    )
  199.    ;-----------------------------------------------------
  200.    ; BURST COMMAND
  201.    ;-----------------------------------------------------
  202.    (BURST)
  203.   (acet-error-restore)
  204. );end defun
  205. (princ)
  206. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;函数定义完毕;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  207. ;;;第一步:分解属性块
  208. (princ "{开始分解属性块,耐心等待...}")
  209. (defun pbossget ()
  210.    (Setq SS1 (SsGet "X" (list (cons 0 "INSERT")'(66 . 1)(cons 67 PSFLAG))));;分解所有带属性块
  211. )
  212. (PBOBURST)
  213. (command ".-PURGE" "A" "" "N")
  214. ;;;;;;;;;;;;;;
  215. (defun pbossget ()
  216.    (Setq SS1 (SsGet "X" (list (cons 0 "INSERT")'(2 . "`*U*")(cons 67 PSFLAG))));;分解所有无名块(在CAD2004里执行,动态块转为CAD2004后自动会变成匿名块)
  217. )
  218. (PBOBURST)
  219. ;;;;;;;;;;;;;;
  220. (princ "{属性块分解完毕}准备进入下一步,耐心等待...=====》")
  221. (princ)
  222. ;;;第二步:炸开动态块(在CAD2004里略去)
  223. ;;;第三步:炸开多重引线(在CAD2004里执行,CAD2008的多重引线转成CAD2004后自动变成ACAD_PROXY_ENTITY)
  224. (setvar "qaflags" 1)
  225. (if (/= (SsGet "X" '((0 . "ACAD_PROXY_ENTITY"))) nil)
  226.     (command "._explode" (SsGet "X" '((0 . "ACAD_PROXY_ENTITY"))) "")
  227.     (princ "选择集为空")
  228. )
  229. (setvar "qaflags" 0)
  230. (command ".-PURGE" "A" "" "N")
  231. (princ "{多重引线分解完毕,耐心等待...}=====》")
  232. (princ)
  233. (command ".-PURGE" "A" "" "N")
  234. (princ "{垃圾清理完毕!}")
  235. (princ)

现在问题是:它只能对当前空间执行,比如当前是在模型空间就只处理模型空间的,不能处理图纸空间的。
根据龙龙仔的指点(感谢龙龙仔!),将程序转成VLISP写就可以实现跨空间处理,并且给出了其中一段炸图的例子,我试过了确实可以!可是除了炸图块外还要固定块的属性、颜色.....等等
龙龙仔帮忙写的部份在这里http://bbs.mjtd.com/forum.php?mod=viewthread&tid=69405


"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2008-8-14 08:02 | 显示全部楼层
有測試的原始圖+完成圖嗎?
 楼主| 发表于 2008-8-14 11:56 | 显示全部楼层
发表于 2008-8-15 07:56 | 显示全部楼层
本帖最后由 作者 于 2008-8-15 7:57:07 编辑

本想在R2008一次完成處理,但因"MULTILEADER"沒有explode方法,所以暫時無法解決,

(構想是先把其他空間的"MULTILEADER"轉到目前空間,處理完再轉回去)

巳完成了大部份(但目前沒有時間),把手上的部份先貼上

本帖子中包含更多资源

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

x
 楼主| 发表于 2008-8-15 09:49 | 显示全部楼层
本帖最后由 作者 于 2008-8-15 12:56:01 编辑

版主大人辛苦了!!!

========================

刚试用了

惊喜啊!没想到2008里能分解MULTILEADER!不用转到2004了。如果MULTILEADER也能跨空间处理就完美了。

 楼主| 发表于 2008-8-16 17:34 | 显示全部楼层
本帖最后由 作者 于 2008-8-16 17:46:25 编辑

龙龙仔,经过反复测试后,发现有个问题。

有时会提示"Automation 错误"而无法执行下去

为找出原因,试了上百次都不止,结果就是:

1、从文件方面:有些文件会但有些不会,出问题与不出问题的文件其实都是很类似的,里面用的块也都是那些,也不是因为某一个图块的问题,没个准。用原来没转成VLISP之前的程序就不会有这问题。

2、从程序方面,将以下2个地方修改了后就可以执行完,但处理后的结果就不同了....

   (1)、将 (vla-explode (vlax-ename->vla-object BNAME)) 改为 (acet-explode BNAME)

   (2)、将(vla-delete (vlax-ename->vla-object ENAME))这句删除。

在CAD2004与CAD2008下执行都存在这问题

上传了一个不能正常处理的文件:     

本帖子中包含更多资源

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

x
发表于 2008-8-18 12:40 | 显示全部楼层
本帖最后由 作者 于 2008-8-18 17:16:24 编辑

用VLISP炸圖塊"!YUQIANG_TK_A2"有問題!!原因不明,待查!!
发表于 2008-8-19 12:27 | 显示全部楼层
查出來是圖塊"!YUQIANG_TK_A2",在圖面中的圖塊參考(blockref),與圖塊定義(blockdef)內容不同,即圖塊炸開後物件數量不同,原圖塊定義是"LWPOLYLINE"的物件,炸開後變成了"LINE",造成VLISP在炸開時出錯(但用COMMAND "_.EXPLODE"不會出錯),但是如何造成這現象,待查!
发表于 2008-8-19 17:13 | 显示全部楼层

被你騙了,原來圖中"!YUQIANG_TK_A2"的blockref是不等比圖塊,vlisp不支持炸開不等比圖塊

(構想是先把其他空間的"MULTILEADER"轉到目前空間,處理完再轉回去)----巳完成

但我看出你是要把圖面弄亂,是嗎?

 楼主| 发表于 2008-8-19 19:56 | 显示全部楼层

啊,哪敢騙龍大人啊,哈哈。。不等比圖塊。。

這圖塊不是我弄,是個圖框,直接用以前現成的。不是要特地弄成不等比圖塊。回頭將圖塊重做試試.

MULTILEADER問題解決了?太棒了

我不是要將圖面弄亂啊。之所以要進行處理是因為:

1、多重引線:只有2008有,別人用2004打開的話,經常就會看不到這個多重引線的東西,以為是我圖紙沒標材料。分解後就不存在這問題了。

2、屬性塊、動態塊:因為有屬性,別人打開我的圖後,經常會自己莫名其妙(或不小心)用"X"炸有些圖塊。用"X"炸屬性塊就完蛋了,屬性都回複到最原始的狀態,顯然是不對的。所以要保留屬性分解。

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

本版积分规则

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

GMT+8, 2024-5-18 04:08 , Processed in 0.197802 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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