แสดงบทความที่มีป้ายกำกับ AutoLISP แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ AutoLISP แสดงบทความทั้งหมด

AutoLISP เพื่อการหาค่า Coordinate , พิมพ์ค่าพิกัด N , E


AutoLISP เพื่อการหาค่า Coordinate



เขียนขึ้นมาสำหรับพี่ทัย Survey  ที่ต้องการคำสั่งช่วยหาค่า COORDINATE ค่า N,E เพื่อให้ระบุในแบบ

โหลดไฟล์นี้ไปใช้ครับ  Coord.lsp

คลิ๊กโหลดตรงนี้ครับ  คลิ๊กโหลดซิครับ

โหลดแล้วจะนำไปวางไว้ตรงไหนก็ตาม แต่ขอแนะให้พี่ควรจัดแยกไว้เพื่อหาให้เจอได้ง่ายๆ เช่นย้ายหรือก๊อปปี้มาไว้ใน D:\LISP (สร้างโฟลเดอร์ขึ้นมาใหม่จะดีกว่า)



เมื่อโหลดไฟล์เข้ามาแล้ว ให้ใช้คำสั่ง APPLOAD ในโปรแกรม AutoCAD แล้ว Enter
Command : APPLOAD
จะขึ้น Dialog Box ดังภาพข้างบน



ให้เลือกไฟล์ที่ต้องการโหลดเข้ามาใช้งาน คือไฟล์ COORD.LSP



เมื่อเลือกไฟล์ COORD.LSP แล้ว คลิ๊กที่ LOAD


ในบางเครื่องจะขึ้นข้อความ Security Concern เตือนเรื่องความปลอดภัย (AutoCAD version 2014 ขึ้นมาจะเตือนข้อความนี้ ) ให้คลิ๊กที่ LOAD เพื่อให้ใช้งานคำสั่ง


การใช้งาน ตามรูปเลยครับพี่ทัย ที่ Command line พิมพ์คำสั่ง COOR

Command : COOR
  Select point or Enter for Exit ...

แล้วคลิ๊กไปที่จุดที่ต้องการหาค่าพิกัด N , E
(ถ้ากด Enter ก็จะออกจากคำสั่งครับ)




จากนั้นก็คลิ๊กในพื้นที่ ที่ต้องการให้พิมพ์ตัวอักษรเท่านั้นครับ

ส่วนขนาดของตัวอักษรจะอยู่ที่การตั้งค่าตัวอักษรในขณะนั้น ซึ่งเปลี่ยนได้ไม่ยากครับพี่ทัยน่าจะทำได้



เขียนมาตั้งแต่ 2013 แน่ะนะนี่

Source Code : COORD.Lsp

; Command for write Coordinate. Modify by Thee on 8 June 2013
(setq p t) (defun cot (p)
(setq x (/ (car p) 1)
        y (/ (cadr p) 1)
        pp (strcat "(" "E="(rtos x) "," "N="(rtos y) ")")
        tp p
        pick (getpoint p "\n\tPick Position:")
)
   (if (/= tp nil)
   (command "text" pick "" "0" pp ))
)

(defun c:coor()
  (while (/= nil p)
  (setq p (getpoint "\n\tSelect point or ENTER for Exit ..."))
   (if (/= p nil) (cot p))
  )
 (setq p t) (prin1))
 (prompt "Start Command with COOR.")(prin1)





COORD.LSP


เสริมนิดนึงครับ สำหรับค่า E และ N 
หากใครต้องการสลับที่กัน

ให้ปรับแก้ไข ที่ บรรทัด   pp (strcat "(" "E="(rtos x) "," "N="(rtos y) ")")


สลับตำแหน่ง เป็น 

pp (strcat "(" "N="(rtos y) "," "E="(rtos x) ")")

เพียงเท่านี้ก็ใช้ได้ครับ

ใครจะนำไปประยุกต์ใช้กับวิธีการอื่นใดๆ ไม่ว่าครับ


AreaText ถามมา-ตอบไป

จากเมล์ครับ ขอสอบถามเกี่ยวกับ area text ครับ

     จะแก้โค้ด อย่างให้ให้ตัวหนังสือบอกมาแค่ตัวเลข
ผมไม่ต้องการ ในโค้ดที่ให้มา มีหน่วยเป็น ตร.ฟุต
ยกตัวอย่างเช่น ผมวาดรูปสี่เหลี่ยม 1 x 1 หน่วย
พอใช้คำสั่ง at แล้วกดเลือกพื้นที่นั่น มันบอกเป็น 0.01 ตร.ฟุต 
(ผมไม่ต้องการรูปแบบนี้ครับ)
อยากให้ออกมาเท่ากับ 1 (ตร.หน่วย) แค่นั้นเอง
ต้องแก้ code อย่างไรบ้างครับ

;;; AreaText.LSP ver 2.0
;;; Select a polyline and where to place the text
;;; Sample result: 2888.89 SQ. FT.

