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  
matden_304

[Yêu cầu] Lisp kết hợp lệnh Array và Copy

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

matden_304    0

Nhờ các anh chị trên diễn đàn viết giùm em cái lisp kết hợp giữa Array và Copy, em thể hiện qua cái hình dưới đây. Sơ bộ là em vẽ 1 bậc thang, sau đó chọn base point và điểm copy đến, cuối cùng là chọn số lần copy. Các anh chị có thể mở rộng thêm đối với các text có số thì thêm tùy chọn là tự động tăng dần giá trị của nó.

 

Nhân đây em cũng nhờ viết giùm em cái lisp nhỏ ^^. Em vẽ các đoạn thẳng rồi dùng lệnh Mirror hoài nên thấy hơi chậm. VD như là em dùng lệnh LL, vẽ đoạn thẳng AB và kết quả là hiện ra đoạn thẳng CB có chiều dài gấp đôi AB( A là trung điểm CB)

Xin cảm ơn các anh chị

drawing1model.jpg

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
Doan Van Ha    2.678

Nhờ các anh chị trên diễn đàn viết giùm em cái lisp kết hợp giữa Array và Copy, em thể hiện qua cái hình dưới đây.

Lisp này Array theo ý bạn

P/S: đây là lisp trên Cadviet, tôi thêm osnap và undo cho tiện và tránh bị lỗi.

(defun C:CA (/ dt p1 p2 sl x)
(command "undo" "be")
(setq osm (getvar "osmode"))
(setq dt (ssget)
    	p1 (getpoint "\nDiem goc: ")
    	p2	(getpoint p1 "\nDiem den: ")
    	sl 	(getint "\nSo lan: ")
    	x 1)
(setvar "osmode" 0)
(repeat sl
(command "copy" dt "" p1 (polar p1 (angle p1 p2) (* (distance p1 p2) x)))
(setq x (1+ x)))
(command "undo" "e")
(setvar "osmode" osm)
(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
matden_304    0

Em xin cảm ơn anh DOan Van Ha. Cái lisp đó nó bị tắt hết Osnap nên không thể bắt điểm chính xác được. Anh có thể giữ nguyên tùy chọn Osnap như hiện hành và bổ sung thêm lựa chọn tăng giá trị các số của các Text nằm trong đối tượng được chọn ko ạ

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
Doan Van Ha    2.678

Em xin cảm ơn anh DOan Van Ha. Cái lisp đó nó bị tắt hết Osnap nên không thể bắt điểm chính xác được. Anh có thể giữ nguyên tùy chọn Osnap như hiện hành và bổ sung thêm lựa chọn tăng giá trị các số của các Text nằm trong đối tượng được chọn ko ạ

- Srr, đã sửa lại osnap vì sơ ý để nhầm vị trí (vẫn link như cũ)

- Trong đối tượng cần copy-array chỉ có 1 text hay nhiều text, tăng theo cấp số cộng hay cấp số nhân (công sai và công bội?)? Hay đơn giản là tăng 1 đơn vị?

  • 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
Doan Van Ha    2.678

Đây chắc đúng y/c của bạn.

;Doan Van Ha
(defun C:CA (/ dt dsdt dt1 dt2 p1 p2 sl x)
(command "undo" "be")
(setq osm (getvar "osmode"))
(princ "\nChon cac doi tuong can Copy-Array...")
(setq dsdt (acet-ss-to-list (setq dt (ssget)))
       	p1 (getpoint "\nDiem goc: ")
       	p2 (getpoint p1 "\nDiem den: ")
       	sl (getint "\nSo lan: ")
       	x 1)
(foreach n dsdt
 (if (or (= "TEXT" (cdr (assoc 0 (entget n)))) (= "MTEXT" (cdr (assoc 0 (entget n)))))
  (setq dt1 (ssdel n dt) dt2 n)))
(setvar "osmode" 0)
(repeat sl
 (command ".copy" dt1 "" p1 (polar p1 (angle p1 p2) (* (distance p1 p2) x)))
 (command ".copy" dt2 "" p1 (polar p1 (angle p1 p2) (* (distance p1 p2) x)))
 (entmod (subst (cons 1 (itoa (+ (atoi (cdr (assoc 1 (entget dt2)))) x))) (assoc 1 (entget (entlast))) (entget (entlast))))
 (entupd (entlast))
 (setq x (1+ x)))
(command "undo" "e")
(setvar "osmode" osm)
(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
matden_304    0

@DVH Cái lisp mới ( có dòng Bạn muốn text tăng dần) nó chỉ chạy ngon lành với text thôi anh. Còn đối với các đối tượng khác thì nó ko copy đc. Nhờ anh ra tay thêm xíu nữa cho nó hoàn chỉnh luôn. :) Em nghĩ có lẽ là thiếu ở giải thuật

 

@Mod Ketxu Hồi trưa em thấy có vài bài reply có cả của anh nữa mà sao giờ nó chạy đâu mất rồi. Anh tìm lại thử ( Làm mod vất vả xíu ^^)

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
Doan Van Ha    2.678

@DVH Cái lisp mới ( có dòng Bạn muốn text tăng dần) nó chỉ chạy ngon lành với text thôi anh. Còn đối với các đối tượng khác thì nó ko copy đc. Nhờ anh ra tay thêm xíu nữa cho nó hoàn chỉnh luôn. :) Em nghĩ có lẽ là thiếu ở giải thuật

 

@Mod Ketxu Hồi trưa em thấy có vài bài reply có cả của anh nữa mà sao giờ nó chạy đâu mất rồi. Anh tìm lại thử ( Làm mod vất vả xíu ^^)

Bạn đưa bản vẽ của bạn lên xem hè, tôi không thấy 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
ketxu    2.653

@DVH Cái lisp mới ( có dòng Bạn muốn text tăng dần) nó chỉ chạy ngon lành với text thôi anh. Còn đối với các đối tượng khác thì nó ko copy đc. Nhờ anh ra tay thêm xíu nữa cho nó hoàn chỉnh luôn. :) Em nghĩ có lẽ là thiếu ở giải thuật

 

@Mod Ketxu Hồi trưa em thấy có vài bài reply có cả của anh nữa mà sao giờ nó chạy đâu mất rồi. Anh tìm lại thử ( Làm mod vất vả xíu ^^)

Dữ liệu bị back up rồi :) Lisp mình viết cho bạn mình vừa phải reup lại

