Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
t031285

[Yêu cầu] Lisp xác định tâm của 1 hình bất kỳ

Các bài được khuyến nghị

E có 1 hình hoặc nhiều đối tượng bất kỳ nay muốn nhờ các bác viết hộ 1 lisp khi chọn hình đó hoặc các đối tượng lisp sẽ tự động xác định tâm của hình hoặc tâm của các đối tượng được chọn,tâm này là 1 point hình chữ thập.E không muốn dùng lệnh Massprop vì nó chỉ hiện toạ độ tâm,lúc này sẽ phải kiếm toạ độ này nên mất thời gian.Chân thành cảm ơn trước.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Của bạn đây, đánh dấu theo Pointstyle hiện hành :

(defun c:tt (/ ST:Geom-Center ST:Ss->ListEnt ST:Entmake-Point)
;;;; Local Functions 
(defun ST:Geom-Center (ent / p1 p2)
(vla-getboundingbox (vlax-ename->vla-object ent) 'p1 'p2)
(mapcar  '(lambda (a B) (* 0.5 (+ a B)))
(vlax-safearray->list p1) (vlax-safearray->list p2))
)
(defun ST:Ss->ListEnt (ss / n e l)
 (setq n (sslength ss))
 (while (setq e (ssname ss (setq n (1- n))))
   (setq l (cons e l))
 )  
)
(defun ST:Entmake-Point (pt)(entmakex (list (cons 0 "POINT")(cons 10 pt))))
;;;;Start here :
(vl-load-com)
(prompt "Ch\U+1ECDn c\U+00E1c \U+0111\U+1ED1i t\U+01B0\U+1EE3ng c\U+1EA7n x\U+00E1c \U+0111\U+1ECBnh t\U+00E2m :")
(foreach obj (ST:Ss->ListEnt (ssget)) (ST:Entmake-Point (ST:Geom-Center obj))))

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Bạn xem lại giùm hình chữ nhật và hình vuông thì đúng còn tam giác hình như nó xác định sai.Vì mình kiểm tra lại thấy chưa đúng và thử dùng massprop thì thấy đúng là sai thật.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Bạn xem lại giùm hình chữ nhật và hình vuông thì đúng còn tam giác hình như nó xác định sai.Vì mình kiểm tra lại thấy chưa đúng và thử dùng massprop thì thấy đúng là sai thật.

Anh có thể chia sẻ cách dùng massprop được không???

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Anh có thể chia sẻ cách dùng massprop được không???

Bạn phải dùng REGION với hình đó trước sau đó nhấn MASSPROP nó sẽ hiện bảng có đầy đủ thông số bạn ah.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Bạn phải dùng REGION với hình đó trước sau đó nhấn MASSPROP nó sẽ hiện bảng có đầy đủ thông số bạn ah.

Ý em muốn hỏi khi đã biết toạ độ tâm, anh xác định điểm trọng tâm trên hình vẽ như thế nào. Cách em làm thủ công hơi bị lâu, em muốn tham khảo cách làm của anh.

 

Area: 102.4834

Perimeter: 41.9405

Bounding box: X: 15.4774 -- 28.6927

Y: 25.8776 -- 33.6325

Centroid:

X: 22.0851

Y: 29.7551

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Ý em muốn hỏi khi đã biết toạ độ tâm, anh xác định điểm trọng tâm trên hình vẽ như thế nào. Cách em làm thủ công hơi bị lâu, em muốn tham khảo cách làm của anh.

 

Area: 102.4834

Perimeter: 41.9405

Bounding box: X: 15.4774 -- 28.6927

Y: 25.8776 -- 33.6325

Centroid:

X: 22.0851

Y: 29.7551

Bạn vẽ 2 đường trung tuyến,giao điểm 2 đường trung tuyến chính là tâm bạn ah,cách này dùng cho hình tam giác.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Ô, ừ nhỉ. Mình dùng hàm con này định lượng cho các hình không kín thấy tạm tạm ổn nên từ trước giờ cứ dùng mà chẳng kiểm tra gì. Thôi thì bạn dùng tạm thằng này : yêu cầu : các đối tượng phải kín và không phải region. Nếu có gì sai nhờ các bác khác sửa hộ nhé :wub:

