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

[Hỏi] Hàm ssget trong Autolisp

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

hieuroi    1

mình tưởng đơn giản, hóa ra lại phức tạp như vậy, đọc xong chả hiểu mô tê răng rứa chi cả. :D

máy mình có cài Express tools.

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

mình tưởng đơn giản, hóa ra lại phức tạp như vậy, đọc xong chả hiểu mô tê răng rứa chi cả. :D

máy mình có cài Express tools.

Thanks

Hề hề hề,

Nếu có cài express tools thì hãy thử làm như sau xem nó ra cái gì nhé:

1/- Nhập trên dòng command:

(setq lst (list '(2 2) '(10 10)))

2/- nhấn enter Cad sẽ trả về trên dòng command list ((2 2) (10 10))

3/- Nhập dòng code loằng ngoằng sau đây:

(foreach p lst (setq ss (acet-list-to ss (append (acet-ss-to-list ss) (acet-ss-to-list (ssget p))))))

4/- Nhấn Enter và nếu bạn thấy xuất hiện một cái tên chi chi đó trên dòng command thì có nghĩa đó là tên của tập chọn các đối tượng đi qua hai điểm (2 2) và (10 10)

 

Hy vọng bạn sẽ Hieuroi......

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
hieuroi    1

hi, làm theo tới bước 2 thì ok, tới bước nhập loằng ngoằng vào thì nó báo lỗi thế này:

 

(foreach p lst (setq ss (acet-list-to ss (append (acet-ss-to-list ss)

(acet-ss-to-list (ssget p))))))

; error: no function definition: ACET-LIST-TO

 

nó bị gì thế bác?

 

Nếu mình muốn đi qua nhiều điểm nữa thì chỉ cần thêm điểm đó vào cái lst ở bước 1 phải k 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
phamthanhbinh    3.123

hi, làm theo tới bước 2 thì ok, tới bước nhập loằng ngoằng vào thì nó báo lỗi thế này:

 

(foreach p lst (setq ss (acet-list-to ss (append (acet-ss-to-list ss)

(acet-ss-to-list (ssget p))))))

; error: no function definition: ACET-LIST-TO

 

nó bị gì thế bác?

 

Nếu mình muốn đi qua nhiều điểm nữa thì chỉ cần thêm điểm đó vào cái lst ở bước 1 phải k bác?

Hề hề hề,

Sorry bạn.

Nó lỗi là do cái ni mình gõ sai chính tả:

(foreach p lst (setq ss (acet-list-to ss (append (acet-ss-to-list ss) (acet-ss-to-list (ssget p))))))

Phải sửa lại thế này:

(foreach p lst (setq ss (acet-list-to-ss (append (acet-ss-to-list ss) (acet-ss-to-list (ssget p))))))

 

Chắc do mình cẩu thả không check lại khi gõ đấy mà.

Cái bạn hỏi thì đúng như vầy, phải thêm vào ở bước 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
Namvanvo    42

các bác cho em hỏi, khi chọn đối tượng trong bản vẽ cad bằng hàm lisp, nếu em không zoom phần đối tượng được chọn lên màn hình thì không chọn được đối tượng đó, vậy làm sao đối tượng đó nằm ngoài giao diện màn hình đồ họa mà mình vẫn chọn được đối tượng đó (đã biết trước vị trí và vị trí chứa đối tượng này cố định trong bản vẽ)  :)

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
Namvanvo    42

hehe, zoom thì mình cũng đã biết và đang áp dụng, tuy nhiên khi chạy nó cứ cà giựt nên mình thấy không được chuyên nghiệp cho lắm, không biết có cách chọn đối tượng nào mà khi thao tác nó mượt mà, nhẹ nhàng hơn không  :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
Doan Van Ha    2.676

Cad nó thế thì đành chịu thế. Hàm ssget còn không cho chọn quá 128 tập chọn nữa cơ. Không biết cad mới thì có sửa số 128 chưa (?).