http://www.cadviet.com/forum/index.php?showtopic=54635

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
ketxu    2.653

@DVH Cái lisp mới ( có dòng Bạn muốn text tăng dần) nó chỉ chạy ngon lành với text thôi anh. Còn đối với các đối tượng khác thì nó ko copy đc. Nhờ anh ra tay thêm xíu nữa cho nó hoàn chỉnh luôn. :) Em nghĩ có lẽ là thiếu ở giải thuật

 

@Mod Ketxu Hồi trưa em thấy có vài bài reply có cả của anh nữa mà sao giờ nó chạy đâu mất rồi. Anh tìm lại thử ( Làm mod vất vả xíu ^^)

Dữ liệu bị back up rồi :) Lisp mình viết cho bạn mình vừa phải reup lại

http://www.cadviet.com/forum/index.php?showtopic=54635

 

@bác ĐVH : code chạy tốt, tuy nhiên hơi tiếc ở chỗ sau vòng foreach thì chỉ còn 1 đối tượng Text duy nhất được gán là dt2, nên lisp chỉ xử lý 1 em Text (trong khi tập chọn có thể có nhiều hơn 1). Ngoài ra do bác chưa kiểm tra có hay không tồn tại dt2, nên nếu tập đối tượng của matden không có text thì dòng

(command ".copy" dt2 "" p1 (polar p1 (angle p1 p2) (* (distance p1 p2) x))) sẽ gây 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
Doan Van Ha    2.678

Một buổi chiều không vào CV được, lại thêm mọi bài viết đều bị undo hết, chán quá đi!

CD dạo này bị sao thế nhỉ? Mới góp ý buổi sáng thì chiều bị dính ngay!

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
Doan Van Ha    2.678

Dữ liệu bị back up rồi :) Lisp mình viết cho bạn mình vừa phải reup lại

http://www.cadviet.c...showtopic=54635

 

@bác ĐVH : code chạy tốt, tuy nhiên hơi tiếc ở chỗ sau vòng foreach thì chỉ còn 1 đối tượng Text duy nhất được gán là dt2, nên lisp chỉ xử lý 1 em Text (trong khi tập chọn có thể có nhiều hơn 1). Ngoài ra do bác chưa kiểm tra có hay không tồn tại dt2, nên nếu tập đối tượng của matden không có text thì dòng

(command ".copy" dt2 "" p1 (polar p1 (angle p1 p2) (* (distance p1 p2) x))) sẽ gây lỗi ^^

