Đến nội dung


Hình ảnh
- - - - -

Lisp nhân thêm hệ số K vào Text ???????????


  • Please log in to reply
16 replies to this topic

#1 hhhhgggg

hhhhgggg

    biết dimedit

  • Members
  • PipPipPipPipPip
  • 393 Bài viết
Điểm đánh giá: 30 (tàm tạm)

Đã gửi 01 December 2008 - 05:09 PM

Các bác PRO sửa giúp em đoạn mã này để Lisp nhân thêm hệ số K vào TEXT sẽ cho ra kết quả có độ chính xác sau dấu phẩy
là 2 chữ số với. Có nghĩa là kết quả sẽ có dạng KQ,00 ví dụ 5.26 ; 6,00 ( độ chính xác 2 dấu phẩy )

(defun c:k() (setvar "CMDECHO" 0)
(command "luprec" pre)
(SETQ TH (SSGET))
(setq co (getreal "\n nhan them he so k=:"))
(SETQ QUANT (SSLENGTH TH))
(SETQ INDEX 0)
(WHILE (< INDEX QUANT)
(IF
(AND (= "TEXT" (CDR (ASSOC 0 (SETQ A (ENTGET (SSNAME TH INDEX)))))))
(PROGN
(setq s (entget (SSNAME TH INDEX)))
(setq otext (assoc 1 s))
(setq ot (cdr otext))
(setq ot (read (substr ot 1 )))
(setq nt (cons 1 (rtos (* ot co))))
(setq s (subst nt otext s))
(entmod s)
)
)
(setq index (+ index 1))
)
(command "luprec" "2")
)
  • 0
Hoàng Giang

#2 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 02 December 2008 - 11:15 AM

Các bác PRO sửa giúp em đoạn mã này để Lisp nhân thêm hệ số K vào TEXT sẽ cho ra kết quả có độ chính xác sau dấu phẩy
là 2 chữ số với. Có nghĩa là kết quả sẽ có dạng KQ,00 ví dụ 5.26 ; 6,00 ( độ chính xác 2 dấu phẩy )

Bạn dùng hàm round sau đây. Ví dụ: (round 12.344 1) -> 12.3; (round 12.344 2) -> 12.34; (round 12.345 2) -> 12.35

(defun round(x i / j)
(setq j (expt 10 i))
(/ (float (fix (+ 0.5 (* x j)))) j)
)

Hy vọng bạn sẽ tự xử lý được.

Lưu ý thêm: trong code của bạn, các đoạn (command "luprec" ...) không có tác dụng gì cả!
  • 0

#3 hhhhgggg

hhhhgggg

    biết dimedit

  • Members
  • PipPipPipPipPip
  • 393 Bài viết
Điểm đánh giá: 30 (tàm tạm)

Đã gửi 02 December 2008 - 02:04 PM

Bạn dùng hàm round sau đây. Ví dụ: (round 12.344 1) -> 12.3; (round 12.344 2) -> 12.34; (round 12.345 2) -> 12.35

(defun round(x i / j)
(setq j (expt 10 i))
(/ (float (fix (+ 0.5 (* x j)))) j)
)

Hy vọng bạn sẽ tự xử lý được.

Lưu ý thêm: trong code của bạn, các đoạn (command "luprec" ...) không có tác dụng gì cả!

Hàm Round của bác SSG ko chạy được, Với lại nếu có chạy được thì cũng mất thời gian quá !!!!! Bác Pro nào sửa đoạn CODE kia giúp em với !
  • 0
Hoàng Giang

#4 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 02 December 2008 - 03:56 PM

Hàm Round của bác SSG ko chạy được, Với lại nếu có chạy được thì cũng mất thời gian quá !!!!! Bác Pro nào sửa đoạn CODE kia giúp em với !

Hàm round vẫn chạy tốt, và cũng không mất thời gian! Bạn thử với lisp sau xem, trong đó có sử dụng hàm round. Tên lệnh NK:


