Đã có giải bài 1 ! hic phải cảm ơn lão SSG trong cadviet.com ! Đúng là đỉnh của chảo! ở VN ko biết có đc mấy lão như thế này ! ae cố mà học hỏi !
POST cai code LISP lên cho anh em lấy về mà xem! ngoạn mục ! Thầy giáo mình cho BT lơn kiểu này khoai ... vãi tè ! ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;VE BIEN DANG CAM GIA CONG CAC HINH DAC BIET
;;;Appload va go lenh BDC de chay
;;;Copyright by ssg -
www.cadviet.com - October 2008
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;-------------------------------------------------------------------------------
(defun DTR(x) (/ (* x pi) 180) ) ;;;Change degree to radian
;;;-------------------------------------------------------------------------------
(defun ints (e1 e2 / ob1 ob2 V L1 L2)
;;;Intersections of e1, e2. Return LIST of points
;;;Thanks Mr. Hoanh for this function!
(setq
ob1 (vlax-ename->vla-object e1)
ob2 (vlax-ename->vla-object e2)
)
(setq V (vlax-variant-value (vla-IntersectWith ob1 ob2 acExtendOtherEntity)))
(if (/= (vlax-safearray-get-u-bound V 1) -1)
(progn
(setq L1 (vlax-safearray->list V) L2 nil)
(while L1
(setq L2 (append L2 (list (list (car L1) (cadr L1) (caddr L1)))))
(repeat 3 (setq L1 (cdr L1)))
)
)
(setq L2 nil)
)
L2
)
;;;-------------------------------------------------------------------------------
(defun getVert (e / i L p)
;;;Return list of all vertex from pline e
(setq i 0 L nil)
(vl-load-com)
(repeat (fix (+ (vlax-curve-getEndParam e) 1))
(setq p (vlax-curve-getPointAtParam e i))
(if (not (member p L)) (setq L (append L (list p))))
(setq i (1+ i))
)
L
)
;;;-------------------------------------------------------------------------------
(defun near2P (p1 p2 p) ;;;Select near point p1 or p2 from p
(if (<= (distance p p1) (distance p p2)) p1 p2)
)
;;;-------------------------------------------------------------------------------
(defun dist3p (p1 p2 p / ag pt pg) ;;;Distance from p to line p1p2
(setq
ag (angle p1 p2)
pt (polar p (+ (/ pi 2) ag) 100)
pg (inters p1 p2 p pt nil)
)
(distance p pg)
)
;;;===========================================
;;;Main program
(defun C:BDC( / ec es et ett ag p0 p1 p2 p3 pg Lst0 Lst1
Lst2 Lstp kc k d r1 r2 r12 g1 g2 x oldos)
(vl-load-com)
;;;NHAP SO LIEU VA TINH THAM SO HINH HOC
(setq es (car (entsel "\nBien dang chi tiet gia cong:")))
(redraw es 3)
(setq et (car (entsel "\nTam giac ga dao:")))
(redraw et 3)
(setq ec (car (entsel "\nDuong tron chuan:")))
(redraw ec 3)
(setq ag (getreal "\nTri so goc cua 1 khoang chia <1>:"))
(if (null ag) (setq ag 1))
(command "regen")
(setq
p1 (car (ints et ec))
p2 (car (ints et es))
Lst0 (getvert et)
kc 0
)
(foreach pk Lst0
(if (>= (setq k (dist3p p1 p2 pk)) kc) (setq kc k p3 pk))
)
(setq
Lstp (list p3)
d (entget ec)
p0 (cdr (assoc 10 d))
r1 (cdr (assoc 40 d))
r2 (distance p0 p2)
r12 (distance p1 p2)
g1 (angle p0 p1)
g2 (angle p0 p2)
oldos (getvar "osmode")
)
;;;VE BIEN DANG CAM
(setvar "osmode" 0)
(repeat (fix (/ 360 ag))
;;;Quay theo duong tron
(command "rotate" et "" p0 ag)
(setq
p1 (polar p0 (+ g1 (dtr ag)) r1)
p2 (polar p0 (+ g2 (dtr ag)) r2)
)
;;;Ve duong tron phu, xac dinh giao diem, quay ve vi tri chinh xac
(command "circle" p1 r12)
(setq
ett (entlast)
Lst1 (ints ett es)
pg (near2P (car Lst1) (cadr Lst1) p2)
)
(command "rotate" et "" p1 "r" p1 p2 pg)
(command "erase" ett "")
;;;Xac dinh 1 diem tren quy dao, add vao Lstp
(setq Lst2 (getvert et) kc 0)
(foreach pk Lst2
(if (>= (setq k (dist3p p1 p2 pk)) kc) (setq kc k p3 pk))
)
(setq Lstp (append Lstp (list p3)))
(command "point" p3) ;;;Ve cac diem de kiem tra qua trinh chay, khong can thi bo
;;;Reset, chuan bi cho vong lap sau
(setq
p2 pg
r2 (distance p0 p2)
g1 (angle p0 p1)
g2 (angle p0 p2)
)
);;;end repeat
;;;Ve pline voi ket qua Lstp
(command "pline") (foreach x Lstp (command x)) (command "c")
;;;Reset osmode va ket thuc
(setvar "osmode" oldos)
(command "regen")
(princ)
)
;;;===========================================
Hết!
PM : ae đọc kĩ HDSD trước khi dùng kẻo ... hóc thì khổ !