;;; By Jimmy Bergmark
;;; Copyright (C) 2007-2009 JTB World, All Rights Reserved
;;; Website: www.jtbworld.com
;;; E-mail: info@jtbworld.com
;;; 2007-09-05 - First release
;;; 2009-08-02 - Updated to work in both modelspace and paperspace

;;; Uses TEXTSIZE for the text height
(defun c:AT (/ entObject entObjectID InsertionPoint ad)
(vl-load-com)
(setq entObject (vlax-ename->vla-object(car (entsel)))
entObjectID (vla-get-objectid entObject)
InsertionPoint (vlax-3D-Point (getpoint "Select point: "))
ad (vla-get-ActiveDocument (vlax-get-acad-object))
)
(vla-addMText (if (= 1 (vla-get-activespace ad))
(vla-get-modelspace ad)
(if (= (vla-get-mspace ad) :vlax-true)
(vla-get-modelspace ad)
(vla-get-paperspace ad)
)
)
InsertionPoint 0.0 (strcat
"%<\\AcObjProp Object(%<\\_ObjId " (rtos entObjectID 2 0) ">%).Area \\f \"%pr2%lu2%ct4%qf1 SQ. FT.\">%"
))
)
โดยส่วนตัวแล้วผมยังอ่อนต่อ Visual Lisp อย่างมากครับ แต่เข้าใจว่าการปรับแก้ไข Code ก็ปรับที่ strcat ครับ โดยเอาหน่วย(สีแดงออกไป) การปรับแก้มากกว่านี้คงต้องให้ผู้รู้ที่เก่งกว่ามาช่วยตอบครับ
แต่ผมขอเสนอ AutoLISP ของผมที่เขียนแบบง่ายๆแต่ก็สามารถใช้ได้เช่นเดียวกันครับ
(defun sel_ob()
   (while (not en)
   (setq en (car (entsel "\nSelect Entities: ")))
   (if (not en)
   (prompt "\nNo entity selected --- Please Try Again : "))
   )
 )

(defun c:at1 (/ en ar aw th an pt)
 (sel_ob)  (Command "area" "entity" en)
 (setq ar  (getvar "area"))
 (setq atext (strcat "Area= " (rtos ar) " sq.m."))
 (setq pt (getpoint "\nText point :"))
 (setq th "0.2")
 (setq an "0")
 (command "text" pt th an atext)
(princ)
)

คิดว่าน่าจะพอแก้ขัดแก้ไขได้บ้างนะครับ
ขอขอบคุณ คุณณัฐวุฒิ ที่ถามมาครับ

ลบจุด Point บน Drawing

AutoLisp erasnode.lsp อันนี้ได้มานานมาแล้วครับ จำไม่ได้แล้วว่าไปเอามาจากไหน เอามาให้ลองใช้กันดูครับ เพราะจุด Point ที่เรามองไม่เห็นมักจะซ่อนอยู่ในงาน Drawing ของเรา หากมีมากก็จะไปกินพื้นที่ไฟล์งานของเรามากครับ Download ที่นี่ครับลองใช้กัน (ผมยังไม่ได้ลองใช้เลย เก็บไว้นานจนลืม อิอิ )

AutoLISP Setup Paper


Setup Paper



AutoLISP Setup Paper อันนี้เป็นอันที่ผมเขียนขึ้นมาใช้งานนานมากแล้วครับ ลองใช้คำสั่งแบบง่ายๆก่อน แล้วก็ค่อยๆปรับให้รับค่าตัวแปรที่เรากำหนดให้ เมื่อใช้งานได้ก็ตัดขั้นตอนกำหนดโดยกำหนดให้เป็นตัวแปรที่คงที่ แล้วใช้ scale เป็นการปรับแต่ง สุดท้ายก็นำเอา Dcl มาใช้ประกอบเพื่อสะดวกในการใช้งาน อธิบายมายาวเดี๋ยวไม่เข้าใจกัน ลองโหลด ไปดูกันเองดีกว่า Download SetupPaper ที่นี้ครับ 


โหลดแล้วมาดูกันครับจะได้เข้าใจมากขึ้น โดยผมกำหนดค่า pp ให้เป็นเงื่อนไขให้เลือก เป็น A4,A3,A2,A1 โดยเลือกตัวใดตัวหนึ่ง แล้วให้ไปใช้ฟังก์ชั่นของตัวที่ได้เลือก (ฟังก์ชั่น get_A*) ในฟังก์ชั่นจะกำหนดจุดเป็นค่าตัวเลข โดยใช้ เครื่องหมาย ' แล้วระบุค่าในแกน XY ทั้ง 4 จุด เราก็เขียนเส้นปิดสี่เหลี่ยมได้แล้ว ในฟังก์ชั่น draw จะกำหนดจุด pt1,pt2.pt3 และ pt4 โดยใช้ฟังก์ชั่น list แล้วกรองเอาค่าตัวแรกหรือตัวที่สอง โดยใช้ car และ cadr แล้วใช้คำสั่ง Pline เขียนเส้นปิด โดยผมจะกำหนด scale เป็นการรับค่าจาก ratio ที่ Dialog box แล้วให้เก็บค่าในตัวแปร sc ซึ่งจะต้องแปลงค่าตัวอักษร String เป็น ตัวเลขก่อนโดยใช้ฟังก์ชั่น rtos เมื่อเขียนกรอบกระดาษแล้ว ผมก็ให้ใช้คำสั่ง zoom all เพื่อให้เห็นภาพทั้งหมด เป็นการจบคำสั่งครับ ลองนำไปใช้งานดูนะครับ


