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

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

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

Ssget rẽ nhánh Lee viết rồi, vác về xào thôi (code hơi dài nhé).

 

Mình tìm được hàm select rẽ nhánh cũng do Lee viết rất hay và ngắn gọn, các bác tham khảo nhé

 

[lisp]
;;---------------------=={ Select if }==----------------------;;
;; ;;
;; Provides continuous selection prompts until either a ;;
;; predicate function is validated or a keyword is supplied. ;;
;;------------------------------------------------------------;;
;; Author: Lee Mac, Copyright © 2011 - www.lee-mac.com ;;
;;------------------------------------------------------------;;
;; Arguments: ;;
;; msg - prompt string ;;
;; pred - optional predicate function [selection list arg] ;;
;; func - selection function to invoke ;;
;; keyw - optional initget argument list ;;
;;------------------------------------------------------------;;
;; Returns: Entity selection list, keyword, or nil ;;
;;------------------------------------------------------------;;

(defun LM:SelectIf ( msg pred func keyw / sel ) (setq pred (eval pred))
(while
(progn (setvar 'ERRNO 0) (if keyw (apply 'initget keyw)) (setq sel (func msg))
(cond
( (= 7 (getvar 'ERRNO))
(princ "\nMissed, Try again.")
)
( (eq 'STR (type sel))
nil
)
( (vl-consp sel)
(if (and pred (not (pred sel)))
(princ "\nInvalid Object Selected.")
)
)
)
)
)
sel
)
(defun c:test1 ( / entity )
  (if
    (setq entity
      (car
        (LM:SelectIf "\nSelect a Line: "
          (lambda ( x ) (eq "LINE" (cdr (assoc 0 (entget (car x)))))) entsel nil
        )
      )
    )
    (princ (strcat "\nHandle of Selected Line: " (cdr (assoc 5 (entget entity)))))
  )
  (princ)
)
(defun c:test2 ( / select pt )
  (if
    (and
      (setq select
        (LM:SelectIf "\nSelect Circle [Point]: "
          (lambda ( x ) (eq "CIRCLE" (cdr (assoc 0 (entget (car x)))))) entsel '("Point")
        )
      )
      (or
        (and
          (listp select) (setq pt (cdr (assoc 10 (entget (car select)))))
        )
        (setq pt (getpoint "\nSpecify Point: "))
      )
    )
    (princ (apply 'strcat (mapcar 'strcat '("\nPoint: " "," ",") (mapcar 'rtos pt))))
  )
  (princ)
)
[/lisp]

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

Hàm này không có cho multiselect bạn ạ. Mình không hiểu lắm ý đồ của Lee khi viết hàm này. Bởi nếu để rẽ nhánh cho việc pick chọn thì sử dụng grread đơn giản hơn, viết dễ hơn và tùy biến cũng dễ hơn, hoặc đơn giản hơn nữa là dùng initget nếu chỉ có nhu cầu rẽ nhánh bằng keyboard.

 

Mình đính chính lại ý của bạn Tue_NV ở trang trước: Initget vẫn có tác dụng với các hàm entsel và nentsel nhé, bạn đọc trong help developer sẽ rõ.

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 đang cần gấp 1 hàm có chức năng tìm trong 1 đoạn string các đoạn là integer để chuyển chúng về real.

ví dụ: "a2b3.1c5" chuyển thành "a2.0b3.1c5.0"

Do đang cần gấp mà mình bận quá không có thời gian mò mẫm nên đành cầu cứu các bạn. Bạn nào đã từng viết hàm như thế này rồi vui lòng cho mình xin. Cảm ơn các 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

Lisp của bạn đây

(defun kk(a / b i j)
  (setq i 1)
  (while (<= i (strlen a))
    (setq j 1)
    (while (<= j (- (1+ (strlen a)) i))
      (setq b(substr a i j))
      (if (and (= (vl-string-search "." b) nil)
	       (= (vl-string-search (strcat b ".") a) nil)
	       (= (vl-string-search (strcat "." b) a) nil))
	(if (= (read b) (atof b))
	  (setq a(strcat (substr a 1 (1+ (vl-string-search b a))) ".0" (substr a (1+ (1+ (vl-string-search b a))) )))
	  )
	)
      (setq j(1+ j))
      )
    (setq i (1+ i))
    )
  (princ a)
  (princ)
  )
  • 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

Không ổn đâu KK ơi. Cái này hy vọng chỉ đúng với integer chỉ gồm 1 chữ số như ví dụ của TL, khi gặp integer có hơn 1 chữ số là bị sai.