Ket theo dõi topic này thì sẽ rõ, tôi hỏi chủ muốn gì nhưng không thấy trả lời nên tôi chỉ viết theo bản vẽ vì thấy có 1 text là số nguyên trên đó, mà chủ thấy đúng ý thì thôi 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
ketxu    2.653

@bác ĐVH : ^^, vậy thì cứ để vậy đi ^^

Bản vẽ matden vừa post kia, ketxu chưa down cũng có thể đoán được đến 90% là lỗi dòng ketxu đã bôi đen ^^ Hì

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
Doan Van Ha    2.678

@bác ĐVH : ^^, vậy thì cứ để vậy đi ^^

Bản vẽ matden vừa post kia, ketxu chưa down cũng có thể đoán được đến 90% là lỗi dòng ketxu đã bôi đen ^^ Hì

Không xem bản vẽ cũng đoán được, vì chủ topic đề nghị copy text tăng dần, hỏi không thấy trả lời nên viết theo những gì thấy trên nó. Chứ có n text hay không có text nào thì đâu phải vấn đề lớn. Liệu chủ muốn có n text trên đó nhưng chỉ tăng dần (n-3) text thì sao? Đây chỉ viết theo kiểu thằng mù sờ voi mà, hì!

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
Doan Van Ha    2.678

@ ĐVH ( Đàm Vĩnh Hưng :) ^^) Anh thử kiểm tra xem với cái cánh cửa trong bản vẽ này nhé, em thử mà chưa ra

http://www.cadviet.c.../3/kientruc.dwg

Bạn ra đề thi chưa rõ ràng nên thí sinh nhầm thì cũng thông cảm. Copy_Array các đối tượng khác *text thì không sao, nhưng khi đối tượng là *text thì bạn cần nói rõ quy luật, tăng giảm thế nào, tăng giảm tất cả *text trên đó hay chỉ 1 số...vv và vv...

Bản vẽ mới của bạn không có *text nên bị lỗi, vì tôi viết theo những gì mà tôi thấy trên bản vẽ cũ bạn đã up lên.

Thân thương!

  • 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
Doan Van Ha    2.678

@DVH Đề của em là ntn. Anh giúp giùm em nhahttp://www.cadviet.c.../kientruc_1.dwg

Cảm ơn anh DVH ...

Tôi viết cho bạn và cho ai cần dùng với trường hợp khá tổng quát: đối tượng không phải *text thì copy-array bình thường, đối tượng là *text thì copy-array tăng lên 1 đơn vị.

Các chú ý khi dùng:

- Chỉ 1 *text được tăng dần.

- *Text có thể là số bất kỳ (int, real), có thể có tiền tố, hậu tố.

- Code hơi dài vì xét cả tiền tố rồi hậu tố, mệt nhất là số dạng real. Bạn thông cảm nhé.

Thân thương!

; Doan Van Ha CADViet.com
; Copy-Array cac doi tuong, rieng *Text co chua so thi tang dan 1 don vi, chap nhan so co tien to va hau to (chi xet 1 *Text).
(defun C:CA (/ dsdt dt dt1 dt2 p1 p2 sl x kwrd strt strp num sym)
(command "undo" "be")
(princ "\nChon cac doi tuong can Copy-Array...")
(setq dsdt (acet-ss-to-list (setq dt (ssget)))
  		dt1 dt
  		p1 (getpoint "\nDiem goc: ")
  		p2 (getpoint p1 "\nDiem den: ")
  		sl (getint "\nSo lan: ")
  		x 1)
(acet-sysvar-set (list "osmode" 0 "cmdecho" 0))
(foreach n dsdt
 (if (or (= "TEXT" (cdr (assoc 0 (entget n)))) (= "MTEXT" (cdr (assoc 0 (entget n)))))
  (setq dt1 (ssdel n dt) dt2 n)))
(if dt2
 (progn
  (initget "Y N")
  (setq kwrd (getkword "\nBan muon Text tang dan ? [Y/<N>]  "))
  (setq x 1)
  (repeat (1- sl)
(command ".copy" dt2 "" p1 (polar p1 (angle p1 p2) (* (distance p1 p2) x)))
(if (eq kwrd "Y")
(progn
 	(CHIA (cdr (assoc 1 (entget dt2))))
 	(entmod (subst (cons 1 (strcat strt (rtos (+ (atof num) x) 2 daup) strp))  (assoc 1 (entget (entlast))) (entget (entlast))))
 	(entupd (entlast))))
(setq x (1+ x)))))
(setq x 1)
(repeat (1- sl)
 (command ".copy" dt1 "" p1 (polar p1 (angle p1 p2) (* (distance p1 p2) x)))
 (setq x (1+ x)))
(command "undo" "e")
(acet-sysvar-restore)
(princ))
;----- Chia text lam 3 phan: tien to, num, hau to.
(defun CHIA(str / strtp)
(setq strt (PHAN str)
  		strp (DAO (PHAN (DAO str)))
  		num (ACET-STR-LR-TRIM strt (ACET-STR-LR-TRIM strp str))
  		daup (if (not (ACET-STR-FIND "." num)) 0 (strlen (substr num (+ 1 (strlen ".") (strlen (substr num 1 (- (ACET-STR-FIND "." num) 1)))))))))