Zoom nó cà giựt nếu bản vẽ nặng. Với bản vẽ nhẹ thì nó lướt êm hơn. Và bạn có thể zoom bằng hàm vla thì nhanh hơn dùng command.

Ví dụ zoom window bằng vla:

(defun c:zoom1 ()

(setq acadapplic (vlax-get-acad-object))
(setq util (vla-get-utility (vla-get-activedocument acadapplic)))
(setq PT1 (vla-getpoint util nil "\nFirst Point : "))
(setq PT2 (vla-getcorner util PT1 "\nSecond Point : "))
(vla-ZoomWindow acadapplic PT1 PT2)
(princ))


)

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
Namvanvo    42

TẬP CHỌN được hiểu như thế nào vậy bác, là 128 đối tượng được chọn trong bản vẽ, hay là 128 nhóm (tập hợp các đối tượng)  đối tượng được chọn trong bản vẽ đó ?

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
Thaistreetz    515

các bác cho em hỏi, khi chọn đối tượng trong bản vẽ cad bằng hàm lisp, nếu em không zoom phần đối tượng được chọn lên màn hình thì không chọn được đối tượng đó, vậy làm sao đối tượng đó nằm ngoài giao diện màn hình đồ họa mà mình vẫn chọn được đối tượng đó (đã biết trước vị trí và vị trí chứa đối tượng này cố định trong bản vẽ)  :)

Đối tượng mà bạn chọn là gì? Các đối tượng có điểm chèn: point, text, insert... hoàn toàn có thể chọn được tại mọi điểm ngoài phạm vi màn hì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
Thaistreetz    515

Cad nó thế thì đành chịu thế. Hàm ssget còn không cho chọn quá 128 tập chọn nữa cơ. Không biết cad mới thì có sửa số 128 chưa (?).

Zoom nó cà giựt nếu bản vẽ nặng. Với bản vẽ nhẹ thì nó lướt êm hơn. Và bạn có thể zoom bằng hàm vla thì nhanh hơn dùng command.

Ví dụ zoom window bằng vla:

(defun c:zoom1 ()

(setq acadapplic (vlax-get-acad-object))

(setq util (vla-get-utility (vla-get-activedocument acadapplic)))

(setq PT1 (vla-getpoint util nil "\nFirst Point : "))

(setq PT2 (vla-getcorner util PT1 "\nSecond Point : "))

(vla-ZoomWindow acadapplic PT1 PT2)

(princ))

 

)

Zoom bằng VLA theo tôi nhớ thì không hề nhanh hơn command. và còn bị nhảy dòng tại command screen 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
Namvanvo    42

Đối tượng mà bạn chọn là gì? Các đối tượng có điểm chèn: point, text, insert... hoàn toàn có thể chọn được tại mọi điểm ngoài phạm vi màn hình

đối tượng mình chọn là text, mình dùng ssget để chọn, nhưng khi ở ngoài màn hình thì lại không chọn được,bạn có cao kiến gì 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
Doan Van Ha    2.676

Zoom bằng VLA theo tôi nhớ thì không hề nhanh hơn command. và còn bị nhảy dòng tại command screen nữa.

Chắc là nhớ nhầm ấy chứ! Điều này dễ kiểm tra bằng cách mở 1 bản vẽ bất kỳ đủ nặng, thử zoom và zoom1 là thấy ngay thô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

đối tượng mình chọn là text, mình dùng ssget để chọn, nhưng khi ở ngoài màn hình thì lại không chọn được,bạn có cao kiến gì không?  :)

Namvanvo dùng (ssget) để chọn nhưng không nói rõ là chọn với cách thức "method" gì?  

Nếu chỉ dùng (ssget) thôi thì chỉ sử dụng chuột mà tự đi quét chọn thôi, ở ngoài màn hình thì tự "Pan" đến đó mà chọn vậy

