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

[Hỏi] Hàm ssget trong Autolisp

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

lisp này hình như là chọn chiều dài bằng với chiều dài line mẫu phải không bác DoanVanHa? em muốn length nó nhỏ hơn length mẫu thì được không bác?

Tham khảo để suy luận sửa thành cái mình cần, vì vẩn vơ đã biết lisp rồi mà. Nếu không tự sửa được thì mới giúp chứ!

Chú ý: bỏ góc + thay equal bởi <= hoặc >= là OK thô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

Tham khảo để suy luận sửa thành cái mình cần, vì vẩn vơ đã biết lisp rồi mà. Nếu không tự sửa được thì mới giúp chứ!

Chú ý: bỏ góc + thay equal bởi <= hoặc >= là OK thôi.

yes, thank bác đã chỉ điểm, em sẽ ngâm cứu chỗ này, nhờ thầy Ket và các bác trên diễn đàn dẫn dắt nên vẩn vơ cũng đã biết một số kiến thức về lisp nhưng level còn vơ vẩn lắm, tuy luôn luôn lắng nge nhưng lâu lâu mới hiểu  :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

mình có điểm p1 (10,10,0) và chọn tất cả các text có dxf 10 >= p1 với lệnh: (ssget "x" '((0 . "*text") (-4 . ">=,>=,*") (10 10.0 10.0 0.0) )) thì OK.

nhưng do p1 thay đổi (dùng getpoint) với lênh: (ssget "x" '((0 . "*text") (-4 . ">=,>=,*") (10 (car p1) (cadr p1) (caddr p1)) )) bị báo lổi "error: bad SSGET list value". xin chỉ cách khắc phục

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
(ssget "x" (list (cons 0 "*text") (cons -4 ">=,>=,*") (list 10 (car 

 

(ssget "x" (list (cons 0 "*text") (cons -4 ">=,>=,*") (list 10 (car p1) (cadr p1) (caddr p1))))

p1) (cadr p1) (caddr p1))))
  • 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

Mình muốn tạo một tập chọn từ một tập chọn đã có.

Ví dụ:

(setq ss1 (ssget '((0 . "LINE,TEXT")))))

 

Bây giờ mình muốn lấy riêng LINE và TEXT của tập chọn trên thì làm thế 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

Hàm này dùng để lấy tập chọn theo 1 kiểu nào đó từ tập đã có:

 

;----- Chon tap hop chon theo kieu doi tuong (by HA, khong dung Acet). 
;; VD: (Laydt ss "*TEXT") ; (Laydt ss "*LINE")
(defun Laydt (ss kieu / sss)
 (setq sss (ssadd))
 (foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
  (if (wcmatch (cdr (assoc 0 (entget ent))) kieu)
   (ssadd ent sss)))
 sss)
 
  • 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

Thực ra mình không muốn dùng vòng lặp. Mình đã tìm tra câu trả lời cho câu hỏi ở trên rồi, hehe... Thông qua một câu lệnh của AutoCAD để gán lệnh tập chọn (ssget "p").

(setq ss1 (ssget '((0 . "LINE,TEXT"))))
(setq ss-line (ssget "p" '((0 . "LINE"))))
(command ".select" ss1 "")
(setq ss-text (ssget "p" '((0 . "TEXT"))))

  • 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

Không biết có cách nào khác không, chứ muốn cho nó rỗng thì làm lệnh xoá các đt của (ssget "p") rồi undo.

(setq ss (ssget "p"))

(command "erase" ss "")

(command "undo" 1)

(setq ss (ssget "p"))
(command "erase" ss "")
(command "undo" 1)
  • 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

Cũng có cách làm lệnh CHỌN đối tượng của (ssget "p") rồi undo tương đương với hàm trong Express 

(ACET-SS-CLEAR-PREV)

 

(setq ss (ssget "p"))

(command "select" ss "")

(command "undo" 1)

  • 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

Ý nghĩa của 2 cách trên là khác nhau: của Tot77 thì trả về tập rỗng, của Tue_NV thì trả về Nil.

 

Bác nói rõ hơn không? Tue_NV thấy cơ bản là giống nhau 

  • 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

Cách của Tot77 trả về tập ss là tập rỗng, nghĩa là ss vẫn tồn tại tên tuổi nhưng không có phần tử nào:

(sslength ss) >> 0

Cách của Tue_NV trả về tập ss là NIL, nghĩa là không có ss:

(ACET-SS-CLEAR-PREV)

(setq ss (ssget "p"))

(sslength ss) >> error

  • 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

Mình muốn chọn text có cùng toạ độ X, nhưng sao câu lệnh này không được nhỉ?

(ssget (list (cons 0 "TEXT")(list 10 X '* '*)))

 

Không được bởi kí tự * không đại diện cho số thực đượ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

Mình muốn chọn text có cùng toạ độ X, nhưng sao câu lệnh này không được nhỉ?

(ssget (list (cons 0 "TEXT")(list 10 X '* '*)))

Này:

(ssget (list '(0 . "Text") '(-4 . "=,*,*") (list 10 x 0.0 0.0)))

(ssget (list '(0 . "Text") '(-4 . "=,*,*") (list 10 x 0.0 0.0)))
 
(ssget (list '(0 . "Text") '(-4 . "=,*,*") (list 10 x 0.0 0.0)))
 
(ssget (list '(0 . "Text") '(-4 . "=,*,*") (list 10 x 0.0 0.0)))

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

Tuyệt! Nhưng mã -4 này không cần đóng nó lại hả bác? Không giống như (-4 . "<OR")....(-4 . "OR>") à?

Thì bằng chứng là không đóng rồi đấy!

Cái đáng thắc mắc là 0.0 nhưng không thấy bạn thắc mắ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

Mình cũng tìm được cách tương tự

(command ".point" (list 0 0)

".erase" (entlast) "");set (ssget "p") to nil

Bạn chú ý: với tập chọn thì Nil khác rỗng đấy nhé! Không như list thì Nil tức là rỗng. Câu hỏi ban đầu của bạn là RỖ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

hihi, có bác ạ! Cả mã -4 nữa. Tại sao là (-4 . "=,*,*") nhỉ? Nó nghĩa là gì?

Hàm ssget này học mãi chẳng biết bao giờ mới hiểu và vận dụng tốt nó nữa. Điều này hoàn toàn không có trong Help của AutoLisp.

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

Oh, hay quá, cám ơn bác rất nhiều! Cái này là cho cả cần câu nè!

Vậy mà xưa nay mình luôn luôn tìm trợ giúp trong AutoLisp bằng cách bôi đen tên hàm và Ctrl+F1.

Mình hoàn toàn không biết những thông tin khác hữu ích như thế này!

(Hết quota rồi, không được rep_up.png 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

Hôm nay mới để ý nha, hình như cái vụ quota này không tính theo giờ Việt Nam hả bác Admin? Mình bị hết quota từ chiều hôm qua, đến sáng nay vẫn chưa vote đượ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

×