Chuyển đến nội dung
Diễn đàn CADViet
duyhung

Hỏi cách lấy giá trị trong text

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

Mình muốn chọn lấy giá trị trong text VD: Text Gia tri: 200 thì sẽ lấy được giá trị 200 ra để tính toán

Bạn ketxu đã giúp đỡ lấy giá trị trong 1 text nhưng nếu text có cả giá trị string và số thì lấy ra kiểu nào vây? :)

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 muốn chọn lấy giá trị trong text VD: Text Gia tri: 200 thì sẽ lấy được giá trị 200 ra để tính toán

Bạn ketxu đã giúp đỡ lấy giá trị trong 1 text nhưng nếu text có cả giá trị string và số thì lấy ra kiểu nào vây? :)

Tối nay chắc phải muợn sách tiếng Việt của thằng con học lại quá !

(đọc đi đọc lại chả hiểu gì ! ngôn ngữ thay đổi nhanh quá hay mình không theo kịp thời đại)

 

Xin lỗi chủ topic nếu có làm phiề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

Chào bác, em có vài công thức tính toán và lập trình lisp dể dùng

Ý em hỏi là vd text: (Chiều dài căn hộ là 25m) thì em muốn lấy giá trị 25 ra bằng cách select text rồi gán vào 1 biến để tính toán!

Hề hề em cũng teen mà bá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

Chào bác, em có vài công thức tính toán và lập trình lisp dể dùng

Ý em hỏi là vd text: (Chiều dài căn hộ là 25m) thì em muốn lấy giá trị 25 ra bằng cách select text rồi gán vào 1 biến để tính toán!

Hề hề em cũng teen mà bác ^^!

Bạn thử cái này. Nó lọc toàn bộ số trong text được chọn

(defun c:locso()
 (setq te (car (entsel))
text (cdr (assoc 1 (entget te)))
sl (strlen text)
kq ""
i 1)
 (while (< i sl)
   (setq so (substr text i 1))
   (if (numberp (read so))
     (setq kq (strcat kq so))
     )
   (setq i (1+ i))
   )
 kq
 )

  • 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

E xin góp thêm 1 cách dùng vl nữa ^^

@Duyhung :

Bạn dùng dòng này để gán số vào biến so:

