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

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

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

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)

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

  • Vote tăng 3

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

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

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

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

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

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

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

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ư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.

  • 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
đầ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]

  • ) để 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

  • 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

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

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

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 21/7/2010 tại 14:11, Tue_NV đã nói:

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

VD: (acet-geom-vertex-list (car (entsel "Chon hinh chu nhat")))

--------------------------------

Các anh chị cho em hỏi:

- Nếu hình chữ nhật đã được chọn trước và gán là tên là TH

(setq TH (ssget "W" D1 D2)); -- hình chữ nhật nằm trong ô D1 D2

 

Thì lệnh trên (acet-geom-vertex-list (car (entsel "Chon hinh chu nhat"))) mình sửa lại như thế nào vậy để hàm entsel không bị lỗi.

Thanks.

 

image.png.00b0079ad9c41a70d41190ee6fb1a0e2.png

 

Mong các anh chị 

 

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
10 giờ trước, Doan Van Ha đã nói:

Gộp lại:
(setq TH (ssget "W" D1 D2))

(acet-geom-vertex-list (ssname TH 0))

Cám ơn anh. Lệnh này nó chạy rồi

Nhưng sao khi áp dụng vào repeat thì nó không thực hiện được:

 

(defun c:rp3()
(setq n (getint "/nNhap so nguyen: "))
(setq p1 (getpoint  "\n Nhap toa do diem thu 1 goc trai phía duoi HCN  p1:")) 
(setq op 8000)
(setq op1 15000)
(setq op2 4000)
(setq i 0)
(repeat n
(setq i (1- n))
(setq F1 (list (+ (car p1) 0) (+ (cadr p1) (* op i) op2)))
(setq F2 (list (+ (car F1) op1) (- (cadr F1) op2)))
(setq TH (ssget "W" F1 F2))
(setq point (acet-geom-vertex-list (ssname TH 0)))
(setq t1 (nth 0 point))
(setq t3 (nth 2 point))
(command "line" t1 t3 "")
)
) 

image.png.ceee61ca8b5dbb4980401eda03bc2905.png

 

Không biết em sai chỗ nào nữa. Anh chị xem sửa giúp em vớ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
1 giờ} trướ}c, ngoctruongthienphu đã nói:

Cám ơn anh. Lệnh này nó chạy rồi

Nhưng sao khi áp dụng vào repeat thì nó không thực hiện được:

 

(defun c:rp3()
(setq n (getint "/nNhap so nguyen: "))
(setq p1 (getpoint  "\n Nhap toa do diem thu 1 goc trai phía duoi HCN  p1:")) 
(setq op 8000)
(setq op1 15000)
(setq op2 4000)
(setq i 0)
(repeat n
(setq i (1- n))
(setq F1 (list (+ (car p1) 0) (+ (cadr p1) (* op i) op2)))
(setq F2 (list (+ (car F1) op1) (- (cadr F1) op2)))
(setq TH (ssget "W" F1 F2))
(setq point (acet-geom-vertex-list (ssname TH 0)))
(setq t1 (nth 0 point))
(setq t3 (nth 2 point))
(command "line" t1 t3 "")
)
) 

image.png.ceee61ca8b5dbb4980401eda03bc2905.png

 

Không biết em sai chỗ nào nữa. Anh chị xem sửa giúp em với.

Sửa:

1- (setq i 0) thành (setq i n)

2- (setq i (1- n)) thành (setq i (1- 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
40 phút trước, alisp đã nói:

Sửa:

1- (setq i 0) thành (setq i n)

2- (setq i (1- n)) thành (setq i (1- i))

Em đã sửa như trên lệnh vẫn chưa thực hiện được anh. Còn 

1- (setq i 0)

2- (setq i (1- n)) như cũ thì 

Hàm repeat nó thực hiện chạy được F1 F2.

Ttuy nhiên đến hàm này (setq point (acet-geom-vertex-list (ssname TH 0))) là nó không hiểu lệnh trong repeat để thực hiện vẽ line từ t1 đến t2.

bv.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
30 phút trước, ngoctruongthienphu đã nói:

Em đã sửa như trên lệnh vẫn chưa thực hiện được anh. Còn 

1- (setq i 0)

2- (setq i (1- n)) như cũ thì 

Hàm repeat nó thực hiện chạy được F1 F2.

Ttuy nhiên đến hàm này (setq point (acet-geom-vertex-list (ssname TH 0))) là nó không hiểu lệnh trong repeat để thực hiện vẽ line từ t1 đến t2.

bv.dwg

Bạn cứ làm như tôi nói nhớ chọn điểm P1 ở dưới cùng tốt nhất là xóa hết mấy cái linh tinh và chỉ để như hình dưới.

Còn nếu bạn muốn giữ ý của mình thì chỉ bắt được pline ở trên cùng thôi vì nếu cho i = n -1 thì i luôn luôn =2 nếu chọn n = 3.

Cỏn tại sao (setq point (acet-geom-vertex-list (ssname TH 0)))  không làm việc là vì nó bắt ngay cái vòng tròn nàm gần chữ F1.

639851088_Screenshot2021-08-0620_20_44.thumb.png.1ef35cb7044b7614402102a3f5dd6450.png

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

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é!| day rut nhua

  • Vote giảm 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
48 phút trước, betion đã nói:

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é!| day rut nhua

Bạn cần thì bạn hỏi, chứ người ta trả lời cho người khác chứ không phải cho bạn mà.

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

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  

×