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

lp_hai    207

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
Thaistreetz    515
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
lp_hai    207

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
duy782006    1.375
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
Thaistreetz    515
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
Tue_NV    3.841
........

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
lp_hai    207
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
lp_hai    207
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
phamthanhbinh    3.123
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
Thaistreetz    515
đầ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
Superlong    9

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

 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

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  

×