VD: (kk "1a2.3b4c56") => 1.0a2.3b4.0c5.06.0

(kk "1a+2.3b4c56")
1.0a+2.3b4.0c5.06.0
 
(kk "1a+2.3b4c56")
1.0a+2.3b4.0c5.06.0
 
(kk "1a+2.3b4c56")
1.0a+2.3b4.0c5.06.0
 
(kk "1a+2.3b4c56")
  • 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

Không ổn đâu KK ơi. Cái này hy vọng chỉ đúng với integer chỉ gồm 1 chữ số như ví dụ của TL, khi gặp integer có hơn 1 chữ số là bị sai.

VD: (kk "1a2.3b4c56") => 1.0a2.3b4.0c5.06.0

Thanks bác Hà đã phát hiện ra lỗi. Cũng tại viết code theo ví dụ của TL nên không phát hiện ra. Đã sửa lại Code mới rồi đây. Các bác Test thử xem còn lỗi ở đâu nữa không.

(defun C:kk ( / i j kt b)
  (setq a "a1.2b23.4c4567f78.5g34984")
  (setq i 1)
  (while (<= i (strlen a))
    (setq j (- (1+ (strlen a)) i))
    (setq kt 0)
    (while (and (= kt 0) (>= j 1))
      (setq b(substr a i j))
      (if (and (= (vl-string-search "." b) nil)
	       (= (vl-string-search (strcat b ".") a) nil)
	       (= (vl-string-search (strcat "." b) a) nil))
	(if (and (= (read b) (atof b)) (= kt 0))
	  (progn
	    (setq a(strcat (substr a 1 (- i 1)) b ".0" (substr a (+ i j)) ))
	    (setq kt 1)
	    (setq i (+ i (strlen b)))
	    )
	  )
	)
      (setq j(1- j))
      )
    (setq i (1+ i))
    )
  (princ a)
  (princ)
  )
  • 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

Món này thấy dễ xơi nhưng khó nuốt lắm KK ơi! Chắc bạn TL cũng mướt mồ hôi rồi chứ chẳng đơn giản để post lên nhờ với 1 cao thủ như bạn ấy.

Tôi mần từ tối tới giờ, được 90% rồi, mai mần tiếp.

Của bạn còn sai: ví dụ a là "1x1" chẳng 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

Quá tam ba bận. Hi vọng lần này sẽ hết lỗi

(defun C:kk ( / i j kt b lst item)
  (setq a (getstring "\n Nhap chuoi:"))
  (setq lst(list))
  (setq i 1)
  (while (<= i (strlen a))
    (setq j (- (1+ (strlen a)) i))
    (setq kt 0)
    (while (and (= kt 0) (>= j 1))
      (setq b(substr a i j))
      (if (/= b ".")
	(if (and (= (read b) (atof b)) (/= (vl-string-search "." b) nil))
	  (progn
	    (setq kt 1)
	    (setq i (+ i (strlen b)))
	    )
	  )
	)
      (if (and (= (vl-string-search "." b) nil)
	       (= (vl-string-search (strcat b ".") a) nil)
	       (= (vl-string-search (strcat "." b) a) nil))
	(if (and (= (read b) (atof b)) (= kt 0))
	  (progn
	    (setq lst(append lst (List (list i j b))))
	    (setq kt 1)
	    (setq i (+ i (strlen b)))
	    )
	  )
	)
      (setq j(1- j))
      )
    (setq i (1+ i))
    )
  (setq lst(reverse lst))
  (foreach item lst
  (setq a(strcat (substr a 1 (- (car item) 1)) (caddr item) ".0" (substr a (+ (car item) (cadr item)))))
  )
  (alert a)
  (princ)
  )
  • 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

 

Quá tam ba bận. Hi vọng lần này sẽ hết lỗi

(defun C:kk ( / i j kt b lst item)
  (setq a (getstring "\n Nhap chuoi:"))
  (setq lst(list))
  (setq i 1)
  (while (<= i (strlen a))
    (setq j (- (1+ (strlen a)) i))
    (setq kt 0)
    (while (and (= kt 0) (>= j 1))
      (setq b(substr a i j))
      (if (/= b ".")
	(if (and (= (read b) (atof b)) (/= (vl-string-search "." b) nil))
	  (progn
	    (setq kt 1)
	    (setq i (+ i (strlen b)))
	    )
	  )
	)
      (if (and (= (vl-string-search "." b) nil)
	       (= (vl-string-search (strcat b ".") a) nil)
	       (= (vl-string-search (strcat "." b) a) nil))
	(if (and (= (read b) (atof b)) (= kt 0))
	  (progn
	    (setq lst(append lst (List (list i j b))))
	    (setq kt 1)
	    (setq i (+ i (strlen b)))
	    )
	  )
	)
      (setq j(1- j))
      )
    (setq i (1+ i))
    )
  (setq lst(reverse lst))
  (foreach item lst
  (setq a(strcat (substr a 1 (- (car item) 1)) (caddr item) ".0" (substr a (+ (car item) (cadr item)))))
  )
  (alert a)
  (princ)
  )

