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

Nhờ viết Lisp đánh dấu đối tượng

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

Vấn đề là file cad của bạn đưa ra không có đối tượng region nào cả.

 

Tôi ví dụ quá trình tạo ra đối tượng region và dùng lệnh li để xem thuộc tính của nó.

Command: l
LINE Specify first point:
Specify next point or [Undo]:
Specify next point or [Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]: c

 

Command: region

Select objects: Specify opposite corner: 5 found

Select objects:
1 loop extracted.

1 Region created.

Command: li
LIST

Select objects: 1 found

Select objects:
                  REGION    Layer: "thay-130"
                            Space: Model space
                   Handle = 48bd0
                             Area: 2994375.1132
                        Perimeter: 6697.2703
   Bounding Box: Lower Bound X = -898133.8829, Y = -976848.3199, Z = 0.0000
                 Upper Bound X = -895846.3343, Y = -974981.8339, Z = 0.0000

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
9 phút trước, vanlam6408 đã nói:

bác biet ve cad cảm ơn bác,em làm được rồi ạ.tuy nhiên em chưa hiểu lắm chỗ bác nói nếu nhập vào 4 thì các polyline chữ nhật đều giữ nguyên ,còn lại đều được chuyển,nhưng em thấy nếu nhập vào số cạnh là 4 thì không thấy có điều gì xảy ra bác ạ,nghĩa là tất cả đều giữ nguyên màu như cũ.

Ngoài ra,nhân đây em muốn nhờ các bác viết giúp thêm em lệnh M3 có chức năng đổi màu vàng các polyline có điểm đầu và điểm cuối trùng nhau được không ạ?Vì với bản vẽ lúc em gửi đi em thường dùng lệnh region hoặc ractang để vẽ đa giác nhưng khi bản vẽ gửi về yêu cầu chỉnh sửa lại có cả các polyline không kín nhưng có điểm đầu và điểm cuối trùng nhau  trông như các polyline kín thật.Thì em muốn các bác giúp em cái lisp này nữa để em thủ sẵn,nếu mà gặp trường hợp này có thể dùng tiếp lisp M3 này để đổi màu chúng luôn.

Em rất biết ơn các bác ,đặc biệt là bác và các bác Duong Nhat Duy, Doan Nguyen Van đã lưu ý vấn đề của em và trực tiếp nhiệt tình code giúp em ạ!

Em cũng mới tham gia diễn đàn thì cũng chưa biết rõ về quy định của diễn đàn,bác cho em hỏi trên diễn đàn nếu muốn thể hiện cảm ơn các bác thì có thể nhấn vào nút Like hay chỗ nào ạ?

1. Do bạn lúc thì polyline, lúc thì là region ( mà bản vẽ chả thấy region đâu ^^) nên bác @duy782006 nói cũng đúng, trước sau phải nhất quản để lisp chạy đúng ý đồ, các bác viết lisp cũng ko phải đoán già đoán non

2. Nếu lisp chạy ứng ý thì bạn chỉ cần nói cảm ơn thui, để biết là lisp đã chạy đúng ^^

3. "nhập vào số cạnh là 4 thì không thấy có điều gì xảy ra bác ạ,nghĩa là tất cả đều giữ nguyên màu như cũ" do bản vẽ bạn ko có polyline 4 cạnh ( ko tính HCN )bạn thử vẽ hình chữ nhật và hình vuông rồi nhập là 4 xem

4. tại sao lại phải là pline kín à bạn , hay là nếu ko phải pline kín thì tự động chuyển qua màu khác, màu đen chẳng hạ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
12 phút trước, duy782006 đã nói:

Vấn đề là file cad của bạn đưa ra không có đối tượng region nào cả.

 

Tôi ví dụ quá trình tạo ra đối tượng region và dùng lệnh li để xem thuộc tính của nó.

Command: l
LINE Specify first point:
Specify next point or [Undo]:
Specify next point or [Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]: c

 

Command: region

Select objects: Specify opposite corner: 5 found

Select objects:
1 loop extracted.

1 Region created.

Command: li
LIST

