วันพฤหัสบดีที่ 11 ตุลาคม พ.ศ. 2561

เครื่องหมายดำเนินการ (Operator)


เครื่องหมายดำเนินการ (Operator)
ใน AutoLISP มีเครื่องหมายดำเนินการเช่นเดียวกับ ภาษาคอมพิวเตอร์อื่น ๆ ที่ช่วยในการสร้างเงื่อนไขสำหรับตัดสินใจ ซึ่งแบ่งออกเป็น 2 ประเภทดังต่อไปนี้
      เครื่องหมายเปรียบเทียบ (Relational Operator)
      เมื่อทำการเปรียบเทียบแล้วก็จะแสดงว่า เป็นจริง T (True) หรือเป็นเท็จ nil (False) อย่างใดอย่างหนึ่ง ซึ่งพอจะสรุปรวบรวมเครื่องหมายเปรียบเทียบได้เป็นตารางดังนี้
ตาราง เครื่องหมายดำเนินการและความหมาย
เครื่องหมายดำเนินการ
ความหมาย
> 
มากกว่า
< 
น้อยกว่า
>=
มากกว่าหรือเท่ากับ
<=
น้อยกว่าหรือเท่ากับ
=
เท่ากับ
/=
ไม่เท่ากับ
eq
เท่ากันอย่างแท้จริง
equal
เท่ากับ (ใช้กับตัวแปรแบบ List)
lisP
ตัวแปรเป็นแบบ List หรือไม่
minUSP
จำนวนมีค่าเป็นลบหรือไม่
numberP
ตัวแปรเป็นแบบ Real หรือ Integer หรือไม่
zeroP
ตัวแปรเป็นศูนย์หรือไม่

      เครื่องหมายทางตรรกศาสตร์ (Logical Operator)
      AND จะให้ได้ค่า T (True) ก็ต่อเมื่อทุก ๆ สถานะมีค่าเป็น  T (True)  หมดดังตาราง
ตาราง การทำงานของ AND
A
B
(and A B)
T
T
T
T
nil
nil
nil
T
nil
nil
nil
nil
     

OR จะใช้เปรียบเทียบสถานะ ถ้ามีสถานะใดสถานะหนึ่งเป็น T (True) ก็จะมีค่ารวมเป็น T (True) ดังตาราง
ตาราง การทำงานของ OR
A
B
(and A B)
T
T
T
T
nil
T
nil
T
T
nil
nil
nil
     
      NOT จะใช้ในการปรับเปลี่ยนสถานะ ให้ตรงกันข้ามกับสถานะเดิม
ตาราง การทำงานของ NOT
A
(not A)
nil
T
T
nil



Cr. กรมส่งเสริมอุตสาหกรรม – พื้นฐานการเขียนโปรแกรม AutoLISP

ฟังก์ชั่นและอาร์กิวเมนต์ (Function and Argument)


ฟังก์ชั่นและอาร์กิวเมนต์ (Function and Argument)
      ฟังก์ชั่น (Function)
      เป็นเสมือนตัวดำเนินการค่าคงที่หรือตัวแปร ที่ทำให้เกิดผลลัพธ์ขึ้นมาใหม่ ตามวิธีดำเนินการในลักษณะต่าง ๆ เช่น +, -, *, / ฯลฯ
      อาร์กิวเมนต์ (Argument)
     คือค่าคงที่ หรือตัวแปรที่เราส่งผ่านเข้าไปดำเนินการตามฟังก์ชั่นต่างๆ เช่น
     ( /  10  X )
       |   |__|___อาร์กิวเมนต์
       |_______ฟังก์ชั่น
      ในบางฟังก์ชั่นจำเป็นต้องมีอาร์กิวเมนต์ บางฟังก์ชั่นอาจไม่จำเป็นต้องมีก็ได้ ในภาษา AutoLISP นี้มีการแบ่งฟังก์ชั่นออกเป็น 2 ประเภทคือ
     1. ฟังก์ชั่นมาตรฐานที่มีใน AutoLISP
      ฟังก์ชั่นทางคณิตศาสตร์
      ฟังก์ชั่นเปลี่ยนแปลงชนิดข้อมูล
      ฟังก์ชั่นที่ใช้กับข้อมูลแบบ List
      ฟังก์ชั่นที่ใช้กับข้อมูลแบบ String
      ฟังก์ชั่นเกี่ยวกับเงื่อนไขและการวนรอบ
      ฟังก์ชั่นที่ควบคุมการ Input & Output
      ฟังก์ชั่นเกี่ยวกับไฟล์
      ฟังก์ชั่นเกี่ยวกับ Entity และการเลือก Entity
     2. ฟังก์ชั่นที่ผู้ใช้กำหนดขึ้นเอง (User Defined Function)
      เรียกใช้งานได้เช่นเดียวกับ Command
      เรียกใช้งานโดยฟังก์ชั่น




Cr. กรมส่งเสริมอุตสาหกรรม – พื้นฐานการเขียนโปรแกรม AutoLISP