Còn lỗi :

Ví dụ với string : "(5+6)*3"

  • 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

Trước hết, mình ngưỡng mộ bạn vì sự "làm cho tới cùng" nên vote cho bạn. Lần này có khá hơn.

Do đề bài của bạn TL không nói rõ các ký tự khác số là như thế nào, nên trong trường hợp tổng quát vẫn còn lỗi.

VD: khi ký tự khác số là dấu phẩy (,).

1,1.0 => 1,1.0

Hoặc 1E2 thì được hiểu như thế nào? Nó là 1 số (100.0) hay 2 số (1) và (2) có chèn ở giữa 1 ký tự (E) khác số?

1E2 =>1E2.0

Tuy nhiên, rất có thể nó đáp ứng y/c trong ví dụ đơn giản của TL.

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 các bạn đã nhiệt tình trợ giúp mình. Xin lỗi vì mình chỉ đưa 1 ví dụ mà chưa nói rõ ý định gây khó khăn cho các bạn.

Mình đang viết 1 hàm xuất kết quả tính toán. Từ dòng nhắc chọn text để lưu kết quả, nếu người dùng không muốn xuất kết quả ngay mà cần tính toán tiếp thì chỉ việc nhập thêm các phép tính. nhập xong thì xuất kết quả mới.

Việc tính toán dựa vào hàm cal với đối số khi đó là chuỗi phép tính người dùng đã nhập nên cần phải chuyển các con số integer trong đó thành real. Phải làm điều này vì phạm vi cho phép tính toán của Integer hẹp quá. Nếu phép tính chứa integer quá lớn sẽ cho kết quả không chính xác. Tại mình cẩn thận, muốn có 1 hàm tổng quát để làm việc này nên mới đưa ra 1 ví dụ dở hơi như trên.

 

Hình như bạn Tue_NV đã đoán được mục đích của mình thì phả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ảm ơn các bạn đã nhiệt tình trợ giúp mình. Xin lỗi vì mình chỉ đưa 1 ví dụ mà chưa nói rõ ý định gây khó khăn cho các bạn.

Mình đang viết 1 hàm xuất kết quả tính toán. Từ dòng nhắc chọn text để lưu kết quả, nếu người dùng không muốn xuất kết quả ngay mà cần tính toán tiếp thì chỉ việc nhập thêm các phép tính. nhập xong thì xuất kết quả mới.

Việc tính toán dựa vào hàm cal với đối số khi đó là chuỗi phép tính người dùng đã nhập nên cần phải chuyển các con số integer trong đó thành real. Phải làm điều này vì phạm vi cho phép tính toán của Integer hẹp quá. Nếu phép tính chứa integer quá lớn sẽ cho kết quả không chính xác. Tại mình cẩn thận, muốn có 1 hàm tổng quát để làm việc này nên mới đưa ra 1 ví dụ dở hơi như trên.

 

Hình như bạn Tue_NV đã đoán được mục đích của mình thì phải ^^

 

Đúng là mình đã đoán trúng ý bạn rồi. Thần giao cách cảm mà ^_^

Code đây các bác :

 

 
(defun Tue-int-real(str / str-res str2)
;;;write by Tue_NV
  ;;;;;example: (Tue-int-real "a2b3.1c5") -> "a2.0b3.1c5.0"
  ;;;;;(Tue-int-real "aa2222b3.1c56") -> "aa2222.0b3.1c56.0"
 (vl-load-com)
(setq str-res "" str2 str)
  (while (/= (strlen str2) 0)
    (setq str2 (vl-string-left-trim "ABCDEFGHIKLMNOPQRSTUYZXY+-*/%( ),#@$^!~_"  (strcase str2)))
    (if (/= (strlen str2) 0) 
(setq str-res (strcat str-res (substr str 1 (- (strlen str) (strlen str2))) (rtos (atof str2))))
(setq str-res (strcat str-res (substr str 1 (- (strlen str) (strlen str2))) ))
    )
    (setq str2 (vl-string-left-trim "1234567890 ."  str2)
 str (substr str (1+ (- (strlen str) (strlen str2))) (strlen str))
    )
  )
str-res
  )
  • 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


 

