วันศุกร์ที่ 12 กุมภาพันธ์ พ.ศ. 2553

AutoCAD Tips: Visual LISP ตอนหมุนเส้นตามเส้นอ้างอิง

รูทีน LISP ในหัวข้อนี้ ใช้จัดการกับรูปวาดแบบเส้นตรง (Line)
เพื่อให้หมุนมาอยู่ในทิศทางเดียวกับเส้นอ้างอิงที่เลือกไว้ (Reference Line)

ลดขั้นตอนการทำงาน เมื่อเทียบกับวิธีปกติ
ซึ่งต้องเริ่มจากวัดมุมเส้นอ้างอิง และจดค่าเอาไว้

จากนั้นหมุนเส้นปลายทางด้วยคำสั่ง Rotate
กำหนดจุดหมุน และใสค่ามุม

แต่ในรูทีนนี้ เพียงแต่คลิกเลือกเส้นอ้างอิงเอาไว้
แล้วไปคลิกเส้นปลายทาง (Target) ที่จะเปลี่ยนมุมเท่านั้น

มีพรอมต์เป็น

Command: ML
Select a ref Line (near base point): เลือกเส้นอ้างอิง ที่ปลายใกล้จุดอ้างอิงในการวัดค่ามุม
Select Target line (near fixed point):
เลือกเส้นที่หมุนมุมใหม่ เลือกใกล้จุดยึด ไม่ใช่จุดที่ถูกหมุนใหม่
และจะยังคงวนแสดงพรอมต์ Select Target line (near fixed point): นี้
ให้เลือกซ้ำได้จนครบ แล้วกด Enter

ก่อนใช้คำสั่ง ML



หลังใช้คำสั่ง ML



โค้ดมีดังนี้
;;; Match Line Angle
;;; Developed by S.Chatchawal.
(defun c:mL (/ stop e refObj selectedPt
stpt enpt refAng obj d *error*
*acaddoc*
)
(defun *error* (msg)
(if (not (member msg (list "Function cancelled")))
(princ (strcat "mL Error: " msg))
)
(vla-endundomark *acaddoc*)
)
(setq *acaddoc* (vla-get-activedocument (vlax-get-acad-object)))
(vla-startundomark *acaddoc*)
(while (not stop)
(if (setq e (entsel "\nSelect a ref Line (near base point):"))
(progn
(if (= "AcDbLine"
(vlax-get (setq refObj (vlax-ename->vla-object (car e)))
'ObjectName
)
)
(setq stop T)
(princ "\nNot a LINE!!! Try again!!!")
)
)
(princ "\nNo object found!!! Try again!!!")
)
)
(setq selectedPt (trans (osnap (cadr e) "endp") 1 0) ; WCS
stpt (vlax-get refObj 'StartPoint)
enpt (vlax-get refObj 'EndPoint)
)
(if (< (distance stpt selectedPt) (distance enpt selectedPt))
(setq refAng (angle stpt enpt))
(setq refAng (angle enpt stpt))
)
(while (setq e (entsel "\nSelect Target line (near fixed point): "))
(if (= "AcDbLine"
(vlax-get (setq obj (vlax-ename->vla-object (car e)))
'ObjectName
)
)
(progn
(setq selectedPt (trans (osnap (cadr e) "endp") 1 0) ; WCS
stpt (vlax-get Obj 'StartPoint)
enpt (vlax-get Obj 'EndPoint)
d (vlax-get obj 'Length)
)
(if (< (distance stpt selectedPt) (distance enpt selectedPt))
(vlax-put obj 'Endpoint (polar selectedPt refAng d))
;endpoint
(vlax-put obj 'Startpoint (polar selectedPt refAng d))
;startpoint
)
)
(princ "\nNot a LINE!!! Try again!!!")
)
)
(vla-endundomark *acaddoc*)
(princ)
)

ตัวอย่างเพิ่มเติม กรณีใช้กับเส้นแนวตั้ง

ก่อนใช้ ML

หลังใช้ ML

ไม่มีความคิดเห็น:

แสดงความคิดเห็น