Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
19 replies to this topic

#1 duyhung

duyhung

    biết vẽ rectang

  • Members
  • PipPip
  • 88 Bài viết
Điểm đánh giá: 9 (bình thường)

Đã gửi 08 March 2011 - 03:05 PM

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? :)
  • 0
Song va chien dau!

#2 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1431 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 08 March 2011 - 03:10 PM

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

#3 duyhung

duyhung

    biết vẽ rectang

  • Members
  • PipPip
  • 88 Bài viết
Điểm đánh giá: 9 (bình thường)

Đã gửi 08 March 2011 - 03:42 PM

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 ^^!
  • 0
Song va chien dau!

#4 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 08 March 2011 - 07:44 PM

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
)

  • 1
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#5 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 08 March 2011 - 10:56 PM

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


  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#6 duyhung

duyhung

    biết vẽ rectang

  • Members
  • PipPip
  • 88 Bài viết
Điểm đánh giá: 9 (bình thường)

Đã gửi 08 March 2011 - 11:18 PM

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
  • 0
Song va chien dau!

#7 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 09 March 2011 - 12:45 AM

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
)

  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#8 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 09 March 2011 - 03:18 AM

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

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#9 vbao

vbao

    biết lệnh array

  • CADViet Team
  • PipPipPip
  • 184 Bài viết
Điểm đánh giá: 80 (tàm tạm)

Đã gửi 09 March 2011 - 04:04 AM

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
)


  • 0

#10 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 09 March 2011 - 08:17 AM

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ỉ..
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#11 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 09 March 2011 - 08:30 AM

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

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#12 duyhung

duyhung

    biết vẽ rectang

  • Members
  • PipPip
  • 88 Bài viết
Điểm đánh giá: 9 (bình thường)

Đã gửi 09 March 2011 - 09:04 AM

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?
  • 0
Song va chien dau!

#13 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 09 March 2011 - 09:34 AM

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)
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#14 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 09 March 2011 - 09:39 AM

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

#15 duyhung

duyhung

    biết vẽ rectang

  • Members
  • PipPip
  • 88 Bài viết
Điểm đánh giá: 9 (bình thường)

Đã gửi 09 March 2011 - 11:02 AM

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
  • 0
Song va chien dau!

#16 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 09 March 2011 - 11:19 AM

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.
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#17 duyhung

duyhung

    biết vẽ rectang

  • Members
  • PipPip
  • 88 Bài viết
Điểm đánh giá: 9 (bình thường)

Đã gửi 09 March 2011 - 11:26 AM

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.)
  • 0
Song va chien dau!

#18 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 09 March 2011 - 11:39 AM

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.
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#19 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 09 March 2011 - 11:40 AM

^^ Ở hàm strcat bạn thêm khoảng trắng vào trước và sau chữ OR ^^
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#20 duyhung

duyhung

    biết vẽ rectang

  • Members
  • PipPip
  • 88 Bài viết
Điểm đánh giá: 9 (bình thường)

Đã gửi 09 March 2011 - 11:57 AM

Ok thanks vậy mà mình cứ backspace mãi mà không được phải thêm (" ").
hj vấn đề em đã giải quyết đc nên del đi!
  • 0
Song va chien dau!