(defun HA (str / lst)
 (setq lst (vl-string->list str))
 (setq lst (mapcar (function vl-list->string)
  (if (nump (car lst))
   (HA1 lst)
   (HA2 lst))))
 (apply 'strcat (mapcar '(lambda(x) (if (wcmatch x "~*[~0-9]*") (strcat x ".0") x)) lst)))
(defun HA1 (num / res)
 (cond
  ((null num) nil)
  ((null (cdr num)) (list num))
  (T
   (while (nump (car num))
    (setq res (cons (car num) res) num (cdr num)))
   (cons (reverse res) (HA2 num)))))
(defun HA2 (num / res)
 (cond
  ((null num) nil)
  ((null (cdr num)) (list num))
  (T
   (while (not(nump (car num)))
    (setq res (cons (car num) res) num (cdr num)))
   (cons (reverse res) (HA1 num)))))
(defun nump (num)
 (or (= num 46) (<= 48 num 57)))
  • 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

 

 

 

(defun HA (str / lst)
 (setq lst (vl-string->list str))
 (setq lst (mapcar (function vl-list->string)
  (if (nump (car lst))
   (HA1 lst)
   (HA2 lst))))
 (apply 'strcat (mapcar '(lambda(x) (if (wcmatch x "~*[~0-9]*") (strcat x ".0") x)) lst)))
(defun HA1 (num / res)
 (cond
  ((null num) nil)
  ((null (cdr num)) (list num))
  (T
   (while (nump (car num))
    (setq res (cons (car num) res) num (cdr num)))
   (cons (reverse res) (HA2 num)))))
(defun HA2 (num / res)
 (cond
  ((null num) nil)
  ((null (cdr num)) (list num))
  (T
   (while (not(nump (car num)))
    (setq res (cons (car num) res) num (cdr num)))
   (cons (reverse res) (HA1 num)))))
(defun nump (num)
 (or (= num 46) (<= 48 num 57)))

 

Lisp bác viết không chấp nhận kí tự rỗng " "

Ví dụ "(5+2) *3"

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

Rỗng vô tư mà!

(HA "(5+2)* 3") => "(5.0+2.0)* 3.0"

 

Ồ, được rồi bác! Không hiểu sao Tue_NV test lúc đầu ko được. Sorry

Còn cái này thì lỗi nè bác :

(ha "(9*sqrt(3))")

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 thử với Lisp này xem:

