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

Viết lisp theo yêu cầu [phần 2]

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

Vì phần mềm mình sử dụng không có chức năng nhập đường cong (arc & spline) nên chỉ dùng Polyline và Line , mình dùng Lisp của bạn Bình chạy ra kết quả rất chính xác, việc viết lisp có thể kết thúc ở đây đc rồi. Thanks 2 bác Bình và Tú rất nhiều ^__^

 

1 yêu cầu khác (theo như bác Tue_VN nói là lại sinh ra "1 quả trứng vàng khác", hy vọng không ai ném đá mình, hux #___#) là cho sẵn file hình vẽ, không cần pick điểm, lisp tự động pick nhận diện được tất cả các đường boundary và xuất ra toạ độ như vừa rồi, không biết việc này có dễ thực hiện k !? (trường hợp số boundary >50) , trường hợp này rất hiếm gặp nhưng giải quyết được thì bài toán sẽ tự động hoàn toàn, nếu giúp được thì giúp mình luôn nhé :cheers:

Chào bạn hdt4151,

Ném đá thì không nhưng ném trứng thì có đây.

Trước hết bạn phải nhớ rằng lisp chỉ là một công cụ giúp con người chứ nó không phải là con người và cũng không thể thay con người. Không có con người thì auto lisp chứ đến ô tô dép cũng là đồ vô dụng.

Vì thế nếu bạn muốn líp tự nhận dạng các boundary thì bạn phải chỉ cho nó biết cái boundary của bạn nó là cái của nợ như thế nào chứ. Trứng vàng hay trứng ung thì cũng phải có cái tiêu chí để xác định chớ.

Vậy nên bạn phải suy nghĩ cho kỹ và tự nghĩ ra các tiêu chí bạn muốn dùng để xác định cái boundary của bạn thì mới nói chuyện lisp nó giúp bạn. Còn nếu chính bạn cũng chả biết phải làm gì, chả có tiêu chí xác định thì lisp chứ bố lisp nó cũng ị ra đó, chả giúp gì được cho bạn đâu.

Cái gọi là bản vẽ bạn cũng chả thèm post lên thì đừng nghĩ chuyện mọi người có thể giúp bạn tìm ra các tiêu chí khả dĩ mà lisp có thể sử dụng. Đừng ỷ lại như vậy, và cũng đừng bày trò đánh đố người khác như thê.

Mọi người nghĩ sao thì mình không biết nhưng mình thì sẽ không dại dột tự suy luận nữa vì có giời mới biết cái mình nghĩ có giống cái bạn cần hay không??

Mà mình thì chả bao giờ muốn làm một việc vô ích cả. Chừng nào bạn chưa đưa ra được các tiêu chí của bạn và chưa post cái bản vẽ của bạn lên thì chừng đó mình sẽ ngồi chờ thôi. Mong bạn chớ có phiền lòng...

  • 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

Hình minh hoạ đây bạn:

http://www.cadviet.com/upfiles/3/v.dwg

 

Hình vẽ gồm nhiều line giao nhau tạo ra các đa giác, như hình vẽ trên là có 9 đa giác, các đa giác thoã điều kiện: bên trong mỗi đa giác không có đa giác nào cả.

 

Lisp tự động tìm ra các đa giác đó, và xuất ra được toạ độ các điểm nằm trên đa giác như lisp ban đầu.

 

Cách tìm tự động các đa giác : ... tạm thời chưa nghĩ ra vì hơi khó về mặt giải thuật +_+ , nhờ bạn nghĩ giúp mình với.

 

Các bước theo mình nghĩ là cần làm trước:

+ Break line tại giao điểm => chi còn line giao nhau tại điểm đầu và cuối

+ Add point tại 2 đầu của line, xoá point trùng nhau

 

Làm theo cách này thì rất mất thời gian:

+ Xác định xmin xmax , ymin ymax trong tất cả các point tạo thành 1 miền hình chữ nhật

+ Tìm A= (xi - xj) min , B = (yi - yj)min [A, B lấy theo giá tri tuyệt đối ; i#j ]

Nói rõ hơn là tìm khoảng cách x bé nhất giữa các điểm, khoảng cách y bé nhất ...

+ Đặt C = min( A , B )

+ Pick 1 lưới điểm trong miền hình chữa nhật trên, mỗi điểm cách điểm kế nó 1 khoảng là C (theo phương x hoặc y)

+ Tạo boundary với điểm vửa pick => tạo được đa giác => xuất ra toạ độ (như Lisp trước đó)

+ Xoá các đa giác trùng nhau.

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
Hình minh hoạ đây bạn:

http://www.cadviet.com/upfiles/3/v.dwg

 

Hình vẽ gồm nhiều line giao nhau tạo ra các đa giác, như hình vẽ trên là có 9 đa giác, các đa giác thoã điều kiện: bên trong mỗi đa giác không có đa giác nào cả.

 

Lisp tự động tìm ra các đa giác đó, và xuất ra được toạ độ các điểm nằm trên đa giác như lisp ban đầu.

 

Cách tìm tự động các đa giác : ... tạm thời chưa nghĩ ra vì hơi khó về mặt giải thuật +_+ , nhờ bạn nghĩ giúp mình với.

 

Các bước theo mình nghĩ là cần làm trước:

+ Break line tại giao điểm => chi còn line giao nhau tại điểm đầu và cuối

+ Add point tại 2 đầu của line, xoá point trùng nhau

 

Làm theo cách này thì rất mất thời gian:

+ Xác định xmin xmax , ymin ymax trong tất cả các point tạo thành 1 miền hình chữ nhật

+ Tìm A= (xi - xj) min , B = (yi - yj)min [A, B lấy theo giá tri tuyệt đối ; i#j ]

Nói rõ hơn là tìm khoảng cách x bé nhất giữa các điểm, khoảng cách y bé nhất ...

+ Đặt C = min( A , B )

+ Pick 1 lưới điểm trong miền hình chữa nhật trên, mỗi điểm cách điểm kế nó 1 khoảng là C (theo phương x hoặc y)

+ Tạo boundary với điểm vửa pick => tạo được đa giác => xuất ra toạ độ (như Lisp trước đó)

+ Xoá các đa giác trùng nhau.

Diễn đàn dạo này lỗi quá không thể down file của bạn được. Bạn up lên hot khác đ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
uh, mình up lên host của MF rồi đây :

 

http://www.mediafire.com/?vg0eubqzaotehsd

 

Hình JPG:

 

http://i860.photobucket.com/albums/ab170/hdt194_1/v.jpg

Thế này thì vượt khỏi khả năng của mình rồi. Nhường lại các bác khúc xương nay mình bó tay rồ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
uh, mình up lên host của MF rồi đây :

 

http://www.mediafire.com/?vg0eubqzaotehsd

 

Hình JPG:

 

http://i860.photobucket.com/albums/ab170/hdt194_1/v-1.jpg

Mình chẳng biết các bác làm gì trước đó, nhưng nhìn hình vẽ của bạn thì có thể làm như vậy :

- 1/ Tìm hàm cắt tất cả các line tại điểm giao

- 2/ dùng lệnh (setq n (entlast)) để nhớ đối tượng cuối vào n

- 3/ dùng lệnh region để tạo các đa giác

- 4/ Tìm tập hợp ss các đối tượng tạo ra sau n cho đến cuối

- 5/ Xóa tất cả trừ ss lại

- 6/ Xóa entlast

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
Hình minh hoạ đây bạn:

http://www.cadviet.com/upfiles/3/v.dwg

 

Hình vẽ gồm nhiều line giao nhau tạo ra các đa giác, như hình vẽ trên là có 9 đa giác, các đa giác thoã điều kiện: bên trong mỗi đa giác không có đa giác nào cả.

 

Lisp tự động tìm ra các đa giác đó, và xuất ra được toạ độ các điểm nằm trên đa giác như lisp ban đầu.

 

Cách tìm tự động các đa giác : ... tạm thời chưa nghĩ ra vì hơi khó về mặt giải thuật +_+ , nhờ bạn nghĩ giúp mình với.

 

Các bước theo mình nghĩ là cần làm trước:

+ Break line tại giao điểm => chi còn line giao nhau tại điểm đầu và cuối

+ Add point tại 2 đầu của line, xoá point trùng nhau

 

Làm theo cách này thì rất mất thời gian:

+ Xác định xmin xmax , ymin ymax trong tất cả các point tạo thành 1 miền hình chữ nhật

+ Tìm A= (xi - xj) min , B = (yi - yj)min [A, B lấy theo giá tri tuyệt đối ; i#j ]

Nói rõ hơn là tìm khoảng cách x bé nhất giữa các điểm, khoảng cách y bé nhất ...

+ Đặt C = min( A , B )

+ Pick 1 lưới điểm trong miền hình chữa nhật trên, mỗi điểm cách điểm kế nó 1 khoảng là C (theo phương x hoặc y)

+ Tạo boundary với điểm vửa pick => tạo được đa giác => xuất ra toạ độ (như Lisp trước đó)

+ Xoá các đa giác trùng nhau.

Hi,

Bài toán của Bạn làm mình liên tưởng đến 1 bài toán tương tự là tìm 1 lưới tam giác,nhưng ở đây lại là vừa tam giác vừa đa giác.

Bài toán tam giác là khá lớn về mặt thuật toán,nó thường giúp tạo lưới trong pp phần tử hữu hạn và 1 vài bài toán khác trong trắc địa.Không biết ở đây có mối liên hệ gì không?

Có lẽ phải mất kha khá thời gian và công sức

Phải kiên trì thôi Bạn nhỉ.

Chúc thành cô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
Chào bác Tue_NV,

Rất cám ơn bác đã có những lời động viên khích lệ đúng lúc.

Về cái vụ pline có phân đoạn ARC thực tế mình cũng chưa thử, song thiển nghĩ là lisp mình viết vẫn có thể thích ứng do mình phân tích như sau:

1/- Pline có các phân đoạn ARC thì khi dùng lệnh Boundary thì nó vẫn lấy ra được hoán toàn các phân đoạn này và các đỉnh của boundary cũng sẽ lấy được bác ạ. Chỉ có duy nhất một chỗ mình hơi nghi ngờ là các parameter có còn đúng nữa hay không mà thôi.

2/- Về cách xác định các điểm giao cắt thì mình dùng hàm lấy giao điểm của các đối tượng với nhau bất kể đó là đối tương gì trong các đối tượng line. poplyline, lwpolyline, arc, circle, arc , ellipse. Do vậy chắc chắn nó sẽ lấy được giao điểm nếu có. Chỉ còn một lỗi là nó chỉ lấy được một giao điểm trong khi các arc, circle và ellipse thì lại có thể có hai giao điểm với boundary. Về vấn đề này mình cũng đã nghĩ đến, song thiệt nghĩ có nhẽ cũng hiếm gặp nên không tìm cách giải quyết mà nghĩ rằng nếu gặp vậy thì phải break các đường đó ra thành hai đoạn sẽ đơn giản hơn.

Do mình sử dụng cái hàm tìm giao điểm mót được trên diễn đàn nên cũng không biết cách sửa nó để có thể đạt được yêu cầu tìm hết cả các giao điểm của các đường cong.

3/- Việc tập hợp các điểm giao cắt và các đỉnh theo mình là đã xử lý được vấn đề tránh sự trùng lặp nên sẽ không có vấn đề khi ghi ra file nữa.

 

Cuối cùng, nếu bác không bận lắm có thể gợi ý cho mình cái giải pháp để hoàn thiện cái lisp trên được không.

Cám ơn bác nhiều

Xìn lỗi bác Tue_NV,

Mình nhầm vì sau khi thử thấy đúng là nếu boundary có phân đoạn cong thì lệnh boundary sẽ không hoạt động được mà phải chuyển qua tạo region. Do khi pick điểm vẫn thấy các đường cong được chọn nên mình cứ nghĩ là nó sẽ vẫn tạo ra boundary theo các đường cong này nhưng thự tế khi enter thì nó trả lới là không tạo được boundary và hỏi có tạo region hay không, nếu yes thì nó trả về region, còn no thì trả về nil.

Lỗi này là do mình dốt về Cad nên chưa hiểu rõ, mong bác đừng giận.

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
Hình minh hoạ đây bạn:

http://www.cadviet.com/upfiles/3/v.dwg

 

Hình vẽ gồm nhiều line giao nhau tạo ra các đa giác, như hình vẽ trên là có 9 đa giác, các đa giác thoã điều kiện: bên trong mỗi đa giác không có đa giác nào cả.

 

Lisp tự động tìm ra các đa giác đó, và xuất ra được toạ độ các điểm nằm trên đa giác như lisp ban đầu.

 

Cách tìm tự động các đa giác : ... tạm thời chưa nghĩ ra vì hơi khó về mặt giải thuật +_+ , nhờ bạn nghĩ giúp mình với.

 

Các bước theo mình nghĩ là cần làm trước:

+ Break line tại giao điểm => chi còn line giao nhau tại điểm đầu và cuối

+ Add point tại 2 đầu của line, xoá point trùng nhau

 

Làm theo cách này thì rất mất thời gian:

+ Xác định xmin xmax , ymin ymax trong tất cả các point tạo thành 1 miền hình chữ nhật

+ Tìm A= (xi - xj) min , B = (yi - yj)min [A, B lấy theo giá tri tuyệt đối ; i#j ]

Nói rõ hơn là tìm khoảng cách x bé nhất giữa các điểm, khoảng cách y bé nhất ...

+ Đặt C = min( A , B )

+ Pick 1 lưới điểm trong miền hình chữa nhật trên, mỗi điểm cách điểm kế nó 1 khoảng là C (theo phương x hoặc y)

+ Tạo boundary với điểm vửa pick => tạo được đa giác => xuất ra toạ độ (như Lisp trước đó)

+ Xoá các đa giác trùng nhau.

Phương án này không ổn vì giả sử trong tập line này có chứ các line song song với trục tọa độ thì xmin và y min sẽ bằng 0 bạn ạ.

 

Việc tìm các điểm giao cắt là có thể

Nhét chúng vào một tập hợp và loại bỏ các điểm trùng nhau là có thể

Việc xác định các đa giác hiện hữu từ tập hợp các điểm này là...... khó đấy.

Có thể thực hiện nếu như chấp nhận việc tốn thời gian làm lisp cũng như thời gian chạy máy.

 

Chúc bạn thành cô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

Mấy anh giúp e với, có cách nào mà vẽ tỉ lế/20 hay bất kì một tỉ lệ nào mà ko phải tính toán không.

Ví dụ: mở bản vẽ cad lên thì nhập 1000, dim theo tỉ lệ 1/100 thì nó sẽ là 1000.

Bây giờ e muốn nhập 1000 thì tự động cad hiều là 4000 (vì e muốn có bản vẽ ở tỉ lệ 1/20, nghĩa là nhập vào 1 giá trị, sau khi enter thì cad tự động nhân số mình nhập cho 4).

Có anh nào biết cách ko, giúp e 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
Mấy anh giúp e với, có cách nào mà vẽ tỉ lế/20 hay bất kì một tỉ lệ nào mà ko phải tính toán không.

Ví dụ: mở bản vẽ cad lên thì nhập 1000, dim theo tỉ lệ 1/100 thì nó sẽ là 1000.

Bây giờ e muốn nhập 1000 thì tự động cad hiều là 4000 (vì e muốn có bản vẽ ở tỉ lệ 1/20, nghĩa là nhập vào 1 giá trị, sau khi enter thì cad tự động nhân số mình nhập cho 4).

Có anh nào biết cách ko, giúp e với.

Mình cũng đang hi vọng có đại ca nào nghiên cứu hook hoặc reactor về vấn đề này đây ^^

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 thì vượt khỏi khả năng của mình rồi. Nhường lại các bác khúc xương nay mình bó tay rồi.

Chào Bác Bình, Chào bạn hdt4151!!

Mình nói thì là nói vậy thôi chứ thực ra mình vẫn tiếp tục nghiên cứu tiếp yêu cầu của bạn.

Cuối cùng thì cũng có giải pháp cho bạn. Đúng với mọi trường hợp dùng line và pline thẳng.

Bác Bình thử xem code rất đơn giản mà mình không nghĩ ra sớm. Code này đang bị chậm phần repeat do chưa biết đặt điều kiện gì cho hợp lý.

Bạn hdt4151 và các bác test thử code rồi cho ý kiến.


(defun pro ()
(setq ss (ssget "x" '((0 . "line,lwpolyline"))))
(repeat (sslength ss)
(setq i 0)
(while (< i (sslength ss))
(setq name (ssname ss i)
ent (entget name)
p1 (cdr (assoc 10 ent))
p2 (cdr (assoc 11 ent))
j 0
)
(while (< j (sslength ss))
(setq name1 (ssname ss j)
ent1 (entget name1)
p3 (cdr (assoc 10 ent1))
p4 (cdr (assoc 11 ent1))
giao (inters p1 p2 p3 p4 T)
)
(if (not (eq name name1))
(progn
(if (and (/= giao nil) (not (equal giao p1 0.01)) (not (equal giao p2 0.01)) 
          (not (equal giao p3 0.01)) (not (equal giao p4 0.01)))
(progn
(entmake (subst (cons 11 giao) (assoc 11 ent1) ent1))
(entmod (subst (cons 10 giao) (assoc 10 ent1) ent1))
)
)
(if (and (/= giao nil) (or (equal giao p1 0.01) (equal giao p2 0.01)) 
          (not (equal giao p3 0.01)) (not (equal giao p4 0.01)))
(progn
(entmake (subst (cons 11 giao) (assoc 11 ent1) ent1))
(entmod (subst (cons 10 giao) (assoc 10 ent1) ent1))
)
)
)
)
(setq j (1+ j))
)
(setq i (1+ i))
)
(setq ss (ssget "x" '((0 . "*line"))))
)
(command "region" ss "")
(setq ss (ssget "x" '((0 . "region"))))
(setq i 0)
(setq list_pl (ssadd))
(while (< i (sslength ss))
(setq reg (ssname ss i))
(command "explode" reg)
(setq plp (ssget "p"))
(command "pedit" "l" "" "j" plp "" "")
(setq boun (entlast))
(setq list_pl (ssadd boun list_pl))
(setq i (1+ i))
)
)

(defun c:tdd ()
(command "undo" "be")
(pro)
(setq dlst (list (strcat "X" "\t" "\t" "Y" "\n"))
oldos (getvar "osmode")
pg (getvar "ucsorg")
file (strcat (getvar "DWGPREFIX") (substr (getvar "DWGNAME") 1 
              (- (strlen (getvar "DWGNAME")) 4)) ".txt")
pw (getpoint "\n Chon goc toa do ")
k 0 id 1
ptlst nil
dlst1 nil
)
(setvar "osmode" 0)
(if (= pw nil) (setq pW (list 0 0 0)))
(setq p 0)
(while (< p (sslength list_pl))
(setq name (ssname list_pl p) 
i 0
ptlst nil
obj (vlax-ename->vla-object name)
dlst1 (append (list (strcat "hinh thu: " (rtos id 2 0))) dlst1))
(while (/= (vlax-curve-getPointAtParam obj (1+ i)) nil)
(setq p1 (vlax-curve-getPointAtParam obj i))
(setq dlst1 (append (list (strcat (rtos (- (car p1) (car pw) (car pg)) 2 3) 
"\t"
"\t"
(rtos (- (cadr p1) (cadr pw) (cadr pg)) 2 3)
)
)
dlst1))
(setq ptlst (append (list p1) ptlst))
(setq i (1+ i))
)
(if (/= (ssget "WP" ptlst) nil)
(progn 
(command "erase" name "")
(setq id (1- id))
(repeat (+ i 2)
(setq dlst1 (cdr dlst1))
)
)
)
(setq p (1+ p))
(setq dlst1 (append (list "\n") dlst1))
(setq dlst (append dlst1 dlst))
(setq dlst1 nil)
(setq id (1+ id))
)
(setq dlst (reverse dlst))
(setq opw (open file "w"))
(foreach n dlst (write-line n opw))
(close opw)
(setvar "osmode" oldos)
(command "undo" "e")
)

  • 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
Mình chẳng biết các bác làm gì trước đó, nhưng nhìn hình vẽ của bạn thì có thể làm như vậy :

- 1/ Tìm hàm cắt tất cả các line tại điểm giao

- 2/ dùng lệnh (setq n (entlast)) để nhớ đối tượng cuối vào n

- 3/ dùng lệnh region để tạo các đa giác

- 4/ Tìm tập hợp ss các đối tượng tạo ra sau n cho đến cuối

- 5/ Xóa tất cả trừ ss lại

- 6/ Xóa entlast

Từ ý tưởng của 'TRUNGNGAMY' mình dùng lisp "BreakObjects.lsp" (sưu tâm trên CadViet) đế thực hiện thao tác "1/..." sau đó

thực hiện thao tác "3/..." là cho ra được kêt quả như yêu cầu. Tuy nhiên làm theo cách này thì sẽ thừa ra 1 hình lớn nhất bao

các hình kín còn lạ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
Từ ý tưởng của 'TRUNGNGAMY' mình dùng lisp "BreakObjects.lsp" (sưu tâm trên CadViet) đế thực hiện thao tác "1/..." sau đó

thực hiện thao tác "3/..." là cho ra được kêt quả như yêu cầu. Tuy nhiên làm theo cách này thì sẽ thừa ra 1 hình lớn nhất bao

các hình kín còn lại!

Cái này mình đã giải quyết triệt để ở lisp tdd trên bạn tham khảo nhé. Sau khi viết xong lisp đọc lại các comment thì mới biết có người nghĩ giống mình. hê hê.

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ái này mình đã giải quyết triệt để ở lisp tdd trên bạn tham khảo nhé. Sau khi viết xong lisp đọc lại các comment thì mới biết có người nghĩ giống mình. hê hê.

Mình thử load lisp của bạn về nhưng khi chạy báo lội "error: bad argument type: 2D/3D point: nil" nên không biết được

ý tưởng bạn đã làm.

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
Mình thử load lisp của bạn về nhưng khi chạy báo lội "error: bad argument type: 2D/3D point: nil" nên không biết được

ý tưởng bạn đã làm.

mình dùng vẫn bình thường mà. trên bản vẽ không dùng pline cong hay spline.

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
Mình thử load lisp của bạn về nhưng khi chạy báo lội "error: bad argument type: 2D/3D point: nil" nên không biết được

ý tưởng bạn đã làm.

Đúng là báo lỗi trên "error: bad argument type: 2D/3D point: nil"

 

Nếu muốn xóa cái region bao ngoài cùng thì phải duyệt qua từng Region, tìm region nào có diện tích lớn nhất và xóa nó đi

Ở dòng này : (setq ss (ssget "x" '((0 . "line,lwpolyline"))))

(repeat (sslength ss)

(setq i 0)

(while (

(setq name (ssname ss i)

ent (entget name)

p1 (cdr (assoc 10 ent))

p2 (cdr (assoc 11 ent))

j 0

)

lwpolyline không có mã DXF nào bằng 11 cả bạn ạ. Đó cũng chính là nguyên nhân gây nên lỗi "error: bad argument type: 2D/3D point: nil". Coi như bản vẽ bạn có PLINE thì xem như là không đúng rồi :cheers: . Vì thế nên Lisp không còn đúng với PLINE thẳng nữa

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

@phamngoctukts: chào bạn, mình thực sự rất ấn tượng với kết quả lisp chạy, thanks bạn rất nhiều :cheers:

 

Lisp vẫn còn 1 lỗi nhỏ là khi tồn tại cạnh của 1 đa giác điểm nằm trên cạnh của 1 đa giác khác (2 cạnh không nhau) => lisp sẽ sinh ra 1 đa giác bao tất cả các đa giác lại (không thoã đk ban đầu là 1 đa giác không có đa giác khác nằm trong nó) => sẽ cho ra thừa 1 đa giác

 

File VD minh hoạ :

http://www.mediafire.com/download.php?v4vurleh577d6pr

Theo như file thì sẽ tìm được 5 đa giác nhưng lisp cho ra 6 đa giác (thêm 1 đa giác bao tất cả các đa giác lại)

 

Nếu những đường line gồm N nhóm nằm tách biệt nhau => sẽ tạo ra N đa giác thừa.

 

------

Ấy, mình post chậm quá, mọi người đã nói về lỗi trên hết rồ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
Mấy anh giúp e với, có cách nào mà vẽ tỉ lế/20 hay bất kì một tỉ lệ nào mà ko phải tính toán không.

Ví dụ: mở bản vẽ cad lên thì nhập 1000, dim theo tỉ lệ 1/100 thì nó sẽ là 1000.

Bây giờ e muốn nhập 1000 thì tự động cad hiều là 4000 (vì e muốn có bản vẽ ở tỉ lệ 1/20, nghĩa là nhập vào 1 giá trị, sau khi enter thì cad tự động nhân số mình nhập cho 4).

Có anh nào biết cách ko, giúp e với.

Bạn dùng layout là ok thôi :cheers:

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ừ ý tưởng của 'TRUNGNGAMY' mình dùng lisp "BreakObjects.lsp" (sưu tâm trên CadViet) đế thực hiện thao tác "1/..." sau đó

thực hiện thao tác "3/..." là cho ra được kêt quả như yêu cầu. Tuy nhiên làm theo cách này thì sẽ thừa ra 1 hình lớn nhất bao

các hình kín còn lại!

Hình bao lớn nhất đc tạo ra cuối cùng. Bạn hãy xóa đi cái entlast. Đối với trường hợp có nhiều nhóm độc lập, bạn hãy chọn từng nhóm để thực hiệ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
Đúng là báo lỗi trên "error: bad argument type: 2D/3D point: nil"

Theo file của bạn hdt thì bạn phải bẽ gãy các đối tượng tại các giao điểm của nó

Nếu muốn xóa cái region bao ngoài cùng thì phải duyệt qua từng Region, tìm region nào có diện tích lớn nhất và xóa nó đi

Ở dòng này : (setq ss (ssget "x" '((0 . "line,lwpolyline"))))

(repeat (sslength ss)

(setq i 0)

(while (< i (sslength ss))

(setq name (ssname ss i)

ent (entget name)

p1 (cdr (assoc 10 ent))

p2 (cdr (assoc 11 ent))

j 0

)

lwpolyline không có mã DXF nào bằng 11 cả bạn ạ. Đó cũng chính là nguyên nhân gây nên lỗi "error: bad argument type: 2D/3D point: nil". Coi như bản vẽ bạn có PLINE thì xem như là không đúng rồi :cheers: . Vì thế nên Lisp không còn đúng với PLINE thẳng nữa

Thank Bác! Đúng là nhầm chỗ này. Thực ra em cung không để ý lúc test dùng toàn line nên không báo lỗi.

BS: Cái này theo em nghĩ chỉ cần explode các pline ra là được đỡ phải phân thành nhiều trường hợp.

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
@phamngoctukts: chào bạn, mình thực sự rất ấn tượng với kết quả lisp chạy, thanks bạn rất nhiều :cheers:

 

Lisp vẫn còn 1 lỗi nhỏ là khi tồn tại cạnh của 1 đa giác điểm nằm trên cạnh của 1 đa giác khác (2 cạnh không nhau) => lisp sẽ sinh ra 1 đa giác bao tất cả các đa giác lại (không thoã đk ban đầu là 1 đa giác không có đa giác khác nằm trong nó) => sẽ cho ra thừa 1 đa giác

 

File VD minh hoạ :

http://www.mediafire.com/download.php?v4vurleh577d6pr

Theo như file thì sẽ tìm được 5 đa giác nhưng lisp cho ra 6 đa giác (thêm 1 đa giác bao tất cả các đa giác lại)

 

Nếu những đường line gồm N nhóm nằm tách biệt nhau => sẽ tạo ra N đa giác thừa.

 

------

Ấy, mình post chậm quá, mọi người đã nói về lỗi trên hết rồi +_+

Có lẽ do đêm qua mình thức khuya quá đầu óc mụ mẫm nên không đưa ra hết các trường hợp được. Lại tiếp tục nghiên cứu tiếp.

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ạn dùng layout là ok thôi :cheers:

Em cũng biết là vậy, nhưng layout bất tiện lắm, nhất là vẽ kiến trúc xong, mấy anh kết cấu còn phải up lại đễ vẽ hệ kết cấu.

nếu làm dc thì không dùng layout.

không gian model thì e nghĩ là tuyệt hơn nhiều.

Em nghĩ có cách nào đó khắc phục chứ. Vì e thấy trong cad có mấy chỗ cho nhập 1:1, 1:10, 1:20, 1:50, 1:100.......

e nghĩ là có biện pháp mà e mò hoài không ra.hihi.....

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ó lẽ do đêm qua mình thức khuya quá đầu óc mụ mẫm nên không đưa ra hết các trường hợp được. Lại tiếp tục nghiên cứu tiếp.

Chào bác Phamngoctukts,

Mình có một ý tưởng, chưa biết là trúng hay trật, song do đang kẹt quá chưa thực hiện được. Nếu có thể bác thử làm xem nhé.

1/- Lấy tập hợp các điểm cắt nhau của các line và pline. loại bỏ các điểm trùng nhau.

2/- Lặp qua tất cả các điểm này như sau:

Tại mỗi điểm lặp n bước xc định boundary với n điểm phân bố đều quanh điểm đó bằng lệnh polar.

Lấy tập hợp các boundary được tạo thành, lọc các boundary trùng nhau.

Lấy đỉnh của các boundary òn lại sau khi lọc

3/- áp dụng lisp tdd.

 

Như vậy sẽ tránh được việc bị trùng boundary bởi lệnh region như bác đã biết. Tuy nhiên có một nhược điểm là líp sẽ bỏ qua các boundary có kích thước nhỏ hơn bán kính polar và góc phân bố là 360độ/n. Do vậy người dùng cần lựa chọn n và bán kính polar cho phù hợp với yêu cầu và làm giảm thời gian xử lý của lisp.

 

Hy vọng rằng cách này sẽ thỏa mãn được yêu cầu đặt ra của bạn hdt4151.

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 bác Phamngoctukts,

Mình có một ý tưởng, chưa biết là trúng hay trật, song do đang kẹt quá chưa thực hiện được. Nếu có thể bác thử làm xem nhé.

1/- Lấy tập hợp các điểm cắt nhau của các line và pline. loại bỏ các điểm trùng nhau.

2/- Lặp qua tất cả các điểm này như sau:

Tại mỗi điểm lặp n bước xc định boundary với n điểm phân bố đều quanh điểm đó bằng lệnh polar.

Lấy tập hợp các boundary được tạo thành, lọc các boundary trùng nhau.

Lấy đỉnh của các boundary òn lại sau khi lọc

3/- áp dụng lisp tdd.

 

Như vậy sẽ tránh được việc bị trùng boundary bởi lệnh region như bác đã biết. Tuy nhiên có một nhược điểm là líp sẽ bỏ qua các boundary có kích thước nhỏ hơn bán kính polar và góc phân bố là 360độ/n. Do vậy người dùng cần lựa chọn n và bán kính polar cho phù hợp với yêu cầu và làm giảm thời gian xử lý của lisp.

 

Hy vọng rằng cách này sẽ thỏa mãn được yêu cầu đặt ra của bạn hdt4151.

Chào bác Bình Bác có thể nói rõ hơn ý này được không?

Tại mỗi điểm lặp n bước xc định boundary với n điểm phân bố đều quanh điểm đó bằng lệnh polar.

...

Cảm ơn 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
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×