;----- Lay 1 phan ben phai hoac trai cua num.
(defun PHAN(str / str1)
(setq str1 str num nil)
(while (and (not num) (/= str1 ""))
 (if (distof (substr str1 1 1))
  (setq strtp (substr str 1 (- (ACET-STR-FIND (substr str1 1 1) str) 1))
       	str1 "")
  (setq str1 (substr str1 2))))
strtp)
;----- Dao nguoc 1 chuoi.
(defun DAO(str / str2)
(setq str2 str strn "")
(while (/= "" str2)
 (setq strn (strcat (substr str2 1 1) strn))
 (setq str2 (substr str2 2 (strlen str2))))
strn)

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

Code chạy tốt :) Thanks bác ĐVH. E có chút góp ý như sau :

- Với chú ý chỉ tăng 1 text trong tập chọn => OK, tuy nhiên, nếu có nhiều text thì các text ngoài text được chọn để tăng đều bị xóa hết, nên k hay lắm

- Bác thử chạy code với 1 text có tiền tố/hậu tố có chứa số (vd a4b5) thì lại thấy tiếp vấn đề nữa ^^

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
Doan Van Ha    2.678

Code chạy tốt :) Thanks bác ĐVH. E có chút góp ý như sau :

- Với chú ý chỉ tăng 1 text trong tập chọn => OK, tuy nhiên, nếu có nhiều text thì các text ngoài text được chọn để tăng đều bị xóa hết, nên k hay lắm

- Bác thử chạy code với 1 text có tiền tố/hậu tố có chứa số (vd a4b5) thì lại thấy tiếp vấn đề nữa ^^

Ket viết nhiều chắc biết kiểu viết lsp theo y/c như đề này là rất nhạy cảm! Có cái thì không tiền/hậu tố, có cái thì có tiền/hậu tố, lại có cái có cả tiền và hậu tố. Có cái là int, lại có cái là real (khổ nhất nó). Chao ôi nó đa đoan! Hì! Riêng 2 câu hỏi của Ket xin trả lời như sau:

1). Khi có nhiều txt thì biết chọn cái nào để tăng, còn nếu tăng tất cả là không thực tế lắm, thành ra chỉ chọn 1 txt thôi. Còn chặt chẽ hơn (tất nhiên sử dụng sẽ phức tạp hơn!) thì sau khi chọn dt cần phải thêm 1 bước chọn txt để tăng nữa (nhằm cho các txt khác đứng yên).

2). Chỉ viết ngang cỡ "ab5.3cdf" thôi, chứ "a4b5" thì biết chọn tăng số 4 hay số 5 đây? Hay phải thêm 1 vài bước nữa, chà!

Thân thươ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
ketxu    2.653

Ket viết nhiều chắc biết kiểu viết lsp theo y/c như đề này là rất nhạy cảm! Có cái thì không tiền/hậu tố, có cái thì có tiền/hậu tố, lại có cái có cả tiền và hậu tố. Có cái là int, lại có cái là real (khổ nhất nó). Chao ôi nó đa đoan! Hì! Riêng 2 câu hỏi của Ket xin trả lời như sau:

1). Khi có nhiều txt thì biết chọn cái nào để tăng, còn nếu tăng tất cả là không thực tế lắm, thành ra chỉ chọn 1 txt thôi. Còn chặt chẽ hơn (tất nhiên sử dụng sẽ phức tạp hơn!) thì sau khi chọn dt cần phải thêm 1 bước chọn txt để tăng nữa (nhằm cho các txt khác đứng yên).

2). Chỉ viết ngang cỡ "ab5.3cdf" thôi, chứ "a4b5" thì biết chọn tăng số 4 hay số 5 đây? Hay phải thêm 1 vài bước nữa, chà!

Thân thương!

- Chọn 1 Text thì e k nói, nhưng lại xóa các đối tượng Text khác thì quả là không hay. Có thể bác chỉ cần chỉ định 1 thằng Text trong đống đó để thao tác ^^

