管路設計常需從平面圖衍生 45° 等軸視圖。45° 視圖僅比平面圖多出「水平高度」資訊。本 LISP 程式自動將平面直線幾何轉換為 45° 等軸投影,設計師只需在轉換後按高度上下移動管線即可完成。
設平面點 P(x, y, z),45° 視圖投影點 P'(x', y', z'):
x' = x + (√2/4)(y - y₀) y' = y₀ + (√2/4)(y - y₀) z' = z
其中 (x₀, y₀) 為使用者指定的 45° 視圖原點對應平面座標。程式僅修改 X、Y,保留 Z(高度)供後續手動調整。
(defun c:V45 ( / cmdmode sset ssl ent p0 p1 p2 x1 x2 y0 y1 y2 z1 z2)
(setq cmdmode (getvar "cmdecho"))
(setvar "cmdecho" 0)
; 使用者框選管線
(prompt "\nSelect lines:")
(setq sset (ssget))
(if (not (null sset))
(progn
(setq ssl (sslength sset))
; 使用者指定 45° 視圖基點
(setq p0 (getpoint "\nThe base point: "))
(setq y0 (cadr p0))
(while (> ssl 0)
(setq ent (entget (ssname sset (setq ssl (1- ssl)))))
; 僅處理 LINE 實體
(if (= (cdr (assoc 0 ent)) "LINE")
(progn
(setq x1 (cadr (assoc 10 ent)))
(setq y1 (caddr (assoc 10 ent)))
(setq z1 (cadddr (assoc 10 ent)))
(setq x2 (cadr (assoc 11 ent)))
(setq y2 (caddr (assoc 11 ent)))
(setq z2 (cadddr (assoc 11 ent)))
; 計算新端點
(setq p1 (list (+ x1 (/ (* (sqrt 2) (- y1 y0)) 4))
(+ y0 (/ (* (sqrt 2) (- y1 y0)) 4))
z1))
(setq p2 (list (+ x2 (/ (* (sqrt 2) (- y2 y0)) 4))
(+ y0 (/ (* (sqrt 2) (- y2 y0)) 4))
z2))
; 更新實體
(setq ent (entmod (subst (cons 10 p1) (assoc 10 ent) ent)))
(entmod (subst (cons 11 p2) (assoc 11 ent) ent))
(redraw (cdr (assoc -1 ent)) 1)
)
)
)
)
)
(setvar "CMDECHO" cmdmode)
(princ)
)
(princ "\nV45 loaded. Start command with V45.")
V45.lsp。V45 → 框選所有管線 → 指定 45° 視圖基點。VPOINT),依設計高度在 Z 方向移動各管線群組。LWPOLYLINE、ARC 等實體類型。