วันพุธที่ 10 ตุลาคม พ.ศ. 2561

ค่าคงที่และตัวแปร (Constant and Variable)


ค่าคงที่และตัวแปร (Constant and Variable)
ค่าคงที่ (Constant)
      หมายถึง ค่าที่มีค่าคงที่ตลอดเวลา โดยไม่มีการเปลี่ยนแปลง และจะคงที่เสมอตราบที่ยังดำเนินการประมวลผลอยู่ เช่น 9, 5, 2.7 ฯลฯ
ตัวแปร (Variable)
      หมายถึง สัญลักษณ์ (Symbol) ที่ผู้เขียนโปรแกรมสร้างขึ้นเอง เพื่อใช้สำหรับเก็บข้อมูลต่าง ๆ ในขณะที่ทำการประมวลผล และค่าของตัวแปรนี้จะมีการเปลี่ยนแปลงได้ตลอดเวลาขณะที่มีการประมวลผล ซึ่งมีการกำหนดสัญลักษณ์ที่จะต้องเป็นไปตามกฎเกณฑ์การตั้งตัวแปร นอกจากนี้ตัวแปรยังแบ่งออกเป็นชนิดต่าง ๆ ดังต่อไปนี้
      Integer ตัวแปรชนิดนี้ จะเป็นตัวเลขที่เก็บค่าจำนวนเต็มเท่านั้น ทั้งค่าบวก ลบ และค่าศูนย์ เช่น 1, -2, 0, 4, ฯลฯ โดยมีข้อจำกัดในการเก็บค่าตัวแปรอยู่ในช่วง -32768 ถึง + 32767 เท่านั้น
      Real ตัวแปรชนิดนี้ จะเป็นตัวเลขที่เก็บค่าจำนวนจริง ที่สามารถเก็บค่าทศนิยมได้ด้วย ทำให้ไม่จำกัดขนาดในการเก็บ เช่น 0.48, 1.8E – 2, 7.4E11 ฯลฯ แต่การกำหนดค่าตัวเลขแบบ Real ให้กับตัวแปรในกรณีที่มีค่าน้อยกว่า 1 จะต้องใส่เลขศูนย์นำหน้าเสมอ เช่น 0.87, 0.25 ฯลฯ
      List จะเป็นตัวแปรที่เก็บค่าตัวแปรชุด หรือเป็นกลุ่ม, เซ็ต โดยที่ตัวแปร 1 ตัว อาจมีข้อมูลอยู่หลายตัว และข้อมูลของตัวแปร List นี้ จะต้องอยู่ภายใต้เครื่องหมายวงเล็บเปิดและปิดเสมอ
      ตัวแปรชนิดนี้จะเหมาะสมกับการเก็บตัวแปรที่มีความสัมพันธ์ในลักษณะเป็นกลุ่ม หรือ เซ็ต เช่นการเก็บค่าโคออร์ดิเนต (X, Y, Z) โดยจะต้องใช้การเก็บค่าตัวแปรแบบ List ดังนี้
      (Setq Pt  ( list 1.1 -7.5 10.25 ) )   
      จะได้ค่า Pt = ( 1.1 -7.5 10.25 )
      String  จะเป็นตัวแปรที่ใช้เก็บอักขระหรือข้อความ ซึ่งการกำหนดจะต้องเขียนไว้ภายใต้เครื่องหมายคำพูด “ ” (Double Quotation Mark)  เช่น  (Setq Text “AutoLisp”)
      File Descriptor จะเป็นตัวแปรที่เก็บหมายเลขไฟล์ที่เรากำหนด เช่น <File : #31614> เพื่อที่ว่าจะสามารถอ้างอิงนำมาใช้งานได้เมื่อต้องการ โดยเฉพาะกรณีที่ AutoLISP ต้องการที่จะติดต่อกับไฟล์ เช่น อ่านหรือเขียนไฟล์นั้น จะใช้ File Descriptor นี้เป็นตัวกำหนด ซึ่งต่างกับภาษาอื่น ๆ ที่ใช้ชื่อ นามสกุลไฟล์เป็นตัวกำหนด เช่น เราต้องการเปิดไฟล์ชื่อ ABC.TXT เพื่อทำการอ่าน จะต้องกำหนดตัวแปร File Descriptor ก่อนดังนี้
      (Setq fis ( Open “ABC.TXT” “r” ) )
    เราก็จะได้ fis เป็นตัวแปรระบบ File Descriptor ซึ่งใช้ สำหรับอ้างอิงถึงไฟล์ ABC.TXT ในการอ่านต่อไป
      Entity Name จะเป็นตัวแปรในการเก็บชื่อของ Object หรือ Entity ซึ่งใน AutoCAD จะทำการเก็บข้อมูลทุกชนิดในรูปแบบ Database แบบ List และเรายังสามารถดึงนำมาใช้งานได้ เช่น
      ((-1 <Entity name : 60000016>) : กำหนดชื่อในรูปแบบรหัส
      (0 . “Line”)                  : เป็นเส้นตรง
      (8 . “0”)                      : อยู่เลเยอร์ 0
      (10 1.0 1.0 1.0)               : Start point = (1.0, 1.0, 1.0)
(11 2.0 2.0 2.0)               : End point = (2.0, 2.0, 2.0)
      (39 . 2.0)                     : มีความหนาเท่ากับ 2
      ..................
      )
      Selection Set จะเป็นตัวแปรที่ใช้เก็บกลุ่มของ Object ที่เลือกไว้ เช่น <Selection set : 1> ใน AutoLISP เราสามารถกำหนดให้ Object หลาย ๆ  Object เข้าไปอยู่ในตัวแปรแบบ Selection set ซึ่งเราจะสามารถอ้างอิงถึง และสามารถนำมาใช้ได้โดยการเรียกผ่านฟังก์ชั่นของ AutoLISP
      (Setq ss ( ssget “L”) )
      จะได้ค่า SS ของ Object ที่กระทำล่าสุดไว้ (“L” = Last) สามารถนำมาใช้ได้ในภายหลัง