;;;-------------------------------------------------------
(defun round(x i / j)
(setq j (expt 10 i))
(/ (float (fix (+ 0.5 (* x j)))) j)
)
;;;-------------------------------------------------------
(defun C:NK( / ss k e d v1 v2)
(setq
ss (ssget '((0 . "TEXT")))
k (getreal "\nNhan voi he so k = ")
)
(while (setq e (ssname ss 0))
(setq
d (entget e)
v1 (atof (cdr (assoc 1 d)))
v2 (round (* k v1) 2)
d (subst (cons 1 (rtos v2)) (assoc 1 d) d)
)
(entmod d)
(ssdel e ss)
)
(princ)
)
;;;-------------------------------------------------------


Có lẽ có một sự hiểu lầm, ssg đã nghĩ rằng đoạn lisp bạn post là của bạn viết ra. Đã viết được như vậy đương nhiên sẽ biết cách đưa hàm round vào chương trình. Ssg không làm đến nơi đến chốn không phải vì... lười biếng mà có ý khuyến khích tất cả các bạn tự lập trình cho mình. Nếu có vướng mắc, ssg cũng như các bạn đã tương đối thành thạo Lisp trên diễn đàn sẽ trợ giúp.
Nếu bạn thật sự chưa biết về lập trình lisp, khi có nhu cầu, cứ nêu yêu cầu bạn muốn hơn là post lên một đoạn lisp của ai đó không biết, không đúng ý bạn. Xin nói rõ hơn để bạn hiểu: lập một chương trình mới tốn chừng 1/5 đến 1/10 thời gian dò và sửa một chương trình có sẵn bị lỗi hoặc hoạt động không đúng ý user!
  • 0

#5 hhhhgggg

hhhhgggg

    biết dimedit

  • Members
  • PipPipPipPipPip
  • 393 Bài viết
Điểm đánh giá: 30 (tàm tạm)

Đã gửi 02 December 2008 - 05:26 PM

Hàm round vẫn chạy tốt, và cũng không mất thời gian! Bạn thử với lisp sau xem, trong đó có sử dụng hàm round. Tên lệnh NK:


;;;-------------------------------------------------------
(defun round(x i / j)
(setq j (expt 10 i))
(/ (float (fix (+ 0.5 (* x j)))) j)
)
;;;-------------------------------------------------------
(defun C:NK( / ss k e d v1 v2)
(setq
ss (ssget '((0 . "TEXT")))
k (getreal "\nNhan voi he so k = ")
)
(while (setq e (ssname ss 0))
(setq
d (entget e)
v1 (atof (cdr (assoc 1 d)))
v2 (round (* k v1) 2)
d (subst (cons 1 (rtos v2)) (assoc 1 d) d)
)
(entmod d)
(ssdel e ss)
)
(princ)
)
;;;-------------------------------------------------------


Có lẽ có một sự hiểu lầm, ssg đã nghĩ rằng đoạn lisp bạn post là của bạn viết ra. Đã viết được như vậy đương nhiên sẽ biết cách đưa hàm round vào chương trình. Ssg không làm đến nơi đến chốn không phải vì... lười biếng mà có ý khuyến khích tất cả các bạn tự lập trình cho mình. Nếu có vướng mắc, ssg cũng như các bạn đã tương đối thành thạo Lisp trên diễn đàn sẽ trợ giúp.
Nếu bạn thật sự chưa biết về lập trình lisp, khi có nhu cầu, cứ nêu yêu cầu bạn muốn hơn là post lên một đoạn lisp của ai đó không biết, không đúng ý bạn. Xin nói rõ hơn để bạn hiểu: lập một chương trình mới tốn chừng 1/5 đến 1/10 thời gian dò và sửa một chương trình có sẵn bị lỗi hoặc hoạt động không đúng ý user!

Lisp của bác SSG chạy lỗi trong trường hợp hệ số k=0 và nó chưa có thể định dạng phía sau dấu phẩy hai chữ số ( cho kết quả bằng 0 chứ ko phải 0.00 , hoặc khi Text = 5 nhân thêm k=2 vào nó cho kết quả = 10 chứ ko phải 10,00 ) mong bác sửa giúp em được ko ? Vì em không biết viết Lisp. Cảm ơn bác nhìu nhé !!!!!!!!
  • 0
Hoàng Giang

#6 meohoang

meohoang

    biết lệnh adcenter

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

Đã gửi 03 December 2008 - 07:02 AM

Lisp của bác SSG chạy lỗi trong trường hợp hệ số k=0 và nó chưa có thể định dạng phía sau dấu phẩy hai chữ số ( cho kết quả bằng 0 chứ ko phải 0.00 , hoặc khi Text = 5 nhân thêm k=2 vào nó cho kết quả = 10 chứ ko phải 10,00 ) mong bác sửa giúp em được ko ? Vì em không biết viết Lisp. Cảm ơn bác nhìu nhé !!!!!!!!

Lisp này bác SSG viết chuẩn rùi bạn thao tác sai ấy chứ. Bác dùng lệnh UNIT đế đặt chữ số có 2 số lẻ thui nhé
  • 0

#7 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 03 December 2008 - 07:24 AM

Lisp này bác SSG viết chuẩn rùi bạn thao tác sai ấy chứ. Bác dùng lệnh UNIT đế đặt chữ số có 2 số lẻ thui nhé

Sử dụng lệnh Units không được bạn meohoang ạ.

Lisp của bác SSG chỉ đúng khi số có số lẻ thập phân lớn hơn 2, còn số có số lẻ thập phân nhỏ hơn 2 thì không được.

Ví dụ : 16.92678 x3 = 50.78 -> Kết quả đồng ý.

16.9 x3 = 50.7 -> Chưa đạt kết quả mong muốn là 50.70

16x3 = 48 -> Chưa đạt kết quả mong muốn là 48.00

Còn nữa , nếu số có số lẻ thập phân lớn hơn 2 nhưng khi nhân với một số k cho được một kết quả có số lẻ thập phân nhỏ hơn 2 thì cũng không được
Ví dụ : 20.4333 x 3 = 61.3 -> Chưa đạt kết quả mong muốn là 61.30

Mong bác Ssg bỏ chút thời gian chỉnh sửa lại một chút đoạn Code trên cho hoàn thiện.
Cảm ơn bác SSG nhiều lắm.
  • 0

#8 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 03 December 2008 - 08:26 AM

Xin nói rõ hơn để bạn hiểu: lập một chương trình mới tốn chừng 1/5 đến 1/10 thời gian dò và sửa một chương trình có sẵn bị lỗi hoặc hoạt động không đúng ý user!


Tổng hợp code của SSG và hhhhgggg đưa lên.
Có xét đến t/hợp nội dung Text là số (nguyên, thập phân)
(defun C:NK( / ss tmpk e d v1 v2)
(setq ss (ssget '((0 . "TEXT")))
tmpk (getreal (strcat "\nHay vao he so k: <" (if k (rtos k) "") ">"))
k (if tmpk tmpk k)
)
(while (setq e (ssname ss 0))
(setq d (entget e)
v1 (cdr (assoc 1 d))
)
(if (and (IsNumeric v1) k)
(progn
(setq v2 (rtos (* k (atof v1)) 2 2)
d (subst (cons 1 v2) (assoc 1 d) d)
)
(entmod d)
)
)
(ssdel e ss)
)
(princ)
)
(defun IsNumeric (str) ; neu gia tri la so (thap phan, nguyen)
(if (not(vl-string-search " " str))
(if (member (type (read str)) '(REAL INT) )
T
nil
)
nil
)
)

  • 0

#9 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 03 December 2008 - 09:16 AM

Sử dụng lệnh Units không được bạn meohoang ạ.

Lisp của bác SSG chỉ đúng khi số có số lẻ thập phân lớn hơn 2, còn số có số lẻ thập phân nhỏ hơn 2 thì không được.

Ví dụ : 16.92678 x3 = 50.78 -> Kết quả đồng ý.

16.9 x3 = 50.7 -> Chưa đạt kết quả mong muốn là 50.70

16x3 = 48 -> Chưa đạt kết quả mong muốn là 48.00

Còn nữa , nếu số có số lẻ thập phân lớn hơn 2 nhưng khi nhân với một số k cho được một kết quả có số lẻ thập phân nhỏ hơn 2 thì cũng không được
Ví dụ : 20.4333 x 3 = 61.3 -> Chưa đạt kết quả mong muốn là 61.30

Mong bác Ssg bỏ chút thời gian chỉnh sửa lại một chút đoạn Code trên cho hoàn thiện.
Cảm ơn bác SSG nhiều lắm.


Mình nghỉ làm được như hàm round của bác ssg mới khó chứ muốn lúc nào sau dấu phẩy cũng là 2 chử số thì chỉ cần dùng hàm rtos là được mà.
(setq ketqua (rtos dauvao 2 2))
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#10 hhhhgggg

hhhhgggg

    biết dimedit

  • Members
  • PipPipPipPipPip
  • 393 Bài viết
Điểm đánh giá: 30 (tàm tạm)

Đã gửi 03 December 2008 - 10:33 AM

Mình nghỉ làm được như hàm round của bác ssg mới khó chứ muốn lúc nào sau dấu phẩy cũng là 2 chử số thì chỉ cần dùng hàm rtos là được mà.
(setq ketqua (rtos dauvao 2 2))

Bạn Duy dùng lệnh Rtos đó ko được, đâu có đơn giản như vậy ???
  • 0
Hoàng Giang

#11 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 03 December 2008 - 10:40 AM

Hy vọng lần này đúng ý các bạn. Chương trình chấp nhận các đối tượng là TEXT lẫn MTEXT:


;;;-------------------------------------------------------
(defun etype (e) ;;;Entity Type
(cdr (assoc 0 (entget e)))
)
;;;-------------------------------------------------------
(defun rnd(x) ;;;Round x, return INT
(if (>= x 0) (fix (+ x 0.5)) (fix (- x 0.5)))
)
;;;-------------------------------------------------------
(defun round2(x / S i j S1 S2)
(setq S (itoa (rnd (* (abs x) 100))))
(if (= (strlen S) 1) (setq S (strcat "00" S)))
(if (= (strlen S) 2) (setq S (strcat "0" S)))
(setq
i (strlen S)
j (- i 2)
S1 (substr S 1 j)
S2 (substr S (1+ j) 2)
)
(if (>= x 0) (strcat S1 "." S2) (strcat "-" S1 "." S2))
)
;;;-------------------------------------------------------
(defun C:NK( / ss k i e d v S)
(setq
ss (ssget '((0 . "TEXT,MTEXT")))
k (getreal "\nNhan voi he so k = ")
i 0
)
(repeat (sslength ss)
(setq e (ssname ss i))
(if (= (etype e) "MTEXT") (progn
(command "explode" e "")
(setq e (entlast))
))
(setq
d (entget e)
v (* (atof (cdr (assoc 1 d))) k)
S (round2 v)
d (subst (cons 1 S) (assoc 1 d) d)
)
(entmod d)
(setq i (1+ i))
)
(princ)
)
;;;-------------------------------------------------------



@duy782006: không được bạn ơi! Ví dụ:
Command: (rtos 1.0023 2 2)
return "1" -> không đúng ý các bạn ấy!


@giabach:
1. Dùng rtos không giải quyết triệt để được như đã nói trên.
2. Bạn thêm Isnumeric thì tốt thôi, nhưng liệu có cần đến mức ấy không? Dù sao, user cũng phải tự chịu trách nhiệm về những gì mình làm chứ?
  • 0

#12 hhhhgggg

hhhhgggg

    biết dimedit

  • Members
  • PipPipPipPipPip
  • 393 Bài viết
Điểm đánh giá: 30 (tàm tạm)

Đã gửi 03 December 2008 - 10:53 AM

Hy vọng lần này đúng ý các bạn. Chương trình chấp nhận các đối tượng là TEXT lẫn MTEXT:


;;;-------------------------------------------------------
(defun etype (e) ;;;Entity Type
(cdr (assoc 0 (entget e)))
)
;;;-------------------------------------------------------
(defun rnd(x) ;;;Round x, return INT
(if (>= x 0) (fix (+ x 0.5)) (fix (- x 0.5)))
)
;;;-------------------------------------------------------
(defun round2(x / S i j S1 S2)
(setq S (itoa (rnd (* (abs x) 100))))
(if (= (strlen S) 1) (setq S (strcat "00" S)))
(if (= (strlen S) 2) (setq S (strcat "0" S)))
(setq
i (strlen S)
j (- i 2)
S1 (substr S 1 j)
S2 (substr S (1+ j) 2)
)
(if (>= x 0) (strcat S1 "." S2) (strcat "-" S1 "." S2))
)
;;;-------------------------------------------------------
(defun C:NK( / ss k i e d v S)
(setq
ss (ssget '((0 . "TEXT,MTEXT")))
k (getreal "\nNhan voi he so k = ")
i 0
)
(repeat (sslength ss)
(setq e (ssname ss i))
(if (= (etype e) "MTEXT") (progn
(command "explode" e "")
(setq e (entlast))
))
(setq
d (entget e)
v (* (atof (cdr (assoc 1 d))) k)
S (round2 v)
d (subst (cons 1 S) (assoc 1 d) d)
)
(entmod d)
(setq i (1+ i))
)
(princ)
)
;;;-------------------------------------------------------

@duy782006: không được bạn ơi! Ví dụ:
Command: (rtos 1.0023 2 2)
return "1" -> không đúng ý các bạn ấy!
@giabach:
1. Dùng rtos không giải quyết triệt để được như đã nói trên.
2. Bạn thêm Isnumeric thì tốt thôi, nhưng liệu có cần đến mức ấy không? Dù sao, user cũng phải tự chịu trách nhiệm về những gì mình làm chứ?

Okk !!! Bác SSG đã giải quyết được vấn đề rùi. Cảm ơn bác đã nhiệt tình giúp đỡ !!!!!!!
  • 0
Hoàng Giang

#13 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 03 December 2008 - 11:06 AM

@duy782006: không được bạn ơi! Ví dụ:
Command: (rtos 1.0023 2 2)
return "1" -> không đúng ý các bạn ấy!

KHông hiểu SSG nói thế nào chứ: Đây là kết quả của mình.
Command: (rtos 1.0032 2 2)
"1.00"

  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#14 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 03 December 2008 - 12:51 PM

KHông hiểu SSG nói thế nào chứ: Đây là kết quả của mình.
Command: (rtos 1.0032 2 2)
"1.00"


Giá trị trả về của RTOS phụ thuộc các biến hệ thống : UNITMODE, DIMZIN, LUNITS và LUPREC.
HELP : The rtos function returns a string that is the representation of number according to the settings of mode, precision, and the system variables UNITMODE, DIMZIN, LUNITS, and LUPREC.
  • 0

#15 meohoang

meohoang

    biết lệnh adcenter

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

Đã gửi 03 December 2008 - 01:17 PM

KHông hiểu SSG nói thế nào chứ: Đây là kết quả của mình.
Command: (rtos 1.0032 2 2)
"1.00"

Đúng rùi vì bác đặt biến DIMZIN = 0 , nếu đặt = 8 thì hàm trên có trị "1" như SSG nói
  • 0

#16 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 03 December 2008 - 01:38 PM

Giá trị trả về của RTOS phụ thuộc các biến hệ thống : UNITMODE, DIMZIN, LUNITS và LUPREC.
HELP : The rtos function returns a string that is the representation of number according to the settings of mode, precision, and the system variables UNITMODE, DIMZIN, LUNITS, and LUPREC.

Chính xác! Ssg cũng đã nhận ra điều đó sau khi đọc reply của bạn duy782006, và cũng không ngờ nó lôi thôi đến như vậy! Trong các System Variables trên, DIMZIN ảnh hưởng trực tiếp đến yêu cầu chúng ta đang xét. Các bạn thử gõ DIMZIN, nhập 8 rồi thử (rtos 5 2 2) xem sẽ thấy return "5".
Xem ra thì cái lisp cuối cùng của ssg, mặc dù có vẻ hơi dài dòng, nhưng có lẽ chạy đúng trong mọi trưởng hợp vì nó chẳng bị ảnh hưởng bởi mấy cái System Var kể trên.

Một hướng khả dĩ là vẫn dùng (rtos value 2 2) như bạn duy782006 và bạn gia_bach, nhưng phải xử lý các System Var cho phù hợp (tương tự như cách chúng ta thường làm với "osmode")

Ví dụ:
...
(setq olddimzin (getvar "dimzin"))
(setvar "dimzin" 1)
...
(setvar "dimzin" olddimzin)
...
  • 0

#17 thinhtutn

thinhtutn

    biết zoom

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

Đã gửi 17 October 2012 - 10:05 AM

Các bác có thể thêm phần chọn text ghi kết quả không
  • 0