Select objects: 1 found

Select objects:
                  REGION    Layer: "thay-130"
                            Space: Model space
                   Handle = 48bd0
                             Area: 2994375.1132
                        Perimeter: 6697.2703
   Bounding Box: Lower Bound X = -898133.8829, Y = -976848.3199, Z = 0.0000
                 Upper Bound X = -895846.3343, Y = -974981.8339, Z = 0.0000

Bác ui,chắc bác bận nhiều việc quá nên quá tải nhầm file hoặc chưa xem kĩ chăng,chứ file em gửi có chữ lisp 2 em khoanh tròn trong đó chỉ có mỗi 2 loại hình là chữ nhật được vẽ bằng lệnh rectang và đa giác 5 cạnh,6 cạnh đều vẽ bằng lệnh polygion mà bác,ngoài ra còn có cả file ảnh có thể xem ngay mà không cần bật cad lê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
3 phút trước, vanlam6408 đã nói:

Bác ui,chắc bác bận nhiều việc quá nên quá tải nhầm file hoặc chưa xem kĩ chăng,chứ file em gửi có chữ lisp 2 em khoanh tròn trong đó chỉ có mỗi 2 loại hình là chữ nhật được vẽ bằng lệnh rectang và đa giác 5 cạnh,6 cạnh đều vẽ bằng lệnh polygion mà bác,ngoài ra còn có cả file ảnh có thể xem ngay mà không cần bật cad lên ạ

Cuối cùng cũng rõ là 2 lệnh này, ^^, các bác vất vả rồi @duy782006 @Biet ve CAD

  • 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

Mô phật region và polygon (chứ không có lệnh polygion). Không biết thèn nào híp thèn nào mà đẻ ra được thèn kia.

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
3 phút trước, Doan Nguyen Van đã nói:

Cuối cùng cũng rõ là 2 lệnh này, ^^, các bác vất vả rồi @duy782006 @Biet ve CAD

 

2 phút trước, duy782006 đã nói:

Mô phật region và polygon (chứ không có lệnh polygion).

vâng,đúng thế ạ,tại thẻ properties đều hiện là đường polyline nên không phân biệt được,chỉ phan biệt được chúng qua hình ảnh ạ

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 hiểu ý chủ thớt thôi cũng mệt.

Mình có 2 lisp này viết cho vui.

- Lisp 1. Loại bỏ dỉnh trùng nhau liên tiếp và tụ động close pline nếu điểm đầu cuối trùng nhau.

(defun c:fixpl(/ fpl)
  (defun fpl(e1 / c s1 s2 s3 st pn)
    (setq e1 (entget e1)
	  s1 (vl-remove-if '(lambda(x / sa) (Cond ((= (Setq sa (car x)) 10)
						   (setq s2 (cons (reverse st) s2)
						         st (list (cdr x))))
						  ((member sa '(40 41 42 91)) (setq st (cons (cdr x) st)))))
	       e1)
	  c (cdr(assoc 70 s1))
	  s2 (cdr (reverse (cons (reverse st) s2)))
	  pn (car s2))
    (foreach x (cdr s2)
      (if (>= (distance (car pn) (car x)) 1e-6)
        (setq s3 (cons pn s3)))
      (setq pn x))
    (if (< (distance (car pn) (car(last s3))) 1e-6)
      (setq c 1)
      (setq s3 (cons pn s3)))
    (entmod (append (subst (cons 70 c) (assoc 70 s1) (subst (cons 90 (length s3)) (assoc 90 s1) s1))
		      (apply 'append (mapcar '(lambda(x) (mapcar 'cons '(10 40 41 42 91) x)) (reverse s3))))))
  (mapcar 'fpl (acet-ss-to-list (ssget '((0 . "LWPOLYLINE")))))
  
  (princ))

Lisp 2. Là chọn nhanh polyline theo cạnh hay open/close. Muốn đổi màu hay làm gì thì tùy.

