Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
7 replies to this topic

#1 congduy

congduy

    biết zoom

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

Đã gửi 30 May 2012 - 12:20 PM

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

#2 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1360 (rất tốt)

Đã gửi 30 May 2012 - 04:13 PM

Lấy làm chi?
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#3 congduy

congduy

    biết zoom

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

Đã gửi 07 June 2012 - 11:17 AM

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

#4 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5448 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 07 June 2012 - 11:34 AM

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 đó!
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#5 congduy

congduy

    biết zoom

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

Đã gửi 08 June 2012 - 01:43 PM

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

#6 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 08 June 2012 - 04:47 PM

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

#7 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 08 June 2012 - 11:17 PM

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

#8 congduy

congduy

    biết zoom

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

Đã gửi 30 July 2012 - 02:36 PM

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