Walls
Wall ผนัง
หลังจากได้ แบบแปลน ประตู หน้าต่าง แล้วเรามาออกแบบผนังกันต่อเลยเลยดีกว่า
โดยเราจะเลือกจุดอ้างอิงของผนังเป็นสามจุดเป็นผนังด้านซ้าย ผนังกลาง
และผนังด้านขวา เพื่อความสะดวกเวลาวางผนังลงในแบบแปลน โดยจะใช้ Osnap
เป็นตัวช่วยในการวางต่อจากมุมเสาในแบบแปลน โดยผนังด้านซ้ายและขวาให้
Osnap เป็น End point ส่วนผนังกลางเป็น
Middle point โดยที่เราต้องใส่ความหนาของผนัง tw
(thickness wall) และตั้งค่าความหนาผนังฉาบไว้ที่ 0.015
ส่วนผนังจริงก็แสดงลายตัดเป็นลาย "ANSI31" ตามรูปด้านล่างเลย
ตัวอย่างที่
30 แบบร่างตำแหน่งผนัง
(defun
c:wall ()
; ตั้งชื่อ wall
(defun
rtod (x) (/ (* x 180) pi) ) ; แปลงเรเดียนเป็นองศา
(defun
dtor (x) (* x (/ pi 180))) ; แปลงองศาเป็นเรเดียน
;
หัวโปรแกรมกำหนดค่าตัวแปรต่างๆ ของสภาพแวดล้อม System
Variables
(setq
old_cmdecho
(getvar "cmdecho")) ; เซทค่า cmdecho
(คอมมานเอคโค่)
(setq
old_osnap (getvar "osmode")) ; เซทค่า osnap
(ออบเจ็คสแนพ)
(setq
old_snap
(getvar "snapmode")) ; เซทค่า snap
(setq
old_ortho (getvar "orthomode")) ; เซทค่า ortho
(setq
old_layer (getvar "clayer")) ; เซทค่า layer
;
หัวโปรแกรมทำการกำหนดค่าสภาพแวดล้อม System Variables
ที่ต้องการ
(setvar
"cmdecho" 0) ; ปิด (off) cmdecho (คอมมานเอคโค่)
(setvar
"osmode" 0)
; ปิด (off) osnap (ออบเจ็คสแนพ)
(setvar
"snapmode" 0) ; ปิด (off) snap
(setvar
"orthomode" 0) ; ปิด (off) ortho
;
ส่วนรับค่า input ต่างๆ
(setq
tw (getdist "\n
ความหนาของผนัง <0.1>: ")) ; ตั้งค่า tw ความหนาของผนัง
(if
(not tw) (setq tw 0.1)) ; ตั้งค่าเริ่มต้น tw ความหนาของผนังเท่ากับ 0.1
(setq
tc (getdist "\n
ความหนาของปูนฉาบ <0.015>: ")) ; ตั้งค่า tc ความหนาของปูนฉาบ
(if
(not tc) (setq tc 0.015)) ; ตั้งค่าเริ่มต้น tc ความหนาของผนังเท่ากับ 0.015
(initget
"Left Middle Right") ; ตั้งค่า keyword จุดของผนัง
(setq
Pp (getkword "\n
เลือกจุดของผนัง : [Left/Middle/Right] <Left>:
")) ; เลือกจุดของผนังตามค่า keyword
(if
(= pp "")(setq pp "Left")) ; ตั้งค่าจุดเริ่มต้นของผนังเป็น
left
;
control Osmode for Pick point p1 p2 ตั้งค่าตัวช่วยในการเลือกจุด
(if
(= Pp "Left")(setvar "Osmode" 1)); Osnap
Endpoint
(if
(= Pp "Middle")(setvar "Osmode" 2)) ; Osnap
Middlepoint
(if
(= Pp "Right")(setvar "Osmode" 1)) ; Osnap
Endpoint
(initget
1)
; กำหนดให้ทำการเลือกจุดหรือตำแหน่ง
(setq
p1 (getpoint "\n
ตำแหน่งเริ่มต้นผนัง :")) ; กำหนดให้
p1 เป็นจุดหรือตำแหน่งเริ่มต้นผนัง
(initget
1)
; กำหนดให้ทำการเลือกจุดหรือตำแหน่ง
(setq
p1 (getpoint P1 "\n ตำแหน่งสุดท้ายของผนัง :"))
; กำหนดให้ p2 เป็นจุดหรือตำแหน่งสุดท้ายของผนัง
(setvar
"Osmode" 0)
; Osnap off ปิดตัวช่วยเลือกจุดหรือตำแหน่ง
(setq
Ang (angle p1 p2))
; หาค่ามุมจากจุด p1 ไป p2
(setq
ang1
(+ ang (dtor 90.0))) ; ตั้งค่ามุมที่ 1 มีค่า 90 องศาและแปลงเป็นเรเดียน
(setq
ang2
(+ ang (dtor 180.0))) ; ตั้งค่ามุมที่ 2 มีค่า 180 องศาและแปลงเป็นเรเดียน
(setq
ang3
(+ ang (dtor 270.0))) ; ตั้งค่ามุมที่ 3 มีค่า 270 องศาและแปลงเป็นเรเดียน
;
กำหนดจุดหรือตำแหน่งต่างๆ จากการเลือกจุดหลักของผนัง
(if
(= Pp "Left") ; ทดสอบว่าถ้าเลือกจุดอ้างอิงของผนังที่
Left ให้ใช้ชุดตำแหน่งหรือจุดต่างๆ ที่กำหนดในชุดนี้
ด้วยการรวมกลุ่มคำสั่ง จากฟังชั่น Polar ที่ได้เคยใช้งานผ่านมาแล้ว
(progn ; รวมกลุ่มคำสั่ง
(setq
p3 p1)
(setq
p4 p2)
(setq
p5 (Polar p2 Ang3 tw))
(setq
p6 (Polar p1 Ang3 tw))
(setq
p1a (Polar p3 Ang3 tc))
(setq
p2a (Polar p4 Ang3 tc))
(setq
p3a (Polar p5 Ang1 tc))
(setq
p4a (Polar p6 Ang1 tc))
); สิ้นสุดการรวมกลุ่ม
); สิ้นสุดการทดสอบ
(if
(= Pp "Middle") ; ทดสอบว่าถ้าเลือกจุดอ้างอิงของผนังที่
Middle ให้ใช้ชุดตำแหน่งหรือจุดต่างๆ ที่กำหนดในชุดนี้
ด้วยการรวมกลุ่มคำสั่ง จากฟังชั่น Polar ที่ได้เคยใช้งานผ่านมาแล้ว
(progn ; รวมกลุ่มคำสั่ง
(setq
p3 (Polar p1 Ang1 (/ tw 2)))
(setq
p4 (Polar p2 Ang1 (/ tw 2)))
(setq
p5 (Polar p4 Ang3 tw))
(setq
p6 (Polar p3 Ang3 tw))
(setq
p1a (Polar p3 Ang3 tc))
(setq
p2a (Polar p4 Ang3 tc))
(setq
p3a (Polar p5 Ang1 tc))
(setq
p4a (Polar p6 Ang1 tc))
); สิ้นสุดการรวมกลุ่ม
); สิ้นสุดการทดสอบ
(if
(= Pp "Right") ; ทดสอบว่าถ้าเลือกจุดอ้างอิงของผนังที่
Right ให้ใช้ชุดตำแหน่งหรือจุดต่างๆ ที่กำหนดในชุดนี้
ด้วยการรวมกลุ่มคำสั่ง จากฟังชั่น Polar ที่ได้เคยใช้งานผ่านมาแล้ว
(progn ; รวมกลุ่มคำสั่ง
(setq
p3 p1)
(setq
p4 p2)
(setq
p5 (Polar p4 Ang1 tw))
(setq
p6 (Polar p3 Ang1 tw))
(setq
p1a (Polar p3 Ang1 tc))
(setq
p2a (Polar p4 Ang1 tc))
(setq
p3a (Polar p5 Ang3 tc))
(setq
p4a (Polar p6 Ang3 tc))
); สิ้นสุดการรวมกลุ่ม
); สิ้นสุดการทดสอบ
(command
"_.line" p3 p4 "" "_.line" p5 p6 "") ; วาดเส้นผนังทั้งสองด้าน
(command
"_.pline" p1a p2a p3a p4a "c") ; วาดผนังด้านในด้วยเส้นต่อเนื่อง
(command
"_.bhatch" "S" "last" "" "P"
"ANSI31" tw 0 "") ; ใส่ลายตัดในผนังด้านในเลือกลายตัดด้วย
P (Pattern) เป็น "ANSI31" เราสามารถเปลี่ยนเป็นลายอื่นได้โดยใส่ชื่อที่ต้องการลงไป กำหนดสเกลที่เหมาะสมเราให้เท่ากับความกว้างเสา tw กำหนดองศา 0 แล้วจบคำสั่งด้วย ""
Enter
;
คืนค่า System Variables
(setvar
"osmode" old_osnap)
(setvar
"cmdecho" old_cmdecho)
(setvar
"snapmode" old_snap)
(setvar
"orthomode" old_ortho)
(princ) ; ลบechoสิ้นสุดคำสั่ง
) ; สิ้นสุดฟังก์ชัน
ตัวอย่างที่ 31 a
ในตัวอย่างที่
31 a เป็นการเลือกจุดเริ่มต้นของผนังเป็น left ด้านซ้ายมือ
และมีตัวช่วยเลือกจุด osnap End point ช่วยเลือกที่มุมเสาด้านซ้าย
ที่จุด p1 และเลือกจุด p2 ที่มุมเสาเป็นความยาวของผนัง
และทำการวาดเส้นผนังซ้ายและขวาและวาดผนังด้านในพร้อมกับแสดงลายตัด
ตัวอย่างที่ 31 b
ในตัวอย่างที่
31 b เป็นการเลือกจุดเริ่มต้นของผนังเป็น middle ด้านซ้ายมือ
และมีตัวช่วยเลือกจุด osnap Midpoint ช่วยเลือกที่กึ่งกลางเสา
ที่จุด p1 และเลือกจุด p2 ที่กึ่งกลางเสา ด้านบนเป็นความยาวของผนัง
และทำการวาดเส้นผนังซ้ายและขวาและวาดผนังด้านในพร้อมกับแสดงลายตัด
ตัวอย่างที่ 31 c
ในตัวอย่างที่
31 c เป็นการเลือกจุดเริ่มต้นของผนังเป็น right ด้านซ้ายมือ
และมีตัวช่วยเลือกจุด osnap End point ช่วยเลือกที่มุมเสาด้านขวา
ที่จุด p1 และเลือกจุด p2 ที่มุมเสาเป็นความยาวของผนัง และทำการวาดเส้นผนังซ้ายและขวาและวาดผนังด้านในพร้อมกับแสดงลายตัดเช่นกัน
จากคำสั่ง
Door
Window Wall
เราได้ใช้คำสั่ง Polar ช่วยในการกำหนดตำแหน่งซึ่งง่ายต่อการใช้งานมากกว่าการใช้
car cadr แต่ก็มีข้อแม้ว่าเราต้องรู้ค่ามุมด้วย
แต่ว่าการใช้ car cadr เราก็ต้องรู้ระยะห่างของแกน x
y ด้วยเหมือนกันแล้วแต่ความถนัดหรือสะดวกของแต่ละคนละกัน
ในส่วนนี้ผมไม่ได้สร้าง layer ไว้ให้นะครับถ้าต้องการก็เพิ่มเอาได้เลยตามตัวอย่าง
gline เอาคำสั่งสร้างยกมาใส่เลยแล้วก็เปลี่ยนชื่อ layer
เป็นชื่อที่เราต้องการ เลือกสีและชนิดของเส้นเอาเลยครับตามที่อธิบายไว้แล้ว
I receive an error "bad argument type 2d/3d point nil"
ตอบลบ