คำสั่งชุดนี้โดยส่วนตัวแล้วผมจะใช้ในเวลาที่จะกำหนดกระดาษและมาตราส่วนของงานที่จะเขียนโดยให้มีกรอบขึ้นมาเป็นตัวกำหนดก่อน เพื่อจะคิดคร่าวๆว่าผมจะใช้ขนาด Dimension และ text ขนาดประมาณไหนได้ แต่หลังๆมานี้ไม่ค่อยได้ใช้เท่าไหร่นักครับ เพราะไม่ได้แปะไว้ใน Pulldown menu ไว้วันหลังจะมาบอกว่าการนำ AutoLISP ไปแปะไว้ต้องทำยังไง จะได้ไม่ต้องพิมพ์คำสั่งที่ command lineครับ

AutoLISP Setup Paper




AutoLISP คือ

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

คำสั่ง AutoLISP เพื่อใช้เขียนเสา

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

จนสุดท้ายได้ไปเจอที่มีคนอื่นได้เขียนเป็น Dialog box ไว้เพื่อให้ใช้งานได้สะดวกยิ่งขึ้น



ดูแล้วมันน่าสนใจมากๆ ก็เลยไปลองหาหนังสือมาอ่านดู หาข้อมูลจากอินเตอร์เน็ตบาง ลองทำแล้วก็ปรับแต่งไปบางส่วนจนทำให้มันใช้ได้ ลองโหลดไปใช้ดูนะครับ ไม่ดียังไงก็เข้าไปปรับปรุงดูให้ดียิ่งขึ้นก็ได้ เพราะผมไม่ได้ Protect Lisp ไฟล์นี้ อยากให้ลองศึกษาการเขียน DCL เหมือนที่ผมเคยมึนๆงงๆกับมันมาแล้ว แต่ก็พอใช้ได้ครับ กดโหลด ที่นี้ครับ

อีกหนึ่ง AutoLISP ที่ใช้วัดรวมความยาวของเส้น - bomlengths.lsp





bomlengths.lsp เขียนขึ้นโดย By Jimmy Bergmark ปี 2007 มีประโยชน์มากในการวัดระยะรวมของเส้นต่างๆ ที่วางพาดระเกระกะ เต็มไปหมดจนตาลาย ผมเคยใช้วัดรวมความยาวของเส้นแบ่ง Joint  ถนนมาก่อนครับ กับโครงการที่มีเส้นแบ่งพื้นถนนที่เยอะๆหลายแนว ที่หลายแนวเพราะวางเองกะมือก็เลยเยอะครับ

การรวมเส้นใน AutoCAD เพื่อประโยชน์ในการวัดความยาวทั้งหมด
ในการทำงานบางครั้งจำเป็นที่จะต้องวัดความยาวของเส้นที่เขียน
ซึ่งหากวัดความยาวของเส้นเพียงเส้นเดียวคงทำให้โดยการใช้คำสั่ง Distance
แล้วกำหนดจุด 2 จุด ก็จะได้ระยะทางหรือความยาวของเส้นแล้ว
หากเส้นที่เราต้องการที่จะวัดความยาวเกิดมีมากหล่ะ เอาแค่มากกว่า 50 เส้น
แค่คิดก็เหนื่อยแล้วครับ

การรวมเส้นจาก Line ธรรมดาให้เป็น Polyline หรือเส้นต่อเนื่องจึงเป็นประโยชน์ในการวัด
ความยาวของเส้นครับ ก็เป็นหนทางหนึ่ง
การใช้คำสั่ง PEDIT (Polyline Edit) แล้ว Joint เพื่อรวมเส้น หรือต่อเส้น ให้เป็นเส้นต่อเนื่อง
แล้วทำการวัดความยาวโดยใช้คำสั่ง List เราก็จะรู้ความยาวของเส้นได้

หากเส้นอยู่ต่างตำแหน่งและไม่สามารถ Joint เส้นให้เป็น Pline ได้ล่ะ


ลองโหลดไปใช้ดูได้ครับ เดิมทีจะต้องพิมพ์คำสั่งยาวไปหน่อย คือต้องพิมพ์ bomlengths ถึงจะใช้ได้ในแต่ละครั้ง ผมได้เพิ่ม (defun C:boo ()(load "boml") (c:bomlengths)) เข้าไปที่บรรทัดล่างสุด เพื่อให้ได้ใช้คำสั้งที่สั้นลงกระชับ ง่ายกว่าเดิมครับ เมื่อโหลดไฟล์แล้วพิมพ์คำสั่ง boo ก็ใช้คำสั่งได้ ไม่ต้องพิมพ์คำสั่งยาวๆแบบ bomlengths ครับแต่ใครชอบยาวๆ ก็ใช้ได้ครับ
ลอง ดาวน์โหลด BOML ไปใช้ดูกันนะครับ

