Chuyển đến nội dung
Diễn đàn CADViet
thanhduan2407

Array đối tượng trong vùng

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

Kết quả sai trong trường hợp đường cong có arc cho dù đường cong lồi hay lõm.

Thực ra lỗi là ở hàm vla-GetBoundingBox

Nếu đường cong có arc thì (x, y,z) của minpt nhỏ hơn (x, y,z) tương ứng của BoundingBox chính xác 1.e8

tương tự (x, y,z) của maxpt lớn hơn (x, y,z) của BoundingBox chính xác 1.e8

từ đó suy ra hàm IntersectWith cũng sai vì thực sự trong không gian LINE có z=1e-8 sẽ không cắt đường cong.

Vì vậy ta bỏ thành phần z của minpt và maxpt là được.

Tìm đến dòng

	(setq minpt (vlax-safearray->list minpt) 
maxpt (vlax-safearray->list maxpt) maxpt

Sửa thành

	(setq minpt (vlax-safearray->list minpt) minpt (list (car minpt) (cadr minpt))
maxpt (vlax-safearray->list maxpt) maxpt (list (car maxpt) (cadr maxpt))

Chào bác ndtnv,

Có lẽ bác đã tìm thêm 1 lỗi nữa lisp của Giabach, cũng như của Tuenv. Thiep đã chạy lisp của Giabach trên vùng kín là 1 đa giác lõm không có arc với khoảng cách rải block tương đối nhỏ thì phát hiện lỗi.

Theo Thiep, bài toán đặt ra là "Array đối tượng block trong vùng kín". Như vậy yêu cầu lisp phải giải quyết được:

- Vùng kín có thể là 1 curve bất kỳ: đa giác hay đường cong trơn kín, có thể là gồm các curve tạo thành vùng kín, và có thể có đảo nữa (cũng là 1 curve kín bất kỳ).

- Mạng lưới rải block có thể lựa chọn là mạng lưới hình vuông (như của Tue_nv), có thể xoay góc 45o (như của Giabach), hay hình tam giác đều (Thiep đề nghị thêm). Tóm lại mạng lưới rải có thể hình vuông hay hình tam giác đều và có thể xoay 1 góc nào đó, tuỳ chọn.

- Khoảng cách rải giữa block có thể thay đổi.

Thân ái chào bác.

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
Xin lỗi đã để thanhDuan phải đợi lâu.

@thanh duan : Ở dòng Select Object (để chọn đối tượng bạn nhấn 'fi -> lập tức hộp thoại Filter hiện ra cho bạn lọc đó nhé :D

Trình Lisp của bác cao quá, em không nghĩ khi chạy chương trình của bác bất ngờ đến vậy. Điều này em nghĩ nó phức tạp quá trời khi nghĩ đến thuật toán giải quyết vấn đề đó. Vl-, Vla-, Vlax- .... hỗ trợ cho cad rất nhiều các bài toán. Bác có thể bật mí về ý nghĩa các hàm Vl-, Vla-, Vlax- .... được không hả bác? Em có thể tìm thấy tài liệu đó từ đâu ạ?

 

Qua nhiều thử nghiệm, bài toán đã được giải quyết 90% . Còn 10% là do vấn đề liên quan giao cắt các đối tượng với vùng kín (em chỉ dùng polyline), một số đối tượng giao với vùng kín thì khi chọn bên TRONG hay Ngoai có đối tượng thì được chọn, có đối tượng thì không bị chọn mà chúng đều giao với vùng kín. Ý của em là đối với đối tượng dạng điểm (VD như Text ) thì xét điểm chèn, còn với đối tượng dạng đường thì xét sự giao cắt với vùng kín, cứ có sự giao cắt với vùng kín thì xác định là nó nằm trên vùng kín.

Bác xem ví dụ này nha: http://www.cadviet.com/upfiles/3/gui_bac_tue_nv.dwg

Tuy nhiên em rất hài lòng với phần lập trình của bác đã đáp ứng tương đối hoàn chỉnh yêu cầu và không có lý do gì mà không tặng thang điểm 10 cho bác. :D :D

Em cũng nhân tiện hỏi bác phần lỗi mà em thử nghiệm 1 số máy thấy nó hỏi là ko load được (acet-undo-begin)? và lần trước em hỏi bác nhưng chắc bác bận chưa trả lời

Bác Tue_NV à!

Em có thể hỏi bác một chút được không?

Một số hàm vl-, vlax-.....em không biết tìm kiếm đâu để tra cứu.

Bác có thể send cho em cấu trúc các hàm đó và cách sử dụng được không?

Cụ thể một số hàm trong lisp bác viết như:

(setq ms (vla-get-modelspace (vla-get-activedocument(vlax-get-acad-object))))

(setq pl (vlax-ename->vla-object (car(entsel "\n Chon Polyline kin :"))))

 

Ngoài ra còn hàm :

 

+ (setq minp (safearray-value minp))

+ (setq maxp (safearray-value maxp))

+ (setq line (vla-addline ms (vlax-3d-point minpp)

(vla-get-insertionpoint x)

 

+ (if (= (rem (length (vlax-invoke pl 'intersectwith line 0)) 2) 0)

(vla-erase x)

Bác giải thích cho em các hàm trên bác nhé.

Mong rằng sau mỗi lần hiểu em sẽ vọc thêm được nhiều kiến thức hơn nữa. Cảm ơn bác

Chân thành cảm ơn bác

Chúc bác luôn mạnh khoẻ và có nhiều niềm vui.

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

bác làm bên địa hình có file ký hiệu dùng trong đia hình không cho em một bản?

gmail: dactracdia@gmail.com

và cuốn ký hiệu bản đồ địa hình các tỷ lệ không?

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

(defun c:sic(/ oldos ms doc util i pl line line2 line3 obj progbar
 sslistints sslistins sslistous dist ans OK)
;;;COPYRIGHT BY TUE_NV. Contact: tue_nvcc@yahoo.com
(IF (acet-util-ver)
(PROGN
 (vl-load-com)
 (defun minmaxp (ob) (vla-getboundingbox ob 'minp 'maxp))
 (defun getss(ob) (acet-list-to-ss(mapcar 'vlax-vla-object->ename ob)))
 (defun *error* (msg)
(princ "error: ")
(princ msg)
(princ)
 )
 (defun bloi(errmsg)
(setvar "osmode" oldos)
(and progbar (acet-ui-progress) )
 )
 (defun checkClosed(/ OK)
(while (and (null OK) (setq pl (vlax-ename->vla-object
(ssname (acet-ui-entsel (list "\n Chon duong bao kin :")) 0)))  )
     	(if (null (vlax-curve-isClosed pl) )
   	(progn (princ "\n Chon lai duong bao kin :") (setq OK nil))
   	(setq OK T)
 )
)
pl
 )
 (acet-undo-begin)
 (setq oldos (getvar "osmode"))
 (setq ms (vla-get-modelspace
 (setq doc (vla-get-activedocument
(vlax-get-acad-object)
)
 )
)
util (vla-get-Utility doc)
ss (vla-get-pickfirstselectionset doc)
 )
 (prompt "\n Chon cac doi tuong :")
 (vla-SelectOnScreen ss)
 (iF (> (vla-get-count ss) 0)
(proGN
  (setq i 0)
  (setq temperr *error*)
  (setq *error* bloi)
 (minmaxp (checkClosed) )
  (setq minpp (mapcar '- (safearray-value minp)
(list (setq dist (distance (safearray-value maxp) (safearray-value minp)))
 	dist 0.0)))
(initget "TRONG TREN NG")
(setq ans (getkword "\n Ban muon chon doi tuong nam TRONG/TREN/NGoai duong bao :"))
  (setvar "osmode" 0)
  (setq ProgBar (acet-ui-progress "Dang tinh toan...." (vla-get-count ss)))
(while (< i (vla-get-count ss))
(minmaxp (setq obj (vla-item ss i)))
(setq line (vla-addline ms minp maxp ))
(setq line2 (vla-addline ms
(vla-polarpoint util minp 0
(- (car (safearray-value maxp)) (car (safearray-value minp)) )
)
(vla-polarpoint util minp (/ pi 2)
(- (cadr (safearray-value maxp)) (cadr (safearray-value minp)) )
)
   	)
)
 ;
(if (and (/= (length (vlax-invoke pl 'intersectwith line 0)) 0)
 	(/= (length (vlax-invoke pl 'intersectwith line2 0)) 0)
		)
(PROGN
  (setq sslistints (cons obj sslistints))
)
(PROGN
     	(setq line3 (vla-addline ms (vlax-3d-point minpp) minp ))
  (if (= (rem (length (vlax-invoke pl 'intersectwith line3 0)) 2) 0)
(setq sslistous (cons obj sslistous))
(setq sslistins (cons obj sslistins))
  )
  (vla-erase line3)
)
);if
 (setq i (1+ i))
 (vla-erase line)
 (vla-erase line2)
 (acet-ui-progress -1)
);while
(setq ProgBar (acet-ui-progress))
(COND
 ((= ans "TRONG") (setq sss (getss sslistins)))
 ((= ans "TREN") (setq sss (getss sslistints)))
 ((= ans "NG") (setq sss (getss sslistous)))
)
(acet-undo-end)
(sssetfirst sss sss)
(setq *error* temperr)

);proGN
(alert "\n No Selected....")
  );iF
);PROGN
(alert "\n Chua cai Express")
);IF
(princ)
)

Nhờ các bác xem và chỉnh sửa lại dùm em lisp này của bác TUE_NV.

Sau khi em dùng lệnh ssx của cad để ngầm lựa chọn các đối tượng trong bản vẽ.

Sau khi dùng lệnh SIC của bác TUE_NV thì lisp sẽ chỉ chọn các đối tượng đã lựa chọn trước và nằm trong/trên/ngoài vùng khép kín.

Sau khi chọn được rồi ta có thể Copy, Move, Erase,....

Em cũng đã thử chỉnh sửa nhưng không được.

Các bác giúp em nhé. Em đang mò mẫm lại cho thỏa cái đam mê. :D

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 thấy Lisp AIC hay copyblk đều rất hay.Tuy nhiên công việc của em lại chưa thể dùng được.Mong các anh có thể sửa giúp em để có kết quả Array theo hướng cho trước, cho lựa chọn khoảng cách hàng và cột (UCS Wolrd hoặc UCS bất kỳ) như hình vẽ sau:

3badf46d122a6699688bb1a8548d99aa_51280855.2.jpg

 

Ngoài ra với lisp SIC em có ý kiến thế này:

Anh có thể sửa và bổ sung thêm với TH nó chọn các Block.

Hiện tại thì lisp đang select tất cả các Block nằm trên đường bao nếu chỉ 1 phần của Block giao với bao.

Với TH của em và có lẽ nhiều TH khác thì Block làm việc theo điểm gốc Block nên em muốn nhờ anh bổ sung thêm giúp em phần lựa chọn để lisp select dựa vào gốc Block chứ không phải điểm bất kỳ thuộc Block

VD: chọn các Block phần ngoài đường bao nghĩa là select tất cả các Block có tim nằm ngoài vùng 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

×