(defun C:kk( / b c a a1 lst accept cancel ac_bd ac_kt ca_bd ca_kt num)
  (setq b nil)  (setq c nil)  (setq a (getstring T "\n Nhap chuoi:")) (setq a1 "") (setq lst(list)) (setq accept(list)) (setq cancel(list)) (setq i 1)
  (setq ac_bd 1) (setq ac_kt 0) (setq ca_bd 1) (setq ca_kt 0)
  (while (<= i (strlen a))
    (setq b(substr a i 1))
    (if (< i (strlen a)) (setq c(substr a (1+ i) 1)))
    (if (= i (strlen a))
      (progn
	(setq c(substr a (strlen a) 1))
	(if (or (= c "0") (= c "1") (= c "2") (= c "3") (= c "4") (= c "5") (= c "6") (= c "7") (= c "8") (= c "9") (= c "."))
	  (setq ac_kt i))
	(if (and (/= c "0") (/= c "1") (/= c "2") (/= c "3") (/= c "4") (/= c "5") (/= c "6") (/= c "7") (/= c "8") (/= c "9") (/= c "."))
	  (setq ca_kt i))
	)
      )
    (if (and (or (= b "0") (= b "1") (= b "2") (= b "3") (= b "4") (= b "5") (= b "6") (= b "7") (= b "8") (= b "9") (= b "."))
	     (/= c "0") (/= c "1") (/= c "2") (/= c "3") (/= c "4") (/= c "5") (/= c "6") (/= c "7") (/= c "8") (/= c "9") (/= c ".")
	     )
      (progn (setq ac_kt i) (setq ca_bd (1+ i))	(setq ca_kt 0))
      )
    (if (and (or (= c "0") (= c "1") (= c "2") (= c "3") (= c "4") (= c "5") (= c "6") (= c "7") (= c "8") (= c "9") (= c "."))
	     (/= b "0") (/= b "1") (/= b "2") (/= b "3") (/= b "4") (/= b "5") (/= b "6") (/= b "7") (/= b "8") (/= b "9") (/= b ".")
	     )
      (progn (setq ac_bd (1+ i)) (setq ac_kt 0)	(setq ca_kt i))
      )
    (if (and (>= ac_bd 1) (>= ac_kt 1) (= (vl-position (list ac_bd ac_kt "A") accept) nil))
      (setq accept(append accept (list (list ac_bd ac_kt "A"))))
      )
    (if (and (>= ca_bd 1) (>= ca_kt 1) (= (vl-position (list ca_bd ca_kt "C") cancel) nil))
      (setq cancel(append cancel (list (list ca_bd ca_kt "C"))))
      )
    (setq i(1+ i))
    )
  (setq lst(append accept cancel))
  (setq lst(vl-sort lst '(lambda (e1 e2) (< (car e1) (car e2)))))
  (foreach item lst
    (if (= (caddr item) "C")
      (setq a1(strcat a1 (substr a (car item) (- (cadr item) (car item) -1))))
      (progn
	(setq num(substr a (car item) (- (cadr item) (car item) -1)))
	(if (= (vl-string-search "." num) nil)
	  (setq a1(strcat a1 num ".0"))
	  (setq a1(strcat a1 num))
	  )
	)
      )
    )
  (alert a1)
  ) 

 

PS: Lisp bác Tuệ đứng hình luôn: (Tue-int-real "a2b3.1c'5")

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 thử với Lisp này xem:

(defun C:kk( / b c a a1 lst accept cancel ac_bd ac_kt ca_bd ca_kt num)
  (setq b nil)  (setq c nil)  (setq a (getstring T "\n Nhap chuoi:")) (setq a1 "") (setq lst(list)) (setq accept(list)) (setq cancel(list)) (setq i 1)
  (setq ac_bd 1) (setq ac_kt 0) (setq ca_bd 1) (setq ca_kt 0)
  (while (<= i (strlen a))
    (setq b(substr a i 1))
    (if (< i (strlen a)) (setq c(substr a (1+ i) 1)))
    (if (= i (strlen a))
      (progn
	(setq c(substr a (strlen a) 1))
	(if (or (= c "0") (= c "1") (= c "2") (= c "3") (= c "4") (= c "5") (= c "6") (= c "7") (= c "8") (= c "9") (= c "."))
	  (setq ac_kt i))
	(if (and (/= c "0") (/= c "1") (/= c "2") (/= c "3") (/= c "4") (/= c "5") (/= c "6") (/= c "7") (/= c "8") (/= c "9") (/= c "."))
	  (setq ca_kt i))
	)
      )
    (if (and (or (= b "0") (= b "1") (= b "2") (= b "3") (= b "4") (= b "5") (= b "6") (= b "7") (= b "8") (= b "9") (= b "."))
	     (/= c "0") (/= c "1") (/= c "2") (/= c "3") (/= c "4") (/= c "5") (/= c "6") (/= c "7") (/= c "8") (/= c "9") (/= c ".")
	     )
      (progn (setq ac_kt i) (setq ca_bd (1+ i))	(setq ca_kt 0))
      )
    (if (and (or (= c "0") (= c "1") (= c "2") (= c "3") (= c "4") (= c "5") (= c "6") (= c "7") (= c "8") (= c "9") (= c "."))
	     (/= b "0") (/= b "1") (/= b "2") (/= b "3") (/= b "4") (/= b "5") (/= b "6") (/= b "7") (/= b "8") (/= b "9") (/= b ".")
	     )
      (progn (setq ac_bd (1+ i)) (setq ac_kt 0)	(setq ca_kt i))
      )
    (if (and (>= ac_bd 1) (>= ac_kt 1) (= (vl-position (list ac_bd ac_kt "A") accept) nil))
      (setq accept(append accept (list (list ac_bd ac_kt "A"))))
      )
    (if (and (>= ca_bd 1) (>= ca_kt 1) (= (vl-position (list ca_bd ca_kt "C") cancel) nil))
      (setq cancel(append cancel (list (list ca_bd ca_kt "C"))))
      )
    (setq i(1+ i))
    )
  (setq lst(append accept cancel))
  (setq lst(vl-sort lst '(lambda (e1 e2) (< (car e1) (car e2)))))
  (foreach item lst
    (if (= (caddr item) "C")
      (setq a1(strcat a1 (substr a (car item) (- (cadr item) (car item) -1))))
      (progn
	(setq num(substr a (car item) (- (cadr item) (car item) -1)))
	(if (= (vl-string-search "." num) nil)
	  (setq a1(strcat a1 num ".0"))
	  (setq a1(strcat a1 num))
	  )
	)
      )
    )
  (alert a1)
  ) 

PS: Lisp bác Tuệ đứng hình luôn: (Tue-int-real "a2b3.1c'5")

Bác thêm kí tự vào trong

chuỗi  "ABCDEFGHIKLMNOPQRSTUYZXY+-*/%( ),#@$^!~_" là được

Thêm chổ nào cũng được  :) 

Do mười chưa viết code đưa kí tự @ nên viết gọn thế cho xong luôn.

Tại lười ấ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

Lisp bác Tue_NV có thêm ' hay không thêm ' cũng chả thèm nhúc nhích luôn!

Chằng quá!!!!!!!!!!

Răng không nhúc nhích được bác. Bác test thử xem:

 

 
(defun Tue-int-real(str / str-res str2)
;;;write by Tue_NV
  ;;;;;example: (Tue-int-real "a2b3.1c5") -> "a2.0b3.1c5.0"
  ;;;;;(Tue-int-real "aa2222b3.1c56") -> "aa2222.0b3.1c56.0"
 (vl-load-com)
(setq str-res "" str2 str)
  (while (/= (strlen str2) 0)
    (setq str2 (vl-string-left-trim "ABCDEFGHIKLMNOPQRSTUYZXY+-*/%( ),#@$^!~_`'"  (strcase str2)))
    (if (/= (strlen str2) 0) 
(setq str-res (strcat str-res (substr str 1 (- (strlen str) (strlen str2))) (rtos (atof str2))))
(setq str-res (strcat str-res (substr str 1 (- (strlen str) (strlen str2))) ))
    )
    (setq str2 (vl-string-left-trim "1234567890 ."  str2)
 str (substr str (1+ (- (strlen str) (strlen str2))) (strlen str))
    )
  )
str-res
  )

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ó nhúc nhích nhưng code vẫn phải sửa lại bác ạ. Ví dụ về 2 trường hợp độ chính xác của đơn vị bản vẽ khác nhau

(Tue-int-real "a2b3.1c'''''5") => "a2b3c'''''5" 

(Tue-int-real "a2b3.1c'''''5")=>  "a2.00000000b3.10000000c'''''5.00000000"

Cái này sửa trong hàm Substr là đượ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

Có nhúc nhích nhưng code vẫn phải sửa lại bác ạ. Ví dụ về 2 trường hợp độ chính xác của đơn vị bản vẽ khác nhau

(Tue-int-real "a2b3.1c'''''5") => "a2b3c'''''5" 

(Tue-int-real "a2b3.1c'''''5")=>  "a2.00000000b3.10000000c'''''5.00000000"

Cái này sửa trong hàm Substr là được

 

Sửa bằng lệnh UNITS cũng được bác

Để User tùy chọn số số lẻ thập phân 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

Test hàm bác Tue_NV:

(Tue-int-real "a2b3.1c'5")
"a2.0000b3.1000c'5.0000"

(Tue-int-real "a2b3.1c'''''5")
"a2.0000b3.1000c'''''5.0000"

(Tue-int-real "a2b3.1c'''''5")
"a2.0000b3.1000c'''''5.0000"

(Tue-int-real "(9*sqrt(3))")
"(9.0000*sqrt(3.0000))"

(Tue-int-real "(5+2)* 3")
"(5.0000+2.0000)* 3.0000"

(Tue-int-real "1a2.3b4c56")
"1.0000a2.3000b4.0000c56.0000"

(Tue-int-real "a2b3.1c5")
"a2.0000b3.1000c5.0000"

 

(Tue-int-real "a2b3.1c5b")
"a2.0000b3.1000c5.0000b"
 

(Tue-int-real "81!@0800&853") => Chạy hoài không dừng.

(Tue-int-real "a2b3.1c'''''5")
"a2.0000b3.1000c'''''5.0000"
 
(Tue-int-real "(9*sqrt(3))")
"(9.0000*sqrt(3.0000))"
 
(Tue-int-real "1a2.3b4c56")
"1.0000a2.3000b4.0000c56.0000"
 
(Tue-int-real "a2b3.1c5")
"a2.0000b3.1000c5.0000"
 
(Tue-int-real "81!@0800&853") => Chạy hoài không dừng ^ ^

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


×