(defun c:sspl(/ a)
  (initget 0 "Open Close")
  (if (setq a (getint "Chon so dinh polyline [Open/Close]:")
	    a (cond ((= a "Open") '(70 . 0))
		    ((= a "Close") '(70 . 0))
		    (a (cons 90 a))))
    (sssetfirst nil (ssget (list '(0 . "LWPOLYLINE") a)))))

Ai thích thì có thể thêm chọn nhanh hình chữ nhật, polygon thì tùy.

@Doan Nguyen Van Nếu pline có cạnh là arc mà 4 dĩnh theo hình chữ nhật thì lisp của bạn vẫn xem là hình chữ nhật nhỉ.

  • 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
12 phút trước, Biet ve CAD đã nói:

1. Do bạn lúc thì polyline, lúc thì là region ( mà bản vẽ chả thấy region đâu ^^) nên bác @duy782006 nói cũng đúng, trước sau phải nhất quản để lisp chạy đúng ý đồ, các bác viết lisp cũng ko phải đoán già đoán non

2. Nếu lisp chạy ứng ý thì bạn chỉ cần nói cảm ơn thui, để biết là lisp đã chạy đúng ^^

3. "nhập vào số cạnh là 4 thì không thấy có điều gì xảy ra bác ạ,nghĩa là tất cả đều giữ nguyên màu như cũ" do bản vẽ bạn ko có polyline 4 cạnh ( ko tính HCN )bạn thử vẽ hình chữ nhật và hình vuông rồi nhập là 4 xem

4. tại sao lại phải là pline kín à bạn , hay là nếu ko phải pline kín thì tự động chuyển qua màu khác, màu đen chẳng hạn ^^

em vẽ hình chữ nhật và hình bình hành bằng lệnh polyline rồi thử nhưng không thấy thay đổi gì bác ạ.

cái đường pline này mặc dù có điểm đầu và điểm cuối trùng nhau nhưng nếu kích vào bảng properties sẽ thấy ở mục Misc ,chỗ Closed là No,trong lúc với pline kín được vẽ bằng rectang hay polygon ....thì nó lại là yes.Cái này anh cứ kích vào hình vẽ trong file cad em tải lên anh sẽ thấy rõ sự khác nhau giữa chúng ạ.Cái này là do người sửa hình họ dùng lệnh pline vẽ một vòng rồi đóng kín hình vẽ về điểm đầu ,họ bắt điểm về điểm đầu chứ không dùng "c"(để đóng đường) khi kết thúc đường pline.Nên em muốn dùng lisp M3 để đổi màu vàng những đường nà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
2 phút trước, ngokiet đã nói:

Đọc hiểu ý chủ thớt thôi cũng mệt.

Mình có 2 lisp này viết cho vui.

- Lisp 1. Loại bỏ dỉnh trùng nhau liên tiếp và tụ động close pline nếu điểm đầu cuối trùng nhau.


(defun c:fixpl(/ fpl)
  (defun fpl(e1 / c s1 s2 s3 st pn)
    (setq e1 (entget e1)
	  s1 (vl-remove-if '(lambda(x / sa) (Cond ((= (Setq sa (car x)) 10)
						   (setq s2 (cons (reverse st) s2)
						         st (list (cdr x))))
						  ((member sa '(40 41 42 91)) (setq st (cons (cdr x) st)))))
	       e1)
	  c (cdr(assoc 70 s1))
	  s2 (cdr (reverse (cons (reverse st) s2)))
	  pn (car s2))
    (foreach x (cdr s2)
      (if (>= (distance (car pn) (car x)) 1e-6)
        (setq s3 (cons pn s3)))
      (setq pn x))
    (if (< (distance (car pn) (car(last s3))) 1e-6)
      (setq c 1)
      (setq s3 (cons pn s3)))
    (entmod (append (subst (cons 70 c) (assoc 70 s1) (subst (cons 90 (length s3)) (assoc 90 s1) s1))
		      (apply 'append (mapcar '(lambda(x) (mapcar 'cons '(10 40 41 42 91) x)) (reverse s3))))))
  (mapcar 'fpl (acet-ss-to-list (ssget '((0 . "LWPOLYLINE")))))
  
  (princ))

Lisp 2. Là chọn nhanh polyline theo cạnh hay open/close. Muốn đổi màu hay làm gì thì tùy.


(defun c:sspl(/ a)
  (initget 0 "Open Close")
  (if (setq a (getint "Chon so dinh polyline [Open/Close]:")
	    a (cond ((= a "Open") '(70 . 0))
		    ((= a "Close") '(70 . 0))
		    (a (cons 90 a))))
    (sssetfirst nil (ssget (list '(0 . "LWPOLYLINE") a)))))

Ai thích thì có thể thêm chọn nhanh hình chữ nhật, polygon thì tùy.

ngokiet cảm ơn bác nhiều ạ!

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à chà, đọc đến đây mới biết lý do bạn yêu cầu phân biệt HCN được tạo từ lệnh Rectang, và Pline

1 = HCN tạo  = Rectang có 4 cạnh, 4 đỉnh, và close

2 = HCN tạo = Pline - pick 4 điểm, với tùy chọn "C" là tương đương lệnh Rectang

3 = HCN tạo = Pline - pick 5 điểm, không close

4 = HCN tạo = Pline - pick 5 điểm, với tùy chọn "C" là có 5 điểm, 5 cạnh, trong đó 1 canh = 0

Vậy bạn đang cần phân biệt 1,2 với 3 4 đúng ko ?

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
19 phút trước, Biet ve CAD đã nói:

Chà chà, đọc đến đây mới biết lý do bạn yêu cầu phân biệt HCN được tạo từ lệnh Rectang, và Pline

1 = HCN tạo  = Rectang có 4 cạnh, 4 đỉnh, và close

2 = HCN tạo = Pline - pick 4 điểm, với tùy chọn "C" là tương đương lệnh Rectang

3 = HCN tạo = Pline - pick 5 điểm, không close

4 = HCN tạo = Pline - pick 5 điểm, với tùy chọn "C" là có 5 điểm, 5 cạnh, trong đó 1 canh = 0

Vậy bạn đang cần phân biệt 1,2 với 3 4 đúng ko ?

hi,không phức tạp thế đâu bác ơi,mà như thế cũng chưa liệt kê được hết các trường hợp tạo ra một hình có dạng hình chữ nhật ,cũng như các hình mà em vẽ không nhất thiết có dạng hình chữ nhật ,nó có thể có 5,6...cạnh,có cung tròn....Nhưng mình không quan tâm đến cách vẽ nó bác ạ,chỉ làm sao xét thấy hình hiện tại là polyline có  điểm đầu và điểm cuối của  đường pline này mà nó trùng nhau thì tô màu vàng cho khỏi sót thôi ạ.

Mà bác bảo nét cảm ơn là nút vote đấy hả 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
17 phút trước, vanlam6408 đã nói:

hi,không phức tạp thế đâu bác ơi,mà như thế cũng chưa liệt kê được hết các trường hợp tạo ra một hình có dạng hình chữ nhật ,cũng như các hình mà em vẽ không nhất thiết có dạng hình chữ nhật ,nó có thể có 5,6...cạnh,có cung tròn....Nhưng mình không quan tâm đến cách vẽ nó bác ạ,chỉ làm sao xét thấy hình hiện tại là polyline có  điểm đầu và điểm cuối của  đường pline này mà nó trùng nhau thì tô màu vàng cho khỏi sót thôi ạ.

Mà bác bảo nét cảm ơn là nút vote đấy hả bác?

 

bạn dùng lệnh OVERKILL trước để lisp chạy hiệu quả hơn nhé

M2-M3.lsp

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
2 giờ trước, Biet ve CAD đã nói:

bạn dùng lệnh OVERKILL trước để lisp chạy hiệu quả hơn nhé

M2-M3.lsp

em cảm ơn bác nhiều ạ!lisp chạy rất tốt bác ạ!bác cho em hỏi xíu nữa nếu trường hợp quên dùng lênh Overkill trước khi sử dụng lisp M2-M3 thì có thể dẫn đến những sai sót nào ạ?

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  

×