แก้ไขลิ้งค์ให้ใหม่แล้วนะครับ

วัดความยาวเส้น distance measurements

จากการทำงานแบบในบางครั้งจะต้องเจอการที่จะต้องหาความยาวของเส้น ที่ใช้แทนสัญลักษณ์อะไรก็ตาม เช่น แนวท่อน้ำ แนวเดินสายไฟ หรืออะไรอีกหลายๆอย่าง การที่จะใช้คำสั่ง List หรือจะใช้ Dim วัดก็คงจะเป็นเรื่องที่ยุ่งยากไม่น้อย ลองใช้คำสั่ง AutoLisp ที่ใช้วัดรวมความยาวทั้งหมดอันนี้ดู
โหลดตามลิ้งค์นี้เลย กดโหลดที่นี้ครับ
 หรือว่าจะก็อป Text ไปลองใช้ก็ได้ ด้านล่างนี้ครับ
ปล.เจอมาให้ลองใช้ดู

;Tip1676:  DS2.LSP   Total Distance    (c)2001, Eric Smallwood

;; allows for continuous distance measurements
;; with an enity selection option and a total
;; of all measurements made

Acad.lsp

Acad.lsp คือ ?
ในความเข้าใจของผมเอง อาจจะสรุปได้ว่า acad.lsp คือ
  • ไฟล์ที่ถูกเขียนขึ้นจากภาษา Autolisp ซึ่งจะมีฟังก์ชั่นต่างๆมากหรือน้อยตามแต่ผู้ใช้จะเพิ่มเติมลงไปเองได้ เพื่อความสะดวกในการใช้งาน
  • ไฟล์ที่ถูกกำหนดชื่อของตัวมันเองว่า acad เพื่อให้โปรแกรม AutoCAD สามารถเข้าไปอ่านฟังก์ชั่นข้างในไฟล์นั้น เมื่อเปิดโปรแกรม AutoCAD ขึ้นมาก็จะโหลดไฟล์ acad.lsp นี้ได้โดยทันที(อัตโนมัติ) โดยที่สำคัญคือจะต้องระบุเส้นทางให้โปรแกรม AutoCAD สามารถเข้าไปหาได้ด้วย ซึ่งโดยทั่วๆไป ที่ผู้ใช้ส่วนมากหรือแม้กระทั่งผมเองก็ยังทำ คือให้ไฟล์ Acad.lsp นี้อยู่ในพาท Support ของ AutoCAD
  • และเมื่อโปรแกรม AutoCAD ค้นหาไฟล์ acad.lsp นี้แล้วฟังก์ชั่นต่างๆที่เขียนไว้ก็จะถูกโหลดให้เข้าไปอยู่ในหน่วยความจำของโปรแกรม
นี่ก็เท่าที่พอจะรู้มานะ ไม่รู้ว่าจะตรงบ้างไหม

นอกจากนี้ยังมีไฟล์ที่ AutoCAD โหลดเข้ามาใช้งานโดยอัตโนมัติอีก คือ acaddoc.lsp และ MNL นะครับ

วิธีการแก้ไขเมื่อโดน Acad.lsp virus เล่นงานไฟล์ Dwg

      ไฟล์ Acad.lsp.virus หรือ  virus. Acad. Brusted. v ที่โปรแกรมแอนตี้ไวรัส ต่างๆ สามารถค้นหาเจอ มันคือไวรัสที่เป็นหนอนตัวฉกาจ สามารถเกาะกินไฟล์ต่างๆใน Directory ที่ acad.lsp.v ตัวนี้เข้าไปอยู่  โดยเฉพาะไฟล์งาน Drawing ที่สำคัญอย่างยิ่ง ถูกกินหายไปก็แทบจะร้องไห้กันเลย
       มาดูกันก่อนว่าไอ้เจ้า Acad.lsp ที่เป็นไวรัสตัวนี้มันคืออะไรกันแ่น่ๆ จากที่น้องๆผมได้ประสบเจอมามันกินไฟล์ทุกไฟล์ที่อยู่ในหมวดเดียวกัน กินไปเรื่อยๆ โดยไม่รู้จักอิ่ม โดยแท้จริงแล้วมันคือไฟล์คำสั่ง Autometic ที่สามารถรัน โดยการเปิดโปรแกรม AutoCAD แล้วโปรแกรมจะเรียกคำสั่ง acad.lsp ขึ้นมาใช้งานในโปรแกรม ซึ่งไฟล์ acad.lspนี้จะเขียนมาจากโปรแกรม AutoLISP ซึ่งเป็นภาษาที่ใช้กับโปรแกรม AutoCAD โดยมากผมว่าเรามักจะหาประโยชน์กับมันมากกว่าในการรันคำสั่งอื่นๆนอกโปรแกรมเข้ามาใช้งาน โดยAutoCAD จะเปิดให้เราสามารถปรับปรุงแก้ไขไฟล์นี้ได้ แต่ก็หารู้ไม่ว่ามีคนเก่งไปเขียนชุดคำสั่งทำให้เดือดร้อนกันไปทั่ว โดยจะไปแอบซ่อนอยู่ใน Appication ของไฟล์ที่เปิดเข้าใช้งาน แล้วในพาร์ทที่มันอยู่ (คำศัพท์เก่าจะเรียกว่า Directory ไม่รู้ว่ายังมีคนเรียกกันอยู่หรือเปล่า ) หรือใน Folder ที่มันอยู่ มันจะรันคำสั่ง Del ลบไฟล์ในนั้นไปที่ละไฟล์จนหมด (เพราะที่เจอมาไฟล์ Excel ก็โดนมันกินไปด้วยครับ)
      เจ้าตัวนี้มันจะเข้าไปทำให้การใช้งานโปรแกรมช้าลง และอึดมากๆในการใช้งานคำสั่งต่างๆ โดยเฉพาะ Pan และ Zoom คิดว่าส่วนหนึ่งจะไปใช้แรมในการค้นหาไฟล์ที่อยู่ใน Folder เดียวกัน เลยกินแรมไปเยอะครับ


     วิธีการที่จะกำจัด Acad.lsp(virus) ตัวนี้มันออกไป ก็ไม่ใช่เรื่องยากอะไร ลองทำตามขั้นตอนนี้ดูนะครับ


