發表文章

目前顯示的是 8月, 2018的文章

AutoCAD使用巨集建立今天日期的文字

圖片
       這裡需要使用引入以 DIESEL (直譯式演算字串表示式語言) 撰寫的巨集條件表示式的指令,並使用Edtime函數來呈現。 使用DIESEL表示式需要在前面加 $M= ,表示方式如下: $M=表示式 使用Edtime函數,表示方式如下: $(edtime, time, picture) $(edtime, 時間, 呈現方式) 時間直接使用系統變數DATE來獲得,方式如下: $(getvar,date) 簡單呈現方式: $M=$(edtime, $(getvar,date), YYYY年M月DD日) 如果把它添加到文字上: ^C^C_.text;\;;$M=$(edtime, $(getvar,date), YYYY年M月DD日); 其他格式參考如下: 以1998/9/5  04:53:17 AM呈現 格式 呈現 D 5 DD 05 DDD 星期六/Sat DDDD 星期六/Saturday M 9 MO 09 MON 九月/Sep MONTH 九月/September YY 98 YYYY 1998 H 4 HH 04 MM 53 SS 17 MSEC 506 AM/PM AM am/pm am A/P A a/p a         如果 picture (呈現方式)中出現任何 AM/PM 片語,則 H 與 HH 片語會依據 12 小時制 (12:00-12:59 1:00-11:59),而不是 24 小時制 (00:00–23:59) 來編輯時間。請注意其中 picture (呈現方式)有逗號(,)必須含括在引號中,否則它會被當做引數的分隔符號。 例如: $(edtime, $(getvar,date), DDD"," DD MO YYYY - H:MM am/pm)

AutoCAD LISP 曲線測量函數查找表(AutoLISP / ActiveX)