Cr. กรมส่งเสริมอุตสาหกรรม – พื้นฐานการเขียนโปรแกรม AutoLISP

องค์ประกอบของโปรแกรม AutoLISP


องค์ประกอบของโปรแกรม AutoLISP
      ในการเขียนโปรแกรม AutoLISP ขึ้นมาใช้งานนั้น จำเป็นต้องมี่ส่วนประกอบที่สำคัญดังนี้
1. ค่าคงที่และตัวแปร (Constant and Variable)
2. ฟังก์ชั่นและอาร์กิวเมนต์ (Function and Argument)
3. เครื่องหมายดำเนินการ (Operator)
4. นิพจน์ (Expression)
ตัวอย่างเช่น

            (Setq X (+ A 5 ) )
                     |  |  |__ ค่าคงที่
                     |  |___  ตัวแปร        รวมเป็น 1 นิพจน์
                     |_____ ฟังก์ชั่น



            ซึ่งจะหมายถึง X = A + 5














Cr. กรมส่งเสริมอุตสาหกรรม – พื้นฐานการเขียนโปรแกรม AutoLISP

โครงสร้างของ AutoLISP


โครงสร้างของ AutoLISP
          AutoLISP เป็นภาษาโครงสร้างภาษาหนึ่งที่มีลักษณะการเขียนโปรแกรมคล้ายกับภาษา C หรือ Pascal แต่จะกระทำได้ง่ายกว่าตรงที่ว่าไม่ต้องมีการประกาศหรือกำหนดชนิดของตัวแปรขณะที่ขึ้นต้นโปรแกรมซึ่งจะทำให้เขียนได้ง่าย เหมือนภาษา BASIC ดังนั้นผู้เขียนโปรแกรม AutoLISP จึงไม่จำเป็นต้องทำความเข้าใจกับโครงสร้างและชนิดของตัวแปรมากนัก ก็สามารถที่จะเขียนโปรแกรม AutoLISP ได้
ลักษณะการใช้งาน AutoLISP แบ่งเป็น 2 ลักษณะคือ
1. Direct Mode เป็นการติดต่อกับ AutoLISP โดยตรง ขณะที่อยู่ Command Prompt คล้ายภาษา BASIC ที่เขียนโดยไม่ได้กำหนดหมายเลขบรรทัด
2. Programmed Mode เป็นการเขียนโปรแกรม AutoLISP ให้อยู่ในรูปแบบ Text File ก่อนแล้วเรียกเข้ามาในหน่วยความจำ จากนั้นจึงสั่งรันอีกครั้งหนึ่ง ซึ่งจะเห็นได้ว่าลักษณะการใช้งาน AutoLISP แบบ Direct Mode จะใช้ได้เพียงครั้งเดียว แต่แบบ Programmed Mode สามารถเรียกมาใช้ภายหลังได้ นอกจากนั้นยังสามารถที่จะปรับปรุงแก้ไขโปรแกรมบางส่วนได้อีกด้วย การเก็บโปรแกรมอยู่ในรูปของ Text File นามสกุลจะต้องเป็น .LSP เท่านั้น
จากลักษณะการใช้งาน AutoLISP ทั้ง 2 แบบนั้นเราจะศึกษาเน้นหนักในรูปแบบของ Programmed Mode ซึ่งจะมีประสิทธิภาพการใช้งานดีกว่ามาก เราจะอาศัยหลักการเป็นภาษาโครงสร้างนี้ มาใช้ให้เป็นประโยชน์ โดยเราจะทำการแบ่งโปรแกรมออกเป็นส่วน ๆ ที่แยกการทำงานเป็นแบบโมดูล (Module) ซึ่งจะง่ายต่อการเขียนโปรแกรมและตรวจหาที่ผิด (Debug)  นอกจากนี้ยังสามารถนำโมดูลนี้ไปใช้กับโปรแกรมตัวอื่น ๆ ได้ ซึ่งถือว่าเป็นการเขียนโปรแกรมแบบที่มีประสิทธิภาพที่สุด
ดังนั้น เราควรมีการวางแผนการเขียนโปรแกรมไว้ล่วงหน้าก่อนที่จะเขียนโปรแกรมเสมอ โดยการวิเคราะห์และเขียนโฟลว์ชาร์ตขึ้นมา จากนั้นจึงพยายามทำการรวบรวมคำสั่งที่ต้องถูกเรียกใช้งานบ่อย ๆ หรือกลุ่มคำสั่งที่ซับซ้อนมาก ๆ เข้าด้วยกัน และควรเขียนโปรแกรมขึ้นในลักษณะแบบบล็อก (Block) ที่เป็นฟังก์ชั่นที่สามารถถูกเรียกใช้งานได้ แล้วค่อยเขียนโปรแกรมเมนหลักให้ทำการดึงฟังก์ชั่นนั้นมาใช้งานอีกทีภายหลัง










