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

Lisp làm tròn số ( là Text) trong CAD ???????

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

Các bác à, em muốn có 1 lisp làm tròn số trong CAD, đề bài : Có các text là các số từ trước, bây giờ em muốn làm tròn các text đó ( lấy sau dấu phẩy x ký tự mình nhập vào ) . Bác Pro nào viết cho em đ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
Các bác à, em muốn có 1 lisp làm tròn số trong CAD, đề bài : Có các text là các số từ trước, bây giờ em muốn làm tròn các text đó ( lấy sau dấu phẩy x ký tự mình nhập vào ) . Bác Pro nào viết cho em đi ?

Cái này mình cũng đang quan tâm, bác nào biết Lisp thì viết cho mọi người đ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
Cái này mình cũng đang quan tâm, bác nào biết Lisp thì viết cho mọi người đi !

 

 

bạn gõ UN vao Precision chọn 0.00 hoặc bao nhiêu tùy bạ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

Bạn vào Dimension style chỉnh trong Modify rồi chỉnh Primany unit /Precision = 0.0.........(tuỳ)

=0 làm tròn xoe :cheers:

[/quote¦

 

Trời ạ ! Ở đây là các Text có sẵn từ trước rùi cơ mà, làm sao các cách thiết đặt có thể thay đổi được. Các các đó của các bác chỉ áp dụng cho bản vẽ mình làm ra từ đầu thôi, còn các bản vẽ do người khác làm mình phải làm tiếp thì phải Dùng Lisp mới làm tròn được chứ ? Mong có bác Pro nào quan tâm viết 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
bạn gõ UN vao Precision chọn 0.00 hoặc bao nhiêu tùy bạn

 

Bạn vào Dimension style chỉnh trong Modify rồi chỉnh Primany unit /Precision = 0.0.........(tuỳ)

=0 làm tròn xoe :cheers:

 

-Cách của hai bạn không đáp ứng được câu hỏi đâu. Trước khi trả lời người ta thì nên thử trước đã.

 

@hhhggg

-Dùng lisp thì có mấy cái vướng:

+Dấu phân cách là dấu phẩy hay dấu chấm là tùy thuộc vào thiết lập của bạn nên có khi lisp đúng có khi không (khi đọc giá trị).

+Phân biệt text số và text chữ (vấn đề này bàn vài lẩn rồi nhưng mình vẫn chưa nắm vấn đề).

+Làm tròn thì dư bỏ bớt còn thiếu thì sao. Ví dụ 12 thì ra 12 hay ra 12,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
Bạn vào Dimension style chỉnh trong Modify rồi chỉnh Primany unit /Precision = 0.0.........(tuỳ)

=0 làm tròn xoe :cheers:

[/quote¦

 

Trời ạ ! Ở đây là các Text có sẵn từ trước rùi cơ mà, làm sao các cách thiết đặt có thể thay đổi được. Các các đó của các bác chỉ áp dụng cho bản vẽ mình làm ra từ đầu thôi, còn các bản vẽ do người khác làm mình phải làm tiếp thì phải Dùng Lisp mới làm tròn được chứ ? Mong có bác Pro nào quan tâm viết giúp !

chọn hết các đường kt rồi vào PROPERTIES chỉnh lạ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
chọn hết các đường kt rồi vào PROPERTIES chỉnh lại

Các bác phải phân biệt rõ, đây là text chứ ko phải Dim, như vậy làm sao chỉnh bằng Properties được ? Dấu ngăn cách hàng thập phân và chữ số ta dùng dâuc Chấm. Trong CAD hay Nova đều dùng dấu chấm mà. Và ta thống nhất là làm tròn sau dấu phẩy hai chữ số ! Tốt nhất là làm tròn với số chữ số sau dấu phẩy là do người dùng nhập và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ác bác phải phân biệt rõ, đây là text chứ ko phải Dim, như vậy làm sao chỉnh bằng Properties được ? Dấu ngăn cách hàng thập phân và chữ số ta dùng dâuc Chấm. Trong CAD hay Nova đều dùng dấu chấm mà. Và ta thống nhất là làm tròn sau dấu phẩy hai chữ số ! Tốt nhất là làm tròn với số chữ số sau dấu phẩy là do người dùng nhập vào ?

Ứng dụng hàm Round của bác SSG đã trả lời trong topic Lisp nhân thêm hệ số K vào Text. Mình đã phát triển nên đoạn Code này để làm tròn các Text sau các chữ số thập phân

;;;-------------------------------------------------------
;;;-------------------------------------------------------
(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 TP()
(setq thapphan 2);Ban co the thay doi so thap phan o dong nay
)

(defun round3(x / tue S i j S1 S3)

(setq tue (TP))

(setq S (itoa (rnd (* (abs x) (expt 10 tue)))))

(setq
i (strlen S)
j (- i tue)
S1 (substr S 1 j)
S3 (substr S (1+ j) tue)
)
(if (>= x 0) (strcat S1 "." S3) (strcat "-" S1 "." S3))
)
;;;-------------------------------------------------------
(defun C:Round( / ss k i e d v S)

(setq
ss (ssget '((0 . "TEXT,MTEXT")))
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)))
S (round3 v)
d (subst (cons 1 S) (assoc 1 d) d)
)
(entmod d)
(setq i (1+ i))
)
(princ)
)

 

