Tuesday, June 14, 2022

LISP ยังมีคนใช้อยู่ไหม

                 บล้อค นี้ ยังมีอยู่  แต่คนเขียน ไปทำอย่างอื่นมานาน       มา ณ วันนี้   LISP ของ AutoCAD ที่เรียกว่า  AutoLISP  ก็ยังอยู่ในชีวิตประจำวันของ คนเขียนแบบ       ยังมีหลายคน  สนใจ  พัฒนา ฟังก์ชัน ขึ้นมาใช้เอง


อยาก ถามว่า  ถ้าจะเขียน บทความเรื่องนี้   หรือ แจก  LISP ฟรี   ยังจะมีคนต้องการไหม   ?????


ช่วยตอบใน คอมเม้นท์ นะ

Wednesday, January 7, 2015

AutoLISP หรือ VBA

 คำถามที่มักจะได้ยินอยู่เสมอคือ การพัฒนาโปรแกรมบน AutoCAD ควรใช้อะไรระหว่าง AutoLISP กับ VBA ? ตัวไหนดีกว่ากัน ?

คำตอบที่ตอบได้ทันทีคือ ดีทั้งคู่ และก็ควรจะใช้เป็นทั้ง 2 ตัว แต่ในทางปฏิบัติแล้วทำไม่ได้ทันที แต่คำตอบที่แท้จริงจะได้จากการประมวลจากคำตอบของอีกหลายคำถามซึ่งจะช่วยให้คุณตัดสินใจได้อย่างมั่นใจ ตัวอย่างเช่น คุณเคยเรียนรู้ภาษา เบสิค บ้างหรือเปล่า ? ถ้าเคย ก็จะทำให้คุณเรียนรู้ VBA ได้เร็วแน่นอน ถ้าไม่ แล้วคุณเคยเรียนภาษาอื่นอีกไหมเช่น Fortran หรือ Pascal ถ้าเคยก็จะทำให้คุณเรียนรู้ VBA ได้ค่อนข้างง่ายเนื่องจกคุณมีพิ้นฐานการเขียนโปรแกรมมาแล้ว แต่ถ้าคุณไม่รู้จักการเขียนโปรแกรมภาษาใด ๆ เลย การเรียนรู้ AutoLISP น่าจะเป็นสิ่งที่ง่ายกว่า

พื้นฐานและประสบการณ์ของคุณก็ไม่ใช่สิ่งเดียวที่จะใช้ในการพิจารณาตัดสินใจ เลือกศึกษาภาษาใด ยังมีอีกคำถามหนึ่งซึ่งตอบได้ยากพอสมควร คือ เป้าหมายของคุณคืออะไร ? ในแต่ละภาษาที่ข้อดี และข้อด้อย อยู่ในตัวมันเอง อย่าง AutoLISP จะดีในแง่การสร้างคำสั่งใหม่ ๆ และการสร้างชุดคำสั่งจากคำสั่งที่มีอยู่แล้ว VBA ดีในแง่การจัดการกับ ออบเจคทั้งใน AutoCAD และ แอพพลิเคชันอื่นจาก ไมโครซอฟท์ เช่น MSExcel หรือ MSWord AutoLISP เป็นระบบประมวลผลแบบทีละขั้นที่ โปรแกรมเมอร์สามารถเก็บข้อมูลและนำมาประมวลผลได้ง่าย ในขณะที่ VBA มีออบเจคต่าง ๆ ที่เก็บข้อมูลและค่ากำหนดต่าง ๆ สำหรับการประมวลผลที่ซับซ้อน มันเป็นคำถามที่ตอบยาก ถ้าเราไม่รู้ให้ลึกกว่านี้ แต่ก็เพื่อให้คุณได้ตระหนักถึง จุดที่คุณต้องการ เมื่อได้เริ่มศึกษาภาษาใด ภาษาหนึ่ง

