AutoCAD顧問
還沒有註冊嗎...即日起免費註冊,所有最完整的AutoCAD討論、教學及資源都在論壇裡喔~

[分享]系統櫃門板V線繪製程式

向下

[分享]系統櫃門板V線繪製程式

發表 由 沉默 于 2017-01-18, 16:51

在LISP學習資源相對缺乏的台灣
感謝論壇的蘋果爸及各大神前輩分享各種學習資源
讓小弟受用無窮 感動
分享我嘗試撰寫的第3個LISP程式
用於節省計繪製系統櫃門板的V線的時間
同時附帶自動計算分割櫃體數量
在此拋磚引玉,希望能有更多人分享討論,一同進步 竊喜


代碼:

;;;;;本程式為系統櫃拉門繪製V線程式
;;;;;支援軟體版本("AutoCAD")
;;;;;設計者:Larry Wu
;;;;;版權所有,歡迎使用
;;;;;Rev.2 (2017/01/18)

(defun c:VX()

 (setq os (getvar "osmode"))  ;;紀錄物件鎖點初始值
(setq pa (getpoint "\n請點選門板左下角"))  ;左下角
(setq pb (getpoint "\n請點選門板右上角"))  ;右上角
(setq pc (list (car pb) (cadr pa)))   ;pc是右下角,car是求X值,cadr是求Y值
(setq ww (distance pa pc))
(setq hh (distance pc pb))

;;;底下if是以高度有沒有超過270判斷是cm還是mm,給後面自動計算等分參考用
;;;一般系統櫃板材最大尺寸是7尺x9尺(210cmx270cm),所以用270來判斷單位
(if (> hh 270)
(progn
(setq au1 500);;;au1是最大門板寬,一般不會超過50cm
)
(progn
(setq au1 50)
)
)  ;;;if判斷式結束

(setq num (/ ww au1))  ;;;設定num為(總寬/最大門板寬)
(if (< num 1)(setq num 0))   ;;;當num(總寬/最大門板寬)小於1時,設定num為0避免後面計算多1個門
(setq ar (getreal "\n請輸入門板數目<自動計算>:"))   ;;;ar是門板陣列數量
(if (null ar)(setq ar (+ (fix num) 1)))  ;;;fix的功能是去掉小數,後面再加1是讓陣列數量無條件進位
(setq w1 (/ ww ar))   ;;;設定w1為門板寬
(setq w2 (* w1 2))    ;;;設定w2一個桶身寬
(setq v1 (polar pa 0 w1))  ;;;v1是V線的第1點
(setq v2 (polar pa (/ pi 2) (/ hh 2)))  ;;;v2是V線第2點
(setq v3 (polar v1 (/ pi 2) hh))  ;;;v3是V線第3點
(setq v4 (polar v2 0 w2))  ;;;v4是對稱V線的第2點
(setq rec5 (polar v3 0 w1))  ;;;rec5是第二片版的矩形右上角
(setq lv1 (polar pa 0 (- ww w1)))  ;;;lv1是最後一個門板V線的第1點
(setq lv2 (polar pc (/ pi 2) (/ hh 2)))  ;;;lv2是最後一個門板V線的第2點
(setq lv3 (polar lv1 (/ pi 2) hh))  ;;;lv3是最後一個門板V線的第3點
(setq ar2 (/ ar 2))  ;;;因為門是對開的,所以陣列V線時陣列數量要除2


(cond   ;;;多重判斷式,如果ar=1畫一個V線,如果ar=2畫一對V線,如果ar>2畫V線後陣列再畫對稱V線後陣列
((= ar 1)   ;;;一片門板
;;;左V線
(command "-color" "8")
(command "-lweight" "0.09")
(command "-linetype" "s" "CENTER" "")
(setvar "osmode" 0)
(command "pline" v1 v2 v3 "")
(command "-color" "bylayer")
(command "-lweight" "bylayer")
(command "-linetype" "s" "bylayer" "")
(command "rectang" pa v3)
(setvar "osmode" os)
)
((= ar 2)   ;;;一對門板
;;;左V線
(command "-color" "8")
(command "-lweight" "0.09")
(command "-linetype" "s" "CENTER" "")
(setvar "osmode" 0)
(command "pline" v1 v2 v3 "")
(setvar "osmode" os)
(command "-color" "bylayer")
(command "-lweight" "bylayer")
(command "-linetype" "s" "bylayer" "")
;;;右V線
(command "-color" "8")
(command "-lweight" "0.09")
(command "-linetype" "s" "CENTER" "")
(setvar "osmode" 0)
(command "pline" lv1 lv2 lv3 "")
(setvar "osmode" os)
(command "-color" "bylayer")
(command "-lweight" "bylayer")
(command "-linetype" "s" "bylayer" "")
;;;門板外框
(setvar "osmode" 0)
(command "rectang" pa v3)
(command "rectang" lv1 pb "")
(setvar "osmode" os)
)
((= ar 3)   ;;;2+1門板
(command "-color" "8")
(command "-lweight" "0.09")
(command "-linetype" "s" "CENTER" "")
(setvar "osmode" 0)
(command "pline" v1 v2 v3 "")
(setvar "osmode" os)
(command "-color" "bylayer")
(command "-lweight" "bylayer")
(command "-linetype" "s" "bylayer" "")
(command "-color" "8")
(command "-lweight" "0.09")
(command "-linetype" "s" "CENTER" "")
(setvar "osmode" 0)
(command "pline" v1 v4 v3 "")
(setvar "osmode" os)
(command "-color" "bylayer")
(command "-lweight" "bylayer")
(command "-linetype" "s" "bylayer" "")
(command "-color" "8")
(command "-lweight" "0.09")
(command "-linetype" "s" "CENTER" "")
(setvar "osmode" 0)
(command "pline" lv1 lv2 lv3 "")
(setvar "osmode" os)
(command "-color" "bylayer")
(command "-lweight" "bylayer")
(command "-linetype" "s" "bylayer" "")
;;;門板外框
(setvar "osmode" 0)
(command "rectang" pa v3)
(command "rectang" v1 rec5)
(command "rectang" lv1 pb "")
(setvar "osmode" os)
)
((> ar 3)   ;;;一堆門板
;;;左V線
(command "-color" "8")
(command "-lweight" "0.09")
(command "-linetype" "s" "CENTER" "")
(setvar "osmode" 0)
(command "pline" v1 v2 v3 "")
(setvar "osmode" os)
(command "-color" "bylayer")
(command "-lweight" "bylayer")
(command "-linetype" "s" "bylayer" "")
(command "-array" "L" "" "R" 1 (fix ar2) w2)
;;;右V線
(command "-color" "8")
(command "-lweight" "0.09")
(command "-linetype" "s" "CENTER" "")
(setvar "osmode" 0)
(command "pline" v1 v4 v3 "")
(setvar "osmode" os)
(command "-color" "bylayer")
(command "-lweight" "bylayer")
(command "-linetype" "s" "bylayer" "")
(command "-array" "L" "" "R" 1 (fix ar2) w2)
;;;收尾V線
(command "-color" "8")
(command "-lweight" "0.09")
(command "-linetype" "s" "CENTER" "")
(setvar "osmode" 0)
(command "pline" lv1 lv2 lv3 "")
(setvar "osmode" os)
(command "-color" "bylayer")
(command "-lweight" "bylayer")
(command "-linetype" "s" "bylayer" "")
;;;門板外框
(setvar "osmode" 0)
(command "rectang" pa v3 "")
(setvar "osmode" os)
(command "-array" "L" "" "R" 1 ar w1)
)
)

(prompt "\n門板寬度:")
(prin1 w1)(if (> hh 270)(prompt "mm")(prompt "cm"))
(prompt "\n門板高度:")
(prin1 hh)(if (> hh 270)(prompt "mm")(prompt "cm"))
(prompt "\n門板數量:")
(prin1 ar)(prompt "片")

 
  (princ)
)