Còn nếu dùng (ssget "x") thì ở trong lẫn ở ngoài màn hình đều chọn tất.

Vậy ý định của Namvanvo là dùng (ssget) như 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
Namvanvo    42

Namvanvo dùng (ssget) để chọn nhưng không nói rõ là chọn với cách thức "method" gì?  

Nếu chỉ dùng (ssget) thôi thì chỉ sử dụng chuột mà tự đi quét chọn thôi, ở ngoài màn hình thì tự "Pan" đến đó mà chọn vậy

Còn nếu dùng (ssget "x") thì ở trong lẫn ở ngoài màn hình đều chọn tất.

Vậy ý định của Namvanvo là dùng (ssget) như thế nào?

sory bác, em nói chung chung quá, em dùng ssget với method "W","C",F" và tọa độ là cố đị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
Namvanvo    42

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

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

(command ".erase" a "")

Các bác cho em hỏi là muốn chọn những đối tượng Line có chiều dài nhỏ hơn 100 thì viết code thế nào? em không tìm thấy mã DXF chiều dài của Line của LWPOLYLINE?   :)

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
Thaistreetz    515

đối tượng mình chọn là text, mình dùng ssget để chọn, nhưng khi ở ngoài màn hình thì lại không chọn được,bạn có cao kiến gì không?  :)

Bạn sử dụng method "X" nhưng kết hợp filter gồm các toán tử AND, OR, <,<,< và >,>,> cho mã dxf 10 để lọc các đối tượng trong khu vực muốn chọn. Mình gợi ý ban vậy thôi vì vao cadviet bằng đt ko code đc. Nhiều lisp của mình từng post lên cadviet có sử dụng cách này. Bạn có thể tìm để tham khảo

  • 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
Doan Van Ha    2.676

Các bác cho em hỏi là muốn chọn những đối tượng Line có chiều dài nhỏ hơn 100 thì viết code thế nào? em không tìm thấy mã DXF chiều dài của Line của LWPOLYLINE?   :)

Có lẽ không chọn trực tiếp bằng ssget được vì chúng không có mã dxf, nhưng có thể chọn và lọc gián tiếp.

Bạn xem link này:

http://www.cadviet.com/forum/index.php?showtopic=67360&pid=217754&st=0&&do=findComment&comment=217754

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
Namvanvo    42

Bạn sử dụng method "X" nhưng kết hợp filter gồm các toán tử AND, OR, <,<,< và >,>,> cho mã dxf 10 để lọc các đối tượng trong khu vực muốn chọn. Mình gợi ý ban vậy thôi vì vao cadviet bằng đt ko code đc. Nhiều lisp của mình từng post lên cadviet có sử dụng cách này. Bạn có thể tìm để tham khảo

Thank Thaistreetz, mình đã là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
Namvanvo    42

các bác cho em hỏi: 

em muốn lọc text trong bản vẽ có nội dung như sau : STN-PF-D1-1000-2H1-CD-D-SD

với cú pháp : (ssget "X" '((0. "TEXT") (-4. "=") (1. "STN-*-SD"))) mà sao không được, sai chỗ nào các bác 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
Namvanvo    42

Có lẽ không chọn trực tiếp bằng ssget được vì chúng không có mã dxf, nhưng có thể chọn và lọc gián tiếp.

Bạn xem link này:

http://www.cadviet.com/forum/index.php?showtopic=67360&pid=217754&st=0&&do=findComment&comment=217754

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?

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
Doan Van Ha    2.676

các bác cho em hỏi: 

em muốn lọc text trong bản vẽ có nội dung như sau : STN-PF-D1-1000-2H1-CD-D-SD

với cú pháp : (ssget "X" '((0. "TEXT") (-4. "=") (1. "STN-*-SD"))) mà sao không được, sai chỗ nào các bác nhỉ?  :)

(ssget "X" '((0 . "TEXT") (1 . "STN-*-SD")))

  • 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


×