歐歪 發問時間: 電腦與網際網路軟體 · 9 年前

請問AUTOCAD的分解

您好!

小弟有一個AutoCAD的問題想發問!

就是假設有一個範圍必須使用XPLODE 或 EXPLODE去連續炸開的話

那我要怎樣去寫AutoLISP?

小弟寫的如下

(defun c:xz() (setq pa (getpoint "\n輸入左下點:")) ;選取範圍

(setq pb (getcorner pa "\n指定對角點:"))

(command "explode" "c" pa pb "") ;此炸開想設定連續五次,要如何用? (prin1)

)(prompt "********** << C:XZ >> **********")(prin1)

但是上面有個問題,就是當執行EXPLODE的時候,手動按可以打"C"(框選)

但是如果是寫成巨集或者是LISP的話,他就會失敗...

是我寫的方式有問題嗎?還是那裏錯誤了@@"

請大師們解惑一下~THX~

已更新項目:

感謝Cola大大的解答~~

經過測試~大大這方法的確可以達到連續炸開圖塊的需求

不過小弟的圖塊內容太多東西了>"<....執行下去後會等個2~3分鐘以上(大概3千多個圖素)

畫面會一直顯示"已無可分解物件"

請問還有別方式可以解決這情況嗎?>"<

如果小弟用EXPLODE框選炸開的話,在對話欄只會顯示一次並不會顯示很多"已無可分解物件"

1 個解答

評分
  • Cola
    Lv 5
    9 年前
    最佳解答

    (defun c:xz(/ pa pb ss *error*)

    ;;定義*error*函數,有錯誤會被呼叫

    (defun *error* (msg)

    (command);;中斷

    (princ "\n已無可分解物件")

    (princ)

    )

    (setq pa (getpoint "\n輸入左下點:"))

    (setq pb (getcorner pa "\n指定對角點:"))

    ;;會一直炸到ss選集中已無可分解物件,

    ;;執行explode時便會出現錯誤,就會自動呼叫*error*函數

    (while (setq ss (ssget "C" pa pb));;如要指定框選可用ssget函數

    (command "explode" ss)

    )

    (princ)

    )

    (prompt "********** << C:XZ >> **********")

    (prin1)

    ;;照命令列上的步驟,在command中不一定適用

    2012-01-10 23:47:18 補充:

    那就改下面方式,先過濾選取物件,再執行command

    在command中用explode,一次只會炸1個物件而且只炸1次

    所以要炸到ss選集為nil為止

    2012-01-10 23:47:39 補充:

    (defun c:xz(/ pa pb flst ss n p i)

    (setvar "cmdecho" 0)

    (setq pa (getpoint "\n輸入左下點:"))

    (setq pb (getcorner pa "\n指定對角點:"))

    2012-01-10 23:48:54 補充:

    ;;建立ssget要用到的過濾串列,只選取可分解物件

    (setq flst (append (list(cons -4 "

    2012-01-10 23:54:00 補充:

    更正上一段補充,下面有"<"及">"的部份,請改回半形

    ;;建立ssget要用到的過濾串列,只選取可分解物件

    (setq flst (append (list(cons -4 "<OR")) (mapcar '(lambda (x) (cons 0 x))

    2012-01-10 23:54:26 補充:

    (list "3DFACE" "3DSOLID" "ARC" "ATTDEF" "ATTRIB" "BODY" "DIMENSION" "HATCH" "HELIX"

    "INSERT" "LEADER" "LWPOLYLINE" "MLINE" "MULTILEADER" "MTEXT" "POLYLINE"

    "REGION" "SECTION" "SHAPE" "SPLINE" "SURFACE" "TABLE" "WIPEOUT"))

    (list(cons -4 "OR>"))))

    2012-01-10 23:55:05 補充:

    (setq n 0)

    (while (setq ss (ssget "C" pa pb flst))

    (setq p (sslength ss) i -1)

    (if (= n 0)(princ (strcat "\n找到 " (itoa (setq n p)) " 件可分解物件.\n分解中...")))

    (repeat p

    (command "explode" (ssname ss (setq i (1+ i))))

    )

    )

    2012-01-10 23:57:10 補充:

    (princ "\\n選取區已無可分解物件.")

    (princ)

    )

    (prompt "********** << C:XZ >> **********")

    (prin1)

    以上接續補充內容

還有問題?馬上發問,尋求解答。