Bạn có thể thay đổi số thập phân ở dòng này : (setq thapphan 2)

Đoạn Code này chưa được hoàn thiện lắm vì theo yêu cầu của người sử dụng là khi đánh số thập phân vào thì chương trình sẽ hiểu. Nhưng ở đây lại phải thay đổi số thập phân bằng cách vào file Lisp sửa lại dòng (setq thapphan 2) mới ra được kết quả như ý.

 

Mình đã thử thay câu (setq thapphan 2) bằng câu (setq thapphan (getint "\nSo chu so thap phan la :"))

Nhưng kết quả lại không theo như ý. Vì dưới tác dụng của vòng lặp Repeat cái câu nhắc "nSo chu so thap phan la :" được lặp lại cho đến Text cuối cùng. Điều này nó không theo được ý của người sử dụng.

 

Mong bác SSG và tất cả mọi người cùng góp ý để đoạn Code trên được hoàn thiện một cách trọn vẹn.

 

Chân thành cảm ơn tất cả mọi người. :cheers:

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ác bác à, em muốn có 1 lisp làm tròn số trong CAD, đề bài : Có các text là các số từ trước, bây giờ em muốn làm tròn các text đó ( lấy sau dấu phẩy x ký tự mình nhập vào ) . Bác Pro nào viết cho em đi ?

Bạn dùng lisp này thử xem. Lệnh LTT:

 

;;;-------------------------------------------------------
(defun etype (e) ;;;Entity Type
(cdr (assoc 0 (entget e)))
)
;;;-------------------------------------------------------
(defun C:LTT( / ss n i oldDimzin e d v S)
(if (not n0) (setq n0 2))
(setq
   ss (ssget '((0 . "TEXT,MTEXT")))
   n (getint (strcat "\nSo chu so thap phan <" (itoa n0) ">:"))
   i 0
   oldDimzin (getvar "dimzin")
)
(if n (setq n0 n) (setq n n0))
(setvar "dimzin" 1)
(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)))
       S (rtos v 2 n)
       d (subst (cons 1 S) (assoc 1 d) d)
   )
   (entmod d)
   (setq i (1+ i))
)
(setvar "dimzin" oldDimzin)
(princ)
)
;;;-------------------------------------------------------

 

 

@Tue_NV

Ssg đã xem lại vấn đề hôm nọ. Trong các system var liên quan, chỉ có dimzin ảnh hưởng trực tiếp, các "thằng" khác không thấy tác dụng gì khi dùng (rtos value 2 n). Có lẽ do số 2 đã xác định kiểu decimal. Nếu vậy, ta cứ "chơi" như trên đơn giản hơ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
Bạn dùng lisp này thử xem. Lệnh LTT:

 

