發表文章

AutoCAD LISP 獲取圖塊中物件列表

主要程式碼: (defun ax:GetBlockSubEnts (blkref / blkdef lst c) (setq blkref (vlax-ename->vla-object blkref)) (if (= (vla-get-objectname blkref) "AcDbBlockReference") (progn (setq blkdef (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)) ) (vla-get-name blkref) ) c 0 ) (repeat (vla-get-count blkdef) (setq lst (cons (vlax-vla-object->ename (vla-item blkdef c)) lst) c (1+ c) ) ) ) ) (reverse lst) ) 如何使用: (AX:GETBLOCKSUBENTS (car(entsel))) 回傳: (<圖元名稱: 7ff6b27c4ef0> <圖元名稱: 7ff6b27c4f00> <圖元名稱: 7ff6b27c4f10>) 程式碼來源網址 相關連結 AutoCAD 如何載入LISP

AutoLISP 計時器(Timer)

        基本上方法是使用時間相減得到時間差,而得到計時功能。         因為在AutoCAD版本上的改變,所以程式上會有所不同,主因是因為從2017開始 date 系統變數不再儲存到當前毫秒,在2016以前是使用 date 系統變數,而在2018之後則是使用 millisecs 系統變數(此系統變數是從2018才加入)。 下面是使用於版本2016以前 (defun C:Timer2016 (/ begin) (defun gettime (/ s seconds) (setq s (getvar "DATE")) (setq seconds (* 86400.0 (- s (fix s)))) ) (setq begin (gettime)) ; 加入500毫秒間隔 (command "._delay" 500) (setvar "dimzin" 8) (princ (strcat "\n" (rtos (- (gettime) begin) 2 12))) (princ) ) 下面是使用於版本2018以後 (defun c:Timer2018 (/ s e) (setq s (getvar "millisecs")) ; 加入500毫秒間隔 (command "._delay" 500) (setvar "dimzin" 8) (setq e (getvar "millisecs")) (princ (strcat "\n" (rtos (/ (- e s) 1000.0) 2 12))) (princ) ) 參考 AutoCAD autolisp CDATE and DATE sysvars

AutoLISP command explode 如何在LISP呼叫分解命令

在LISP中,使用explode指令發現無法炸開多個物件。 基本方式(在LISP中,使用explode(分解,俗稱炸開)指令,只能一次分解一個,如果物件放入多個也只會分解一個): (command "_.explode" 圖元資料) 分解單一物件的方法: (command "_.explode" (entsel)) 分解多個物件的方法: (setq SelObjs (ssget)) (setq N -1) (while (setq SelObj (ssname SelObjs (setq N (1+ N)))) (command "_.explode" SelObj) ) 相關連結 AutoCAD 如何載入LISP

AutoCAD Select 選取模式下或巨集中所用的快捷鍵

圖片
基本上的選取模式有: 窗選(W)/前次(L)/框選(C)/方塊(BOX)/全部(ALL)/籬選(F)/多邊形窗選(WP)/多邊形框選(CP)/群組(G)/加入(A)/移除(R)/多重(M)/前一個(P)/退回(U)/自動(AU)/單一(SI)/子物件(SU)/物件(O) 在平常或指令巨集常用的有2個是P跟L: P是最後或上一個選集。 L是最後一個建立的物件。 在指令巨集中多會配合Select指令的使用,下一個指令就直接使用P來選取上次選取物件選集。 下表整理至官方說明 模式 指令修改子 說明 窗選 W 選取完全處於兩點所定義之矩形內的所有物件。從左向右指定角點會建立一項窗選 ( 從右向左指定角點會建立框選 ) 。 最後一個 ( 建立的可見物件 ) L 選取最近建立的可見物件。物件必須位於目前空間 ( 即模型空間或圖紙空間 ) ,且其圖層必須未設定為凍結或關閉。 框選 C 選取處於兩點所定義之區域內的物件以及與該區域相交的物件。框選以虛線或亮顯來呈現,以區別窗選。 方塊 BOX 選取兩點所指定之矩形內的所有物件或所有與該矩形相交的物件。如果矩形的點是從右向左指定的,則「方塊」等於「框選」。否則,「方塊」等於「窗選」。 所有 ALL 選取模型空間或目前配置中的所有物件 ( 凍結或鎖住的圖層上的物件除外 ) 。 籬選 F 選取跨越選取籬選線的所有物件。籬選方法與多邊形框選方法相似,只是籬選線不封閉,並且籬選線可以與自身相交。籬選不受系統變數 PICKADD 的影響。 多邊形窗選 WP 選取透過指定點所定義的多邊形內的物件,以及與該多邊形相交的物件。多邊形可以是任何形狀,但不能與自身相交或接觸。將繪製多邊形的最後一條邊,所以多邊形在任何時候都是封閉的。多邊形框選不受系統變數 PICKADD 的影響。 多邊形框選 CP 選取透過指定點所定義的多邊形內的物件,以及與該多邊形相交的物件。多邊形可以是任何形狀,但不能與自身相交或接觸。將繪製多邊形的最後一條邊,所以多邊形在任何時候都是封閉的。多邊形框選不受系統變數 PICKADD 的影響。 群組 G 選取一個或多個具名群組或...