- Nếu format được giới hạn trong [Tiền tố] số [Hậu tố] thì ok rồi. Nhưng bác cũng phải chú ý nếu gặp phải text không hề có số nhé, lúc đó hàm chia của bác lỗi luôn ^^

À, code của bác đúng là dài thật, lại ưa xài Express quá ^^ Em thì nghĩ chỉ cần thế này thôi

(defun txt2num (str / num pos)
(setq pos (vl-string-search (setq num (vl-list->string (vl-remove-if-not '(lambda (x) (or (< 44 x 47)(< 47 x 58)))(vl-string->list str))))str))
(list
(substr str 1  pos)
(if (vl-string-search "." num)(atof num)(atoi num))
(substr str (+ 1 pos (strlen num)))
))

=> trả về list (Tiền tố - số - Hậu tố)

Ví dụ :

(txt2num "abcde12.3fghijk") => ("abcde" 12.3 "fghijk")

 

 

(txt2num "abcde123fghijk") => ("abcde" 123 "fghijk")

(txt2num "abcdef") => ("" 0 "abcdef")

 

Chúc bác ngày càng mạnh khỏe và có nhiều lisp hay.

 

P/s : nhân tiện hàm vừa viết, e update luôn cái Dynamic Array ^^

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
ketxu    2.653

Sáng dậy làm thêm phát nữa ^^ : (đầu cuối số)

(defun tach (str / i j dau cuoi tmp tmp1 tmp2)
(setq lst (vl-string->list str) i -1 j (strlen str))
(list
(setq tmp1 (vl-list->string (reverse (while (not (or (<= 48 (setq tmp (nth (setq i (1+ i)) lst)) 57) (>= i j))) (setq dau (cons tmp dau))))))
(setq tmp2(vl-list->string (while (not (or (<= 48 (setq tmp (nth (setq j (1- j)) lst)) 57) (<= j i))) (setq cuoi (cons tmp cuoi)))))
(if (vl-string-search "." (setq num (vl-string-left-trim tmp1 (vl-string-right-trim  tmp2 str)))) (atof num) (atoi num))
)
)

Hì hì ^^

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
Doan Van Ha    2.678

Sáng dậy làm thêm phát nữa ^^ : (đầu cuối số)

(defun tach()...

Hì hì ^^

Chỉ mỗi hàm chia Text có/không tiền/hậu tố ra thành 3 phần: tiền tố, số, hậu tố mà đã lắm vấn đề! Cả 3 hàm: chia, txt2num, tach đều có vấn đề, trích dẫn:

(chia "a.bcd.gh") => ; error: bad argument type: stringp nil => NO!

(txt2num "a.b012.3400cd.gh") => ; error: bad argument type: numberp: nil => NO!

(tach "a.b012.3400cd.gh") => ("a.b" "cd.gh" 12.34) => NO! (vì bỏ số 0 đằng trước số và bỏ 2 số 0 đằng sau của số)

Hy vọng hàm dưới đây không có sự cố. Trên cơ sở đó sẽ h/c và bổ sung thêm 1 số vấn đề cho lệnh copy-Array ở trên. Ket test giùm nhé!

Trích dẫn:

(ha "a.b012.3400cd.gh") => ("a.b" "012.3400" "cd.gh")

(ha "012.3400cd.gh") => ("" "012.3400" "cd.gh")

(ha "a.b012.3400") => ("a.b" "012.3400" "")

(ha "a.bcd.gh") => ("a.bcd.gh" "" "")

(defun HA (str / trai phai lstt lstn)
(setq lstt (vl-string->list str) lstn (reverse lstt))
(while lstt
 (cond ((or (< (car lstt) 48) (> (car lstt) 57)) (setq trai (cons (car lstt) trai) lstt (cdr lstt)))
		(T (setq lstt nil))))
(while lstn
 (cond ((or (< (car lstn) 48) (> (car lstn) 57)) (setq phai (cons (car lstn) phai) lstn (cdr lstn)))
		(T (setq lstn nil))))
(list (vl-list->string (reverse trai))
	(if (= (strlen str) (strlen (vl-list->string (reverse trai)))) ""
     	(vl-string-right-trim (vl-list->string phai) (vl-string-left-trim (vl-list->string trai) str)))
	(if (= (strlen str) (strlen (vl-list->string (reverse trai)))) ""
     	(vl-list->string phai))))

  • 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
ketxu    2.653

Tks bác ĐVH. E rất khâm phục tính quyết làm tới cùng của bác..^^ Tuy nhiên em thấy code HA vẫn... dài quá

Cả 2 hàm e viết đều dựa trên ý tách ab5.3cdf của bác và ngắn hơn, chứ không phải là xử lý tất cả tình huống.

Hàm txt2num e viết với ý đồ cụm số phải liền nhau, k ngờ tới có cụm số thâm như thế, nên pos trả về giá trị Nil ^^

Hàm tach, trong ví dụ của bác, theo em thế là đạt yêu cầu (tất nhiên với nhiều trường hợp bác chưa nêu thì còn ốm nữa ^^)

Ở đây 12.34 chính là kết quả của (atof "012.3400"), chứ bác để "012.3400" thì là định dạng số gì ạ ? cộng trừ nó thế nào ? Chẳng qua là em đã gộp bước chuyển sang số vào trong kết quả thôi ^^. Nếu không tin, bác có thể thử bỏ những dòng atof, atoi đi thì kết quả sẽ ra y hệt hàm của bác ^^ (định dạng đầu - cuối - string thể hiện số)

(defun tach (str / i j dau cuoi tmp tmp1 tmp2)
(setq lst (vl-string->list str) i -1 j (strlen str))
(list
(setq tmp1 (vl-list->string (reverse (while (not (or (<= 48 (setq tmp (nth (setq i (1+ i)) lst)) 57) (>= i j))) (setq dau (cons tmp dau))))))
(setq tmp2(vl-list->string (while (not (or (<= 48 (setq tmp (nth (setq j (1- j)) lst)) 57) (<= j i))) (setq cuoi (cons tmp cuoi)))))
(setq num (vl-string-left-trim tmp1 (vl-string-right-trim tmp2 str))))
)

Command: (tach "a.b012.3400cd.gh")

("a.b" "cd.gh" "012.3400")

 

Command: (tach "012.3400cd.gh")

("" "cd.gh" "012.3400")

 

Command: (tach "a.b012.3400")

("a.b" "" "012.3400")

 

Command: (tach "a.bcd.gh")

("a.bcd.gh" "" "")

  • 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
Doan Van Ha    2.678

Tks bác ĐVH. E rất khâm phục tính quyết làm tới cùng của bác..^^ Tuy nhiên em thấy code HA vẫn... dài quá

Cả 2 hàm e viết đều dựa trên ý tách ab5.3cdf của bác và ngắn hơn, chứ không phải là xử lý tất cả tình huống.

Hàm txt2num e viết với ý đồ cụm số phải liền nhau, k ngờ tới có cụm số thâm như thế, nên pos trả về giá trị Nil ^^

Hàm tach, trong ví dụ của bác, theo em thế là đạt yêu cầu (tất nhiên với nhiều trường hợp bác chưa nêu thì còn ốm nữa ^^)

Ở đây 12.34 chính là kết quả của (atof "012.3400"), chứ bác để "012.3400" thì là định dạng số gì ạ ? cộng trừ nó thế nào ? Chẳng qua là em đã gộp bước chuyển sang số vào trong kết quả thôi ^^. Nếu không tin, bác có thể thử bỏ những dòng atof, atoi đi thì kết quả sẽ ra y hệt hàm của bác ^^ (định dạng đầu - cuối - string thể hiện số)

1). Tôi cũng rất khâm phục tính theo tới cùng của Ket. Tất nhiên nhờ vậy mà tôi và Ket đều biết lỗi của mình là ở chỗ nào.

2). Cả 3 hàm Chia, Tach, Txt2num đều có những lỗi nào đó, thôi không bàn nữa, vì Ket và tôi đã vá được rồi.

3). Hàm "HA" dài quá: tôi thấy nó cũng không dài lắm so với hàm "TACH", nhưng dẫu có dài thì cũng không đến nỗi gì, vì chúng ta đã đạt mục đích chung.

4). Ket nói "012.3400" là định dạng số gì ạ, thì câu này hơi lạ. Ai cũng biết 012.3400 chính là 12.34, nhưng 2 cách viết thể hiện 2 ý đồ khác nhau: cách viết đầu ý muốn số trước thập phân phải thể hiện bằng 3 chữ số, còn số sau thập phân là 4 chữ số. Tại sao biển số xe mới đây người ta ghi 001.20 mà không ghi 1.2 cho gọn. Còn cộng trừ nhân chia... thì nó vẫn vô tư.

Thân thươ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

Đăng nhập để thực hiện theo  

×