วันจันทร์ที่ 6 เมษายน พ.ศ. 2552

Visual LISP: Tips คัดลอกแนวแถวในทิศใดๆ

ในคำสั่ง Array เองใน AutoCAD เราสามารถกำหนดให้ทำการคัดลอกรูปซ้ำในแนวแถวหนึ่งๆ ในทิศใดๆ ก็ได้ เช่น ทำซ้ำรูปขั้นบันได รูปฟันเลื่อย ฯลฯ

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

Command: copyn
Select objects: {เลือกวัตถุที่ต้องการ}
Select objects: {เลือกครบแล้วกด Enter หรือ Spacebar}
Base point: {คลิกเลือกจุดอ้างอิงแรก เช่น จุดเริ่มต้นของขั้นบันไดแรก ฯลฯ}
Next base point: {คลิกเลือกจุดอ้างอิงที่สอง เช่น จุดปลายของขั้นบันไดตัวแรก ฯลฯ}
Number of new copies: {ใส่จำนวนที่จะให้ทำซ้ำเพิ่มใหม่ แล้วกด Enter หรือ Spacebar}

ทิศทางของแถวในการซ้ำรูปขึ้น จะมาจากแนวเส้นระหว่างจุด Base point และ Next base point

ระยะห่างจากรูปแรกไปยังรูปทำซ้ำ จะเท่ากับระยะทางจากจุด Base point และ Next base point และจะคงค่าในรูปใหม่ที่ทำซ้ำขึ้นทั้งหมด


;;; Copy N objects , Analogous to One row Array in any direction.
;;; Developed by S.Chatchawal, schatchawal@gmail.com

(defun c:copyn (/ *error* oldcmd oldosmode s p q disp j n)
(setq oldcmd (getvar "cmdecho")
oldosmode (getvar "osmode")
)
(defun *error* (msg)
(if (not
(member msg (list "Function cancelled" "quit / exit abort"))
)
(princ (strcat "COPYN Error: " msg))
)
(command "_.undo" "_end")
(setvar "cmdecho" oldcmd)
(setvar "osmode" oldosmode)
(princ)
)
(setvar "cmdecho" 0)
(command "_.undo" "_begin")
(if (setq s (ssget))
(progn
(initget 1)
(setq p (getpoint "\nBase point: "))
(initget 33)
(setq q (getpoint p "\nNext base point: "))
(initget 1)
(setq n (getint "\nNumber of new copies: "))
(setq disp (mapcar '- q p)
j 0
)
(setvar "osmode" 0)
(repeat n
(setq j (1+ j))
(command "_.copy" s "" (mapcar '* disp (list j j j)) "")
)
(command "_.undo" "_end")
)
(princ "\nNo object found!!!")
)
(setvar "cmdecho" oldcmd)
(setvar "osmode" oldosmode)
(princ)
)

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

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