AutoLISP command fillet 如何在LISP呼叫圓角命令

呼叫圓角(fillet)命令基本範例: (command "fillet" (list 物件1-圖元資料 點座標1) (list 物件2-圖元資料 點座標2)) 物件-圖元資料或點可以省略其中一個,但省略點座標可能會影響圓角後的結果(尤其物件是聚合線)。 點座標1、點座標2可以是相同的點及可以不是物件1、物件2上的點。 點座標1、點座標2主要是影響各自物件的遭裁減保留部分或延伸部分。 下面簡易的範例: (setq object_1 (ssget)) (setq pt1 (getpoint)) (command "fillet" (list (ssname object_1 0) pt1) (list (ssname object_1 1) pt1)) 相關連結 AutoCAD 如何載入LISP

AutoLISP 在設定及恢復系統變數上的處理

在程式處理時經常會使用到 系統變數 , 尤其最常用的是 Cmdecho 、 Osmode ...等, 通常會在程式開始處保存原有 系統變數 值, 在程式結束處恢復原有 系統變數 值。 例如: (defun c:test ( / oldlayer oldsnap oldpick) ;|程式開始-保存原有系統變數|; (setq oldlayer (getvar "clayer")) ;目前圖層) (setq oldsnap (getvar "osmode")) ;(儲存目前的抓點設定) (setq oldpick (getvar "pickbox")) ;(儲存目前的選取框大小值) ;|程式開始-修改系統變數|; (setvar "clayer" "123") (setvar "osmode" 0) (setvar "pickbox" 5) ;|程式過程....|; ;|程式結束-恢復原有系統變數|; (setvar "clayer" oldlayer) (setvar "osmode" oldsnap) (setvar "pickbox" oldpick) (princ) ) 但是程式的過程中, 如果發生錯誤導致程式中斷, 會發生 系統變數 值沒有恢復的情形, 所以會應用到在錯誤處理時用的錯誤處理函數( *error* )上加入恢復 系統變數 值。 例如: (defun c:test ( / *error* oldlayer oldsnap oldpick) (defun *error* (err) ;|程式錯誤時-恢復原有系統變數|; (setvar "clayer" oldlayer) (setvar "osmode" oldsnap) (setvar "pickbox" oldpick) (princ (strcat ";...

AutoLISP 如何得到動態圖塊名稱

一般來說 使用 entget 獲取圖元資料 (cdr (assoc 2 (entget (car (entsel "\n 選取一個圖塊:"))))) 會得到圖塊名稱 但因為動態圖塊的特性, 也就是匿名圖塊 名稱大多是 *U 開頭 提供簡單得到動態圖塊名稱的語法: (vl-load-com) (vla-get-Effectivename (vlax-ename->vla-object (car (entsel "\n 選取一個圖塊:")))) 其他方法 下面LISP源自於作者 Lee Mac 原網址-Effective Block Name Visual LISP(從圖塊的VLA物件得到有效圖塊名稱) 例如: (LM:effectivename (vlax-ename->vla-object (car(entsel "\n 選取一個圖塊:")))) ;; Effective Block Name (有效圖塊名稱) - Lee Mac ;; obj - [vla] VLA Block Reference object (圖塊的VLA物件) (defun LM:effectivename ( obj ) (vlax-get-property obj (if (vlax-property-available-p obj 'effectivename) 'effectivename 'name ) ) ) Vanilla LISP(從圖塊的圖元名稱得到有效圖塊名稱) 例如: (LM:al-effectivename (car(entsel "\n 選取一個圖塊:"))) ;; Effective Block Name (有效圖塊名稱) - Lee Mac ;; ent - [ent] Block Reference entity (圖塊的圖元名稱) (defun LM:al-effectivename ( ent / blk rep ) (if (wcmatch (setq blk (cdr (assoc 2 ...