看懂本程式後, 可以試著改寫成 "魚形"......
另一條 "魚" !
******************************************
本程式由此開始展示:
這是斜圓管的立體圖.
這是正視圖,上面是斜的,下面是平的,
上面看懂了,下面要改斜的就容易多了.
這個圓圈圈,當然就是---- 上視圖 ---- 的樣子
這是本程式展開的示意圖.
下面是不同斜角所展開的樣子.
以下是此程式的全部, 請參考, 不再多加解釋:
===========================================
(defun C:tube() ;; 2006.12.30 modify by Ya-Kuei ; (initerr) ;intit error (setvar "CMDECHO" 0) ;reset variables (setvar "osmode" 4223) (setvar "pickbox" 1) (command "undo" "m") ;set mark
(setq ly (tblsearch "layer" "中心線")) (if (= ly nil) (command ".-layer" "n" "中心線" "c" "11" "中心線" "l" "center" "中心線" "lw" "0.25" "中心線" "") ) (setq ly (tblsearch "layer" "尺寸")) (if (= ly nil) (command ".-layer" "n" "尺寸" "c" "71" "尺寸" "lw" "0.25" "尺寸" "") ) (setq ly (tblsearch "layer" "WHITE")) (if (= ly nil) (command ".-layer" "n" "WHITE" "c" "WHITE" "WHITE" "lw" "0.5" "WHITE" "") ) (setq ly (tblsearch "layer" "YELLOW")) (if (= ly nil) (command ".-layer" "n" "YELLOW" "c" "YELLOW" "YELLOW" "lw" "0.25" "YELLOW" "") ) (setq ly (tblsearch "layer" "noprint")) (if (= ly nil) (command ".-layer" "n" "noprint" "c" "151" "noprint" "lw" "0" "noprint" "") )
;;
(prompt "\n此指令用於繪斜圓管的展開圖...")(princ)
;; ---------------------------------------------------------------- (if (= DIAd nil) (setq DIAd 0.0) (setq DIAd DIA) ; 設DIAd為預設的 圓管 直徑 ) (prompt "\n 請輸入 圓管 直徑 < ") (princ DIAd) (princ " > : ") (setq DIA (getreal)) ; 可直接輸入 圓管 直徑 (if (= DIA nil) (setq DIA DIAd) ) (while (< DIA 0) ; 輸入值須大於或等於零. (princ "圓管 直徑 不可以小於零!!!")(princ) (prompt "\n 請輸入 圓管 直徑 : ") (setq DIA (getreal)) ; 可直接輸入 圓管 直徑 ) ;; ---------------------------------------------------------------- (if (= CHTd nil) (setq CHTd 0.0) (setq CHTd CHT) ; 設CHTd為預設的 圓管 中心高度 ) (prompt "\n 請輸入圓管的 中心高度 < ") (princ CHTd) (princ " > : ") (setq CHT (getreal)) ; 可直接輸入 圓管的 中心高度 (if (= CHT nil) (setq CHT CHTd) ) (while (<= CHT 0) ; 輸入值須大於零. (princ " 圓管的 中心高度 不可以小於零!!!")(princ) (prompt "\n 請輸入 圓管的 中心高度 : ") (setq CHT (getreal)) ; 可直接輸入 圓管的 中心高度 ) ;; ---------------------------------------------------------------- (if (= AE1d nil) (setq AE1d 0.0) (setq AE1d AE1) ; 設AE1d為預設的 角度 1 ) (prompt "\n 請輸入圓管的 角度 1 值 < ") (princ AE1d) (princ " > : ") (setq AE1 (getreal)) ; 可直接輸入圓管的 角度 1 值 (if (= AE1 nil) (setq AE1 AE1d) ) (while (< AE1 0) ; 輸入值須大於零. (princ " 圓管的 角度 1 值 不可以小於零!!!")(princ) (prompt "\n 請輸入圓管的 角度 1 值 : ") (setq AE1 (getreal)) ; 可直接輸入圓管的 角度 1 值 ) (setq ANG1 (/ (* AE1 pi) 180)) (setq AE2 0.0)
;; ---------------------------------------------------------------- (if (= THKd nil) (setq THKd 0.0) (setq THKd THK) ; 設THKd為預設的 板厚 ) (prompt "\n 請輸入大小頭的 板厚 < ") (princ THKd) (princ " > : ") (setq THK (getreal)) ; 可直接輸入 板厚 (if (= THK nil) (setq THK THKd) ) (while (<= THK 0) ; 輸入值須大於零. (princ " 板厚 不可以小於零!!!")(princ) (prompt "\n 請輸入 板厚 : ") (setq THK (getreal)) ; 可直接輸入 板厚 ) ;; ---------------------------------------------------------------- (initget 1 "1 2") (setq i_od (getkword "\n 請選擇 直徑 為 外尺寸[1] 或 內尺寸[2] : ") ) (if (= i_od "1") (setq i_o "OUT") (setq i_o "IN") ) ;; ----------------------------------------------------------------
(if (= i_o "OUT") (setq DCL (- DIA THK)) (setq DCL (+ DIA THK)) ) (setq PDC (* pi DCL)) ;板中心捲成的圓周長 (setq N10 24) ;內定的等分數 (setq NBL N10)
(setq INS (getpoint "\n 請輸入 插入點 位置 : ")) (setvar "osmode" 0)
;;
(setq SQ4 (/ NBL 4))
(setq LA10 (polar INS (/ pi 2.0) CHT)) ;AE1側曲線座標(未旋轉ANG3角度) (setq DA1 0.0 DA2 0.0) (setq YA1 (* (/ (sin ANG1) (cos ANG1)) (sin ANG3) (/ DCL 2.0))) (setq LA10 (polar LA10 (/ pi 2) YA1)) ;AE1側曲線座標(旋轉ANG3角度後的高度值) (setq LA1 LA10)
(setq LA20 INS) ;AE2側曲線座標 (setq LA2 LA20) (setq DN20 LA20)
(setvar "CLAYER" "WHITE") (command "._line" LA1 LA2 "") ;畫壓折線的起始端 (setq LAR1 LA1 LAR2 LA2) (setq j 0) (setq UP0 LA1 DN0 LA2) (setq j (1+ j))
(setq DAS (/ PDC NBL)) ; 等分後的單位弧長 (setq DDP (/ (* pi 2.0) NBL)) ; 等分後的 單位弳度值 (setq DA1 (+ DA1 DDP)) (setq DA2 (+ DA2 DDP))
(setq i 0) (repeat NBL (draw_line) (draw_arc) (setq i (1+ i)) ) (if (= AE2 0) (command "._line" DN20 DN2 "") ;畫壓折線 ) (princ)
(setvar "CLAYER" "WHITE")
; ------------------------------------------------------------------------------- (reset) (princ) )
;
(defun draw_line() (if (= (rem i SQ4) (1- SQ4)) (setvar "CLAYER" "YELLOW") (setvar "CLAYER" "noprint") ) (if (= i (1- NBL)) (setvar "CLAYER" "WHITE") )
(setq LA10 (polar LA10 0 DAS)) (setq LA1 LA10) (setq YA1 (* (/ (sin ANG1) (cos ANG1)) (sin DA1) (/ DCL 2.0))) (if (>= YA1 0) (setq LA1 (polar LA1 (/ pi 2) YA1)) (setq LA1 (polar LA1 (/ (* pi 3) 2) (abs YA1))) ) (setq LA20 (polar LA20 0 DAS)) (setq LA2 LA20) (setq YA2 (* (/ (sin ANG2) (cos ANG2)) (sin DA2) (/ DCL 2.0))) (if (>= YA2 0) (setq LA2 (polar LA2 (/ (* pi 3) 2) YA2)) (setq LA2 (polar LA2 (/ pi 2) (abs YA2))) ) (command "._line" LA1 LA2 "") ;畫壓折線 (setq DA1 (+ DA1 DDP)) (setq DA2 (+ DA2 DDP)) )
;
(defun draw_arc() (if (= (rem j 2) 1) (setq UP1 LA1 DN1 LA2) ) (if (= (rem j 2) 0) (progn (setvar "CLAYER" "WHITE") (setq UP2 LA1 DN2 LA2) (command "._arc" UP0 UP1 UP2 "") ;畫上側圓弧線
(setq UP0 LA1) ) ) (setq j (1+ j)) )
============================================
會了嗎?
如果懂了,
還可以試著寫個 " 彎頭 " 的展開程式...
寫完了 " 斜圓管 " 的小小程式, 大概又花了兩天的時間,改良程式成 " 雙斜圓管 ",
順便連 " 彎頭 " , 也一起誕生, 讓許多 " 大魚 ", " 小魚 ", 上上下下的相望,
倒是有趣極了!!
tube_2d.lsp 下載