หลังจากที่คุณได้ศึกษาไปบ้างแล้ว คุณจะพบว่าคำตอบของผมนั้นถูกต้อง คุณต้องรู้ทั้งสองภาษา เพราะบางครั้งคุณอยากเขียนโปรแกรมง่าย ๆ ไม่กี่บรรทัด มาใช้งานซึ่งใช้เพียง AutoLISP ก็พอ แต่ถ้าคุณต้องการเขียนแอพพลิเคชันที่ซับซ้อน ก็ควรใช้ VBA เพราะมีเครื่องมือที่ช่วยทำระบบติตด่อกับผู้ใช้ แบบ ไดอะลอกที่ง่ายกว่า AutoLISP และ VBA สามารถเข้าถึง AutoCAD ในระดับ ออบเจค แต่ก็ไม่ได้ช่วยให้การเรียกใช้คำสั่งของ AutoCAD ดีมากขึ้น ซึ่งบางครั้ง AutoLISP กลับจะใช้งานได้ดีกว่า

มีสัจธรรมอยู่ข้อหนึ่งคือ - ภาษาทั้งสองนี้ไม่สามารถทำงานร่วมกันได้ นั่นคือมันไม่ง่ายเลยที่คุณจะเขียนเครื่องมือ(utility) สำหรับ AutoCAD ด้วย AutoLISP และนำไปใช้กับ VBA และก็ไม่ง่ายเช่นกันที่จะเขียนเครื่องมือต่าง ๆ(utility) ด้วย VBA และนำมาใช้ใน AutoLISP แต่ผมไม่ได้บอกว่า มันเป็นไปไม่ได้ เพียงแต่ว่ามันไม่ง่ายที่จะทำ ปัญหาคือเมื่อโปรแกรมเมอร์ เริ่มต้นศึกษากับภาษาใดไปแล้ว ส่วนใหญ่ก็ยังคงใช้ภาษานั้นต่อไป มันยากที่คุณจะเปลี่ยนแปลงกลางคันเมื่อถึงจุดที่มีปัญหา

Building a Vocabulary
เราจะเริ่มมองหาความแตกต่างระหว่าง สองภาษานี้ในเชิงเทคนิคก่อน AutoLISP เป็นเครื่องมือที่น่าอัศรรย์สำหรับการรวมเอาโครงสร้างทางตรรกศาสตร์เข้าด้วยกันกับ คำสั่งของ AutoCAD คุณสามารถดึงเอาคำสั่งของ AutoCAD มาใช้ในสคริปต์ที่คุณเขียนในลักษณะที่เป็นเงื่อนไขและการวนรอบ(loop) ได้ ซึ่งจะทำให้คุณสร้างคำสั่งใหม่ ๆ ที่ฉลาดและใช้ได้ดี ซึ่งเหมาะกับงานที่ต้องทำซ้ำ ๆ เพื่อให้ได้ผลลัพธ์

การเรียกใช้ออบเจคของ VBA มีประโยชน์มากกว่าการเรียกใช้แบบคำสั่งใน AutoLISP เช่น คุณสามารถเลือกเส้น หรือ วงกลมที่ต้องการได้ทันที และโปรแกรมของคุณจะรู้ทันทีว่าจะต้องทำงานกับสิ่งที่คุณเลือก แต่ถ้าคุณเขียนด้วย AutoLISP ผู้ใช้โปรแกรมสามารถเลือกสิ่งต่าง ๆ ได้ในขณะที่คำสั่งกำหนดให้เท่านั้น
แต่อย่างไรก็ตาม การประมวลผลแบบออบเจคนี้ก็สามารถใช้ได้แล้วกับ Visual LISP แต่โปรแกรมเมอร์ AutoLISP ส่วนใหญ่ก็จะไม่ค่อยใช้การเรียกใช้ แบบออบเจค

อีกจุดหนึ่งซึ่ง Visual LISP (AutoLISP เดิม) ดูจะเหนือกว่า VBA ก็คือความใกล้ชิดในเชิงเทคนิคกับ AutoCAD VBA ไม่ได้เกิดมากับ AutoCAD แต่มันเป็นเพียงโปรแกรมเสริมเข้ามา เหมือนที่เสริมกับ MSExcel หรือ MSWord คุณจะเห็นได้ถึงตัวอย่างของความแตกต่างได้ เช่น คุณสามารถใช้คำสั่ง (PROMPT) หรือ (PRINT) ได้ทันทีใน VisualLISP แต่ใน VBA คุณจะต้องเรียกใช้จาก ออบเจคUtility ที่อยู่ภายใต้ Drawing อีกทีหนึ่ง

