Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
11 replies to this topic

#1 quansla

quansla

    biết lệnh xclip

  • Members
  • PipPipPipPipPipPipPip
  • 641 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 26 June 2012 - 03:45 PM

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

#2 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 26 June 2012 - 04:43 PM

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?
  • 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.


#3 quansla

quansla

    biết lệnh xclip

  • Members
  • PipPipPipPipPipPipPip
  • 641 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 26 June 2012 - 06:58 PM

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

Bài viết đã được chỉnh sửa nội dung bởi quansla: 26 June 2012 - 07:05 PM

  • 0

#4 quansla

quansla

    biết lệnh xclip

  • Members
  • PipPipPipPipPipPipPip
  • 641 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 26 June 2012 - 07:05 PM

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

#5 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 26 June 2012 - 07:17 PM

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

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


#6 quansla

quansla

    biết lệnh xclip

  • Members
  • PipPipPipPipPipPipPip
  • 641 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 26 June 2012 - 08:37 PM

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

#7 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 26 June 2012 - 08:39 PM

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


#8 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 26 June 2012 - 09:48 PM

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

  • 0

#9 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 26 June 2012 - 09:50 PM

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.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#10 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 26 June 2012 - 09:51 PM

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


#11 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 27 June 2012 - 06:22 AM

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

  • 0

#12 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 28 June 2012 - 02:18 PM

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???
  • 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.