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ị

ặc cái mã -4 là cái ji đó ta. cám ơn hà nhé tiếp cận cũng khá khá thời gian với lisp rùi mà jo mới bít đúng thật biển học mênh mô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

bác Hà cho em hỏi tý nữa là sao

(setq tapdoituong (ssget '((0."text") (-4 . "<OR") (62 . 2) (62 . 3) (-4 . "OR>"))))

bác giải thích cho em cái mã -4 đó 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

bác Hà cho em hỏi tý nữa là sao

(setq tapdoituong (ssget '((0."text") (-4 . "<OR") (62 . 2) (62 . 3) (-4 . "OR>"))))

bác giải thích cho em cái mã -4 đó cái

Hề hề hề,

Mã -4 là dùng cho các toán tử logic trong quá trình tạo bộ lọc cho hàm ssget bạn ạ.

Bạn có thể vào trong Help của Cad để tham khảo thêm về mã 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

@NTD : Bạn đọc những dòng sau, hi vọng sẽ trả lời và áp dụng được với những câu hỏi của bạn

 

1- SSget có thể chọn các đối tượng ngay bằng bộ lọc.

Trước tiên bạn bật Help về hàm ssget lên để đọc, và sẽ gặp khái niệm Filter List

 

- Bộ lọc đó là gì ? Là list các sub-list bao gồm : (dxf-id . Giá_trị) hoặc (cons dxf-id giá-trị)

Dxf là mã thuộc tính của đối tượng. Mỗi 1 đặc tính của đối tượng đều được gán vào 1 mã. Ví dụ, kiểu đối tượng mã 0, layer đối tượng mã 8, màu đối tượng mã 62.... Để tìm được thông tin các mã này bạn phải vào Help của CAD để tìm đọc

Khi gán bộ lọc này vào hàm ssget, CAD sẽ chọn tất cả các đối tượng có tất cả các giá trị khớp với list bạn đưa.

 

+ Quay trở lại với yêu cầu đầu tiên : Chọn tất cả các Hatch có cùng kiểu Hatch, loại ANSI31, cùng tỉ lệ Scale 100

(defun c:1()(sssetfirst nil (ssget (list (cons 0 "HATCH")(cons 2 "ANSI31")(cons 41 100)))))

Ở đây mã 0 : kiểu đối tượng HATCH

Mã 2 : Pattern của Hatch : Đặt là kiểu "ANSI31" (string)

Mã 41 : Scale của Hatch : Đặt bằng 100 (Real)

 

* Áp dụng với chọn tất cả các Text,Mtext có kiểu chữ là "Standard"(7) :

(defun c:1()(sssetfirst nil (ssget (list (cons 0 "*TEXT")(cons 7 "Standard")))))

*

 

+ Ở trên bạn có hỏi muốn linh động 2 giá trị trên bằng cách đánh vào => Hãy thay thế các giá trị cố định đó bằng hàm lấy loại dữ liệu tương ứng

Với String : Hàm (getstring message)

Với Real : Hàm (getreal message)

 

=> Lisp 1 sẽ sửa thành :

(defun c:1a()(sssetfirst nil (ssget (list (cons 0 "HATCH")(cons 2 (getstring "\nLoai Hatch :"))(cons 41 (getreal "\nScale :"))))))

 

+ Tiếp nữa, bạn lại hỏi cách không muốn nhập bằng tay mà pick một đối tượng mẫu. Để làm được điều này bạn phải đọc về các hàm cdr, assoc, entget, car, entsel

Ở đây mình viết sẵn 1 hàm để lấy danh sách các mã DXF của đối tượng kick, bạn áp dụng trước đã, sau này bạn tìm hiểu sau :

(defun getDxfs(lstId en)(vl-remove-if-not '(lambda(x)(vl-position (car x) lstId)) (entget en)))

* Áp dụng vào pick chọn các HATCH có cùng loại Hatch(2), Scale(41), Layer(8) với đối tượng Hatch mẫu :

(defun c:1b()(sssetfirst nil (ssget (getDxfs '(0 2 41 8)(car(entsel "\nDoi tuong mau :"))))))

 

* Áp dụng pick chọn các Block cùng tên(2) với Block mẫu :

(defun c:1c()(sssetfirst nil (ssget (getDxfs '(0 2 )(car(entsel "\nDoi tuong mau :"))))))

 

*Áp dụng pick chọn các đối tượng cùng layer(8) với đối tượng mẫu :

(defun c:1d()(sssetfirst nil (ssget (getDxfs '(8)(car(entsel "\nDoi tuong mau :"))))))

 

Với các ví dụ trên hi vọng bạn đã có thể tự làm lisp chọn đối tượng cho đa số trường hợp yêu cầu ở trên

 

Sang phần 2 : Một số yêu cầu lọc đối tượng mà điều kiện của nó bạn không thể tìm thấy ngay trong các mã DXF. Ví dụ yêu cầu cuối cùng, tìm các Block có scale xyz khác nhau. Không có mã này, nên điều bạn phải làm là chọn tất cả các Block trong vùng chọn, rồi kiểm tra. Thằng nào thỏa điều kiện thì giữ lại, thằng nào không thỏa thì bỏ ra khỏi tập chọn (giống như lisp bác ĐVH viết cho bạn)

Vì bạn chưa nghiên cứu Lisp nên thôi mình không trình bày, viết code tổng quát cho bạn áp dụng luôn, dần dà bạn thắc mắc thì nói tiếp

Có thể dùng ssadd và ssdel, nhưng ở đây mình dùng Visual Lisp => bạn phải có dòng (vl-load-com) đầu lisp.

Ngoài ra cũng lạm dụng luôn cả ACET, các hàm của Express trong CAD

 

- Đầu tiên : hàm lọc theo điều kiện hàm giữ và bỏ + hàm lấy dxf của 1 ename + hàm kiểm tra dxf có bằng yêu cầu không

(defun getss (typ fc_lay fc_bo / )
(sssetfirst nil
(acet-list-to-ss
 (vl-remove-if fc_bo
 (vl-remove-if-not
  fc_lay
  (acet-ss-to-list(ssget (list (cons 0 typ))))
 ))
)
)
)
(defun cdxf(id en)(cdr (assoc id (entget en))))
(defun isEq(id vl en)(eq (cdxf id en) vl))

=> Yêu cầu của bạn có thể viết thành :

(defun c:6();Chon cac Block k cung ti le xyz
(getss "INSERT"
 '=
 '(lambda(x)(= (cdxf 41 x)(cdxf 42 x)(cdxf 43 x)))
)
)

 

Hay yêu cầu về các Dimension có cùng tỉ lệ ScaleFactor bằng 1có thể viết thành :

(defun c:2()
(getss  "DIMENSION"
 '(lambda(x)(= (vlax-get (vlax-ename->vla-object x) 'LinearScaleFactor) 1))
 'not
)
)

 

- Câu hỏi cuối cùng : nếu không muốn chọn trong vùng chọn mà chọn tất cả đối tượng trên bản vẽ thì bạn thêm "x" vào sau chữ ssget ở tất cả các lisp

Đọc bài trên rồi nhưng mình nhằn ko ra bây giờ mình muốn thay đổi dòng dưới sao cho cái số 0 và chữ text là do mình nhồi vào bằng lisp thì sửa như thế nào?

(setq SS (ssget '((0 . "text"))))

 

Mình thử viết:

(setq loai "text")

(setq SS (ssget '((0 . loai))))

Thì không được, nó báo lổi. Sửa thành

(setq loai "text")

(setq SS (ssget '((0 . "loai"))))

Thì không báo lổi nhưng ko chọn được đối tượng.

Mình cứ đọc tới vl, vla thì tràn bộ nhớ nên có cách nào làm như mong muốn mà ko dùng vl và vla không? Mình đoán chắc dùng strcat để ghép chuổi thì phải. Mong các bác giú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

Đọc bài trên rồi nhưng mình nhằn ko ra bây giờ mình muốn thay đổi dòng dưới sao cho cái số 0 và chữ text là do mình nhồi vào bằng lisp thì sửa như thế nào?

(setq SS (ssget '((0 . "text"))))

 

Mình thử viết:

(setq loai "text")

(setq SS (ssget '((0 . loai))))

Thì không được, nó báo lổi. Sửa thành

(setq loai "text")

(setq SS (ssget '((0 . "loai"))))

Thì không báo lổi nhưng ko chọn được đối tượng.

Mình cứ đọc tới vl, vla thì tràn bộ nhớ nên có cách nào làm như mong muốn mà ko dùng vl và vla không? Mình đoán chắc dùng strcat để ghép chuổi thì phải. Mong các bác giúp.

Không dùng hàm ' khi tạo list có chứa biến bác ơi. Hàm ' là hàm tạo list mà không định giá trước => loai sẽ biến thành SYM LOAI. Phả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

cho em hỏi các bác phát nữa. (he he các cái trên em thông rùi)

giả sử khi ta dùng ssget có bộ lọc xdata

(ssget (list (list -3 (list "P1" (cons 1070 2))))) : mã 1070 (integer) thì ok

(ssget (list (list -3 (list "P1" (cons 1071 51))))): với mã 1071 (long) thì không lọc được đối tượng. Với cái kiểu long này thì ko bít phải làm sao

cảm ơn các bác nhì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

Mấy tuần trước em đã mò ra lệnh SELECTSIMILAR , hehe , có bắc nào thử coi , lệnh này đáp ứng được phần nào yêu cầu về lọc của em rồi :D . 1 lệnh thay cho rất nhiều Lisp lọc đối tượng , bác nào thích thì đặt cho nó phím tắt trong acad.pgp đi còn đợi gì 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

Mấy tuần trước em đã mò ra lệnh SELECTSIMILAR , hehe , có bắc nào thử coi , lệnh này đáp ứng được phần nào yêu cầu về lọc của em rồi :D . 1 lệnh thay cho rất nhiều Lisp lọc đối tượng , bác nào thích thì đặt cho nó phím tắt trong acad.pgp đi còn đợi gì nữa

Cad đời mấy nhiêu vậy bạ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
Mấy tuần trước em đã mò ra lệnh SELECTSIMILAR , hehe , có bắc nào thử coi , lệnh này đáp ứng được phần nào yêu cầu về lọc của em rồi :D . 1 lệnh thay cho rất nhiều Lisp lọc đối tượng , bác nào thích thì đặt cho nó phím tắt trong acad.pgp đi còn đợi gì nữa

Mình dùng Cad đời thấp nên đếch có :D

  • 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ấy tuần trước em đã mò ra lệnh SELECTSIMILAR , hehe , có bắc nào thử coi , lệnh này đáp ứng được phần nào yêu cầu về lọc của em rồi :D . 1 lệnh thay cho rất nhiều Lisp lọc đối tượng , bác nào thích thì đặt cho nó phím tắt trong acad.pgp đi còn đợi gì nữa

Right click chuột cũng có lệnh này trong popup menu

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ác bác giúp em với, em muốn viết câu lệnh xoá toàn bộ các đường tròn có D<200, em viết lệnh chọn các đường tròn có R<100, câu lệnh như sau: 

(ssget "X" ' ((0 . "CIRCLE") (-4 . "<") (40 . 100.0)))

thì trả về kq như thế này 

<selection set : xxx> với xxx là 1 ký tự gì đó.

Các bác chỉnh giúp em với.

Thanks 

(ssget "X" ' ((0 . "CIRCLE") (-4 . "<") (40 . 100.0)))
<Selection set: 1f2>
(ssget "X" ' ((0 . "CIRCLE") (-4 . "<") (40 . 100.0)))
<Selection set: 1f2>
(ssget "X" ' ((0 . "CIRCLE") (-4 . "<") (40 . 100.0)))
<Selection set: 1f2>

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ọn đc rồi thì xóa đi chứ có gì đâu

ko chọn được bác ơi, nó chỉ hiện ra <selection set: xxx> chứ nó ko có chọn.

 

Có nhiều cách dùng hàm để delete 1 tập hợp chọn có tên là ss:

(command "erase" ss "")

(acet-ss-entdel ss)

v.v...

Bác viết giúp em câu lệnh xoá các đường tròn đường kính <200 được 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

ko chọn được bác ơi, nó chỉ hiện ra <selection set: xxx> chứ nó ko có chọn.

 

Bác viết giúp em câu lệnh xoá các đường tròn đường kính <200 được ko?

Bạn có thể dùng như vầy :

(setq a (ssget "X" ' ((0 . "CIRCLE") (-4 . "<") (40 . 100.0))))

(command ".erase" 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

Màu đối tượng trong Autocad nằm trong code 62 của đối tượng đó. Nếu code này là có thì nó sẽ mang màu của code đó, nếu không, nó mang màu là bylayer.

Bây giờ mình muốn chọn các đối tượng có màu bylayer, nghĩa là không chứa code 62 trong mã DXF của nó thì câu lệnh gọi (SSGET cần tham số gì?

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

Rất hay và hữu ích! Nhưng vẫn câu hỏi cũ, mình muốn hỏi rằng liệu có thể chọn đối tượng mà không có một mã code nhất định nào đó 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

Rất hay và hữu ích! Nhưng vẫn câu hỏi cũ, mình muốn hỏi rằng liệu có thể chọn đối tượng mà không có một mã code nhất định nào đó không?

Bạn có thể nói rõ hơn không? Hơi khó hiểu.

  • 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

Rất hay và hữu ích! Nhưng vẫn câu hỏi cũ, mình muốn hỏi rằng liệu có thể chọn đối tượng mà không có một mã code nhất định nào đó không?

(ssget)

  • 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

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

×