Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
19 replies to this topic

#1 t031285

t031285

    biết vẽ rectang

  • Members
  • PipPip
  • 89 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 11 August 2011 - 10:49 PM

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.
  • 0

#2 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 12 August 2011 - 12:30 AM

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))))

  • 2

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#3 t031285

t031285

    biết vẽ rectang

  • Members
  • PipPip
  • 89 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 12 August 2011 - 06:17 AM

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.
  • 1

#4 hoan2182

hoan2182

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 2646 Bài viết
Điểm đánh giá: 832 (rất tốt)

Đã gửi 12 August 2011 - 06:35 AM

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???
  • 0

Gió đưa cây cải về trời

Rau răm ở lại chịu lời đắng cay...


#5 t031285

t031285

    biết vẽ rectang

  • Members
  • PipPip
  • 89 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 12 August 2011 - 06:43 AM

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.
  • 1

#6 hoan2182

hoan2182

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 2646 Bài viết
Điểm đánh giá: 832 (rất tốt)

Đã gửi 12 August 2011 - 06:52 AM

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

  • 0

Gió đưa cây cải về trời

Rau răm ở lại chịu lời đắng cay...


#7 t031285

t031285

    biết vẽ rectang

  • Members
  • PipPip
  • 89 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 12 August 2011 - 07:04 AM

Ý 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.
  • 0

#8 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 12 August 2011 - 07:40 AM

Ô, ừ 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))))

  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#9 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 12 August 2011 - 07:52 AM

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
  • 1

#10 t031285

t031285

    biết vẽ rectang

  • Members
  • PipPip
  • 89 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 12 August 2011 - 09:13 AM

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.
  • 0

#11 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 12 August 2011 - 09:26 AM

(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
  • 0

#12 t031285

t031285

    biết vẽ rectang

  • Members
  • PipPip
  • 89 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 12 August 2011 - 03:05 PM

Ô, ừ 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.
  • 0

#13 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 12 August 2011 - 04:55 PM

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ề.....
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#14 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 12 August 2011 - 05:36 PM

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ì ạ ???
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#15 t031285

t031285

    biết vẽ rectang

  • Members
  • PipPip
  • 89 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 12 August 2011 - 06:19 PM

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

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

#16 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 12 August 2011 - 09:40 PM

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:
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#17 hoan2182

hoan2182

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 2646 Bài viết
Điểm đánh giá: 832 (rất tốt)

Đã gửi 13 August 2011 - 08:28 AM

Hình đã gửi
hình 3
Hình đã gửi
Command: l LINE Specify point : 188.6778,4.7964
(lưu ý có dấu phẩy ở giữa x,y)
Hình 4

Hình đã gửi
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.

  • 1

Gió đưa cây cải về trời

Rau răm ở lại chịu lời đắng cay...


#18 hochoaivandot

hochoaivandot

    biết dimradius

  • Members
  • PipPipPipPipPip
  • 310 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 13 August 2011 - 09:06 PM

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?
  • 0

Dương Bá Diệp

 

www.cadonline.duyxuyen.vn 

 

Thành viên nhóm CADMAGIC

 


#19 ntduy1988

ntduy1988

    biết vẽ arc

  • Members
  • PipPip
  • 46 Bài viết
Điểm đánh giá: 9 (bình thường)

Đã gửi 15 August 2011 - 10:23 AM

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...i8xljd9y12pdb64
Lệnh: TT
  • 0

#20 trandanxd

trandanxd

    biết vẽ circle

  • Members
  • PipPip
  • 39 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 15 August 2011 - 10:30 AM

Mình hay dùng Lít này của thằng bạn :
http://www.cadviet.c...timtrongtam.lsp
  • 0
Người ta thường cô đơn bởi vì người ta thường chỉ lo xây tường chứ không lo xây dựng những nhịp cầu.
Hình đã gửi