วันอาทิตย์ที่ 26 มกราคม พ.ศ. 2563

Walls


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 เป็นชื่อที่เราต้องการ เลือกสีและชนิดของเส้นเอาเลยครับตามที่อธิบายไว้แล้ว

1 ความคิดเห็น: