Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
congduy

[Yêu cầu] Lisp lấy các thông số của đối tượng line, polyline, circle .....

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

Các bác giúp em đoạn code để lấy các thông số của các đối tượng trong cad nhé:

 

B1: chọn đối tượng.

 

B2: lấy thông số cơ bản.

- Với đoạn thẳng: lấy ra tọa độ 2 điểm.

- Với hình chữ nhật: lấy tọa độ của 4 điểm.

- Với hình tròn: lấy tọa độ tâm và bán kính.

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

Em đang viết một cái Lisp với mục đích chính là chọn tất cả các đối tượng nằm trong một đa giác kín hoặc một hình tròn (màu vàng)

Hình này được tạo thành khi offset đa giác hay hình tròn ban đầu (màu trắng) ra một khoảng cách nào đó.

Như hình minh họa dưới đây. Các bác cho ý kiến tư vấn nhé.http://www.cadviet.com/upfiles/3/109311_minhhoa_selection.dwg

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 đang viết một cái Lisp với mục đích chính là chọn tất cả các đối tượng nằm trong một đa giác kín hoặc một hình tròn (màu vàng)

Hình này được tạo thành khi offset đa giác hay hình tròn ban đầu (màu trắng) ra một khoảng cách nào đó.

Như hình minh họa dưới đây. Các bác cho ý kiến tư vấn nhé.http://www.cadviet.c...a_selection.dwg

Ý kiến tư vấn: search xem CadViet có chưa? Chắc có rồi đó!

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

Thanks bác Ha, để em tìm xem.

Hề hề hề,

Bạn thử cái này xem nhé. mình mới làm cho LWpolyline kín còn circle thì phải có bước chuyển nó thành lwpolyline nữa. Nếu bạn ưng thì mình sẽ là nốt phần circle.


(defun c:sldb ()
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(command "undo" "be")
(setq ent (car (entsel "\n Chon doi tuong goc")))
(command "offset" (getreal "\n Nhap khoang cach can offset") ent (getpoint "\n Chon phia offset ") "")
(setq ent1 (entlast)
         elst (entget ent1)  )
(if (and (= (cdr (assoc 0 elst)) "LWPOLYLINE") (= (cdr (assoc 70 elst)) 1))
   (setq ss (ssget "CP" (acet-geom-vertex-list ent1)))
)
;;;(sssetfirst ss)
(command "undo" "e")
(setvar "osmode" oldos)
(princ)
)

Chúc bạn vui.

  • 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

Hề hề hề,

Bạn thử cái này xem nhé. mình mới làm cho LWpolyline kín còn circle thì phải có bước chuyển nó thành lwpolyline nữa. Nếu bạn ưng thì mình sẽ là nốt phần circle.

 

Chúc bạn vui.

Hề hể hề,

Đây là code bổ sung vào lisp trên với chức năng thêm xử lý cả khi đối tượng là circle đồng thời hiển thị luôn các đối tượng được chọn trên màn hình


(defun c:sldb (/ oldos ent ent1 elst ss d)
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(command "undo" "be")
(setq ent (car (entsel "\n Chon doi tuong goc")))
(command "offset" (getreal "\n Nhap khoang cach can offset: ") ent (getpoint "\n Chon phia offset ") "")
(setq ent1 (entlast)
         elst (entget ent1)  )
(if (and (= (cdr (assoc 0 elst)) "LWPOLYLINE") (= (cdr (assoc 70 elst)) 1))
   (setq ss (ssget "CP" (acet-geom-vertex-list ent1)))
)
(if (= (cdr (assoc 0 elst)) "CIRCLE")
   (setq d (getreal "\n Nhap khoang cach giua hai diem lien ke: ")
             ss (ssget "CP" (makelist ent1 d)) )
)

(command "undo" "e")
(setvar "osmode" oldos)
(sssetfirst nil ss)
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;-------------------------------------------------------------
(defun makelist ( e d1 / ps pe d d2 p2);;;Make points list along curve e. Length of 1 segment = d1
(vl-load-com);;;Load Visual LISP extensions before use vlax-xxxx functions
(setq
ps (vlax-curve-getStartPoint e);;;Start point
pe (vlax-curve-getEndPoint e);;;End point
d (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e));;;Length of curve e
d2 d1;;;Init variable distance
plst (list)
)
;;;;;;;(command "pline");;;Call pline command
(setq plst (append plst (list ps)));;;Start point
(while (<= d2 d);;;While not over end point pe
(setq p2 (vlax-curve-getPointAtDist e d2));;;Variable point at d2 = length along curve
(setq plst (append plst (list p2)));;;Continue point list with current point  p2
(setq d2 (+ d2 d1));;;Increase distance d2 by d1
);;;End while
;;;;;(if (not (equal pe ps 0.01))
(setq plst (append plst (list pe)));;;Continue points list with pe and finish command
;;;;(command "c" )
;;;)
plst
)

Trong đoạn code trên có sử dụng một phần lisp biến đường tròn thành lwpolyline của bác SSG nhưng thay vì vẽ pline thì mình chuyển lại chỉ tạo points list cho đỡ phải vẽ rồi lại xóa đi.

Bạn nhớ cám ơn bác ấy nếu thấy dùng được cái lisp này nhé.

  • 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

Hề hể hề,

Đây là code bổ sung vào lisp trên với chức năng thêm xử lý cả khi đối tượng là circle đồng thời hiển thị luôn các đối tượng được chọn trên màn hình


(defun c:sldb (/ oldos ent ent1 elst ss d)
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(command "undo" "be")
(setq ent (car (entsel "\n Chon doi tuong goc")))
(command "offset" (getreal "\n Nhap khoang cach can offset: ") ent (getpoint "\n Chon phia offset ") "")
(setq ent1 (entlast)
         elst (entget ent1)  )
(if (and (= (cdr (assoc 0 elst)) "LWPOLYLINE") (= (cdr (assoc 70 elst)) 1))
   (setq ss (ssget "CP" (acet-geom-vertex-list ent1)))
)
(if (= (cdr (assoc 0 elst)) "CIRCLE")
   (setq d (getreal "\n Nhap khoang cach giua hai diem lien ke: ")
             ss (ssget "CP" (makelist ent1 d)) )
)

(command "undo" "e")
(setvar "osmode" oldos)
(sssetfirst nil ss)
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;-------------------------------------------------------------
(defun makelist ( e d1 / ps pe d d2 p2);;;Make points list along curve e. Length of 1 segment = d1
(vl-load-com);;;Load Visual LISP extensions before use vlax-xxxx functions
(setq
ps (vlax-curve-getStartPoint e);;;Start point
pe (vlax-curve-getEndPoint e);;;End point
d (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e));;;Length of curve e
d2 d1;;;Init variable distance
plst (list)
)
;;;;;;;(command "pline");;;Call pline command
(setq plst (append plst (list ps)));;;Start point
(while (<= d2 d);;;While not over end point pe
(setq p2 (vlax-curve-getPointAtDist e d2));;;Variable point at d2 = length along curve
(setq plst (append plst (list p2)));;;Continue point list with current point  p2
(setq d2 (+ d2 d1));;;Increase distance d2 by d1
);;;End while
;;;;;(if (not (equal pe ps 0.01))
(setq plst (append plst (list pe)));;;Continue points list with pe and finish command
;;;;(command "c" )
;;;)
plst
)

Trong đoạn code trên có sử dụng một phần lisp biến đường tròn thành lwpolyline của bác SSG nhưng thay vì vẽ pline thì mình chuyển lại chỉ tạo points list cho đỡ phải vẽ rồi lại xóa đi.

Bạn nhớ cám ơn bác ấy nếu thấy dùng được cái lisp này nhé.

 

Cam ơn bạn nhé.

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  

×