(prompt "\n starting.")

thisDrawing.Utility.Prompt Chr$(10) & "starting"

จุดแตกต่างที่เห็นได้ชัดคือ VisualLISP ใช้ " \n " เพื่อขึ้นบรรทัดใหม่ แต่ VBA ใช้ Chr$(10) และใช้เครื่องหมาย & เพื่อเชื่อมกับสตริงที่ต้องการแสดงผล

ใน AutoLISP ," \n" ที่เคยใช้กับคำสั่ง (PRINT) เพื่อขึ้นบรรทัดใหม่ บัดนี้ก็ไม่ต้องใช้แล้วเนื่องจากคำสั่ง (PRINT) จะขึ้นบรรทัดใหม่ให้เอง นอกจากนี้ คำสั่ง(PRINT) สามารถใช้กับข้อมูลชนิดใด ๆ ก็ได้ แต่ (PROMPT) จะใช้กับข้อมูลสตริงเท่านั้น

ในส่วนของการแปลงชนิดของข้อมูล AutoLISP มีฟังก์ชันในการแปลงข้อมูลหลายฟังชันก์ เช่น (RTOS) แปลงจำนวนจริงให้เป็นสตริง (ITOA) ใช้แปลง integer สำหรับ VBA มีฟังก์ชันในการแปลงตัวเลข2ฟังก์ชัน คือ STR แปลงให้เป็นสตริงและมี space ข้างหน้า 1 ช่อง และ FORMAT กำหนดรูปแบบของการแปลงเป็นสตริงให้มีรูปแบบต่าง ๆ

Balancing the Scales
ใน AutoLISP คุณสามารถสร้างคำสั่งขึ้นเองได้ ด้วยฟังก์ชัน "C:" ซึ่งจะทำงานเหมือน คำสั่งของ AutoCAD ฟังก์ชัน C: เรีบกว่า command functions สำหรับ VBA นั้น มี มาโคร และคุณต้องรันมาโครจาก VBA Program Manager เท่านั้น

จากการที่ VBA ไม่สามารถรันที่ command prompt ได้นั้น ไม่ใช่ปัญหาที่หนักหนานัก เนื่องจากคุณสามารถ รัน VBA program manager และเรียกมาโครมาทำงานได้ โดยใช้ AutoLISP ได้ แต่ต้องจำไว้ว่า เมื่อคุณใช้คำสั่ง (COMMAND) อย่าลืมใส่ "-" ข้างหน้าดังตัวอย่าง

(command "-VBALOAD" "mymacros" "-VBARUN" "mymacro")

ถ้าไม่ใส่ "-" จะปรากฎ ไดอะลอก เพื่อให้เลือกมาโครที่จะรัน ซึ่งโปรแกรมเมอร์ส่วนใหญ่ไม่ต้องการ ไดอะลอกนี้
นอกจากนี้ VBA มีฟังก์ชันที่สามารถจัดการกับหลาย ๆ drawing ได้พร้อม ๆ กัน แต่คุณก็สามารถทำแบบนี้ได้บางส่วน ถ้าใช้ VisualLISP

ในส่วนอื่น ๆ ที่ VBA เหนือกว่า Visual LISP คือ ชนิดของข้อมูล ซึ่ง VBA มีมากกว่า VisualLISP มากรวมถึงข้อมูลแบบวันที่ และ เวลา ซึ่งใน VisualLISP จะเก็บอยู่เป็นสตริงหรือค่าตัวเลข เมื่อคุณต้องการใช้คุณจะได้มาเป็นจำนวนจริง ตามแบบปฏิทินโบราณ

การประมวลผลเกี่ยวกับวันที่และเวลาใน VBA ทำได้ไม่ง่ายนัก ต้องใช้ฟังก์ชัน Format ช่วยจัดให้ได้รูปแบบตามที่ต้องการ

ผมได้ฟังคำกล่าวอ้างจาก โปรแกรมเมอร์รุ่นเก๋าว่า VBA ไม่สามารถรองรับการทำงานได้เท่า LISP ซึ่งมันเป็นเรื่องจริง แต่VBA ก็รองรับตัวแปรได้หลายแบบ กับโครงสร้างข้อมูลที่หลากหลาย แต่ LISP ก็สามารถจัดการกับข้อมูลได้ด้วยการใช้คำสั่งไม่กี่บรรทัด ซึ่งบางครั้งก็ต้องเป็นโปรแกรมเมอร์ระดับเซียน