(setq so (atof (vl-list->string (vl-remove-if '(lambda(x) (or (< x 48) (> x 57))) (vl-string->list (cdr(assoc 1 (entget(car(entsel "\n Chon text : "))))))))))
  • 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

Cảm ơn bác tú và bạn ketxu đã reply.

Lisp của bác tú và bạn ketxu gặp lỗi cho em khi text có dấu (.) ngăn cách

VD: Kết quả là 15.2

Thì lisp locso của bác tú chỉ lọc khi các số là nguyên và gặp lỗi khi có dấu chấm ngăn cách

Của bạn ketxu thì nó lại nhận là 152.

Hj vẫn lỗi với mình.

Mọi người xem hộ mình nhé

Thanks

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ảm ơn bác tú và bạn ketxu đã reply.

Lisp của bác tú và bạn ketxu gặp lỗi cho em khi text có dấu (.) ngăn cách

VD: Kết quả là 15.2

Thì lisp locso của bác tú chỉ lọc khi các số là nguyên và gặp lỗi khi có dấu chấm ngăn cách

Của bạn ketxu thì nó lại nhận là 152.

Hj vẫn lỗi với mình.

Mọi người xem hộ mình nhé

Thanks

Bạn sửa như sau:

(defun c:locso()
 (setq te (car (entsel))
text (cdr (assoc 1 (entget te)))
sl (strlen text)
kq ""
i 1)
 (while (<= i sl)
   (setq so (substr text i 1))
   (if (/= so ".")
     (progn
   (if (numberp (read so))
     (setq kq (strcat kq so))
     )
     )
     (setq kq (strcat kq so))
     )
   (setq i (1+ i))
   )
 kq
 )

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ảm ơn bác tú và bạn ketxu đã reply.

Lisp của bác tú và bạn ketxu gặp lỗi cho em khi text có dấu (.) ngăn cách

VD: Kết quả là 15.2

Thì lisp locso của bác tú chỉ lọc khi các số là nguyên và gặp lỗi khi có dấu chấm ngăn cách

Của bạn ketxu thì nó lại nhận là 152.

Hj vẫn lỗi với mình.

Mọi người xem hộ mình nhé

Thanks

Vậy bạn sửa lại 1 chút như sau.

(setq so (atof (vl-list->string (vl-remove-if '(lambda(x) (or (< x 46) (> x 57))) (vl-string->list (cdr(assoc 1 (entget(car(entsel "\n Chon text : "))))))))))

".123abc" -> "0.123"

"123.abc45" -> "123.45"

Lưu ý : chấp nhận cả dấu /, nhưng không tính vào kết quả.Ví dụ 34/35 -> nhận là 34, /345 -> nhận là 0. Còn nếu bạn muốn "3/4" mà nó nhận là 0.75 thì lại là chuyện hoàn toàn khác so với yêu cầu ^^

 

P/S : xem Ars đá Barca thô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

tôi sử dụng thì gặp lỗi sau:

Command: locso

Select object: ; error: misplaced dot on input

Mong các bạn xem lại giúp. Thanks

 

Bạn sửa như sau:

(defun c:locso()
 (setq te (car (entsel))
text (cdr (assoc 1 (entget te)))
sl (strlen text)
kq ""
i 1)
 (while (< i sl)
   (setq so (substr text i 1))
   (if (/= so ".")
     (progn
   (if (numberp (read so))
     (setq kq (strcat kq so))
     )
     )
     (setq kq (strcat kq so))
     )
   (setq i (1+ i))
   )
 kq
 )

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 sử dụng thì gặp lỗi sau:

Command: locso

Select object: ; error: misplaced dot on input

Mong các bạn xem lại giúp. Thanks

Mình đã test Ok có bị làm sao đâu nhỉ..

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 Tú : e thử test thấy 2 đoạn e với bác mần cho kquả khác thực tế ở mã unicode, do nếu để tiếng Việt thì CAD sẽ tách từ đó ra những ký tự nhỏ, e phải đi mần, chưa sửa được, bác thử xem sao ^^

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

Thanks ketxu và bác tú đã giải quyết xong.

@bác tú lisp của bác có lỗi là khi chọn text thì vd: 220=> ra kq:22 và 0.8=> 0. và chọn text kết quả "Chiếu sáng lộ 10" ra kq "0051" chắc là do text có tiếng việt.

Cái nữa em muốn hỏi là hàm in kết quả ra ấy, mình muốn thay vì mặc định in một kết quả thì in 2 or 3 kết quả trên 1 dòng lệnh được không ạ.

VD:

Chieu dai cua doi tuong lan luot la xm ym (với x, y là biến)

Bình thường em chỉ in được 1 hàng em dùng lệnh như sau:

(princ "\n Chieu dai cua doi tuong la: ")

(princ x)

(princ "m")

Nhưng in thêm ym vào dòng đó thì chưa biết ntn?

Mong mọi người chỉ giáo?

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ái nữa em muốn hỏi là hàm in kết quả ra ấy, mình muốn thay vì mặc định in một kết quả thì in 2 or 3 kết quả trên 1 dòng lệnh được không ạ.

VD:

Chieu dai cua doi tuong lan luot la xm ym (với x, y là biến)

Bình thường em chỉ in được 1 hàng em dùng lệnh như sau:

(princ "\n Chieu dai cua doi tuong la: ")

(princ x)

(princ "m")

Nhưng in thêm ym vào dòng đó thì chưa biết ntn?

Mong mọi người chỉ giáo?

Bạn có thể dùng như sau

(setq txt (strcat "chieu dai doi tuong la: " x "m " y "m"))

(princ txt)

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

Thanks ketxu và bác tú đã giải quyết xong.

@bác tú lisp của bác có lỗi là khi chọn text thì vd: 220=> ra kq:22 và 0.8=> 0. và chọn text kết quả "Chiếu sáng lộ 10" ra kq "0051" chắc là do text có tiếng việt.

Cái nữa em muốn hỏi là hàm in kết quả ra ấy, mình muốn thay vì mặc định in một kết quả thì in 2 or 3 kết quả trên 1 dòng lệnh được không ạ.

VD:

Chieu dai cua doi tuong lan luot la xm ym (với x, y là biến)

Bình thường em chỉ in được 1 hàng em dùng lệnh như sau:

(princ "\n Chieu dai cua doi tuong la: ")

(princ x)

(princ "m")

Nhưng in thêm ym vào dòng đó thì chưa biết ntn?

Mong mọi người chỉ giáo?

1./ Bạn có thể upload file lên đây, mới biết lỗi ở đâu được chứ?

2./ Bạn có thể sử dụng hàm strcat để nối chuỗi, như trên thì mình có thể hiểu x, y là biến thuộc kiểu STRING. Các đối số trong hàm strcat thuộc kiểu STRING. Nó có tác dụng nối chuỗi lại với nhau.

Bạn sử dụng cái này xem :

(princ (Strcat "\n Chieu dai cua doi tuong la: " x "m " y " 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

Mình dùng cái strca thì lại bị lỗi :wacko: hj mò mẫm mà chưa tìm ra lỗi này

Mình up code mình viết lên đây:

 

(defun c:cali ()

(setvar "CMDECHO" 0)

(setq csdl (list 1 2 3 4 6 10 16 20 25 32 40 50 63 80 100 125 160 200 250 300 400 500 630 800 1000 1250))

(setq csd (list 1 2 3 4 6 10 16 20 25 32 40 50 63))

(setq s (atof (vl-list->string (vl-remove-if '(lambda(x) (or (< x 46) (> x 57))) (vl-string->list (cdr(assoc 1 (entget(car(entsel "\n Chon text : "))))))))))

(setq cosfi (getreal "\nCho cosfi cua lo dien (0.7): "))

(if (null cosfi)(setq cosfi 0.7))

(initget 1 "3 1")

(setq as(getkword "\nTinh toan cong suat <3 1>"))

(if (= as "3")

(progn

(setq i (/ s (* 1.732 0.38 cosfi 1000)))

(setq a i)

(setq kq (mapcar '(lambda (x) (if (< (- a x) 0) x)) csdl))

(setq kq (vl-remove nil kq))

)

(setq k (rtos a 2 3))

(princ (strcat "\n Dong dien tinh toan cua lo: " k "A"))

(setq k1 (car kq))

(setq k2 (cadr kq))

(setq kq1 (rtos k1 2 3))

(setq kq2 (rtos k2 2 3))

(princ (strcat "\nMCCB tinh toan cua lo: " kq1 "A" kq2 "A"))

)

(if (= as "1")

(progn

(setq i (/ s (* 0.22 cosfi 1000)))

(setq a i)

(setq kq (mapcar '(lambda (x) (if (< (- a x) 0) x)) csdl))

(setq kq (vl-remove nil kq))

)

(princ (strcat "\n Dong dien tinh toan cua lo: " (rtos a 2 3) "A"))

(setq kq1 (rtos (car kq) 2 0))

(setq kq2 (rtos (cadr kq) 2 0))

(princ "A")

(princ (strcat "\n MCB tinh toan cua lo: " kq1 "A" "OR" kq2 "A"))

(princ)

)

)

Kiểm tra hộ mình với, mình muốn nó hiện lên giá trị của kết quả 1 và 2

VD: MCB tinh toan cua lo 20A OR 30A

mình đang còn vấn đề nữa là khoảng trắng giữa "20A" và "OR" và "30A" làm thế nào đây.

Thanks

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 dùng cái strca thì lại bị lỗi :wacko: hj mò mẫm mà chưa tìm ra lỗi này

Mình up code mình viết lên đây:

 

(defun c:cali ()

(setvar "CMDECHO" 0)

(setq csdl (list 1 2 3 4 6 10 16 20 25 32 40 50 63 80 100 125 160 200 250 300 400 500 630 800 1000 1250))

(setq csd (list 1 2 3 4 6 10 16 20 25 32 40 50 63))

(setq s (atof (vl-list->string (vl-remove-if '(lambda(x) (or (< x 46) (> x 57))) (vl-string->list (cdr(assoc 1 (entget(car(entsel "\n Chon text : "))))))))))

(setq cosfi (getreal "\nCho cosfi cua lo dien (0.7): "))

(if (null cosfi)(setq cosfi 0.7))

(initget 1 "3 1")

(setq as(getkword "\nTinh toan cong suat <3 1>"))

(if (= as "3")

(progn

(setq i (/ s (* 1.732 0.38 cosfi 1000)))

(setq a i)

(setq kq (mapcar '(lambda (x) (if (< (- a x) 0) x)) csdl))

(setq kq (vl-remove nil kq))

)

(setq k (rtos a 2 3))

(princ (strcat "\n Dong dien tinh toan cua lo: " k "A"))

(setq k1 (car kq))

(setq k2 (cadr kq))

(setq kq1 (rtos k1 2 3))

(setq kq2 (rtos k2 2 3))

(princ (strcat "\nMCCB tinh toan cua lo: " kq1 "A" kq2 "A"))

)

(if (= as "1")

(progn

(setq i (/ s (* 0.22 cosfi 1000)))

(setq a i)

(setq kq (mapcar '(lambda (x) (if (< (- a x) 0) x)) csdl))

(setq kq (vl-remove nil kq))

)

(princ (strcat "\n Dong dien tinh toan cua lo: " (rtos a 2 3) "A"))

(setq kq1 (rtos (car kq) 2 0))

(setq kq2 (rtos (cadr kq) 2 0))

(princ "A")

(princ (strcat "\n MCB tinh toan cua lo: " kq1 "A" "OR" kq2 "A"))

(princ)

)

)

Kiểm tra hộ mình với, mình muốn nó hiện lên giá trị của kết quả 1 và 2

VD: MCB tinh toan cua lo 20A OR 30A

mình đang còn vấn đề nữa là khoảng trắng giữa "20A" và "OR" và "30A" làm thế nào đây.

Thanks

Code của bạn sai 2 chỗ đặt (progn Bạn kiểm tra lại. Sửa lại là chạy oke cho kết quả đúng như bạn muố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

Hj cảm ơn bác em đã sửa chuẩn rồi.

Nhưng còn vấn đề tạo khoảng trắng như trên em hỏi:

VD: em muốn kết quả trả về (MCB cua lo la 20A OR 30A).

Mà kết quả lisp của em luôn là (MCB cua lo la 20A30A.)

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

Hj cảm ơn bác em đã sửa chuẩn rồi.

Nhưng còn vấn đề tạo khoảng trắng như trên em hỏi:

VD: em muốn kết quả trả về (MCB cua lo la 20A OR 30A).

Mà kết quả lisp của em luôn là (MCB cua lo la 20A30A.)

Bạn sửa dòng này thành (princ (strcat "\n MCB tinh toan cua lo: " kq1 "A" " OR " kq2 "A"))

thêm dấu cách vào trong ""

BS: chuyển getkword thành getstring.

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

×