;;;-------------------------------------------------------
(defun etype (e) ;;;Entity Type
(cdr (assoc 0 (entget e)))
)
;;;-------------------------------------------------------
(defun C:LTT( / ss n i oldDimzin e d v S)
(if (not n0) (setq n0 2))
(setq
   ss (ssget '((0 . "TEXT,MTEXT")))
   n (getint (strcat "\nSo chu so thap phan <" (itoa n0) ">:"))
   i 0
   oldDimzin (getvar "dimzin")
)
(if n (setq n0 n) (setq n n0))
(setvar "dimzin" 1)
(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)))
       S (rtos v 2 n)
       d (subst (cons 1 S) (assoc 1 d) d)
   )
   (entmod d)
   (setq i (1+ i))
)
(setvar "dimzin" oldDimzin)
(princ)
)
;;;-------------------------------------------------------

@Tue_NV

Ssg đã xem lại vấn đề hôm nọ. Trong các system var liên quan, chỉ có dimzin ảnh hưởng trực tiếp, các "thằng" khác không thấy tác dụng gì khi dùng (rtos value 2 n). Có lẽ do số 2 đã xác định kiểu decimal. Nếu vậy, ta cứ "chơi" như trên đơn giản hơn.

ok ! Cảm ơn bác SSG , lisp của bác chạy tốt lắm ! Diễn đàn của mình thật là tuyệt vời !

  • 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

Cho mình hỏi có thể sửa Lisp này thành dạng làm tròn đến 5, 10,...tùy chọn như trong Dim ko nhỉ ?

Thanks a lot

 

Bạn dùng lisp này thử xem. Lệnh LTT:

 

;;;-------------------------------------------------------
(defun etype (e) ;;;Entity Type
(cdr (assoc 0 (entget e)))
)
;;;-------------------------------------------------------
(defun C:LTT( / ss n i oldDimzin e d v S)
(if (not n0) (setq n0 2))
(setq
   ss (ssget '((0 . "TEXT,MTEXT")))
   n (getint (strcat "\nSo chu so thap phan <" (itoa n0) ">:"))
   i 0
   oldDimzin (getvar "dimzin")
)
(if n (setq n0 n) (setq n n0))
(setvar "dimzin" 1)
(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)))
       S (rtos v 2 n)
       d (subst (cons 1 S) (assoc 1 d) d)
   )
   (entmod d)
   (setq i (1+ i))
)
(setvar "dimzin" oldDimzin)
(princ)
)
;;;-------------------------------------------------------

@Tue_NV

Ssg đã xem lại vấn đề hôm nọ. Trong các system var liên quan, chỉ có dimzin ảnh hưởng trực tiếp, các "thằng" khác không thấy tác dụng gì khi dùng (rtos value 2 n). Có lẽ do số 2 đã xác định kiểu decimal. Nếu vậy, ta cứ "chơi" như trên đơn giản hơn.

  • 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
Cho mình hỏi có thể sửa Lisp này thành dạng làm tròn đến 5, 10,...tùy chọn như trong Dim ko nhỉ ?

Thanks a lot

Chưa hiểu ý bạn? Có thể nói rõ hơn không?

Lisp trên nhập vào số chữ số thập phân cần làm tròn 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
Chưa hiểu ý bạn? Có thể nói rõ hơn không?

Lisp trên nhập vào số chữ số thập phân cần làm tròn mà.

Theo mình hiểu thì ý bạn í thế này:

-Có số _______________________________________0.132456789

-Làm tròn với 5 chử số nó ra _____________________0.12345

-Làm tròn cái kết quả vừa rồi với 10 chử số nó ra ____0.1234567890

 

Đúng không bạn huycad?

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

Ko. Là thế này, VD có số 123.2

Làm tròn đến 2 có: 124

Làm tròn đến 5 có: 125

Làm tròn đến 10 có: 120

Cái này tương tự trong Dimstyle, dùng rất hữu ích.

 

Theo mình hiểu thì ý bạn í thế này:

-Có số _______________________________________0.132456789

-Làm tròn với 5 chử số nó ra _____________________0.12345

