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

AutoCAD Tips: Visual Lisp ตอน array แบบระยะเพิ่มค่าแบบอนุกรมเลขคณิต

ปกติแล้วคำสั่ง Array จะสร้างภาพซ้ำให้ในแนวแถวและหลัก หรือแนวตาราง
ด้วยระยะห่างที่คงที่ในแนวหนึ่งๆ

ในบทความวันนี้ ลองมาพิจารณากรณีที่ระยะห่างนั้นเป็นอนุกรมเลขคณิต
(Arithmetic Series) ดูบ้าง กล่าวคือ

ระยะห่างระหว่างรูปแรกกับรูปสอง d1 = d
ระยะห่างระหว่างรูป 2 กับรูป 3 d2 = 2d
ระยะห่างระหว่างรูป 3 กับรูป 4 d3 = 3d

ระยะห่างระหว่างรูป j กับรูป j+1 dj = j x d

หรือถ้าวัดเทียบรูปแรกทั้งหมด
ก็จะอยู่ในรูป dj = d + 2d + 3d + ... + (j-1)d



ตัวอย่างโค้ด LISP ที่พัฒนาขึ้นเพื่อจัดการปัญหานี้เป็นดังนี้

;;; Incrementing Array
;;; Developed by S.Chatchawal.
(defun c:ia (/ s tmp i j dx dy dxy oldosmode *error*)
(setq oldosmode (getvar "osmode"))
(defun *error* (msg)
(if (not (member msg (list "Function cancelled")))
(princ (strcat "IA Error: " msg))
)
(command ".undo" "end")
(setvar "osmode" oldosmode)
(setvar "cmdecho" 1)
(princ)
)
(setvar "cmdecho" 0)
(command ".undo" "begin")
(if (not #distx) ; column
(setq #distx 10.0)
)
(if (not #disty) ; row
(setq #disty 10.0)
)
(if (not #ny) ;row
(setq #ny 5)
)
(if (not #nx) ; column
(setq #nx 5)
)
(if (setq s (ssget))
(progn
(princ "\nSpecify row distance: <")
(princ #disty)
(princ "> ")
(initget 2)
(if (setq tmp (getdist)); Nonzero distance
(setq #disty tmp)
)
(princ "\nSpecify column distance: <")
(princ #distx)
(princ "> ")
(initget 2)
(if (setq tmp (getdist)); Nonzero distance
(setq #distx tmp)
)
(princ "\nNo. of rows: <")
(princ #ny)
(princ "> ")
(initget 6)
(if (setq tmp (getint)); Positive and nonzero integer
(setq #ny tmp)
)
(princ "\nNo. of columns: <")
(princ #nx)
(princ "> ")
(initget 6)
(if (setq tmp (getint)); Positive and nonzero integer
(setq #nx tmp)
)
(setvar "osmode" 0)
(setq i -1)
(repeat #ny
(setq i (1+ i)
j -1
dy (* (/ i 2.0) (1+ i) #disty)
)
(repeat #nx
(setq j (1+ j)
dx (* (/ j 2.0) (1+ j) #distx)
dxy (strcat (rtos dx) "," (rtos dy))
)
(command ".copy" s "" dxy "")
)
)
(command ".erase" s "")
(command ".undo" "end")
(setvar "osmode" oldosmode)
(setvar "cmdecho" 1)
)
(princ "\nNo object found!!!")
)
(princ)
)

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

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