Cr. กรมส่งเสริมอุตสาหกรรม – พื้นฐานการเขียนโปรแกรม AutoLISP

AutoLisp


AutoLisp

AutoLISP เป็นภาษาคอมพิวเตอร์ที่ถูกสร้างขึ้นมาโดยอาศัยพื้นฐานมาจากภาษา LISP (LIST Processing) ที่สามารถเขียนขึ้นในลักษณะที่เป็นโครงสร้าง (Structure) ซึ่งจะเอื้ออำนวยให้ผู้ใช้งานสามารถเขียนแยกส่วนหรือแบ่งกันทำงานได้ แต่อย่างไรก็ตาม AutoLISP ที่กล่าวถึงนี้มิได้อยู่แยกเป็นภาษาหนึ่งจาก AutoCAD เหมือนกับภาษาคอมพิวเตอร์อื่น ๆ เช่น C, Pascal, BASIC ฯลฯ คือ ผู้ใช้งานสามารถใช้งาน AutoLISP ได้ภายใต้ AutoCAD เท่านั้น จะรันโปรแกรมตามลำพังไม่ได้ โดยโปรแกรม AutoLISP จะถูกคอมไฟล์ในลักษณะอินเตอร์เพรเตอร์ (Interpreter) คือเมื่อป้อนข้อมูลลงไปก็จะให้คำตอบออกมาที่ละบรรทัดต่อบรรทัด ทันที  AutoLISP จะใช้งานร่วมกับ Macros ของ AutoCAD โดยที่การปฏิบัติหน้าที่ของ Macros จะทำได้เฉพาะคำสั่งมารตรฐานของ AutoCAD ที่มีอยู่แล้วเท่านั้น แต่ผู้ใช้งานสามารถใช้ AutoLISP เป็นเครื่องมือในการสร้าง Command ขึ้นมาใหม่ด้วยการนำคำสั่งต่าง ๆ ของ AutoCAD ที่มีอยู่แล้วมาประกอบกัน ใช้ฟังก์ชั่นพิเศษเข้ามาช่วยเสริม และใส่เงื่อนไขต่าง ๆ เข้าไปเพื่อให้สามารถตัดสินใจเองได้ จากนั้นก็จะนำทั้งหมดมาประมวลเข้าด้วยกัน สร้างเป็น Command ขึ้นมาใหม่ที่จะสามารถเรียกใช้งานได้เหมือนกับคำสั่งมาตรฐานทั่ว ๆ ไปของ AutoCAD

















Cr. กรมส่งเสริมอุตสาหกรรม – พื้นฐานการเขียนโปรแกรม AutoLISP

วันศุกร์ที่ 10 สิงหาคม พ.ศ. 2561

กรวยยอดตัด(CONE)

กรวยยอดตัด(CONE)
          เรามาลองทำ Project ที่ใช้ในการทำงานจริงๆ กันบ้าง การสร้างกรวยยอดตัด พร้อมกับแบบแผ่นคลี่ จะได้เห็นภาพกันชัดๆ และแสดงฟังชั่นการใช้งานไปด้วยเลย เช่นการคำนวณมุมต่างๆ  Sin  Cos  aTan  และเมื่อพูดถึงตรีโกณมิติ หลายคนคง...ว้าเอาอีกแล้วเกาหัวรอเลยนะ ผมเองก็เหมือนกันนะแหละจำไม่ได้หรอก ต้องหาตัวช่วยตลอดเลย จะใช้ทีก็เปิดหาที ตามตารางมุมนี้เลย


ตารางค่ามุม

ส่วนของวงกลม
          ในการที่จะออกแบบโปรแกรมอะไรสักอย่างหนึ่ง เราจะต้องทำการวางแผนขั้นตอนการทำงานต่างๆ หรือร่างแบบออกมาก่อน ว่าเราต้องใช้คำสั่งใดบ้างหรือเราต้องกำหนดค่าใดบ้างในโปรแกรมของเรา
ตัวอย่างที่ 27