-Làm tròn cái kết quả vừa rồi với 10 chử số nó ra ____0.1234567890

 

Đúng không bạn huycad?

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

Xin admin và các cao thủ giúp thêm về vấn đề tròn số:

VD: số 0.34% thì kết qủa giữ nguyên = 0.34%

Nếu số 2.00% thì bỏ bớt số phía sau đi = 2%

Tôi phải chỉnh sửa rất nhiều bản vẽ như vậy. Rất mong được các bạn giúp đỡ cho. Cám ơn trướ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
Xin admin và các cao thủ giúp thêm về vấn đề tròn số:

VD: số 0.34% thì kết qủa giữ nguyên = 0.34%

Nếu số 2.00% thì bỏ bớt số phía sau đi = 2%

Tôi phải chỉnh sửa rất nhiều bản vẽ như vậy. Rất mong được các bạn giúp đỡ cho. Cám ơn trước!

Tue_NV vẫn chưa hiểu là trong bản vẽ của bạn vừa có cả số thập phân (0.34) và có cả số %(0.34) hay không?. Vì bạn chưa nói rõ

 

Thế này nhé :

Tue_NV sẽ lược bỏ theo ý của bạn : 0.34% -> thì kết qủa giữ nguyên = 0.34

Nếu số 2.00% thì bỏ bớt số phía sau đi = 2

 

Còn đuôi % thì bạn sử dụng Lisp thêm Text thêm vào vậy vì lí do :

 

Tue_NV vẫn chưa hiểu là trong bản vẽ của bạn vừa có cả số thập phân (0.34) và có cả số % (0.34%) hay không?

Vì bạn chưa nói rõ

 

Code này có chỉnh lại Lisp của bác ssg 1 chút :

;;;-------------------------------------------------------
(defun etype (e);;;Entity Type
(cdr (assoc 0 (entget e)))
)
;;;-------------------------------------------------------
(defun C:LTT( / ss n i oldDimzin e d v S)
(if (not n0) (setq n0 2))
(setq
ss (ssget '((0 . "TEXT,MTEXT")))
n (getint (strcat "\nSo chu so thap phan :"))
i 0
oldDimzin (getvar "dimzin")
)
(if n (setq n0 n) (setq n n0))
(setvar "dimzin" 8)
(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)))
S (rtos v 2 n)
d (subst (cons 1 S) (assoc 1 d) d)
)
(entmod d)
(setq i (1+ i))
)
(setvar "dimzin" oldDimzin)
(princ)
)

:s_big:

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
Em thử rồi bác ơi! không có tác dụng gì hết. Hu...hu... các bác giúp em chứ em mỏi mệt vì nó lắm rồi!

Bạn hãy upload file của bạn lên đây và nói rõ cái mà bạn muốn. Chứ viết ra không đúng ý của bạn thì mất thời giờ 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
Thì bác cứ thử cái lisp của bác đi nó đâu có tác dụng gì đâu mà bảo?

Xin lỗi bạn mình bị lỗi 1 chỗ và đã sửa lại. Bạn thử nhé :

 

Xin admin và các cao thủ giúp thêm về vấn đề tròn số:

VD: số 0.34% thì kết qủa giữ nguyên = 0.34%

Nếu số 2.00% thì bỏ bớt số phía sau đi = 2%

Tôi phải chỉnh sửa rất nhiều bản vẽ như vậy. Rất mong được các bạn giúp đỡ cho. Cám ơn trước!

Tue_NV vẫn chưa hiểu là trong bản vẽ của bạn vừa có cả số thập phân (0.34) và có cả số %(0.34%) hay không?. Vì bạn chưa nói rõ

 

Thế này nhé :

Tue_NV sẽ lược bỏ theo ý của bạn : 0.34% -> thì kết qủa giữ nguyên = 0.34

Nếu số 2.00% thì bỏ bớt số phía sau đi = 2

 

Còn đuôi % thì bạn sử dụng Lisp thêm Text thêm vào vậy vì lí do :

 