บอกตามตรงได้ว่า การประมวลผลแบบ list ไม่น่าสนใจเท่า การประมวลผลแบบ ออบเจค ในสายตาของโปรแกรมเมอร์ ใน VBA คุณสามารถเชื่อมโยงกับระบบอื่น ๆ ที่รองรับการทำงานแบบออบเจคเหมือนกัน เช่นคุณสามารถรัน AutoCAD ได้ภายในสเปรดชีตของ MSExcel หรือ MS Word ซึ่งทำให้มองเห็นถึงศักยภาพในการที่จะพัฒนาซอฟท์แวร์ที่ทำงานแบบอัตโนมัติ

จากการทดลองสร้างโปรแกรมที่ทำงานแบบเดียวกัน 2 โปรแกรม แต่เขียนด้วย VBA และ VisualLISP ซึ่งแตกต่างกัน คือ VBA รองรับคอนเซปใหม่สำหรับโปรแกรมเมอร์ได้ดี แต่ก็ยังมีจุดบกพร่องอยู่ไม่น้อยซึ่งทำให้โปรแกรมที่ทำงานดูง่าย แต่กลับเขียนได้ยาก ผมกลับชอบ VisualLISP มากขึ้นเพราะ มีตัวเลือกให้ทำงานได้มากขึ้น แต่หลายครั้งที่ทำงานให้ลูกค้าโดยใช้ VBA เนื่องจากง่ายต่อการปรับแก้ และมีอินเตอเฟสดี ลูกค้าหลายคนที่ไม่มีประสบการณ์ในการพัฒนา AutoCAD ด้วยตัวเองแต่เคยรู้ภาษา Basic ซึ่งทำให้เขารู้สึกคุ้นเคยที่จะทำการปรับแก้ด้วยตัวเองในอนาคต

ทุกเหตุผลที่กล่าวมาแล้ว น่าจะอธิบายได้ว่า ทำไมผมถึงแนะนำให้เรียนทั้งสองภาษา แต่การเริ่มต้นกับ VisualLISP หรือ VBA ภาษาใดภาษาหนึ่งก็ถือว่า OK ในลำดับแรก ขอให้คุณศึกษาการรันคำสั่ง LISP จาก VBA หรือรัน โปรแกรมที่เขียนด้วย VBA โดยเรียกผ่าน VisualLISP จากนี้คุณจะรู้ว่าต้องศึกษาอะไรต่อ

เริ่มที่ไหนดี
หากต้องตัดสินใจเพื่อเลือกแล้ว ให้พิจารณาดังนี้ ถ้าคุณรู้คำสั่ง AutoCAD ดีและต้องการทำเป็นชุดคำสั่ง ให้คุณเริ่มที่ VisualLISP แต่ถ้าคุณเป็น โปรแกรมเมอร์ ซึ่งเข้าใจการทำงานแบบ Objected Oriented คุณควรเริ่มที่ VBA ถ้าคุณเป็นโปรแกรมเมอร์ภาษา C++ ให้คุณศึกษา ObjectARX (ไลบราลีของ C++ สำหรับสร้าง DLL ) ผมไม่ได้เปรียบเทียบถึง ObjectARX เนื่องจาก การเขียนจะต้องใช้คอมไพเลอร์ C++ ต่างหาก

คำแนะนำสุดท้าย สำหรับผู้ที่ต้องการเขียนโปรแกรมบน AutoCAD คือควรหาหนังสือและบทความจากเวบไซต์ที่มีตัวอย่างมาก ๆ ครับ

Tuesday, June 17, 2014

วิธีการ นำ โปรแกรม lisp เข้ามารัน

การเขียน โปรแกรม ออโตลิสพ์ แบบดั้งเดิมคือการ ใช้ text editor ทั่ว ๆไป   ง่ายที่สุดก็ใช้ notepad. เครื่องมือมาตรฐานที่มากับ วินโดวส์

เปิด notepad ขึ้นมาแล้วก็เขียนโปรแกรมลงไป แล้วบันทึกลงเป็นไฟล์ ตั้งชื่อตามชอบใจ แต่นามสกุล ต้องเป็น lsp