1. เริ่มแรกเลย ให้เปิดโปรแกรม AutoCAD ขึ้นมา (ไม่ต้องไปกลัวมัน มันจะกินไฟล์ก็ปล่อยมันไปก่อนครับ แล้วท่ิองคาถา เจ้าไวรัสจงตายๆ)


2. จากนั้นก็ใช้คำสั่งที่ Command line พิมพ์ AP แล้ว Enter ( คำสั่ง APPLOAD ) น้องๆจะได้เห็น Dialog box : Load/Unload Application จะเห็นไฟล์ที่ cadapp.lsp โหลดเข้ามาใช้งาน  ให้ปิดการใช้งานไฟล์ AutoCAD Apps ต่างๆก่อน (ปิดตัวสามารถปิดได้ปิดให้หมด)



3. ปิดการใช้งานโปรแกรม AutoCAD ลง โดยไปที่ File แล้วก็ Exit ( Turn off AutoCAD เขียนให้ดูดีนิดนึง โดยการใช้ Ctrl+Q ปิดโปรแกรมไปซะก่อน)


4. สำคัญอย่างยิ่ง สำคัญมากๆ : ใช้  Windows Search ( F3 โดยส่วนตัวจะบอกว่าให้หมาหาให้ เพราะจะมีหมาออกมาช่วยจริงๆ ) ให้หาชื่อไฟล์ Acad.lsp ที่ถูกสร้างขึ้นโดยสคริปไฟล์ acad.lsp.v ตัวปัญหา จัดการลบมันทิ้งไปซะ โดยเฉพาะไอ้ตัวที่อยู่ใน Support เช็คได้จากวันที่ ที่สร้างไฟล์ขึ้นมา ตัวอื่นด้วยนะ ลบมันทิ้งไปซะ เท่านี้ก็ถือได้ว่าฆ่ามันไปแล้ว 
( แต่จะหมดไปหรือเปล่าก็ต้องลองดู ว่ามันจะสร้างไฟล์ Acad.lsp ขึ้นมาใหม่อีกหรือเปล่า เพื่อความแน่ใจ เช็คมันหลายๆรอบ แล้ว Delete มันทิ้ง)

5.เอาหล่ะทีนี้เรามาลองเปิดโปรแกรมกันดูว่า อาการต่างๆหายเป็นปกติดีหรือยัง ลอง Zoom และ Pan ดู หรือใช้คำสั่งอื่นๆที่คิดว่าช้า รู้สึกๆอึดไปจากที่เคยใช้ กลับมาดีดังเดิมก็ใฃ้ได้ครับ




ขอให้ประสบผลสำเร็จนะครับ

โดยเฉพาะน้องต้อง69 และต้น70 ที่หามาให้แก้
( ทางเลือกสุดท้ายเมื่อเจอทางตันแก้ไม่ตก ก็ลงโปรแกรม AutoCAD ใหม่ครับ )

เขียนมา 2 ปีกว่าก็ยังมีคนโดนไวรัสตัวนี้อยู่อีก มันช่างฆ่าไม่ตายจริงๆ
     

Area command AutoLISP By Me

ตามที่ได้ว่าไว้ วันนี้เลยหามาลงให้ เป็น AutoLISP ที่เขียนมานานแล้วและก็ปรับปรุงอยู่ตลอดมา

; Program to calculate area.

; version 3.10 Date 11-02-2003
; Used for Meters units ( 1 unit = 1 meter ) only.

; By TEERAPONG PIPATTANAKOSIT

; Add command AA0 , AA4 and AA5 for calculate Area
; Add description to use for AA0 Date 4-06-02
; Revise value intergel to real of number in AA5. Date 5-06-02
; Add command AA6 command plus many areas

