Đến nội dung


Hình ảnh
- - - - -

chỉ giùm cách lấy điểm là các đỉnh của hình chữ nhật


  • Please log in to reply
12 replies to this topic

#1 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 20 July 2010 - 10:56 AM

Chào các pro!
em đang tập tành viết mấy cái lisp đơn giản để tự mình xài. các pro làm ơn chỉ giùm em cách để lấy điểm là đỉnh của hình chữ nhật (VD như em muốn vẽ line từ đỉnh số 1 đến dỉnh số 3 của hình chữ nhật)
  • 0
Hình đã gửi

#2 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 20 July 2010 - 12:28 PM

Chào các pro!
em đang tập tành viết mấy cái lisp đơn giản để tự mình xài. các pro làm ơn chỉ giùm em cách để lấy điểm là đỉnh của hình chữ nhật (VD như em muốn vẽ line từ đỉnh số 1 đến dỉnh số 3 của hình chữ nhật)

Những câu hỏi thế này bạn nên post vào topic hướng dẫn lập trình lisp.
Bạn tham khảo hàm con này. Đối số là ENAME của 1 pline
(defun getvert-en (en / i L) 
(setq i -1 L nil)
(repeat (fix (1+ (vlax-curve-getEndParam en) ))
(setq i (1+ i) L (append L (list (vlax-curve-getPointAtParam en i))))
)
)
Test: (getvert-en(car(entsel)))
  • 3

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#3 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 21 July 2010 - 08:23 AM

với trình độ của mình thì kho mà hiểu thấu đáo về cái hàm này được bạn ạh! theo mình hiểu thì cái hàm này có đối số là ename của 1 pline (đối tượng gồm nhiều pline), nhưng yêu cầu của mình thì xác định các điểm đầu mút(end) của một pline thôi.
cái hàm đó mình khong hiểu là nó cho kết quả gì. Mong bạn chỉ kỹ một chút cho mình nhé!
Thanks
  • 0
Hình đã gửi

#4 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 21 July 2010 - 11:01 AM

với trình độ của mình thì kho mà hiểu thấu đáo về cái hàm này được bạn ạh! theo mình hiểu thì cái hàm này có đối số là ename của 1 pline (đối tượng gồm nhiều pline), nhưng yêu cầu của mình thì xác định các điểm đầu mút(end) của một pline thôi.
cái hàm đó mình khong hiểu là nó cho kết quả gì. Mong bạn chỉ kỹ một chút cho mình nhé!
Thanks

Nếu vậy thì thử cái này xem:

(setq laynoidung (entget doituong))
(setq diemve (cdr (assoc 10 laynoidung)))

  • 1

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


#5 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 21 July 2010 - 12:30 PM

với trình độ của mình thì kho mà hiểu thấu đáo về cái hàm này được bạn ạh! theo mình hiểu thì cái hàm này có đối số là ename của 1 pline (đối tượng gồm nhiều pline), nhưng yêu cầu của mình thì xác định các điểm đầu mút(end) của một pline thôi.
cái hàm đó mình khong hiểu là nó cho kết quả gì. Mong bạn chỉ kỹ một chút cho mình nhé!
Thanks

thế này nhé. Hình chữ nhật vẽ ra bằng lệnh rectang là 1 đường pline đóng gồm 5 đỉnh (trong đó có đỉnh đầu và đỉnh cuối sẽ trùng nhau)
hàm trên sẽ trả về cho bạn 1 list gồm tập hợp tọa độ của các đỉnh này. bạn cần lấy tọa độ của đỉnh nào trong hình chữ nhật thì theo list đó mà lấy.
nếu không muốn sử dụng hàm con thì bạn có thể dùng hàm (acet-geom-vertex-list en) cũng trả về kết quả tương tự.
VD: (acet-geom-vertex-list (car (entsel "Chon hinh chu nhat")))
copy đoạn code trên vào dòng command để test.
  • 2

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#6 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 21 July 2010 - 02:11 PM

........
nếu không muốn sử dụng hàm con thì bạn có thể dùng hàm (acet-geom-vertex-list en) cũng trả về kết quả tương tự.
VD: (acet-geom-vertex-list (car (entsel "Chon hinh chu nhat")))
copy đoạn code trên vào dòng command để test.

Chỉ test và ra kết quả được khi máy bạn có cài đặt phụ trợ Express
  • 1

#7 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 21 July 2010 - 04:17 PM

Nếu vậy thì thử cái này xem:

(setq laynoidung (entget doituong))
(setq diemve (cdr (assoc 10 laynoidung)))

nhưng cái (setq diemve (cdr (assoc 10 laynoidung))) chỉ xác định được diểm số 1 của rectang thoi anh ah. các điểm 2, 3 và 4 có xác định theo cách này được ko? nếu được thì la assoc ?? hà anh.
chỉ giúp em với.
  • 0
Hình đã gửi