感謝蘋果爸提出程式錯誤 竊喜
程式已經修改好囉
附件
VX.zip 您無權下載這里的附件。(2 Kb) 下載 8 次
VX.zip 您無權下載這里的附件。(2 Kb) 下載 8 次


沉默 在 2017-01-19, 00:03 作了第 2 次修改
avatar
沉默
初級會員
初級會員

文章總數 : 18
年齡 : 27
來自 : 台北
職業 : 家具設計
愛好 : 電腦
個性 : 古板
使用年資 : 10
使用版本 : 2014
積分 : 1
經驗值 : 941
威望值 : 30
注冊日期 : 2016-06-15
男 獅子座 羊

回頂端 向下

回復: [分享]系統櫃門板V線繪製程式

發表 由 Tiger&蘋果爸 于 2017-01-18, 18:12

謝謝 沉默 熱心分享,還製作操作影片~
我測試過輸入3片以上程式就出錯了,請再檢核一下~
感恩!
竊喜


____________________________________________________________________________________
avatar
Tiger&蘋果爸
系統管理員
系統管理員

文章總數 : 17945
年齡 : 42
來自 : 台北市文山區
職業 : AutoCAD顧問
愛好 : 蹓狗/戶外活動/拍照
個性 : 幽默/樂觀/善良
使用年資 : 15↑
使用版本 : AutoCAD 2016
經驗值 : 68786
威望值 : 13366
注冊日期 : 2008-04-23
2D基礎函授 2D進階函授 3D基礎函授 https://i.servimg.com/u/f11/19/71/67/71/2d3d10.png2D+3D線上 顧問外掛程式 經典問與答讀者 藍鵲1號
2009聚會勳章 2010聚會勳章 2011聚會勳章 2012聚會勳章 2013勳章-2D基礎 2014聚會勳章 2015聚會勳章 2016聚會勳章 串連貼紙成功 男 水瓶座 兔

