Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
hhhhgggg

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

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

hhhhgggg    30

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

)

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
ssg    1.088
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ả!

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
hhhhgggg    30
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 !

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
ssg    1.088
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!

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
hhhhgggg    30
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é !!!!!!!!

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
meohoang    342
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é

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
Tue_NV    3.841
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.

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

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

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
hhhhgggg    30
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 ???

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
ssg    1.088

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ứ?

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
hhhhgggg    30
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 đỡ !!!!!!!

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
duy782006    1.374
@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"

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
gia_bach    1.442
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.

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
meohoang    342
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

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

...

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  

×