ในรูป ตัวอย่างที่ 27 กรวยยอดตัดของเรานั้นเราต้องกำหนดค่า input 3 ค่าด้วยกันแล้วก็กำหนดจุดเริ่มต้นด้วยหนึ่งจุด ค่าแรกคือ diamax ขนาดของฐานกรวยใหญ่  ค่าที่สองคือ diamin ขนาดของยอดกรวยบน ค่าที่สาม he (Height) ความสูงของกรวยตัด  แล้วสุดท้ายคือ cen เป็นการเลือกจุดศูนย์กลางของกรวยที่เราคลี่ออกมา ไปลุยกันเลย


(defun c:cop () ; ตั้งชื่อโปรแกรมของเรา cop (cone pattern) ให้การตั้งชื่อให้เราตรวจสอบด้วยว่าไปซ้ำ กับ คำสั่งใดๆ ใน AutoCAD หรือไม่โดยลองพิมพ์ที่ command: ว่าชื่อที่เราตั้งซ้ำหรือไม่ถ้าซ้ำก็ ให้เปลี่ยนใหม่ ซึ่งชื่อโปรแกรมของเราไม่ควรซ้ำกับคำสั่งใดๆเลย

(setq diamax (getdist "\n Max Diameter <20.0>: ")) ; กำหนดค่าตัวแปร diamax ฐานกรวย(ใหญ่) โดยการใส่ค่าที่ต้องการ ด้วย getdist ใส่เลขจำนวนเต็มหรือเลขจำนวนจริง

(if (not diamax) (setq diamax 20.0)) ; ทำการทดสอบตัวแปร diamax ด้วยฟังชั่น if ถ้าไม่ได้ใส่ขนาดฐาน กรวย (ใหญ่) หรือกด Enter ผ่านไป ให้ตั้งค่าเริ่มต้น diamax เป็น 20.0

(setq diamin (getdist "\n Min Diameter <10.0>: ")) ; กำหนดค่าตัวแปร diamin ยอดกรวย(เล็ก)โดย การใส่ค่าที่ต้องการด้วย getdist ใส่เลขจำนวนเต็มหรือเลขจำนวนจริง

(if (not diamin) (setq diamin 10.0)) ; ทำการทดสอบตัวแปร diamin ด้วยฟังชั่น if ถ้าไม่ได้ใส่ขนาดยอด กรวย (เล็ก) หรือกด Enter ผ่านไป ให้ตั้งค่าเริ่มต้น diamin เป็น 10.0

(setq he (getdist "\n Height of cone <20.0> : ")) ; กำหนดค่าตัวแปร he (Height) ความสูงของกรวยตัด โดยการใส่ค่าที่ต้องการด้วย getdist ใส่เลขจำนวนเต็มหรือเลขจำนวนจริง

(if (not he) (setq he 20.0)) ; ทำการทดสอบตัวแปร he (Height) ด้วยฟังชั่น if ถ้าไม่ได้ใส่ขนาดความสูง หรือกด Enter ผ่านไป ให้ตั้งค่าเริ่มต้น he (Height) เป็น 20.0

(initget 1) ; กำหนดค่า bit 1 ไม่ให้ Enter ผ่านไปให้ใช้การเลือกตำแหน่งเท่านั้น

(setq cen (getpoint "\n Pick Center Point : ")) ; กำหนดค่าตัวแปร cen เป็นการเลือกจุดศูนย์กลางของ กรวยที่เราจะทำการคลี่ ด้วย getpoint เลือกจุดพิกัดหรือตำแหน่ง

(setq rx (/ diamax 2)) ; กำหนดค่าตัวแปร rx เป็นรัศมีของฐานกรวย (ใหญ่)

(setq rn (/ diamin 2)) ; กำหนดค่าตัวแปร rn เป็นรัศมีของยอดกรวย (เล็ก)

(setq dr (- rx rn)) ; กำหนดค่าตัวแปร dr เป็นระยะฐานของสามเหลี่ยม โดยใช้รัศมี rx – rn เพี่อที่จะใช้หามุม beta ต่อไป

(setq beta1 (atan (/ he dr))) ; กำหนดค่าตัวแปร beta1 เป็นค่ามุมที่เราต้องการหาเพื่อที่จะนำไปหาค่า ความยาวจริงของสามเหลี่ยมโดยใช้ atan (อาร์คแทน) หาค่าจาก ความสูง he (Height) หารด้วยระยะของฐานสามเหลี่ยม dr มุมที่ได้จะมีหน่วยเป็น radian (เรเดียน) * สูตรจาก ตารางมุม

(setq h1 (/ dr (cos beta1))) ; กำหนดค่าตัวแปร h1 เป็นค่าความยาวจริงที่เราต้องการ โดยหาจากความ ยาวฐานของสามเหลี่ยม dr หารด้วยค่า (cos ของมุม beta1) * สูตรจากตารางมุม

(setq h1 (sqrt (+ (expt he 2) (expt dr 2)))) ; กำหนดค่าตัวแปร h1 เป็นค่าความยาวจริงที่เราต้องการ โดยหาจากความสูง he(Height) และความยาวฐานของสามเหลี่ยม dr ถ้าเราทราบค่าทั้ง สองนี้เราสามารถหาความยาว h1 ได้อีกแบบคือ h1 =  he2 + dr2 คือ สแควรูท he ยก กำลัง 2 + dr ยกกำลัง 2 *ให้เราเลือกเอาว่าจะใช้อันใดก็ได้ตามสะดวก

(setq r1 (/ rn (cos beta1))) ; กำหนดค่าตัวแปร r1 เป็นค่าความยาวจริงของกรวยบนที่เราต้องการ โดยหา จากความยาวฐานของสามเหลี่ยม rn หารด้วยค่า (cos ของมุม beta1) *สูตรจากตารางมุม ซึ่งเราจะใช้ในการวาดแผ่นคลี่

(setq r2 (+ r1 h1)) ; กำหนดค่าตัวแปร r2 เป็นค่าความยาวจริงของกรวย (ยอดแหลมจากฐาน) ที่เรา ต้องการโดยหาจากความยาว (+ r1 h1) ซึ่งเราจะใช้ในการวาดแผ่นคลี่

(setq cirn (* 2 pi rn)) ; กำหนดค่าตัวแปร cirn เป็นค่าความยาวจริงของเส้นรอบวงยอดกรวย (เล็ก) สอง พายอาร์ (rn รัศมียอดกรวยเล็ก)

(setq cirx (* 2 pi rx)) ; กำหนดค่าตัวแปร cirx เป็นค่าความยาวจริงของเส้นรอบวงฐานกรวย (ใหญ่) สองพาย อาร์ (rx รัศมีฐานกรวยใหญ่)

(setq Beta2 (/ cirn r1)) ; กำหนดค่าตัวแปร beta2 เป็นค่ามุมที่เราต้องการหาเพื่อที่จะนำไปใช้ในการวาด รูปแผ่นคลี่จริง จากสูตรในส่วนของวงกลม คือความยาวของเส้นรอบวง cirn หารด้วยค่า ความยาวจริงของกรวย r1 มุมที่ได้จะมีหน่วยเป็น radian (เรเดียน)

; set position ต่อไปเป็นการกำหนดตำแหน่งเพื่อจะใช้ในการวาดแผ่นคลี่

(setq p1 (polar cen 0 r1)) ; กำหนดค่าตัวแปร p1 เป็นจุดเริ่มของการวาดแผ่นคลี่ โดยใช้คำสั่ง polar จาก จุด cen ที่เราได้เลือกเอาไว้แล้วเป็นจุดอ้างอิง ชี้ทิศทางไปยัง 0 องศาจาก ตัวอย่างที่ 17 โดย ให้ระยะจากค่าความยาวจริงของกรวยบน r1

(setq p2 (polar cen Beta2 r1)) ; กำหนดค่าตัวแปร p2 เป็นจุดที่สองของการวาดแผ่นคลี่ โดยใช้คำสั่ง polar จากจุด cen ที่เราได้เลือกเอาไว้แล้วเป็นจุดอ้างอิง ชี้ทิศทางไปยังองศาที่ได้จาก การ คำนวณ beta2 โดยให้ระยะจากค่าความยาวจริงของกรวยบน r1

(setq p3 (polar cen 0 r2)) ; กำหนดค่าตัวแปร p3 เป็นจุดที่สามของการวาดแผ่นคลี่ โดยใช้คำสั่ง polar จากจุด cen ที่ ชี้ทิศทางไปยัง 0 องศา โดยให้ระยะจากค่าความยาวจริงของกรวย (ยอด แหลมจากฐาน) คือ r2

(setq p4 (polar cen Beta2 r2)) ; กำหนดค่าตัวแปร p4 เป็นจุดที่สี่ของการวาดแผ่นคลี่ โดยใช้คำสั่ง polar จากจุด cen ที่ ชี้ทิศทางไปยังองศาที่ได้จาก การคำนวณ beta2 โดยให้ระยะจากค่าความ ยาวจริงของกรวย(ยอดแหลมจากฐาน) คือ r2

; Pattern Drawing ส่วนนี้เป็นการวาดรูปแผ่นคลี่ตามจุดต่างๆที่เราได้กำหนดเอาไว้

(command "ARC" p1 "c" cen p2) ; เราจะใช้คำสั่ง arc ในการเขียนส่วนโค้ง โดยเริ่มจากจุด p1 โดยเลือก options เป็น "c" คือ center ที่ตัวแปร cen แล้วก็วาดเส้นโค้งจากจุด p1 ไปยังจุด p2 จะ ได้ความยาวส่วนโค้งเท่ากับ cirn เส้นรอบวงยอดกรวย (เล็ก)

(command "ARC" p3 "c" cen p4) ; ใช้คำสั่ง arc ในการเขียนส่วนโค้งที่สอง โดยเริ่มจากจุด p3 โดยเลือก options เป็น "c" คือ center ที่ตัวแปร cen แล้วก็วาดเส้นโค้งเช่นเดียวกันกับส่วนโค้งแรก วาดเส้นโค้งจากจุด p3 ไปยังจุด p3 จะได้ความยาวส่วนโค้งเท่ากับ cirx เส้นรอบวงฐาน กรวย (ใหญ่)

(command "LINE" p1 p3 "") ; ใช้คำสั่ง line ในการเขียนตรง โดยเริ่มจากจุด p1และ p3

(command "LINE" p2 p4 "") ; ใช้คำสั่ง line ในการเขียนตรง โดยเริ่มจากจุด p2 และ p4

(princ) ; ลบechoสิ้นสุดคำสั่ง

); สิ้นสุดฟังก์ชัน

