Đến nội dung


Hình ảnh
* * - - - 4 Bình chọn

[Hỏi] Hàm ssget trong Autolisp


  • Please log in to reply
149 replies to this topic

#121 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 15 November 2013 - 08:27 AM

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.c...=0


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#122 Namvanvo

Namvanvo

    Edu level: li5

  • Members
  • PipPipPipPipPip
  • 386 Bài viết
Điểm đánh giá: 42 (tàm tạm)

Đã gửi 15 November 2013 - 09:36 AM

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  :)


  • 0

#123 Namvanvo

Namvanvo

    Edu level: li5

  • Members
  • PipPipPipPipPip
  • 386 Bài viết
Điểm đánh giá: 42 (tàm tạm)

Đã gửi 15 November 2013 - 10:29 AM

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ỉ?  :)


  • 0

#124 Namvanvo

Namvanvo

    Edu level: li5

  • Members
  • PipPipPipPipPip
  • 386 Bài viết
Điểm đánh giá: 42 (tàm tạm)

Đã gửi 15 November 2013 - 10:33 AM

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.c...=0

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?


  • 0

#125 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 15 November 2013 - 10:43 AM

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")))


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#126 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 15 November 2013 - 10:50 AM

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.


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#127 Namvanvo

Namvanvo

    Edu level: li5

  • Members
  • PipPipPipPipPip
  • 386 Bài viết
Điểm đánh giá: 42 (tàm tạm)

Đã gửi 15 November 2013 - 11:08 AM

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
  • 0

#128 tien2005

tien2005

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 257 Bài viết
Điểm đánh giá: 94 (tàm tạm)

Đã gửi 24 November 2013 - 06:00 PM

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


  • 0

#129 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 24 November 2013 - 06:55 PM

(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))))

  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#130 Polyline

Polyline

    biết lệnh mirror

  • Members
  • PipPipPip
  • 159 Bài viết
Điểm đánh giá: 18 (tàm tạm)

Đã gửi 03 January 2014 - 10:33 AM

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?


  • 0

#131 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 03 January 2014 - 10:51 AM

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)
 

  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#132 Polyline

Polyline

    biết lệnh mirror

  • Members
  • PipPipPip
  • 159 Bài viết
Điểm đánh giá: 18 (tàm tạm)

Đã gửi 03 January 2014 - 01:21 PM

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"))))


  • 1

#133 Polyline

Polyline

    biết lệnh mirror

  • Members
  • PipPipPip
  • 159 Bài viết
Điểm đánh giá: 18 (tàm tạm)

Đã gửi 15 July 2014 - 11:44 AM

Các bác cho mình hỏi: Làm sao để gán tập chọn (ssget "p") về rỗng?
  • 0

#134 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 15 July 2014 - 01:43 PM

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)

  • 1

#135 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 15 July 2014 - 02:27 PM

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)


  • 1

#136 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 15 July 2014 - 02:41 PM

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


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#137 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 15 July 2014 - 02:52 PM

Ý 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 


  • 1

#138 Polyline

Polyline

    biết lệnh mirror

  • Members
  • PipPipPip
  • 159 Bài viết
Điểm đánh giá: 18 (tàm tạm)

Đã gửi 15 July 2014 - 02:59 PM

Mình cũng tìm được cách tương tự
(command ".point" (list 0 0)
".erase" (entlast) "");set (ssget "p") to nil
  • 0

#139 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 15 July 2014 - 03:04 PM

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


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#140 Polyline

Polyline

    biết lệnh mirror

  • Members
  • PipPipPip
  • 159 Bài viết
Điểm đánh giá: 18 (tàm tạm)

Đã gửi 15 July 2014 - 03:05 PM

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 '* '*)))
  • 0