#8 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 21 July 2010 - 04:42 PM

thế này nhé. Hình chữ nhật vẽ ra bằng lệnh rectang là 1 đường pline đóng gồm 5 đỉnh (trong đó có đỉnh đầu và đỉnh cuối sẽ trùng nhau)
hàm trên sẽ trả về cho bạn 1 list gồm tập hợp tọa độ của các đỉnh này. bạn cần lấy tọa độ của đỉnh nào trong hình chữ nhật thì theo list đó mà lấy.
nếu không muốn sử dụng hàm con thì bạn có thể dùng hàm (acet-geom-vertex-list en) cũng trả về kết quả tương tự.
VD: (acet-geom-vertex-list (car (entsel "Chon hinh chu nhat")))
copy đoạn code trên vào dòng command để test.

đầu tiên em xin cảm ơn pác. khi em tét đoạn code đó thì cad trả về kq là tọa độ các điểm của rectang
((-216389.0 -106676.0 0.0) (-214615.0 -106676.0 0.0)
(-214615.0 -104981.0 0.0) (-216389.0 -104981.0 0.0) (-216389.0 -106676.0 0.0))
tiếp theo là làm sao để sữ dụng những tọa này trong lisp. em còn dở lisp lắm.
các pác đừng cười tội nghiệp. có lẽ pác nào có thời gian viết hộ em luôn.
Thanks
  • 0
Hình đã gửi

#9 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 21 July 2010 - 05:37 PM

nhưng cái (setq diemve (cdr (assoc 10 laynoidung))) chỉ xác định được diểm số 1 của rectang thoi anh ah. các điểm 2, 3 và 4 có xác định theo cách này được ko? nếu được thì la assoc ?? hà anh.
chỉ giúp em với.