Tue_NV vẫn chưa hiểu là trong bản vẽ của bạn vừa có cả số thập phân (0.34) và có cả số % (0.34%) hay không?

Vì bạn chưa nói rõ

 

Code này có chỉnh lại Lisp của bác ssg 1 chút :

;;;-------------------------------------------------------
(defun etype (e);;;Entity Type
(cdr (assoc 0 (entget e)))
)
;;;-------------------------------------------------------
(defun C:LTT( / ss n i oldDimzin e d v S)
(if (not n0) (setq n0 2))
(setq
ss (ssget '((0 . "TEXT,MTEXT")))
n (getint (strcat "\nSo chu so thap phan :"))
i 0
oldDimzin (getvar "dimzin")
)
(if n (setq n0 n) (setq n n0))
(setvar "dimzin" 8)
(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)))
S (rtos v 2 n)
d (subst (cons 1 S) (assoc 1 d) d)
)
(entmod d)
(setq i (1+ i))
)
(setvar "dimzin" oldDimzin)
(princ)
)

:s_big:

  • Vote tăng 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

 

Bạn dùng lisp này thử xem. Lệnh LTT:

 

;;;-------------------------------------------------------(defun etype (e) ;;;Entity Type(cdr (assoc 0 (entget e))));;;-------------------------------------------------------(defun C:LTT( / ss n i oldDimzin e d v S)(if (not n0) (setq n0 2))(setq    ss (ssget '((0 . "TEXT,MTEXT")))    n (getint (strcat "\nSo chu so thap phan <" (itoa n0) ">:"))    i 0    oldDimzin (getvar "dimzin"))(if n (setq n0 n) (setq n n0))(setvar "dimzin" 1)(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)))        S (rtos v 2 n)        d (subst (cons 1 S) (assoc 1 d) d)    )    (entmod d)    (setq i (1+ i)))(setvar "dimzin" oldDimzin)(princ));;;-------------------------------------------------------

 

@Tue_NV

Ssg đã xem lại vấn đề hôm nọ. Trong các system var liên quan, chỉ có dimzin ảnh hưởng trực tiếp, các "thằng" khác không thấy tác dụng gì khi dùng (rtos value 2 n). Có lẽ do số 2 đã xác định kiểu decimal. Nếu vậy, ta cứ "chơi" như trên đơn giản hơn.

cái của bạn k dùng được bạ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

 

Tue_NV vẫn chưa hiểu là trong bản vẽ của bạn vừa có cả số thập phân (0.34) và có cả số %(0.34) hay không?. Vì bạn chưa nói rõ

 

Thế này nhé :

Tue_NV sẽ lược bỏ theo ý của bạn : 0.34% -> thì kết qủa giữ nguyên = 0.34

Nếu số 2.00% thì bỏ bớt số phía sau đi = 2

 

Còn đuôi % thì bạn sử dụng Lisp thêm Text thêm vào vậy vì lí do :

 

Tue_NV vẫn chưa hiểu là trong bản vẽ của bạn vừa có cả số thập phân (0.34) và có cả số % (0.34%) hay không?

Vì bạn chưa nói rõ

 

Code này có chỉnh lại Lisp của bác ssg 1 chút :

;;;-------------------------------------------------------
(defun etype (e);;;Entity Type
(cdr (assoc 0 (entget e)))
)
;;;-------------------------------------------------------
(defun C:LTT( / ss n i oldDimzin e d v S)
(if (not n0) (setq n0 2))
(setq
ss (ssget '((0 . "TEXT,MTEXT")))
n (getint (strcat "\nSo chu so thap phan <" (itoa n0) ">:"))
i 0
oldDimzin (getvar "dimzin")
)
(if n (setq n0 n) (setq n n0))
(setvar "dimzin" 8)
(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)))
S (rtos v 2 n)
d (subst (cons 1 S) (assoc 1 d) d)
)
(entmod d)
(setq i (1+ i))
)
(setvar "dimzin" oldDimzin)
(princ)
)
s_big.gif

cái bạn sửa vẫn chưa ổ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

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


×