Lệnh M2C
Di chuyển (Move) nhóm đối tượng chọn vào tâm 1 vùng kín (xác định bằng cách pick chuột)
Cách thực hiện M2C
- Gõ lệnh M2C
- Chọn đối tượng cần di chuyển => Enter
- Pick tâm 1 vùng bao kín cần di chuyển đến
1 Thêm class M2C_lisp.vn.lsp
Lưu mã sau dưới dạng tệp tin M2C_lisp.vn.lsp
Code:
(defun C:M2C (/)
(princ "\nMove doi tuong vao giua vung kin - from lisp.vn")
(vl-load-com) ; Tải các hàm ActiveX để sử dụng
(defun sleep_osnap ()(setvar "OSMODE" (logior (getvar "OSMODE") 16384)))
(defun wake_osnap ()(setvar "OSMODE" (logand (getvar "OSMODE") -16385)))
(sleep_osnap)
(princ "\nChọn đối tượng thứ nhất: ")
(setq ent1 (ssget)) ; Chọn một đối tượng duy nhất
(if ent1
(progn
(princ "\nChọn đối tượng thứ hai: ")
(setq pt (getpoint "\nChọn tâm vùng kín cần chèn: ")) ; Chọn đối tượng thứ hai
(if pt
(progn
; Lấy thực thể từ tập hợp lựa chọn
;(setq ent1 (ssname ent1 0))
;(setq obj1 (vlax-ename->vla-object ent1))
; Lấy điểm tham chiếu của hai đối tượng
(setq pt1 (GetGeometricCenter ent1))
(setq pt2 (getCentroid pt))
; Di chuyển đối tượng thứ nhất đến vị trí của đối tượng thứ hai
(command "_.MOVE" ent1 "" pt1 pt2)
; Di chuyển đối tượng thứ hai đến vị trí của đối tượng thứ nhất
;(command "_.MOVE" ent2 "" pt2 pt1)
(princ "\nĐã hoán đổi vị trí hai đối tượng!")
)
(princ "\nKhông chọn được đối tượng thứ hai!")
)
)
(princ "\nKhông chọn được đối tượng thứ nhất!")
)
(wake_osnap)
(princ "\nBy AJS at www.lisp.vn")
(princ)
)
(defun GetGeometricCenter (ss / i ent minpt maxpt xsum ysum zsum pt cnt)
;; Initialize variables
(setq xsum 0.0 ysum 0.0 zsum 0.0 cnt 0)
;; Loop through all objects in the selection set
(if ss
(progn
(setq i 0)
(while (< i (sslength ss))
(setq ent (ssname ss i))
;; Get the bounding box of the entity
(command "._UCS" "_World")
(vla-getboundingbox (vlax-ename->vla-object ent) 'minpt 'maxpt)
(setq minpt (vlax-safearray->list minpt)
maxpt (vlax-safearray->list maxpt))
;; Calculate the center of the bounding box
(setq xsum (+ xsum (/ (+ (car minpt) (car maxpt)) 2.0))
ysum (+ ysum (/ (+ (cadr minpt) (cadr maxpt)) 2.0))
cnt (1+ cnt))
(setq i (1+ i))
)
;; Calculate the average to find the geometric center
(if (> cnt 0)
(progn
(setq pt (list (/ xsum cnt) (/ ysum cnt) 0))
pt
)
nil
)
)
nil
)
)
(defun getCentroid (pt / area pt1)
(setq ent (entlast))
(Command ".Bpoly" "a" "o" "r" "" pt "")
(if (setq ss (ssnewer ent))
(progn
(Command "Union" ss "")
(setq pt1 (get-reference-point (vlax-ename->vla-object (entlast))))
)
)
(if (setq ss (ssnewer ent)) (Command ".Erase" ss ""))
pt1
)
(defun ssnewer (ent / ss ent1)
(if ent
(progn
(setq ent1 ent)
(while (setq ent1 (entnext ent1))
(if ent1
(progn
(if (NULL ss) (setq ss (ssadd)))
(setq ss (ssadd ent1 ss))
)
)
)
ss
)
nil
)
)
; Hàm lấy điểm tham chiếu của đối tượng
(defun get-reference-point (obj / minpt maxpt midpt)
(cond
((vlax-property-available-p obj 'Centroid) ; Nếu có Centroid
(vlax-get obj 'Centroid))
((vlax-property-available-p obj 'InsertionPoint) ; Nếu có InsertionPoint
(vlax-get obj 'InsertionPoint))
((vlax-property-available-p obj 'StartPoint) ; Nếu là đường thẳng/cung
(setq midpt (mapcar '(lambda (x y) (/ (+ x y) 2.0))
(vlax-get obj 'StartPoint)
(vlax-get obj 'EndPoint)))
midpt)
(t ; Nếu không có điểm đặc trưng, lấy tâm của bounding box
(vla-getboundingbox obj 'minpt 'maxpt)
(mapcar '(lambda (x y) (/ (+ x y) 2.0))
(vlax-safearray->list minpt)
(vlax-safearray->list maxpt)))
)
)Link tải (MediaFire)
---------------------------------------------------------------------------------------------
Mọi thông tin xin liên hệ Fanpage AutoLISP Thật là đơn giản!
Cảm ơn bạn đã theo dõi!

Không có nhận xét nào:
Đăng nhận xét