วิธีการนำเข้ามาใช้งาน ทำได้โดย

- เปิดโปรแกรม Autocad.
- ใช้คำสั่ง appload  แล้วเลือกไฟล์ที่ เขียนและบันทึกเอาไว้
- รันคำสั่งที่สร้างไว้ในโปรแกรม

ลองกับโปรแกรมนี้ดูครับ

(defun c:cxc ()
(+ 100 5)
)

โหลดแล้วรันคำสั่ง  cxc นะ  จะได้ผลบวกของ  100+5






Tuesday, June 10, 2014

ย้อนยุค ไปเริ่มต้น กับ Autolisp

สำหรับคนที่รู้จัก AutoCAD ก็คงต้องรู้จัก หรือ เคยได้ยินคำว่า  Autolisp

AUTOLISP  คือภาษาการเขียนโปรแกรมคอมพิวเตอร์  ภาษาหนึ่ง  รากฐานเดียวกับ ภาษา LISP   แต่ที่มีคำว่า Auto นำหน้าเพราะว่า  ทำงานอยู่บน AutoCAD    ซึ่ง ผู้ใช้งาน AutoCAD สามารถใช้ภาษา  Autolisp  เขียน โปรแกรม หรือชุดคำสั่งใหม่ ขึ้นมาเพื่อตอบสนองความต้องการของตนเองได้ เช่น

อยากจะมีคำสั่ง ที่ เลือกวงกลม  ที่มีขนาด  20 มม.  และ สีแดง  โดยเลือกทั้ง drawing ได้

อยากจะมีคำสั่งที่ เปลี่ยน วงกลม   ที่มีขนาด  20 มม  ให้เป็น รูปหกเหลี่ยม ทั้งหมด

สามารถทำได้ครับ  แต่ต้องเขียน โปรแกรมคำสั่งขึ้นมาใหม่


การเขียนโปรแกรม Autolisp  ถ้าเขียนเป็น คำสั่งสั้น ๆ ก็สามารถเขียนไปใน  command prompt : ได้เลย

แต่ถ้าโปรแกรม ยาว ๆ ก็เขียนไว้ใน  notepad  แล้ว เซฟไว้ในนามสกุล  lsp  แล้ว ค่อยโหลดมา รันทำงานเมื่อต้องการ ครับ



จะขอนำเสนอ วิธีเขียนง่าย ๆ  พื้น ๆ กันก่อนนะ ครับ   ก็ต้องเริ่มจาก การเขียน คำว่า   สวัสดีชาวโลก  หรือ  Hello World !  กันก่อน



หมายเหตุ  ในการแสดง ตัวอย่างการเขียน คำสั่งของ Autolisp   ผมจะ ใช้ซอฟต์แวร์ CAD ทางเลือก ที่มีความสามารถรองรับ Autolisp ได้เหมือนกัน   นะครับ  แจ้งให้ทราบล่วงหน้า


ที่  command prompt :  พิมพ์   (defun c:kk   ()   (princ "Hellow world!")  )

ผลลัพธ์ คือ

Command: (defun c:kk () (princ "hello") )
C:KK
Command: kk
hello
"hello"
Command:


การเขียน Autolisp  มีรูปแบบ คือ

เปิด วงเล็บ / คำสั่งพร้อมตัวแปร  / ปิดวงเล็บ
เช่น
(princ  "Hello")    เป็นตัวอักษร ต้อง ครอบด้วย เครื่องหมาย คำพูด

(defun c:kk    ()     xxxxxxxxxxxxxx    )                   

คือการกำหนด หรือ define คำสั่งใหม่ ขึ้นมาที่ ไม่มีใน AutoCAD อย่าให้ซ้ำ ไม่งั้นจะทับคำสั่งเดิมไป
ในที่นี้คือ คำสั่ง kk   

()  วงเล็บ เปิด ปิด คือ ส่วนของการส่งผ่านค่าตัวแปร เพื่อไปประมวลผลทีอื่น ซึ่ง ตอนนี้ยังไม่มี

)   ปิด วงเล็บสุดท้าย  คือจบโปรแกรม

ลองทำตามกันดูนะครับ

คราวหน้ามาต่อ