Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
quansla

[Hỏi] Code list cho lệnh chọn đối tượng có điều kiện

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

Em đang bập bẹ viết list, em có đoạn code thế này

(defun chon1t(/ x)
 (setq x (entsel"\n [color=#ff0000]Chon 1 Text la so. Huy bang ESC hoac chon lai Text cu[/color]"))
 (while (or
           (not x)
           (and x (/= "TEXT" (cdr(assoc 0 (entget(car x)))))
                      ;(/= 0 (cdr(assoc 1 (entget(car x)))) )  
           )
        (setq x (entsel"\n2.Chon 1 Text la so. Huy bang ESC hoac chon lai Text cu"))
   )
  (cdr(assoc 1 (entget(car x))))
)

Em viết code cho Hàm (chon1t) này mục đích là để sử dùng làm điều kiện lặp cho vòng lặp của While

* Yêu cầu của (chon1t) là sau khi sử dụng hàm người dùng bắt buộc phải nhập vào một đối tượng Text và Text là số không nhận Tex có chữ cái không cho phép không nhập gì và muốn dừng vòng lặp hàm con này phải nhập chọn vào đối tượng chọn của lần lặp ngay trước nó(tức hai lần liên tiếp chọn cùng một đối tượng) (hoặc một đối tượng quy định từ đầu bằng entsel cũng được)

Vậy em phải sử dụng Code như thế nào ạh. Với code trên em chỉ hạn chế yêu cầu người dùng phải nhập đối tượng là Text thôi, còn muốn thoát vòng lệnh chỉ có cách nhấn ESC hay nói cách khác là vòng lặp của em không có lối thoát hix! Và cũng chưa có đoạn yêu cầu Text là số nữa. Các bác giúp em hoàn thiện hoặc đưa cho em một ví dụ tương tự được không ạh. Sơ sơ em nhớ đã có lần diễn đàn mình cũng có list của bác nào đó dừng vòng lặp bằng cách chọn đối tượng lần trước(2 lần chọn trùng nhau) , nhưng không nhớ rõ lắm nên tìm hoài không ra?

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ôi không hiểu ý bạn:

1). Nếu chỉ chọn 1 text là số thì tại sao không đặt điều kiện: nếu chọn được thì thoát vòng lặp, mà phải chọn lại chính nó?

2). Nếu chọn nhiều text là số thì tại sao không dùng ssget mà là entsel?

Bạn có thể giải thích thêm?

  • 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ôi không hiểu ý bạn:

1). Nếu chỉ chọn 1 text là số thì tại sao không đặt điều kiện: nếu chọn được thì thoát vòng lặp, mà phải chọn lại chính nó?

2). Nếu chọn nhiều text là số thì tại sao không dùng ssget mà là entsel?

Bạn có thể giải thích thêm?

Như thế này bác ạ. Em tính viết list để vẽ biểu đồ nhân lực trong tổ chức thi công, em upfile em làm xong rồi lên ở cuối nhé ạh, do mới bập bẹ thôi lên viết khá lằng nhằng. Ý của em là mỗi lần người dùng chọn một Text(là số) list thực hiện tách giá trị trong (assoc 1 textent) đổi qua số thực và dùng làm khoảng cách trong lệnh vẽ Line, Nếu bắt nhiều lần sẽ có lợi hơn nên em dự tính dùng hàm (while (setq Text (car(entsel "\nChon Text la so")))... Nếu người dùng bắt chuẩn Text (pick chuột trúng tróc ngay nó) thì không nói làm gì, Nhưng nếu tích nhầm (phải Line, khoảng trắng, Hay text có chữ cái kèm theo) thì list bị dừng lại và thoát ra, Em không muốn vậy mà mún dù có pick nhầm thì list vẫn cho tích lại và pick chúng thì thôi còn muốn thoát thì (tốt nhất là nhấp lại vào đối tượng có trước đó là đường nằm ngang biểu diễn dòng thời gian) thì list sẽ thoát. Em gửi lên bác xem, chỉnh góp ý giúp em

 

 

Vì list này em viết cho bạn và kết hợp hướng dẫn luôn nên hơi lằng nhằng còn file thì như thế này

Chỉnh sửa theo quansla

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ôi không hiểu ý bạn:

1). Nếu chỉ chọn 1 text là số thì tại sao không đặt điều kiện: nếu chọn được thì thoát vòng lặp, mà phải chọn lại chính nó?

2). Nếu chọn nhiều text là số thì tại sao không dùng ssget mà là entsel?

Bạn có thể giải thích thêm?

http://www.cadviet.c...101306_anh2.lsp

http://www.cadviet.c..._hd_su_dung.dwg

Vâng, trước hết em cảm ơn bác đã quan tâm ạh. Em gửi 2 file đây bác xem qua là hiểu ngay, list này em viết cho bạn lên kết hợp hộp thoại hướng dẫn luôn, và do mới bập bẹ thôi lên khá là lằng nhằng.

1. Không phải chọn chính nó đâu ạh mà là ví dụ sau n bước lặp ngon lành rồi giờ muốn thoát lệnh thì nhớ lại rằng ở bước n đã chọn Text mang nội dung là 86 thì giờ nhấp lại con số đó. List kiểm tra thấy ename đối tượng lần này bị trùng với ename đối tượng ngay trước đó thì lần n+1 này đk vòng while là nil và list dừng lại a.

