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ị

Xin lỗi, cách diễn đạt này đúng là khó hiểu thật!

Ví dụ mình muốn chọn tất cả các đối tượng không có dữ liệu mở rộng (mã -3) thì làm thế nào? Có dùng trực tiếp ssget được không hay phải chọn cả rồi lọc đối tượ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

Mình có thêm một thắc mắc về hàm ssget nữa.
Khi dùng (nentsel) để pick vào một text bên trong Block, nó sẽ trả về giá trị của text đơn mà không quan tâm đến block.
Vậy làm sao để chọn được block chứa nó sau 1 lần pick? Và khi sử dụng (nentsel), làm sao để biết mình đã pick vào một block?

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ó thêm một thắc mắc về hàm ssget nữa.

Khi dùng (nentsel) để pick vào một text bên trong Block, nó sẽ trả về giá trị của text đơn mà không quan tâm đến block.

Vậy làm sao để chọn được block chứa nó sau 1 lần pick? Và khi sử dụng (nentsel), làm sao để biết mình đã pick vào một block?

 

Bạn tham khảo code này:

 

(defun c:nent (/ e)
(setq e (nentsel "\n Pick vao doi tuong :"))
(if (= (type (car (last e))) 'ENAME)
 (progn
   (alert "Ban dang pick vao Block")
  (setq e (car (last e)))  
))
 e
)
  • 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

Bạn tham khảo code này:

 

 

(defun c:nent (/ e)
(setq e (nentsel "\n Pick vao doi tuong :"))
(if (= (type (car (last e))) 'ENAME)
 (progn
   (alert "Ban dang pick vao Block")
  (setq e (car (last e)))  
))
 e
)

 

 

Hay quá! Vậy mà mình tưởng (nentsel) và (entsel) chỉ khác cái vụ xuyên qua hay không xuyên qua block thôi chứ!

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

Hay quá! Vậy mà mình tưởng (nentsel) và (entsel) chỉ khác cái vụ xuyên qua hay không xuyên qua block thôi chứ!

 

Tại bạn không để ý đấy thôi, quan tâm đến (entsel) trả về kết quả gì, (nentsel) trả về kết quả gì khi pick vaof Block, đem chúng ra so sánh sẽ được câu trả lờ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

Nhưng coi chừng bạn chọn luôn cả DIM (mặc dầu bản chất sâu xa của Dim là 1 block).

 

sử dụng thêm entget để xử..... .  ^_^

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

entget cũng không phải là đơn giản.

 

Bác xem ri đã đơn giản chưa ^_^

 

(defun c:nent (/ e)
(setq e (nentsel "\n Pick vao doi tuong :"))
(if (= (type (setq e (last (last e)))) 'ENAME)
 (if (= (cdr(assoc 0 (entget e))) "INSERT")
   (alert "Ban dang pick vao Block") 
))
 e
)
(defun c:nent (/ e)
(setq e (nentsel "\n Pick vao doi tuong :"))
(if (= (type (setq e (last (last e)))) 'ENAME)
 (if (= (cdr(assoc 0 (entget e))) "INSERT")
   (alert "Ban dang pick vao Block") 
))
 e
)

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ưa rằng chưa đâu! Nếu đơn giản thế thì đã không comment làm gì. Bác phải test cho nhiều kiểu block nhé!

 

Nếu bác nói chưa được thì đưa ra ví dụ đi,

Cái INSERT thường được tạo ra sau cùng trong mớ list danh sách đó, kể cả Block trong Block

Mình nghĩ nó rất đơn giả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

Đúng đấy bác ạ, không đơn giản như mình nghĩ.

Nếu gọi (nentsel) rồi bác pick vào một thuộc tính bên trong block thì có cho ra kết quả giống y sì so với (entsel), đến nỗi không thể phân biệt đượ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

Đúng đấy bác ạ, không đơn giản như mình nghĩ.

Nếu gọi (nentsel) rồi bác pick vào một thuộc tính bên trong block thì có cho ra kết quả giống y sì so với (entsel), đến nỗi không thể phân biệt được.

 

Nếu bạn test code có vấn đề lỗi với code cuối cùng của mình ở bài #86 thì phiền bạn đưa ví dụ lên đ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

Nó đây bác ạ! Bác thử code ở #86 trên bản vẽ này, chỉ vào một Attribute thì sẽ có kết quả thôi mà!

http://www.cadviet.com/upfiles/3/118851_block_attribute_2.dwg

 

Hì, có phức tạp tí mà thấy cũng đơn giản. Bạn test code :

 

(defun c:nent (/ e e1) (vl-load-com)
(setq e (nentsel "\n Pick vao doi tuong :"))
(if (= (type (setq e1 (last (last e)))) 'ENAME)
 (if (= (cdr(assoc 0 (entget e1))) "INSERT")
   (alert (strcat "Ban dang pick vao Block ten ENAME: " (vl-princ-to-string e1) ))
 )
)
 (if (= (cdr(assoc 0 (entget (car e)))) "ATTRIB")
    (alert (strcat "Ban dang pick vao Block ten ENAME: "
                           (vl-princ-to-string (setq e1 (cdr(assoc 330 (entget (car e))) )))))
 )
 E1
)
(defun c:nent (/ e e1)
(setq e (nentsel "\n Pick vao doi tuong :"))
(if (= (type (setq e1 (last (last e)))) 'ENAME)
 (if (= (cdr(assoc 0 (entget e1))) "INSERT")
   (alert (strcat "Ban dang pick vao Block ten ENAME: " (vl-princ-to-string e1) ))
 )
)
 (if (= (cdr(assoc 0 (entget (car e)))) "ATTRIB")
    (alert (strcat "Ban dang pick vao Block ten ENAME: "
  (vl-princ-to-string (cdr(assoc 330 (entget (car e))) ))))
 )
 e
)
  • 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

Hình như bạn Polyline chỉ hỏi về các hàm ở #77 cho vui mà không cần nên không test thử có ổn không?

Rồi mà bạn! Bạn thử chạy code ở #86, khi pick vào khung màu tím thì nó nhận ra block, nhưng pick vào text thuộc tính thì nhận được kết quả là:

Command: nent

Pick vao doi tuong :0.0

 

Command:

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ồi mà bạn! Bạn thử chạy code ở #86, khi pick vào khung màu tím thì nó nhận ra block, nhưng pick vào text thuộc tính thì nhận được kết quả là:

Command: nent

Pick vao doi tuong :0.0

 

Command:

Tôi hỏi bài #77 cơ mà!

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ì, có phức tạp tí mà thấy cũng đơn giản. Bạn test code :

 


Mọi thứ phức tạp đều trở nên đơn giản nếu ta biết được - bằng cách nào đó - sự phức tạp của nó.

Tuy nhiên, sau 3 lần "đơn giản" thì phân sau cùng số vẫn chưa thể "đơn giản" đượ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ọi thứ phức tạp đều trở nên đơn giản nếu ta biết được - bằng cách nào đó - sự phức tạp của nó.

Tuy nhiên, sau 3 lần "đơn giản" thì phân sau cùng số vẫn chưa thể "đơn giản" được.

 

Hì , có lỗi gì bác cứ nói toẹc ra và đưa ví dụ lên đi, cứ thấy bác viết bài như vậy, chán òm..........

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 anh cho em hỏi: (ssget '(2 2)) là chọn đối tượng đi qua 1 điểm (2 2)

Giờ em muốn chọn 2 đối tượng đi qua 2 điểm (2 2) và (10 10) (hoặc đi qua 3 điểm, 4 điểm) thì phải viết thế nào , em viết (ssget '(2 2) '(10 10)) nhưng không được  :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

các anh cho em hỏi: (ssget '(2 2)) là chọn đối tượng đi qua 1 điểm (2 2)

Giờ em muốn chọn 2 đối tượng đi qua 2 điểm (2 2) và (10 10) (hoặc đi qua 3 điểm, 4 điểm) thì phải viết thế nào , em viết (ssget '(2 2) '(10 10)) nhưng không được  :D

Hề hề hề,

Vậy là Không "hieuroi".....

Muốn như vậy bạn cần tạo một list bao gồm các point mà bạn muốn. 

Sau đó tạo một vòng lặp qua các point này và tại mỗi point thì sử dụng cái hàm (ssget point) này để lấy tập đối tượng đi qua điểm đó, chuyển nó thành list bao gồm các ename của các đối tượng được chọn . Dùng hàm append để nối các enmae này thành một list các ename được chọn rồi lại chuyển ngược từ list các ename này thành tên tập chọn.

Công việc này nếu bạn có cài express tools thì khá dễ dàng, bằng không bạn sẽ phải viết các hàm con cho nó.

Hãy làm thử đi nhé. Nếu không được mình sẽ hỗ trợ.

  • 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

×