วันจันทร์ที่ 16 กรกฎาคม พ.ศ. 2561

Piping 2D and 3D



(defun pipe3D ()
; กำหนดตัวแปรต่างๆ ในฟังชั่น input
            (setq dia (getdist "\n ขนาดเส้นผ่าศูนย์กลางท่อ  : <20> ")) ; กำหนด dia (Diameter) เป็นขนาดเส้นผ่าศูนย์กลางท่อ
            (if (not dia) (setq dia 20.0)) ; กำหนดค่าเริ่มต้นของ dia เป็น 20.0 mm. หรือ  1/2"
            (setq tk (getint "\n ความหนาท่อ  <4> : ")); กำหนด tk เป็นความหนาท่อ (getint เลขจำนวนเต็ม)
            (if (not tk) (setq tk 4)) ; กำหนดค่าเริ่มต้นของ tk  เป็น 4 mm.             
            (setq p1 (getpoint "\n จุดเริ่มต้น Pick Frist Point: ")); กำหนดจุดเริ่มต้นของท่อ
            (setq p2 (getpoint p1 "\n จุดสุดท้าย Pick Second Point: ")); กำหนดจุดสุดท้ายของท่อ
            (command "_LINE" p1 p2 "") ; ใช้คำสั่ง line วาดเส้นแนวท่อ
            (setq ssline (ssget "L")) ; กำหนดให้เส้นที่เราวาดเป็นตัวเลือก ssline ด้วย (ssget "L")
            (command "_CIRCLE" p1 (/ dia 2)) ;  วาดวงกลมขนาดเส้นผ่าศูนย์กลางท่อ dia
            (setq ssdiax (ssget "L")) ; กำหนดให้วงกลมขนาดเส้นผ่าศูนย์กลางท่อ dia เป็นตัวเลือก ssdiax ด้วย (ssget "L")
            (command "_CIRCLE"  p1 (- (/ dia 2) tk)) ; วาดวงกลมขนาดเส้นผ่าศูนย์กลางท่อ dia-tk
            (setq ssdian (ssget "L")) ; กำหนดให้วงกลมขนาดเส้นผ่าศูนย์กลางท่อ dia-tk เป็นตัวเลือก ssdian ด้วย (ssget "L")
            (command "_SWEEP" ssdiax "" ssline) ; ใช้คำสั่ง SWEEP ของ 3D ใช้ตัวเลือก ssdiax ("" = Enter) ใช้ตัวเลือก ssline แนวท่อ
            (setq ss3dx (ssget "L")) ; กำหนดให้ท่อ dia 3D เราวาดเป็นตัวเลือก ss3dx ด้วย (ssget "L")
            (command "_SWEEP" ssdian "" ssline)  ; ใช้คำสั่ง SWEEP ของ 3D ใช้ตัวเลือก ssdian ("" = Enter) ใช้ตัวเลือก ssline แนวท่อ
            (setq ss3dn (ssget "L")) ; กำหนดให้ท่อ dia-tk 3D เราวาดเป็นตัวเลือก ss3dn ด้วย (ssget "L")
            (command "_SUBTRACT" ss3dx "" ss3dn "")  ; ใช้คำสั่ง SUBTRACT ตัดออกของ 3D ใช้ตัวเลือก ss3dx ("" = Enter)
                       
(princ) ; ลบechoสิ้นสุดคำสั่ง
)           ; สิ้นสุดฟังก์ชัน
;;--------------------------------------------------------------------





