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  
aliosa

[Yêu cầu] Sửa lisp chọn Block trong bản vẽ!

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

aliosa    4

Chào các bạn trên diễn đàn. Mình đanh tập viết lisp. Mong các bạn giúp đỡ.

 

Mình viết một đọn code để chọn các block trong bản vẽ có tên là tên của Block mình đã chọn trước.

Do chưa nắm rõ lên chương trình chưa chạy được. Mong các bạn chỉnh sửa lại giúp.

 


(defun c:Dem ( / ss )
; Lay ten block can dem
 (setq pt (cadr (entsel "\nChon Block can dem")))
 (setq e1 (ssget pt))
 (setq e2 (entget (ssname e1 0)))
 (setq tenblock (cdr (assoc 2 e2)))

; Chon tat ca cac block co ten cua block da chon o tren va dem
(setq ss (ssget '((cons 2 tenblock) (0 . "INSERT"))))
 (if ss
   (princ (strcat "\n So block da chon la: "  (rtos (sslength ss))))
 )
 (princ)
)

 

Vạn sự khởi đầu nan. Mong các bạn chỉ giùm. Thank !!!

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

 (Defun c:dem ( )  
(prompt "\nChon BLOCK mau.")
 (setq DT (car (entsel)))
 (setq DT (entget DT))
 (setq STNAME (cdr (assoc 2 DT)))
  (Princ "\nHay chon vung :")
(setq SS (ssget  (list (cons 0 "insert")
                     	(cons 2 STNAME)
               	)
    	)
)
 (if (Null ss)
 (princ "\nKhong tim thay doi tuong nao")
)
  (IF (/= NIL SS) (PROGN
 (setq Sl (SSLength SS))
(princ (strcat "\nTim thay: <" (itoa sl) "> doi tuong la BLOCK co ten: <" STNAME ">"))
)
)
(princ)
)

 

Của mình thì như này bạn đọc coi bạn sai chổ nào, dạo này mình hơi lười.

  • 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
phamthanhbinh    3.123

Chào các bạn trên diễn đàn. Mình đanh tập viết lisp. Mong các bạn giúp đỡ.

 

Mình viết một đọn code để chọn các block trong bản vẽ có tên là tên của Block mình đã chọn trước.

Do chưa nắm rõ lên chương trình chưa chạy được. Mong các bạn chỉnh sửa lại giúp.

 


(defun c:Dem ( / ss )
; Lay ten block can dem
 (setq pt (cadr (entsel "\nChon Block can dem")))
 (setq e1 (ssget pt))
 (setq e2 (entget (ssname e1 0)))
 (setq tenblock (cdr (assoc 2 e2)))

; Chon tat ca cac block co ten cua block da chon o tren va dem
(setq ss (ssget '((cons 2 tenblock) (0 . "INSERT"))))
 (if ss
   (princ (strcat "\n So block da chon la: "  (rtos (sslength ss))))
 )
 (princ)
)

 

Vạn sự khởi đầu nan. Mong các bạn chỉ giùm. Thank !!!

 

Hề hề hề,

Có một vài góp ý với bạn như sau:

1/- Để lấy được tên của block mẫu, bạn sử dụng hàm (ssget pt). Như vậy sẽ có khả năng tại điểm chọn này bạn sẽ có thể không có đối tượng nào hoặc có nhiều đối tượng cùng đi qua điểm chọn này. Vì thế rất dễ dàng xảy ra là biến tenblock của bạn bị trả về là nil.

Bạn lưu ý rằng hàm (entsel) cho phép pick chọn đối tượng với độ chính xác không cao lắm. Nhưng khi dùng (ssget ...) thì việc pick chọn lại rất cần chuẩn xác.

Vì thế bạn nên sử dụng code đơn giản hơn để lấy tenblock. Chẳng hạn chỉ cần:

(setq tenblock (cdr (assoc 2 (entget (car (entsel "\n Chọn block mau"))))))

2/- Việc sử dụng list bộ lọc cho hàm (ssget) của bạn chưa chuẩn khi chọn tập chọn các block.

Bạn đã dùng: (setq ss (ssget '((cons 2 tenblock) (0 . "INSERT"))))

Như vậy (cons 2 tenblock) sẽ trả về một list còn (0. "INSERT") chưa phải là list.

Do vậy cái bộ lọc '((cons 2 tenblock) (0 . "INSERT")) bị sai và bạn phải sửa thành '((cons 2 tenblock) (cons 0 "INSERT")) hoặc '((cons 2 tenblock) '(0 . "INSERT")) hoặc (list (cons 2 tenblock) (cons 0 "INSERT")).....

 

Bạn hãy thử sửa lại xem còn lỗi nữa không nhé.

  • 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
Tue_NV    3.841

 

Hề hề hề,

Có một vài góp ý với bạn như sau:

1/- Để lấy được tên của block mẫu, bạn sử dụng hàm (ssget pt). Như vậy sẽ có khả năng tại điểm chọn này bạn sẽ có thể không có đối tượng nào hoặc có nhiều đối tượng cùng đi qua điểm chọn này. Vì thế rất dễ dàng xảy ra là biến tenblock của bạn bị trả về là nil.

Bạn lưu ý rằng hàm (entsel) cho phép pick chọn đối tượng với độ chính xác không cao lắm. Nhưng khi dùng (ssget ...) thì việc pick chọn lại rất cần chuẩn xác.

Vì thế bạn nên sử dụng code đơn giản hơn để lấy tenblock. Chẳng hạn chỉ cần:

(setq tenblock (cdr (assoc 2 (entget (car (entsel "\n Chọn block mau"))))))

2/- Việc sử dụng list bộ lọc cho hàm (ssget) của bạn chưa chuẩn khi chọn tập chọn các block.

Bạn đã dùng: (setq ss (ssget '((cons 2 tenblock) (0 . "INSERT"))))

Như vậy (cons 2 tenblock) sẽ trả về một list còn (0. "INSERT") chưa phải là list.

Do vậy cái bộ lọc '((cons 2 tenblock) (0 . "INSERT")) bị sai và bạn phải sửa thành '((cons 2 tenblock) (cons 0 "INSERT")) hoặc '((cons 2 tenblock) '(0 . "INSERT")) hoặc (list (cons 2 tenblock) (cons 0 "INSERT")).....

 

Bạn hãy thử sửa lại xem còn lỗi nữa không nhé.

Bác Bình sửa thành 2 dòng màu xanh vầy là không đúng rồi

  • 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
phamthanhbinh    3.123

Bác Bình sửa thành 2 dòng màu xanh vầy là không đúng rồi

Hề hề hề,

Mình hiểu lỗ mỗ vậy, nhờ bác giải thíc thêm về cách dùng thằng quote này 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
Tue_NV    3.841

Hề hề hề,

Mình hiểu lỗ mỗ vậy, nhờ bác giải thíc thêm về cách dùng thằng quote này với.

Hàm ' : Không định giá trị của các phần tử trước khi tạo list

List : định giá trị các phần tử trước khi tạo list

(setq tenblock "a")

(quote (cons 2 tenblock)) -> trả về: (CONS 2 TENBLOCK)

-> Bác sẽ thu được 1 list gồm 3 phần tử : 2 phần tử có kiểu SYM là CONS, TENBLOCK và một phần tử 2 có kiểu INT

 

Cái của mình cần là :

(ssget (list (cons 2 tenblock) (cons 0 "INSERT")) )

Hoặc :

(ssget (list (cons 2 tenblock) '(0 . "INSERT")) )

 

Vì tenblock là biến thì không thể viết là :

(ssget '((cons 2 tenblock) )) được bác ạ

  • 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
aliosa    4

Chân thành cảm ơn các bạn ! Lisp đã chạy tốt.

Đúng là sai một ly đi một dặm quả không sai.

Các bạn giải thích mình lại hiểu thêm một chút:

 

1. Mình phải đi lòng vòng mới lấy được tên của đối tượng, mà kết quả đôi khi lại không chính xác.

(setq pt (cadr (entsel "\nChon Block can dem")))

(setq e1 (ssget pt))

(setq e2 (entget (ssname e1 0)))

 

2. Đi như bạn PhamThanhBinh thì nhanh hơn và chính xác hơn.

 

 

(setq tenblock (cdr (assoc 2 (entget (car (entsel "\n CChon Block can thong ke:"))))))

 

Cái này mình sẽ tìm hiểu dần dần. Âu cũng là Lisp toàn đi cóp nhặt mới như vậy.

 

Chúc các bạn thành công và hạnh phú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

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  

×