http://mypaper.pchome.com.tw/kv1012tiger

回頂端 向下

回復: [分享]系統櫃門板V線繪製程式

發表 由 沉默 于 2017-01-18, 18:30

哎呀
我少了一個門片等於3的判斷
3個門片時不需要陣列
我再修改一下
謝謝蘋果爸
avatar
沉默
初級會員
初級會員

文章總數 : 18
年齡 : 27
來自 : 台北
職業 : 家具設計
愛好 : 電腦
個性 : 古板
使用年資 : 10
使用版本 : 2014
積分 : 1
經驗值 : 941
威望值 : 30
注冊日期 : 2016-06-15
男 獅子座 羊

回頂端 向下

回復: [分享]系統櫃門板V線繪製程式

發表 由 HEMOS 于 2017-01-19, 13:59

超過三個門板,不就又超過相同的狀況…

雖然說門板的片數不可能太多片,

但程式若能改善成任意數量為佳。

有興趣投入研究可以更盡善盡美,

謝謝你的創作分享,好好加油吧!!
avatar
HEMOS
榮譽顧問
榮譽顧問

文章總數 : 826
年齡 : 45
來自 : 台北
職業 : 土木結構
愛好 : 攝影
個性 : 和善
使用年資 : 10年以上
使用版本 : AutoCAD 2014
積分 : 26
最佳解答 : 3
經驗值 : 7724
威望值 : 1587
回帖精華 : 1
注冊日期 : 2009-02-23
藍鵲38號
男 射手座 鼠

回頂端 向下

回復: [分享]系統櫃門板V線繪製程式

發表 由 沉默 于 2017-01-19, 14:38

不好意思 造成您誤解了
小弟說明一下我寫這個程式的邏輯
因為我從事家具設計製圖相關工作
常需要畫系統櫃的立面圖,而每件案子配合空間不同
系統櫃的門板分割及尺寸也不盡相同
但以下有幾點通則是比較常見的:
1.最左側的門板通常是左開(西德鉸鍊位於左側)
2.最右側的門板通常是右開(西德鉸鍊位於右側)
3.受限於系統櫃板材尺寸,單一板材長度不會超過270cm
4.為避免門板過重,導致門板下垂,單一門板寬度不會超過50cm
不過也是會遇到部分較特殊的專案不適用上列規則
另外以下是我在撰寫程式時,一些思考邏輯:
1.我希望這程式能像畫矩形一樣,點選左下及右上就能確定門板範圍
2.因上列通則,程式的第一片門板為左開,最後一片門板為右開
3.大部分專案業主提供的都是櫃體總寬,我希望程式能幫我判斷分幾片門板比較合適
4.業主提供的CAD檔案,圖面單位有時是mm有時是cm,我希望程式能依圈選範圍判斷單位

所以程式是這樣運作的
1.點選櫃體左下和右上,得出櫃體的總寬與總高
2.用if判斷高度超過270單位即為mm,反之cm
3.手動輸入門板數量,或自動計算門板數量
;;;以下是自動計算的邏輯
4.用總寬除以50或500(以第2點決定)再無條件進位,求出門板數量
依據手動輸入或自動計算門板數量的值會有以下幾種應對

if 門板數量=1
畫一個左開門 → 結束程式

if 門板數量=2
畫一個左開門 → 畫最後一個右開門 → 結束程式

;;;我最初上傳的程式就是少這組判斷式,因為這組不需要陣列
if 門板數量=3
畫一個左開門→ 畫第二個個右開門 → 畫最後一個右開門 → 結束程式

if 門板數量>3
畫一個左開門 → 矩形陣列n/2個 → 畫1個右開門 → 矩形陣列n/2個 →畫最後一個右開門 → 結束程式

以上說明希望您能理解,因為是自學LISP,程式內可能很多問題,請您多多指教,謝謝 認同
avatar
沉默
初級會員
初級會員

文章總數 : 18
年齡 : 27
來自 : 台北
職業 : 家具設計
愛好 : 電腦
個性 : 古板
使用年資 : 10
使用版本 : 2014
積分 : 1
經驗值 : 941
威望值 : 30
注冊日期 : 2016-06-15
男 獅子座 羊

回頂端 向下

回復: [分享]系統櫃門板V線繪製程式

發表 由 Banson 于 2018-09-12, 23:31

這個程式很受用,
謝謝沉默大大!!
我也是剛接觸
一起加油喔!!
avatar
Banson
一般會員
一般會員

文章總數 : 2
年齡 : 23
來自 : 宜蘭縣
職業 : 室內設計
愛好 :
個性 : 開朗
使用年資 : 5
使用版本 : 2018
經驗值 : 110
威望值 : 6
注冊日期 : 2018-06-18
男 巨蟹座 豬

回頂端 向下

回頂端


 
這個論壇的權限:
無法 在這個版面回復文章