(defun pipe2D (/ p1 p2)
(setq old_osnap (getvar "osmode"))

(setvar "osmode" 0)
            (defun rtd (x)                           ;radial to degee
                           (/ (* x 180) pi))
            (defun dtr (x)                           ;degee to radial
                          (* x (/ pi 180)))         
; กำหนดตัวแปรต่างๆ ในฟังชั่น input
            (setq dia (getdist "\n ขนาดเส้นผ่าศูนย์กลางท่อ  : <20> ")) ; กำหนด dia (Diameter) เป็นขนาดเส้นผ่าศูนย์กลางท่อ
            (if (not dia) (setq dia 20.0)) ; กำหนดค่าเริ่มต้นของ dia เป็น 20.0 mm. หรือ  1/2"
            (setq tk (getint "\n ความหนาท่อ  <4> : ")); กำหนด tk เป็นความหนาท่อ (getint เลขจำนวนเต็ม)
            (if (not tk) (setq tk 4)) ; กำหนดค่าเริ่มต้นของ tk  เป็น 4 mm.             
            (setq p1 (getpoint "\n จุดเริ่มต้น Pick Frist Point: ")); กำหนดจุดเริ่มต้นของท่อ
            (setq p2 (getpoint p1 "\n จุดสุดท้าย Pick Second Point: ")); กำหนดจุดสุดท้ายของท่อ
            (setq ang0 (angle p1 p2))                   ;;angle 0.0
            (setq ang1 (+ ang0 (DTR 90.0)))  ;;angle 90.0
            (setq ang2 (+ ang0 (DTR 180.0))) ;;angle 180.0
            (setq ang3 (+ ang0 (DTR 270.0)))       ;;angle 270.0  
            (setq p3 (Polar p1 ang1 (/ dia 2.0))
                          p4 (Polar p3 ang0 (distance p1 p2))
                          p5 (Polar p4 ang3 dia)
                          p6 (Polar p5 ang2 (distance p1 p2))
                          p7 (Polar p1 ang1 (-(/ dia 2.0) tk))
                          p8 (Polar p7 ang0 (distance p1 p2))
                          p9 (Polar p1 ang3 (-(/ dia 2.0) tk))
                          p10 (Polar p9 ang0 (distance p1 p2))
            )

                (command "_line" p1 p2 ""); วาดเส้นตรงที่จะทำเป็นเส้นศูนย์กลาง center line
            (setq sscen (ssget "L")) ; กำหนดให้เส้นที่เราวาดเป็นตัวเลือก sscen ด้วย (ssget "L")
            (command "_pline" p3 p4 p5 p6 "c"); วาดเส้นต่อเนื่องเป็นท่อ
            (command "_line" p7 p8 ""); วาดเส้นตรงที่จะทำเป็นเส้นประ hidden line                   
            (setq sshid1 (ssget "L")) ; กำหนดให้เส้นที่เราวาดเป็นตัวเลือก sshid1 ด้วย (ssget "L")
            (command "_line" p9 p10 ""); วาดเส้นตรงที่จะทำเป็นเส้นประ hidden line                             
            (setq sshid2 (ssget "L")) ; กำหนดให้เส้นที่เราวาดเป็นตัวเลือก sshid2 ด้วย (ssget "L")
            (if (null (tblsearch "LType" "center")); ตรวจสอบเส้นศูนย์กลาง center line ว่ามีอยู่หรือไม่
                        (command "_linetype" "load" "center" "acad.lin" "" ""); ถ้าไม่มีอยู่ให้ทำการเรียกใช้งานเส้นศูนย์กลาง center line
            );if null center line
            (if (null (tblsearch "LType" "HIDDEN")); ตรวจสอบเส้นประ hidden line ว่ามีอยู่หรือไม่
                        (command "_linetype" "load" "hidden" "acad.lin" "" ""); ถ้าไม่มีอยู่ให้ทำการเรียกใช้งานเส้นประ hidden line
            );if null hidden line
            (command "_chprop" sscen "" "_ltype" "center" ""   ; เปลี่ยนเส้นตรง Line ให้เป็นเส้นศูนยกลาง  center line
                                     "_chprop" sshid1 sshid2 "" "_ltype" "hidden" ""   ; เปลี่ยนเส้นตรง Line ให้เป็นเส้นประ  hidden line
                                     "_chprop" sscen sshid1 sshid2 "" "_ltScale" "1" "" ;แก้สเกลเส้นศูนย์กลางกับเส้นประเป็นสเกล 1
                                     "_chprop" sscen sshid1 sshid2 "" "Color" "Yellow" "";เปลี่ยนสีเส้นศูนย์กลางกับเส้นประเป็นสเกล เป็นสีเหลือง
            )                                  
 (setvar "osmode" old_osnap)
(princ) ; ลบechoสิ้นสุดคำสั่ง
)           ; สิ้นสุดฟังก์ชัน


 (defun c:p23d (); ชื่อโปรแกรมที่จะเรียกใช้งาน
            (initget "2D 3D");ข้อความตัวเลือก
                        (setq view (getkword "Select View [2D/3D] <2D>: "));Popup เมนูให้เลือก
            (if (not view)(setq view "2D")) ; กำหนกค่าเริ่มต้นให้เป็น 2D
            (cond  
                        ((= view "2D")(pipe2D)) ; ใช้ cond เป็นตัวเลือกถ้าค่า view = “2D” ให้เรียกใช้งาน pipe2D
                        ((= view "3D")(pipe3D)) ; ใช้ cond เป็นตัวเลือกถ้าค่า view = “3D” ให้เรียกใช้งาน pipe3D
            ) 
  (princ)
)
(prompt "\nEnter P23D to start.")