快速查詢函數功能與用法。 這裡的曲線可以是線(LINE)、聚合線(Polyline)、圓(Circle)、弧(Arc)、建構線(XLINE)、射線(Ray)......等線類型。 函數 描述 (vlax-curve-getArea   curve-obj ) 返回曲線內的面積。 (vlax-curve-getClosestPointTo  curve-obj givenPnt [extend] ) 返回最接近指定點的曲線上的點(在WCS坐標中)。 (vlax-curve-getClosestPointToProjection  curve-obj givenPnt normal [extend] ) 將曲線投影到平面上後,返回曲線上的最近點(在WCS中)。 (vlax-curve-getDistAtParam   curve-obj param ) 返回曲線段從曲線開始到指定參數的長度。 (vlax-curve-getDistAtPoint curve-obj point ) 返回曲線起點和指定點之間曲線段的長度。 (vlax-curve-getEndParam  curve-obj ) 返回曲線端點(終點)的參數。 (vlax-curve-getEndPoint  curve-obj ) 返回曲線的端點(終點)(以WCS坐標表示)。 (vlax-curve-getFirstDeriv  curve-obj param ) 返回指定位置的曲線的一階導數(在WCS坐標中)。 (vlax-curve-getParamAtDist  curve-obj point ) 返回距曲線起點指定距離的曲線參數。 (vlax-curve-getParamAtPoint  curve-obj dist ) 返回該點處曲線的參數。 (vlax-curve-getPointAtDist   curve-obj dist ) 返回沿用戶指定距離的曲線的點(以WCS坐標)。 (vlax-curve-getPointAtParam 

open 指令介紹 (AutoLISP)

打開文件以供AutoLISP I / O函數使用。 (open filename mode) filename (檔案名):要打開的文件的名稱和路徑。如果未指定文件的完整路徑名,打開預設的AutoCAD默認目錄。 mode (模式):指示文件是否已打開以進行讀取,寫入或追加。指定包含以下字母之一的字符串: r :開啟讀取。 w :開啟寫入。如果 filename 不存在,則創建並打開一個新文件。如果 filename 已存在,則會覆蓋其現有內容。寫入到打開檔案的內容實際上不會寫入,直到使用 close 函數來檔案關閉。 a :開啟追加。如果 filename 不存在,則創建並打開一個新文件。如果 filename 已存在,則會打開並且現有內容的最後,因此寫入文件的新數據將附加到已有內容。 所述模式參數可以是大寫或小寫。請注意,在AutoCAD 2000之前的版本中,必須以小寫形式指定模式。 返回值:檔案或 nil 如果成功, 打開返回可供其他I / O函數使用的文件描述。如果模式“R”指定並且文件名不存在,將返回 nil . 範例: 打開現有文件: (setq a (open "c:/datafiles/filelist.txt" "r")) #<file "c:/datafiles/filelist.txt"> 以下示例問題 打開 針對不存在的文件: (setq f (open "c:\\my documents\\new.tst" "w")) #<file "c:\\my documents\\new.tst"> (setq f (open "nosuch.fil" "r")) nil (setq f (open "logfile" "a")) #<file "logfile"> 相關連結 AutoCAD 如何載入LISP AutoLISP 如何將CAD的內容導出到TXT或CSV 參考 open (AutoLISP)

AutoLISP 如何將CAD的內容導出到TXT或CSV

1.開啟已有的TXT檔案並寫入資料 基本上利用 OPEN 來開啟已有的檔案, 用 write-line 來寫入每一行, 用 close 來關閉檔案, 範例: (setq file (open "D://123.txt" "w")) (write-line "這是第一行..." file) (close file) 2.建立新的TXT檔案並寫入資料 如果要建立新的檔案, 加上 getfiled 來開啟新增檔案視窗, 範例: (setq file (open (getfiled "保存到..." "D:\\" "txt" 1) "w")) (write-line "這是第一行..." file) (close file) 3.建立新的CSV檔案並寫入資料 基本上跟TXT檔是差不多的, 只差在於CSV檔需要有分隔符號, 通常是逗號分隔,或Tab分隔, 範例: (setq file (open (getfiled "保存到..." "D:\\" "csv" 1) "w")) (write-line "圖塊名, 圖層, 數量" file) (close file) 相關連結 AutoCAD 如何載入LISP open 指令介紹 (AutoLISP) AutoCAD LISP 讀取TXT檔的內容

AutoLISP 如何檢查左右括號對稱問題

圖片
在寫LISP時, 左右括號對稱是很重要的, 而有時會因為不對稱而導致發生錯誤。 在使用Visual LISP IDE中, 可以使用兩個方式來檢查左右括號對稱(括號匹配), 第一個方法: 使用「括號符合」(或叫括號匹配)(Balancing Parentheses)(Ctrl+M)的功能, 在工具列「編輯」中的「括號符合」(Ctrl+M), 裡面有4個功能,       名稱                     英文                快捷鍵                                  功能 符合及向前(F)  Match Forward        Ctrl+]                  向下跳到互相對稱的括號旁 符合及退回(B)  Match Backward     Ctrl+[                 向上跳到互相對稱的括號旁 選取向前(O)     Select Forward      Ctrl+Shift+]          向下選取到互相對稱的括號 選取退回(A)     Select Backward   Ctrl+Shift+[          向上選取到互相對稱的括號 第二個方法: 使用「格式選項」或叫做「格式化程式碼」(Formatting Code), 在工具列「工具」中,      名稱                                        快捷鍵                            功能 選取中的格式化程式碼(F)        Ctrl+Shift+F       格式化選取中的程式碼 編輯器中的格式化程式碼(A)    Ctrl+Alt+F         格式化編輯器中正在編輯中整個文本的程式碼 功能基本上是把程式碼進行格式重新調整排列, 附帶會檢視左右括號是否相符合並詢問是否添加。 注意: (1) 因為會調整格式,所以要事先設定好格式選項設定。 (2) 詢問是否添加缺失的括號並不一定會添加在正確位置上。 參考 About Formatting Code (Visual LISP IDE) Balancing Parentheses Reference

AutoLISP 防止輸入函數回傳空值

輸入函數基本上是以 GET 開頭, 例如: GETINT 、 GETREAL ...等 回傳空值 nil 通常是未輸入值就按下Enter鍵, 通常方法是在前面使用 initget 來預防, (initget 1);;;參數1是防止直接按下Enter鍵 但是如果有設定預設值時, (setq TheV 10) (setq TheV (getreal (strcat "\n 輸入新的值:<" TheV ">"))) 想要直接用預設值,而使用 initget 來預防就會不方便了, 但不用 initget ,卻又想要使用預設值,而直接按下Enter鍵, 卻只會回傳空值 nil , 這時就會使用一些方法來解決, 通常方法是在後面使用 IF 進行判斷, 缺點是會多一個變數。 (setq TheV 10) (setq NewTheV (getreal (strcat "\n 輸入新的值:<" TheV ">"))) (if (/= NewTheV nil) (setq TheV NewTheV)) 另一個方法是使用 cond : 來判斷是否回傳空值 nil ,否則給予原本的值。 (setq TheV 10) (setq TheV (cond ((getreal (strcat "\n 輸入新的值:<" (rtos TheV) ">"))) (TheV))) *備註: getstring 不適用此方法,因為直接按下Enter鍵會回回傳的是 "" ,而不是 nil 。 相關連結 AutoCAD 如何載入LISP

AutoLISP CAR 跟 CDR 疊加用法

在串列資料中, 很常用 car 跟 cdr , 而這兩個有為了縮減疊加的寫法, 例如: caaaar  或 cadr 這樣的方式可以最多疊加4層, 如何分辨 ( c aa r x)     相當於  ( c a r (c a r x)) ( c da r  x)     相當於  ( c d r (c a r  x))  ( c ada r  x)    相當於   ( c a r (c d r  (c a r  x))) ( c ad r  x)     相當於  ( c a r (c d r  x)) ( c dd r  x)     相當於   ( c d r (c d r  x)) ( c add r  x)    相當於   ( c a r (c d r (c d r  x)))

AutoLISP acet-geom-textbox 取得文字範圍的點座標

圖片
如何取得單行文字(TEXT)或多行文字(MTEXT)的文字範圍, 可以利用 acet-geom-textbox 這個指令, 利用這個指令可以取得該文字的範圍四周的四個點座標。 (acet-geom-textbox [圖元串列] 倍數) 回傳: 點座標串列 依序是左下點-右下點-右上點-左上點 ((0.0 -51.7053 0.0) (140.859 -51.7053 0.0) (140.859 0.0 0.0) (0.0 0.0 0.0)) 文字範圍框及所取得4個點 範例1: (vl-load-com) (acet-geom-textbox (entget (car (entsel "\n 選擇一個物件:"))) 0) 範例2: (vl-load-com) (acet-geom-textbox (entget (Ssname (ssget "L") 0)) 0) 範例3: ;;;為文字加範圍框 (defun C:BoxText (/ tbox) (setq Tbox (acet-geom-textbox (entget (car (entsel))) 0)) (command ".rectangle" (nth 0 Tbox) (nth 2 Tbox)) (princ) );結束 相關連結 AutoCAD 如何載入LISP

AutoLISP 取得2點中點

因為沒有內建函數可以直接得到, 所以大部分的人都會把點座標的X跟Y取出相加除以2, ;;;P1 為第一點 ;;;P2 為第二點 ;;;P3 為兩點中點 (setq P1 (list 0 0 0)) (setq P2 (list 10 0 0)) (setq P3 (list (/ (+ (car P1) (car P2)) 2) (/ (+ (cadr P1) (cadr P2)) 2) (/ (+ (caddr P1) (caddr P2)) 2) )) 而得到中點, 這裡提供另外兩個方法, 方法一: ;;;P1 為第一點 ;;;P2 為第二點< ;;;P3 為兩點中點 (setq P1 (list 0 0 0)) (setq P2 (list 10 0 0)) (setq P3 (polar P1 (angle P1 P2) (/ (distance P1 P2) 2))) 而寫成函數是下面這樣: (defun K:P2PMID(PT1 PT2 /);;;求得2點中點 (polar PT1 (angle PT1 PT2) (/ (distance PT1 PT2) 2)) ) 方法二: ;;;P1 為第一點 ;;;P2 為第二點 ;;;P3 為兩點中點 (setq P1 (list 0 0 0)) (setq P2 (list 10 0 0)) (setq pt3 (mapcar '(lambda (x y) (/ (+ x y) 2)) P1 P2)) 相關連結 AutoCAD 如何載入LISP

AutoLisp Entmake 建立物件最少需求的圖元資料

利用 entmake 的方法, 我稱之為圖元創建法 (entmake 圖元資料) 在Lisp內使用 entmake 是需要加入最少基本的圖元資料, 否則會無法建立, 而其他忽略的值會依照系統進行預設。 圖元目錄 1.單行文字 TEXT 2.多行文字 MTEXT 3.線 LINE 4.聚合線 POLYLINE 5.圓 CIRCLE 6.弧 ARC 7.單行文字 TEXT 8.多行文字 MTEXT 9.半徑標註 10.直徑標註 11.水平標註 12.垂直標註 13.對齊標註 14.生成一般圖塊 15.插入一般圖塊 16.生成匿名圖塊 17.將選擇集中的物件製作成屬性圖塊(單行文字會轉成屬性定義) 18.創建新的圖層 19.創建新的線型 20.引線 21.建構線 XLINE 22.橢圓 23.點 POINT 24.創建新的文字樣式 25.創建新的標註樣式 26.雲形線 27.實體SOLID 28.生成屬性圖塊(但不插入) 29.插入屬性圖塊(但必須已有該圖塊) 1.單行文字 TEXT (entmake '((0 . "TEXT")(1 . "50")(40 . 0)(10 0 0 0))) 2.多行文字 MTEXT (entmakex    (list      (cons 0   "MTEXT")              (cons 100 "AcDbEntity")               (cons 100 "AcDbMText")        (cons 10 (list 0 0 0));基準點      (cons 1 "多行文字 MTEXT")));文字內容 3.線 LINE (entmake (list '(0 . "LINE") (cons 10 (getpoint));第一點 (cons 11 (getpoint))));第二點 4.聚合線 POLYLINE (1)基本架構 (entmake    (list      (cons 0 "