2. Chọn một Text vì lấy nội dung Text đó từ hàm (* #tl (atof (assoc 1 TextEnt))) để làm khoảng cách khi vẽ Line ạh

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ử dùng cái này xem đúng ý bạn không: mỗi lần chọn 1 text là num, chọn cho đến khi được 1 text là num thì thoát.

;----- Chon chi 1 Text_Num
(defun Get1TextNum (/ ss)
(while
 (or
  (not ss)
  (> (sslength ss) 1)
  (= (distof (cdr (assoc 1 (entget (ssname ss 0))))) nil))
 (setq ss (ssget ":S" '((0 . "*TEXT") (1 . "~*[~-0--9]*")))))
(ssname ss 0))

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ử dùng cái này xem đúng ý bạn không: mỗi lần chọn 1 text là num, chọn cho đến khi được 1 text là num thì thoát.

 

(ssname ss 0))

 

Em đã kiểm tra lại Code đúng ý em rồi ạh, cảm ơn anh. Có lẽ tối nay lại mất ngủ tìm hiểu sao ssname nhưng lại có thể bỏ qua enter cuối công đoạn nhập đối tượng rùi, hì hì.

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 chưa dùng thử rồi! Nó chẳng cần nhấn enter đâu. Hàm chỉ cho phép bạn chọn 1 và chỉ 1 text là số. Chọn chừng nào được thì thôi. Khi chọn được rồi thì nó tự thoát vòng lặ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

Thử dùng cái này xem đúng ý bạn không: mỗi lần chọn 1 text là num, chọn cho đến khi được 1 text là num thì thoát.

;----- Chon chi 1 Text_Num
(defun Get1TextNum (/ ss)
(while
 (or
  (not ss)
  (> (sslength ss) 1)
  (= (distof (cdr (assoc 1 (entget (ssname ss 0))))) nil))
 (setq ss (ssget ":S" '((0 . "*TEXT") (1 . "~*[~-0--9]*")))))
(ssname ss 0))

Bác viết dài quá.

Code ngắn lại 1 tí cho gọn và dễ hiểu nữa

(defun Get1TextNum (/ ss)
(while (null (setq ss (ssget ":S" '((0 . "*TEXT") (1 . "~*[~-0--9]*"))))))
(ssname ss 0))

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
Em đã kiểm tra lại Code đúng ý em rồi ạh, cảm ơn anh. Có lẽ tối nay lại mất ngủ tìm hiểu sao ssname nhưng lại có thể bỏ qua enter cuối công đoạn nhập đối tượng rùi, hì hì.

Hề hề hề,

Không biết cái này có đúng ý bạn không hè???

(defun chon1t ( / x x1  txt)
(while  (and (setq x1 (car (entsel "\n Chon mot text so"))) (not (equal x x1)) )

             (if  (or (/= (cdr (assoc 0 (entget x1))) "TEXT")        
                        (= (wcmatch (setq txt (cdr (assoc 1 (entget x1)))) "~*@*") nil)                              
                  )
                  (setq x nil)
                  (setq x x1)
            )     
            (if x
                (princ (strcat "\n Gia tri text ban chon la: " txt))
            )

)
(princ)
)

Vòng lặp này sẽ dừng khi bạn chọn không trúng đối tượng nào, khi bạn chọn đối tượng text số hai lần liên tiếp. Mỗi khi bạn pick đúng text số thì nó sẽ hiển thị giá trị của text số trên dòng commmand để bạn kiểm tra.

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 mình cái dấu "." nó cũng bị chọn như bữa trước đã bàn nên để vậy cho chắc ăn.

"." không được chọn nhưng ".1" (.#) thì được chọn vì (distof ".1") -> 0.1

Tue_NV đã test 2 code này kỹ rồi. Bác thử xem:

1. Trường hợp xem .# là 1 số:

(defun Get1TextNum (/ ss)
(while
(null
 	(setq ss (ssget ":S"
  	  '((0 . "*TEXT")
 	  		(1 . "~*[~-0--9~~ ]*")
 			(1 . "*#*")
 			(1 . "~*`.*`.*")
 			(1 . "~*? ?*") )
  	 ))
)
)
(ssname ss 0))

2. Trường hợp không xem .# là 1 số:

(defun Get1TextNum (/ ss)
(while
(null
 	(setq ss (ssget ":S"
  	  '((0 . "*TEXT")
 			(1 . "~*[~-0--9~~ ]*")
 			(1 . "*#*")
 			(1 . "~*.#*")
 			(1 . "~*`.*`.*")
 			(1 . "~*? ?*") )
  	 ))
)
)
(ssname ss 0))

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

1). Cad hơi khó hiểu chỗ này (hoặc bản thân chưa hiểu hết cad):

+ (type 0.1) => REAL

+ (type .1) => ; error: misplaced dot on input

+ (distof "0.1") => 0.1

+ (distof ".1") => 0.1

+ Khi nhập 0.1 hoặc .1 vào command để thể hiện 1 số thì đều OK.

2). Hàm thứ nhất của bác thì test chưa phát hiện sai. Nhưng hàm thứ hai thì test bị sai mất rồi: 0.1 nó cũng lắc đầu luô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

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
Đăng nhập để thực hiện theo  

×