Chào bạn lp_hai,
Vậy là bạn hiểu đúng vấn đề rồi đó. Với cái (assoc 10 enlist) thì bạn chỉ lấy được 1 điểm có mã dxf là (10 a b c) tức là điểm đầu của 1 đoạn thẳng trong đó a b c là tọa độ của điểm. Với đoạn thẳng thì nó chỉ có hai điểm để xác định là đầu và đít. Điểm đít của đoạn thẳng sẽ có mã dxf là (11 a b c) . Do đó muốn lấy tọa độ của điểm đít này bạn sẽ phải xài thắng (setq diemdit (cdr (assoc 11 laynoidung))) thay vì (setq diemve (cdr (assoc 10 laynoidung))) trong đoạn code trên bạn ạ.
Tuy nhiên vì bạn muốn lấy các đỉnh của một hình chữ nhật chứ không đơn thuần là điểm đầu cuối của đoạn thẳng riêng biệt nên bạn nên tham khảo bài viết của bác ThaiStreetz bạn nhé.
Như vậy là bạn đã test và có được một list gồm tọa độ của các đỉnh của hình chữ nhật rồi đó. Trong list này bạn lưu ý rằng : trật tự các đỉnh được lấy theo đúng cái cách mà bạn tạo ra nó và đỉnh cuối cùng sẽ trùng với đỉng đầu tiên do đây là mội pline khép kín. Để lấy ra từng đỉnh bạn sử dụng hàm (nth stt list) bạn ạ. Trong đó stt là số thứ tự của đỉnh trong cái list của bạn và list chính là cái list bạn đã có.
Giả sử bạn gọi cái list mà bạn có là lista (setq lista '((-216389.0 -106676.0 0.0) (-214615.0 -106676.0 0.0) (-214615.0 -104981.0 0.0) (-216389.0 -104981.0 0.0) (-216389.0 -106676.0 0.0)))
Như vậy để có đỉnh thứ nhất bạn dùng : (nth 0 lista) nó sẽ cho bạn kết quả là (-216389.0 -106676.0 0.0)
Để có đỉnh thứ hai bạn dùng : (nth 1 lista) nó sẽ cho bạn kết quả là (-214615.0 -106676.0 0.0)
.........
Từ đó bạn tha hồ mà chặt chém tiếp.
Ngoài ra bạn có thể tham khảo lisp lấy đỉnh của các pline trên diễn đàn đã có bạn nhé. Lisp này sẽ trả về một danh sách tọa độ các đỉnh của pline, từ đó bạn có thể tách các đỉnh ra tương tự như trên.

Chúc bạn thành công.
  • 2
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#10 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 21 July 2010 - 05:42 PM

đầu tiên em xin cảm ơn pác. khi em tét đoạn code đó thì cad trả về kq là tọa độ các điểm của rectang
((-216389.0 -106676.0 0.0) (-214615.0 -106676.0 0.0)
(-214615.0 -104981.0 0.0) (-216389.0 -104981.0 0.0) (-216389.0 -106676.0 0.0))
tiếp theo là làm sao để sữ dụng những tọa này trong lisp. em còn dở lisp lắm.
các pác đừng cười tội nghiệp. có lẽ pác nào có thời gian viết hộ em luôn.
Thanks

bạn dùng hàm (nth [number] [List]) để lấy ra tọa độ đỉnh nào bạn muốn. đây là code mình lấy ra cả 4 đỉnh.

(setq Rec (acet-geom-vertex-list (car (entsel "Chon hinh chu nhat")))
PT1 (nth 0 Rec)
PT2 (nth 1 Rec)
PT3 (nth 2 Rec)
PT4 (nth 3 Rec)
)

Những code tương tự thế này mình nghĩ là có rất nhiều trong diễn đàn này rồi, bạn nên tham khảo code của mọi người để tự hiểu ra vấn đề mình cần
  • 1

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#11 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 22 July 2010 - 10:05 AM

thanks 2 pác nhiều lắm!
  • 0
Hình đã gửi

#12 Superlong

Superlong

    biết vẽ arc

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

Đã gửi 19 March 2016 - 10:28 PM

làm sao có thể dùng hàm này để lấy tọa độ của nhiều pline cùng lúc không quét chuột chọn 1 lần nhìu đường luôn(acet-geom-vertex-list )

dùng entsel pick từng đường lâu quá mình dùng ssget thì nó lại không hiểu 

đoạn code dưới đây mình cần sửa chỗ nào để cho nó lọc danh sách các pline mình chọn để xử lí tọa độ của từng điểm được 

mình load vào chọn các pline xog là nó báo  lentityp (-1 . <Entity name: 

7ef034c0>)
 

vd:

(defun c:yeah(/ dt tenfile f lst lst2 i ls )

(vl-load-com)
(setq dt (ssget '((0 . "LWPOLYLINE")))
(setq sdt (sslength dt)
i 0)
(repeat sdt
(setq dt1 (ssname dt i)
i (+1 i)
 (setq td2 (acet-geom-vertex-list dt1)
.
.
.
.
.
các hàm xử lý vs tọa độ của đối tượng thứ i

  • 0

#13 Superlong

Superlong

    biết vẽ arc

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

Đã gửi 20 March 2016 - 08:47 AM

 cám ơn bác doan van ha em thành công rồi

 

(defun DXF (code elist)
(cdr (assoc code elist))
)

(defun c:ZX(/ dt tenfile f lst lst2 i ls )
(if (not scale) (setq scale 1))
(setq sc1 (getreal (strcat "\n Cao text <"(rtos scale 2 0)">:")))
(if sc1 (setq scale sc1))
(setq sc9 (cdr (assoc 1 (entget (car (entsel "\nChon Text Ly Trinh : "))))))
(setq p (getpoint "\nChon tim trac ngang: "))
(setq TX (Car P))
(setq TY (Cadr P))
(setq ed (entget (car (entsel "\nChon cao do tim : "))))
(setq H0 (read (DXF 1 ed)))
(setq ATLAST (getvar "Attreq"))
(setq dt (ssget '((0 . "LWPOLYLINE")))
sdt (sslength dt)
i 0)

(repeat sdt
(setq dt1 (ssname dt i)
i (1+ i)
rec (acet-geom-vertex-list dt1))
(setq x1 (car (nth 0 Rec))
y1 (cadr (nth 0 Rec))
x2 (car (nth 1 Rec))
y2 (cadr (nth 1 Rec))
x3 (car (nth 2 Rec))
y3 (cadr (nth 2 Rec))
)
(setq kc1 (rtos (- x1 tx) 2 2))
(setq kc2 (rtos (- x3 tx) 2 2))
(setq kctim (rtos (- x2 tx) 2 2))
(setq cd1 (rtos (abs (+ (- y1 ty) H0)) 2 2))
(setq cdtim (rtos (abs (+ (- y2 ty) H0)) 2 2))
(setq cd2 (rtos (abs (+ (- y3 ty) H0)) 2 2))
(setvar "attreq" 1)

(if (not (tblsearch "block" "dimTN"))
(progn (command "insert" "D:\\Lisp CAD\\BLOCK.dwg" 0 "" "" "")
(command "erase" (entlast) "")))
(if (> kc1 KC2) (command "INSERT" "dimTN" (nth 2 rec) scale scale 0 sc9 CD2 KC2 cdtim kctim CD1 KC1))

(if (< kc1 KC2) (command "INSERT" "dimTN" (nth 0 rec) scale scale 0 sc9 CD1 KC1 cdtim kctim CD2 KC2))
))

bác cho em hỏi thêm có cách nào sắp xếp các phần tử trong danh sách được chọn theo thứ tự từ lớn tới nhỏ không VD sau khi chọn 5 pline và dùng cadr lọc ra 5 tung độ rồi thì sẽ sắp xếp 5 tung độ đó theo thứ tự từ lớn tới nhỏ để đặt tên từ y1-y5 chứ không phải theo thứ tự chọn


  • 0