; Description for AA0 command definded.
; Command for calculate transfer units type from Sq.meter to Rai-Ngan-Va.
; How to use :
; 1. Type many units do you want to transfer (units square meter only).
; 2. Pick point in locate to type units transfering.
; 3. Select defind text height to type.
; ----------------------------------------------------------------------------------------------------------------------
; Start function

(defun c:aa0 (/ vm pt an th)
(setq vm (getreal "\n How many area do you transfer :"))
(setq AAx1 (/ vm 1600)
RAI (fix AAx1) AAx2 (* (- AAx1 RAI) 4)
NGAN (fix AAx2) AAx3 (* (- AAx2 NGAN) 100)
VA (Fix AAx3) RAI (Itoa RAI)
NGAN (Itoa NGAN) VA (Itoa VA))
(setq pt (getpoint "\nText point :")) (setq an "0")
(set_txh)
(command "Text" "j" "mc" pt th an (strcat RAI "-" NGAN "-" VA)) )

(defun sel_ob() (ver)
(while (not en) (setq en (car (entsel "\nSelect Entities: ")))
(if (not en) (prompt "\nNo entity selected --- Please Try Again : "))
)
)

(defun set_txh()
(prompt "Text Height?:<")(princ th1)(setq th (getreal ">"))
; (if (not th) (setq th 1))
(if (not th) (setq th th1)) (setq th1 th)
)

(defun c:aa1 (/ en ar pr aw wh th an pt)
(sel_ob) (Command "area" "entity" en)
(setq ar (getvar "area"))
(setq pr (getvar "perimeter"))
(setq atext (strcat "Area= " (rtos ar) " sq.m."))
(setq ptext (strcat "Perimeter= " (rtos pr) " m."))
(setq wh (getreal "\nWall Hieght <2.60>:"))
(if (not wh) (setq wh 2.60))
(setq aw (* pr wh))
(setq wtext (strcat "Area wall = " (rtos aw) " sq.m."))
(setq pt (getpoint "\nText point :"))
(set_txh)
; (setq th (getreal "\nText Height <0.18>:"))
; (if (not th) (setq th 0.18))
(setq an "0")
(command "text" pt th an atext)
(command "text" "" ptext)
(command "text" "" wtext)
(princ)
)
(defun c:aa2 (/ en pr aw wh th an pt)
(sel_ob)
(Command "area" "entity" en)
(setq pr (getvar "perimeter"))
(setq ptext (strcat "Perimeter= " (rtos pr) " m."))
(setq wh (getreal "\nWall Hieght <2.60>:"))
(if (not wh) (setq wh 2.60))
(setq aw (* pr wh))
(setq wtext (strcat "Area wall = " (rtos aw) " sq.m."))
(setq pt (getpoint "\nText point :"))
(set_txh)
(setq an "0")
(command "text" pt th an ptext)
(command "text" "" wtext)
(princ)
)
(defun c:aa3 (/ en ar pr th an pt)
(sel_ob)
(Command "area" "entity" en)
(setq ar (getvar "area"))
(setq pr (getvar "perimeter"))
(setq atext (strcat "Area= " (rtos ar) " sq.m."))
(setq ptext (strcat "Perimeter= " (rtos pr) " m."))
(setq pt (getpoint "\nText point :"))
(set_txh)
; (setq th (getreal "\nText Height <0.18>:"))
; (if (not th) (setq th 0.18))
(setq an "0")
(command "text" pt th an atext)
(command "text" "" ptext)
(princ)
)

(defun c:aa3p (/ pten en ar th an pt)
(ver) (prompt "\n Load calculate for Area")
(setq pten (getpoint "\n Pick point to calculate Area :"))
(command "-boundary" pten "")
(setq en (entlast))
(Command "area" "entity" en)
(setq ar (getvar "area"))
(setq pr (getvar "perimeter"))
(setq atext (strcat "Area= " (rtos ar) " sq.m."))
(setq ptext (strcat "Perimeter= " (rtos pr) " m."))
(setq pt (getpoint "\nText point :"))
(set_txh)
; (setq th (getreal "\nText Height <0.18>:"))
; (if (not th) (setq th 0.18))
(setq an "0")
(command "text" pt th an atext)
(command "text" "" ptext)
(princ)
)


(defun c:aa4 (/ en ar th an pt)
(sel_ob)
(Command "area" "entity" en)
(setq ar (getvar "area") AAx1 (/ ar 1600)
RAI (fix AAx1) AAx2 (* (- AAx1 RAI) 4)
NGAN (fix AAx2) AAx3 (* (- AAx2 NGAN) 100)
VA (Fix AAx3) RAI (Itoa RAI)
NGAN (Itoa NGAN) VA (Itoa VA))
(setq pt (getpoint "\nText point :"))
(setq an "0")
(set_txh)
(command "Text" "j" "mc" pt th an (strcat RAI "-" NGAN "-" VA))
(prompt " Sq.m. Units Area = ")(princ ar)(prompt " sq.m.")
(princ)
)

