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ị

Polyline    18

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
Polyline    18

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
Tue_NV    3.841

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
Polyline    18

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
Tue_NV    3.841

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
Tue_NV    3.841

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
Tue_NV    3.841

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
Tue_NV    3.841

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
Polyline    18

Đú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
Tue_NV    3.841

Đú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
Tue_NV    3.841

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
Polyline    18

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

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

 

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
Tue_NV    3.841

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

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

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


×