(defun c:tt (/ ST:Geom-Center ST:Ss->ListEnt ST:Entmake-Point)
;;;; Local Functions 
(defun ST:Region-Center (ent / rt)
(cond ;((wcmatch (cdadr (entget ent)) "REGION") (setq rt (vlax-get (vlax-ename->vla-object ent)'Centroid)) )
((not (wcmatch (cdadr (entget ent)) "REGION"))  (command "region" ent "")
(setq rt (vlax-get (vlax-ename->vla-object (entlast))'Centroid)) 
(command "undo" ""))
) rt
)
(defun ST:Ss->ListEnt (ss / n e l)
 (setq n (sslength ss))
 (while (setq e (ssname ss (setq n (1- n))))
   (setq l (cons e l))
 )  
)
(defun ST:Entmake-Point (pt)(entmakex (list (cons 0 "POINT")(cons 10 pt))))
;;;;Start here :
(vl-load-com)
(prompt "Ch\U+1ECDn c\U+00E1c \U+0111\U+1ED1i t\U+01B0\U+1EE3ng c\U+1EA7n x\U+00E1c \U+0111\U+1ECBnh t\U+00E2m :")
(foreach obj (ST:Ss->ListEnt (ssget)) (ST:Entmake-Point (ST:Region-Center obj))))

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

E có 1 hình hoặc nhiều đối tượng bất kỳ nay muốn nhờ các bác viết hộ 1 lisp khi chọn hình đó hoặc các đối tượng lisp sẽ tự động xác định tâm của hình hoặc tâm của các đối tượng được chọn,tâm này là 1 point hình chữ thập.E không muốn dùng lệnh Massprop vì nó chỉ hiện toạ độ tâm,lúc này sẽ phải kiếm toạ độ này nên mất thời gian.Chân thành cảm ơn trước.

Chủ đề này đã có kha khá.

Bạn có thể đọc bài viết này của Tue_NV

Bài viết số 18 - Bắt tâm của 1 đối tượng kín

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Chủ đề này đã có kha khá.

Bạn có thể đọc bài viết này của Tue_NV

Bài viết số 18 - Bắt tâm của 1 đối tượng kín

(defun centre(dt / cen)
;;copyright by Tue_NV
 (vl-load-com)
 (if (or (= (cdr(assoc 0 (entget dt))) "REGION") 
     	(and (wcmatch (cdr(assoc 0 (entget dt))) "*POLYLINE")
      (= (cdr(assoc 70 (entget dt))) 1)
        )
     )
      (if (and (wcmatch (cdr(assoc 0 (entget dt))) "*POLYLINE")
      (= (cdr(assoc 70 (entget dt))) 1)
          )
 (Progn
   (setq cen (vlax-get (car (vlax-invoke (vla-get-modelspace (vla-get-activedocument(vlax-get-acad-object)))
     		'addregion (list (vlax-ename->vla-object dt)))) 'Centroid))
   (entdel (entlast))
 )
 (setq cen (vlax-get (vlax-ename->vla-object dt) 'Centroid))
       )

 )    
 cen
)
(defun c:cen() (centre (car(entsel "\n Pick chon doi tuong lay trong tam :"))))

Lisp của bác khi e chạy nó báo Pick chon doi tuong lay trong tam :nil,tiện thể nhờ bác sửa khi xác định của tâm hình bất kỳ nó vẽ 1 point giống như lisp của ketxu luôn giùm e.Thanks.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

(defun centre(dt / cen)
;;copyright by Tue_NV
 (vl-load-com)
 (if (or (= (cdr(assoc 0 (entget dt))) "REGION") 
     	(and (wcmatch (cdr(assoc 0 (entget dt))) "*POLYLINE")
      (= (cdr(assoc 70 (entget dt))) 1)
        )
     )
      (if (and (wcmatch (cdr(assoc 0 (entget dt))) "*POLYLINE")
      (= (cdr(assoc 70 (entget dt))) 1)
          )
 (Progn
   (setq cen (vlax-get (car (vlax-invoke (vla-get-modelspace (vla-get-activedocument(vlax-get-acad-object)))
     		'addregion (list (vlax-ename->vla-object dt)))) 'Centroid))
   (entdel (entlast))
 )
 (setq cen (vlax-get (vlax-ename->vla-object dt) 'Centroid))
       )

 )    
 cen
)
(defun c:cen() (centre (car(entsel "\n Pick chon doi tuong lay trong tam :"))))

Lisp của bác khi e chạy nó báo Pick chon doi tuong lay trong tam :nil,tiện thể nhờ bác sửa khi xác định của tâm hình bất kỳ nó vẽ 1 point giống như lisp của ketxu luôn giùm e.Thanks.

Sử dụng lệnh Point:

Command: point

Current point modes: PDMODE=0 PDSIZE=0.0000

Specify a point: 'cen-> Gõ 'CEN

Pick chon doi tuong lay trong tam : -> Pick vào đối tượng kín

(572196.0 339095.0) -> Đây là trọng tâm

 

-> Lệnh point sẽ vẽ 1 point ngay tại trọng tâm của đối tượng kín -> OK

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Ô, ừ nhỉ. Mình dùng hàm con này định lượng cho các hình không kín thấy tạm tạm ổn nên từ trước giờ cứ dùng mà chẳng kiểm tra gì. Thôi thì bạn dùng tạm thằng này : yêu cầu : các đối tượng phải kín và không phải region. Nếu có gì sai nhờ các bác khác sửa hộ nhé :wub:

(defun c:tt (/ ST:Geom-Center ST:Ss->ListEnt ST:Entmake-Point)
;;;; Local Functions 
(defun ST:Region-Center (ent / rt)
(cond ;((wcmatch (cdadr (entget ent)) "REGION") (setq rt (vlax-get (vlax-ename->vla-object ent)'Centroid)) )
((not (wcmatch (cdadr (entget ent)) "REGION"))  (command "region" ent "")
(setq rt (vlax-get (vlax-ename->vla-object (entlast))'Centroid)) 
(command "undo" ""))
) rt
)
(defun ST:Ss->ListEnt (ss / n e l)
 (setq n (sslength ss))
 (while (setq e (ssname ss (setq n (1- n))))
   (setq l (cons e l))
 )  
)
(defun ST:Entmake-Point (pt)(entmakex (list (cons 0 "POINT")(cons 10 pt))))
;;;;Start here :
(vl-load-com)
(prompt "Ch\U+1ECDn c\U+00E1c \U+0111\U+1ED1i t\U+01B0\U+1EE3ng c\U+1EA7n x\U+00E1c \U+0111\U+1ECBnh t\U+00E2m :")
(foreach obj (ST:Ss->ListEnt (ssget)) (ST:Entmake-Point (ST:Region-Center obj))))

Cảm ơn bác,bác thêm cho tính tâm của các đối tượng được chọn luôn giùm e luôn nhe.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cảm ơn bác,bác thêm cho tính tâm của các đối tượng được chọn luôn giùm e luôn nhe.

Hề hề hề,

bạn nên nói chính xác là tìm tâm hay trọng tâm của hình bạn nhé.

Với trọng tâm thì bạn đã có kha khá vốn liếng về nó và các bác khác cũng đã cung cấp kha khá bài viết rồi.

Còn nếu là tâm thì e rằng bạn cần cung cấp cái định nghĩa về tâm một hình của bạn bạn ạ.

Cái cách này: Bạn vẽ 2 đường trung tuyến,giao điểm 2 đường trung tuyến chính là tâm bạn ah,cách này dùng cho hình tam giác. thì nó trả về trọng tâm của tam giác chứ không phải là tâm của tam giác đâu nhé. Hề hề hề.....

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cảm ơn bác,bác thêm cho tính tâm của các đối tượng được chọn luôn giùm e luôn nhe.

"Tính" tức là làm gì ạ ???

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Là xác định bạn ah.Xin lỗi vì mình dùng từ không đúng.

Mình cũng đến pó CAD với bạn lun. Tất nhiên là lisp đã phải làm công việc xác định thì nó mới chèn cái point vô được chứ :rolleyes: . Bạn nói xác định là sao đây :huh: lisp nó phải làm việc gì chứ :angry:

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Hoan3.jpg

hình 3

hoan4.jpg

Command: l LINE Specify point : 188.6778,4.7964 (lưu ý có dấu phẩy ở giữa x,y)

Hình 4

 

Hoan5mmmm.jpg

hình 5

 

Chốt lại: nên viết đúng khối lượng và trọng lượng, nên xác định hoặc nên tìm toạ độ trọng tâm của một hình kín, chỉ bắt điểm trọng tâm hình kín sau khi region.

Nếu thường xuyên phải bắt điểm hoặc vồ điểm trọng tâm hình kín nên sử dụng lisp để tăng cường cường độ vẽ. Nếu phọt phẹt năm thì mười hoạ mới phải “bắt tâm” chỗ kín như iem thì dùng cách làm thủ công cuốc xẻng gậy gộc.... cũng không mất nhiều thời gian lắm đâu.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Sử dụng lệnh Point:

Command: point

Current point modes: PDMODE=0 PDSIZE=0.0000

Specify a point: 'cen-> Gõ 'CEN

Pick chon doi tuong lay trong tam : -> Pick vào đối tượng kín

(572196.0 339095.0) -> Đây là trọng tâm

 

-> Lệnh point sẽ vẽ 1 point ngay tại trọng tâm của đối tượng kín -> OK

 

Chào anh TUE_NV!

Em thử thêm chức năng Nếu Enter không chọn đối tượng kín thì Pick điểm (Tương tự dùng lệnh boundary để lấy đối tượng), sau đó tìm trọng tâm. Kết quả:

- Nếu chỉ dùng lệnh bình thường cen thì cho kết quả OK

- Nếu dùng chen vào lệnh khác như Line, rồi gõ 'cen thì không được. Cad báo lỗi ; error: Function cancelled

Anh giải quyết dùm đưọc không?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

E có 1 hình hoặc nhiều đối tượng bất kỳ nay muốn nhờ các bác viết hộ 1 lisp khi chọn hình đó hoặc các đối tượng lisp sẽ tự động xác định tâm của hình hoặc tâm của các đối tượng được chọn,tâm này là 1 point hình chữ thập.E không muốn dùng lệnh Massprop vì nó chỉ hiện toạ độ tâm,lúc này sẽ phải kiếm toạ độ này nên mất thời gian.Chân thành cảm ơn trước.

Bạn có thể sử dụng lisp sau: http://www.mediafire.com/?i8xljd9y12pdb64

Lệnh: TT

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Vào lúc 12/8/2011 tại 07:40, ketxu đã nói:

Ô, ừ nhỉ. Mình dùng hàm con này định lượng cho các hình không kín thấy tạm tạm ổn nên từ trước giờ cứ dùng mà chẳng kiểm tra gì. Thôi thì bạn dùng tạm thằng này : yêu cầu : các đối tượng phải kín và không phải region. Nếu có gì sai nhờ các bác khác sửa hộ nhé :wub:

 


(defun c:tt (/ ST:Geom-Center ST:Ss->ListEnt ST:Entmake-Point)
;;;; Local Functions 
(defun ST:Region-Center (ent / rt)
(cond ;((wcmatch (cdadr (entget ent)) "REGION") (setq rt (vlax-get (vlax-ename->vla-object ent)'Centroid)) )
((not (wcmatch (cdadr (entget ent)) "REGION"))  (command "region" ent "")
(setq rt (vlax-get (vlax-ename->vla-object (entlast))'Centroid)) 
(command "undo" ""))
) rt
)
(defun ST:Ss->ListEnt (ss / n e l)
 (setq n (sslength ss))
 (while (setq e (ssname ss (setq n (1- n))))
   (setq l (cons e l))
 )  
)
(defun ST:Entmake-Point (pt)(entmakex (list (cons 0 "POINT")(cons 10 pt))))
;;;;Start here :
(vl-load-com)
(prompt "Ch\U+1ECDn c\U+00E1c \U+0111\U+1ED1i t\U+01B0\U+1EE3ng c\U+1EA7n x\U+00E1c \U+0111\U+1ECBnh t\U+00E2m :")
(foreach obj (ST:Ss->ListEnt (ssget)) (ST:Entmake-Point (ST:Region-Center obj))))
 

 

bạn ơi lisp rất hay, bạn có thể viết đổi điểm trọng tâm là point thành tự động đặt tên tam giác được không, ví dụ như có 10 trọng tâm thì đặt tên các trọng tâm theo thứ tự từ 1 đến 10 (sắp xếp bất kỳ), tên trọng tâm có dạng vòng tròn và số ở giữa. Cảm ơn abnj

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay
Đăng nhập để thực hiện theo  

×