(defun c:aa5 (/ pten en ar th an pt)
(ver) (prompt "\n Load calculate for Area")
(setq pten (getpoint "\n Pick point to calculate Area :"))
(command "-boundary" pten "")
(setq en (entlast))
(command "area" "entity" en)
(setq ar (getvar "area") AAx1 (/ ar 1600)
RAI (fix AAx1) AAx2 (* (- AAx1 RAI) 4)
NGAN (fix AAx2) AAx3 (* (- AAx2 NGAN) 100)
VA (* (- (* (- (/ ar 1600)RAI) 4) NGAN) 100)
;VA (fix AAx3)
RAI (Itoa RAI)
NGAN (Itoa NGAN)
VA (Rtos VA))
;(setq VA (* (- (* (- (/ ar 1600)RAI) 4) NGAN) 100))
;(if ( not ar) (nil))
(command "erase" "last" "")
(setq pt (getpoint "\nText point :")) (setq an "0")
(set_txh)
(command "Text" "j" "mc" pt th an (strcat RAI "-" NGAN "-" VA))
(prompt " Sq.m. Units Area = ")(princ ar)(prompt " sq.m.")(princ)
)
(defun c:aa5f (/ pten en ar th an pt)
(ver) (prompt "\n Load calculate for Area")
(setq pten (getpoint "\n Pick point to calculate Area :"))
(command "-boundary" pten "")
(setq en (entlast))
(command "area" "entity" en)
(setq ar (getvar "area") AAx1 (/ ar 1600)
RAI (fix AAx1) AAx2 (* (- AAx1 RAI) 4)
NGAN (fix AAx2) AAx3 (* (- AAx2 NGAN) 100)
;VA (* (- (* (- (/ ar 1600)RAI) 4) NGAN) 100)
VA (fix AAx3)
RAI (Itoa RAI)
NGAN (Itoa NGAN)
VA (Rtos VA))
;(setq VA (* (- (* (- (/ ar 1600)RAI) 4) NGAN) 100))
;(if ( not ar) (nil))
(command "erase" "last" "")
(setq pt (getpoint "\nText point :")) (setq an "0")
(set_txh)
(command "Text" "j" "mc" pt th an (strcat RAI "-" NGAN "-" VA))
(prompt " Sq.m. Units Area = ")(princ ar)(prompt " sq.m.")(princ)
)
(defun c:aa6 ()
(Ver)
(command "Area" "Add" "Object")
(setq arp (getvar "area" ))
(setq atext (strcat "Area= " (rtos arp) " sq.m."))
(princ)
)

(defun ver()
;; Reset if changed
(setq aa_ver "3.10") ;

(princ (strcat "\n Calculate area, Version "
aa_ver
", Copyright ฉ 1999-03 by Teerapong, Studio Pro.ฉ"))
)

Area Text

ได้ AutoLISP ที่น่าใช้มาให้ลองใช้กันดูครับ
อันนี้ของ Jimmy Bergmark

;;; AreaText.LSP ver 2.0
;;; Select a polyline and where to place the text
;;; Sample result: 2888.89 SQ. FT.

;;; By Jimmy Bergmark
;;; Copyright (C) 2007-2009 JTB World, All Rights Reserved
;;; Website: www.jtbworld.com
;;; E-mail: info@jtbworld.com
;;; 2007-09-05 - First release
;;; 2009-08-02 - Updated to work in both modelspace and paperspace

;;; Uses TEXTSIZE for the text height
(defun c:AT (/ entObject entObjectID InsertionPoint ad)
(vl-load-com)
(setq entObject (vlax-ename->vla-object(car (entsel)))
entObjectID (vla-get-objectid entObject)
InsertionPoint (vlax-3D-Point (getpoint "Select point: "))
ad (vla-get-ActiveDocument (vlax-get-acad-object))
)
(vla-addMText (if (= 1 (vla-get-activespace ad))
(vla-get-modelspace ad)
(if (= (vla-get-mspace ad) :vlax-true)
(vla-get-modelspace ad)
(vla-get-paperspace ad)
)
)
InsertionPoint 0.0 (strcat
"%<\\AcObjProp Object(%<\\_ObjId " (rtos entObjectID 2 0) ">%).Area \\f \"%pr2%lu2%ct4%qf1 SQ. FT.\">%"
))
)

ส่วนที่ผมเขียนเอง ลักษณะคล้ายๆกัน แล้วจะเอามาลงให้วันหลังครับ

หยิบมาฝากกัน AutoLISP เขียนตำแหน่งเสาไฟฟ้า

หยิบมาฝากกัน AutoLISP เขียนตำแหน่งระยะห่างเสาไฟฟ้า ไปเห็นมาจากเว็บน่าสนใจดี
ที่มา :  http://www.phosat.com/
ลองนำไปใช้ดูได้นะครับ

;สร้าง block eploe ขนาด 1x1 มี insert point อยู่ตรงกลาง และ layer epole


(defun c:epole ()

(setq ins_pnt (getpoint "\nStart point :")) ;จุดเริ่มต้นวางเสา

(setq i (getint "\nNumber of blocks :")) ;จำนวนเสาที่จะวาง

(if (> i 1) (setq dist1 (getdist "\nDistance :")))ระยะห่างของเสา

(setq w1 (getdist "\nWidth :"));ขนาดเสา ความกว้าง

(setq l1 (getdist "\nLenght :"));ความยาว ปกติก็ให้ 1x1

(setq rot_txt (getangle "\nRotation angle<0>:"));การหมุนของเสา

(if (not rot_txt)

(setq rot_txt 0.0)

)

(setq rot_txt (rtod rot_txt))

(if (> i 1) (setq txt_dir (getangle "\nPutting direction:"))) ;แนวการวางเสา

(if (not dist1) (setq dist1 0.0))

(if (not txt_dir) (setq txt_dir 0.0))

(setvar "clayer" "epole")

(repeat i

(command "_insert" "epole" ins_pnt w1 l1 rot_txt) ;คำสั่งวางเสา

(setq ins_pnt (polar ins_pnt txt_dir dist1))

)

)

Begin with Command "BOX"

เป็นคำสั่งในชุดแรกๆเริ่มจากการเขียนตามหนังสือ
แล้วมาต่อยอดภายหลังครับ
(defun getinfo ()
(setq pt1 (getpoint "pick first corner:"))
(setq pt3 (getcorner pt1 "pick opposite corner:"))
)
(defun procinfo ()
(setq pt2 (list (car pt3) (cadr pt1)))
(setq pt4 (list (car pt1) (cadr pt3)))
)
(defun output()
(command "pline" pt1 pt2 pt3 pt4 "c")
)
(defun C:BOX1 (/ pt1 pt2 pt3 pt4)
(getinfo)
(procinfo)
(output)
)
(defun C:3DBOX (/ pt1 pt2 pt3 pt4 h)
(getinfo)
(setq h (getreal "Enter height of box: "))
(procinfo)
(output)
(command "change" "L" "" "P" "thickness" h ""
"3dface" pt1 pt2 pt3 pt4 ""
"3dface" ".xy" pt1 h ".xy" pt2 h
".xy" pt3 h ".xy" pt4 h ""
)
)
(defun C:3DWEDGE (/ pt1 pt2 pt3 pt4 h)
(getinfo)
(setq h (getreal "Enter height of wedge: "))
(procinfo)
(output)
(command "3dface" pt1 pt4 ".xy" pt4 h ".xy" pt1 h pt2 pt3 ""
"3dface" pt1 pt2 ".xy" pt1 h pt1 ""
"copy" "L" "" pt1 pt4
)
)

คำสั่งเสริม AutoLISP ช่วยเขียนลูกศร

คำสั่งเสริม AutoLISP ช่วยเขียนลูกศร

(defun C:ARROW ()
(setvar "osmode" 0)(setq oldcolor (getvar "cecolor"))
(setq AR1 (getpoint "\nClick on Start point of arrow line: ")
AR2 (getpoint ar1 "\nClick on Next point of arrow line: ")
AR3 (getpoint ar2 "\nClick on Next point of arrow line: ")
)
(setq ang (angle ar1 ar2) angl (+ ang (/ pi 2.)) angr (+ ang (* 3 (/ pi 2.)))
r (polar ar1 angr 0.15) l (polar ar1 angl 0.15) ur (polar r ang 0.26)
ul (polar l ang 0.26)
)
(command "color" "5" "pline" ar1 "w" "0" "" ur ul ar1 ar2 ar3 "")
(command "color" oldcolor)
)

(defun C:ARROW-R ()
(setvar "osmode" 0)(setq oldcolor (getvar "cecolor"))
(setq AR1 (getpoint "\nClick on Start point of arrow line: ")
AR2 (getpoint ar1 "\nClick on End point of arrow line: ")
)
(setq ang (angle ar2 ar1) angl (+ ang (/ pi 2.)) angr (+ ang (* 3 (/ pi 2.)))
r (polar ar2 angr 0.15) l (polar ar2 angl 0.15) ur (polar r ang 0.26)
ul (polar l ang 0.26)
)
(command "color" "5" "pline" ar1 "w" "0" "" ar2 ur ul ar2 "")
(command "color" oldcolor)
)

Change Layer - AutoLISP

Change Layer - AutoLISP ที่ใช้เปลี่ยนเลเยอร์แบบง่ายๆ โดยการกำหนดเลเยอร์ของวัตถุที่ต้องการเปลี่ยนให้เป็น แล้วเลือกวัตถุที่ต้องการให้เปลี่ยนตามครับผม


(defun c:chlayer (/ a1 a2 n index b1 b2 d1 d2 b3)

(graphscr)

(prompt "\nselect entities to be changed: ")

(setq a1 (ssget))

(prompt "\npoint to entity on target layer: ")

(setq a2 (entsel))

(setq n (sslength a1))

(setq index 0)

(setq b2 (entget (car a2)))

(setq d2 (assoc 8 b2))

(repeat n

(setq b1 (entget (ssname a1 index)))

(setq d1 (assoc 8 b1))

(setq b3 (subst d2 d1 b1))

(entmod b3)

(setq index (+ index 1))

)

(princ)

)

คลังบทความของบล็อก