Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
ketxu

[Thảo luận] Viết lại các hàm Express

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

đúng là ngớ ngẩn khi cẩn thận (setq lst1 nil). ketxu thử kiểm tra xem hàm này và hàm của bạn thằng nào chạy nhanh hơn thì lấy. Mình hơi ác cảm với 3 thằng vl-remove vì nó gây chậm chương trình của mình tương đối nhiều nên hạn chế dùng nó để viết hàm con.

Tiện đây bạn cho mình hỏi lợi ích của vl-position so với member là gì? nó hơn về tính tổng quát hay về tố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

Ý, theo e bác có thể bỏ dòng setq nil ở đầu tiên đi và thay member bằng vl-position ^^

Có 1 hàm tương tự ở mục Hỏi về lisp e gửi bằng đệ quy , k biết có nên dùng k :(

http://www.cadviet.c...ndpost&p=149078

Hề hề hề,

1/- Theo mình không nên bỏ vì có nó tốc độ không chậm đi bao nhiêu cả mà trong một số trường hợp khi không có nó cái lst1 dễ bị kéo theo các thằng ngoại lai khác do các hàm phía trước để lại. Việc này mình đã từng dính đòn khi viết và test các lisp.

2/- Đồng ý với bác ThaitStreet.

3/- Nhân thể té nước theo mưa, xin các bác giải đáp cho một số thắc mắc

Mình vừ viết thử một hàm CV:ss-explode-it nhằm explode các đối tượng có trong tập chọn ss và trả về 1 bộ chọn các đối tượng vừa được explode ra. Tuy nhiên mình không sử dụng hàm Command mà sử dụng phương pháp dùng các hàm vla-....vlax- như bác ketxu hướng dẫn.

Nó đây:


(defun CV:ss-explode-it (ss / lst obj ssl )
(setq ssl (CV:ss-to-list ss T) lst (list))
(foreach obj ssl
       (if (vlax-method-applicable-p obj  'Explode )
           (progn
                 (setq lst (append (vlax-safearray->list (vlax-variant-value (vlax-invoke-method obj 'Explode))) lst))
                 (vla-delete obj)
           )
           (princ "\n Doi tuong khong explode duoc \n ")
  	)
)      
(CV:list-to-ss lst)
)

 

Tuy nhiên, do đây là lần đầu tiên mình cố gắng làm hoàn chỉnh một function với các hàm vla- và vlax- nên trong quá trình này mình phát hiện ra vài điều khó hiểu như sau:

a/- Đối tượng mtext không cho sử dụng explode method. Vậy sao mình vẫn dùng command để explode nó được??? Cũng vì lý do này mà mình thêm vào tên hàm chữ it (explode dược ít hơn khi dùng command như của bác hochoaivandot.)

b- Khi sử dụng hàm (vlax-invoke-method obj method) vẫn phải dùng thêm các đối số tương tự như khi dùng (vla-method ....)

Vậy phải chăng hàm vlax-invoke-method .... ) có cách sử dụng khác với (vlax-invoke ......)

c/- Các hàm (vlax-invoke-method.... ) và (vla-method ....) trả về cùng một dạng kết quả như nhau khi dùng cùng một method chứ không phải khác nhau như bác ketxu đã hướng dẫn. (mình đã kiểm tra với các method copy, move, explode,delete) Vậy phải chăng mình dùng chưa đúng???

d/- Việc sử dụng expolde method để phá vỡ các đối tượng phức không làm mất đi đối tượng này mà chỉ thêm các đối tượng tạo thành đối tượng phức vào bản vẽ. (đó chính là lý do mình phải thêm một hàm (vla-delete obj) vào đoạn code trên). Điều này khác với khi sử dụng command "explode". Như vậy phải chăng việc dùng command sẽ tốt hơn là dùng các hàm vla-, vlax- ???

e/- Thực tế mình thấy dùng vla- , vlax- .. thì vấn đề tốc độ có vẻ như tốt hơn dùng command kha khá các bác ạ. Như vậy các bác có thể phân tích và lý giải giùm cái sự nên và không nên dùng command không ạ.

f/- Trong đoạn code trên khi mình chưa bổ sung hàm (setq lst (list)) vào đầu lisp thì khi chạy cái lst cứ được nối hoài hoài sau mỗi lần test mặc dù đã nhét biến lst vào nhóm biến cục bộ.( Đấy cũng là lý do mà mình trả lời ở ý 1 của bài post này.). Vậy phải chăng là việc đặt biến cục bộ trong các hàm sử dụng các biến vla-object này là không có tác dụng????

 

Hề hề hề, cái hàm (CV:ss-explode-it (ss / lst obj ssl) ...) mà mình viết ở trên có thể dùng để kiểm chứng những điều mình nói. Rất mong các bác giải đáp giùm

  • 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

Hề hề hề,

1/- Theo mình không nên bỏ vì có nó tốc độ không chậm đi bao nhiêu cả mà trong một số trường hợp khi không có nó cái lst1 dễ bị kéo theo các thằng ngoại lai khác do các hàm phía trước để lại. Việc này mình đã từng dính đòn khi viết và test các lisp.

Không bác Bình ạ. vì ta đã xét biến lst1 là biến cục bộ rồi nên trong quá trình chạy, hàm sẽ xét giá trị tạm thời cho biến lst1 thôi. xong đâu đấy nó sẽ trả lại giá trị cũ cho lst1.

bác có thể dán cái này vào command để kiểm chứng:

(setq lst1 "Pham Thanh Binh") (defun c:test (/ lst1) (setq lst1 "Thaistreetz")).

Sau khi chạy lệnh test bác kiểm tra lại giá trị của lst1 xem

Về vấn đề tốc độ giữa các hàm vl,vla,vlax so với command thì cũng còn tùy, nhưng fần lớn là command chậm hơn. em ghét command ở thao tác undo, chậm khủng khiếp.Có lần em dùng command để viết 1 lệnh rải taluy. lệnh đó vẽ ra khoảng hơn 5.000 đối tượng. Undo phát là bản vẽ treo luôn gần 10p. sử dụng phương pháp khác thì undo gần như là tức thời. ngoài ra thì nếu ta sử dụng command bao nhiêu lần, khi undo lại nó sẽ print ra màn hình bấy nhiêu dòng thông báo gì gì đó em quên roài. rất là khó chịu.

  • 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

Hi, chào các bác ^^

Hề hề hề,

1/- Theo mình không nên bỏ vì có nó tốc độ không chậm đi bao nhiêu cả mà trong một số trường hợp khi không có nó cái lst1 dễ bị kéo theo các thằng ngoại lai khác do các hàm phía trước để lại.

 

=> Giống nhận định của bác Tuệ ở trên nè. Các biến tạm + đối số trong cục bộ hàm con không hề liên quan đến biến hàm chính.

Đối số thì hqua e nói trong list tìm chuỗi rồi, Còn biến tạm thì bác có thể thấy qua ví dụ:

(setq a 1) ;Main

(defun test (/ a) a)

=> (test) trả về Nil.

Tức là ngay khi chạy hàm con test, giá trị a (tạm) đã là nil

!a : trả về 1 : tức là bản thân biến a vẫn còn nguyên zin

 

2/- Đa số các trường hợp đệ quy sẽ nhanh hơn, nhưng sau bài học crash vì liên quan đến Ram khi dùng Đệ quy, nên e cũng k ưa nó lắm. CÒn chuyện tốc độ thì bác nào down sosanh + bench thử xem sao

 

3/-

a/- Đối tượng mtext không cho sử dụng explode method. Vậy sao mình vẫn dùng command để explode nó được??? Cũng vì lý do này mà mình thêm vào tên hàm chữ it (explode dược ít hơn khi dùng command như của bác hochoaivandot.) => là sự bất tiện khi dùng ActiveX, ta chỉ có thể khai thác những gì mà người ta cung cấp cho nó, còn command cải tiến qua các thời kỳ có khi làm được nhiều việc hơn bản thân nó có ^^

b- Khi sử dụng hàm (vlax-invoke-method obj method) vẫn phải dùng thêm các đối số tương tự như khi dùng (vla-method ....)

Vậy phải chăng hàm vlax-invoke-method .... ) có cách sử dụng khác với (vlax-invoke ......)

=> Như e có nói, invoke trả trực tiếp về dạng list, vla-method mới cần chuyển từ variant => safe-array => list

c/- Các hàm (vlax-invoke-method.... ) và (vla-method ....) trả về cùng một dạng kết quả như nhau khi dùng cùng một method chứ không phải khác nhau như bác ketxu đã hướng dẫn. (mình đã kiểm tra với các method copy, move, explode,delete) Vậy phải chăng mình dùng chưa đúng???

=> Bác kiểm tra thêm 1 lần nữa xem, e cũng mới test vài trường hợp chứ chưa test hết các method ^^

 

f/- Trong đoạn code trên khi mình chưa bổ sung hàm (setq lst (list)) vào đầu lisp thì khi chạy cái lst cứ được nối hoài hoài sau mỗi lần test mặc dù đã nhét biến lst vào nhóm biến cục bộ.( Đấy cũng là lý do mà mình trả lời ở ý 1 của bài post này.). Vậy phải chăng là việc đặt biến cục bộ trong các hàm sử dụng các biến vla-object này là không có tác dụng????

=> e k nghĩ vậy đâu ^^

Hề hề hề, cái hàm (CV:ss-explode-it (ss / lst obj ssl) ...) mà mình viết ở trên có thể dùng để kiểm chứng những điều mình nói. Rất mong các bác giải đáp giùm

  • 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

em ghét command ở thao tác undo, chậm khủng khiếp.Có lần em dùng command để viết 1 lệnh rải taluy. lệnh đó vẽ ra khoảng hơn 5.000 đối tượng. Undo phát là bản vẽ treo luôn gần 10p. sử dụng phương pháp khác thì undo gần như là tức thời. ngoài ra thì nếu ta sử dụng command bao nhiêu lần, khi undo lại nó sẽ print ra màn hình bấy nhiêu dòng thông báo gì gì đó em quên roài. rất là khó chịu.

1). Đỏ: sao tôi undo thì nó đâu in ra màn hình như bác nói nhỉ? Chắc bác cũng đã set cmdecho 0, command undo begin, command undo end rồi chứ nhỉ? Hay còn lý do gì nữa chăng?

2). Xanh: tôi đồng quan điểm như bác.

@PTB: Tôi nhớ bác SSG có viết một bài về ưu/nhược của command, giờ tìm không ra để link cho bác, tiếc quá.

Có 1 cái dỡ của command mà quá trình làm tôi đã phát hiện ra: khi ở trong đoạn code của hàm grread mà có dùng hàm command thì màn hình nó sẽ bị nháy. Nháy càng nhiều khi dùng command càng nhiều bác ạ. Thậm chí có khi phải pick mouse mấy lần liền nó mới nhận điểm. Có bác nào biết để "xử" nó không?

Thân thương!

  • 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

1) sao tôi undo thì nó đâu in ra màn hình như bác nói nhỉ? Chắc bác cũng đã set cmdecho 0, command undo begin, command undo end rồi chứ nhỉ? Hay còn lý do gì nữa chăng?

Bác thử cái này

(defun c:vl (/ p1 p2)

(setvar "cmdecho" 0)

(command "undo" "begin")

(setq p1 (getpoint (setq p2(getpoint)))) (repeat 200 (command "line" p1 p2 ""))

(command "undo" "end")(princ))

Chạy lệnh VL xong thì bác undo 1 phát. mình lặp 200 lần nên nếu bác rảnh rỗi để đếm thì sẽ thấy đủ 200 lần thông báo "(Lisp Expression)"

PS: riêng (command "undo"...) thì không bị trả về thông báo nà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

Hề hề hề,

Thêm một thằng CV:string-replace thay thế cho (acet-str-replace "a" "b" "c")

Thằng này mình xài trộm cái hàm CV:string-find của bác ketxu nhưng đổi tên một tí để phân biệt với các hàm đã được viết trước. Hề hề hề.

Các bác kiểm tra chất lượng thử coi có đạt chuẩn không hè.


(defun CV:string-replace ( a b c / )
(foreach m (cv:string-findm b c nil)
     (setq c (strcat (substr c 1 (1- m)) a (substr c  (+ m (strlen b )))))
)
)

(defun CV:String-FindM (sym str ignoreCase / pos lst)
(if ignoreCase (setq str (strcase str) sym (strcase sym)))
(setq len (strlen sym) pos (- len))
(reverse
   (while (setq pos (vl-string-search sym str (+ pos len)))
       (setq lst (cons (1+ pos) lst))
   )
)
)

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

Hề hề hề,

Thêm một thằng CV:string-replace thay thế cho (acet-str-replace "a" "b" "c")

Thằng này mình xài trộm cái hàm CV:string-find của bác ketxu nhưng đổi tên một tí để phân biệt với các hàm đã được viết trước. Hề hề hề.

Các bác kiểm tra chất lượng thử coi có đạt chuẩn không hè.


(defun CV:string-replace ( a b c / )
(foreach m (cv:string-findm b c nil)
     (setq c (strcat (substr c 1 (1- m)) a (substr c  (+ m (strlen b )))))
)
)

(defun CV:String-FindM (sym str ignoreCase / pos lst)
(if ignoreCase (setq str (strcase str) sym (strcase sym)))
(setq len (strlen sym) pos (- len))
(reverse
   (while (setq pos (vl-string-search sym str (+ pos len)))
       (setq lst (cons (1+ pos) lst))
   )
)
)

Chào bác Bình!

1. Cái của bác không giống với ACET-STR-REPLACE ở chổ :

(CV:STRING-REPLACE "a" "b" "ccccccc") -> trả về NIL

Còn (acet-STR-REPLACE "a" "b" "ccccccc") -> trả về "ccccccc"

 

2. Việc bác sử dụng hàm CV:String-FindM thực sự cũng không cần thiết lắm.

Bác sử dụng 2 vòng lặp (Vòng lặp While tạo List và Foreach để Replace) trong chương trình của bác, em nghĩ chỉ cần 1 vòng while là đủ như code mà em viết dưới đây

(defun CV:string-replace (a b c / i)
(setq i 0)
(while (setq i (vl-string-search a c i))
(setq c (vl-string-subst b a c) i (+ i 1))
) c )

  • 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
Chào bác Bình! 1. Cái của bác không giống với ACET-STR-REPLACE ở chổ : (CV:STRING-REPLACE "a" "b" "ccccccc") -> trả về NIL Còn (acet-STR-REPLACE "a" "b" "ccccccc") -> trả về "ccccccc" 2. Việc bác sử dụng hàm CV:String-FindM thực sự cũng không cần thiết lắm. Bác sử dụng 2 vòng lặp (Vòng lặp While tạo List và Foreach để Replace) trong chương trình của bác, em nghĩ chỉ cần 1 vòng while là đủ như code mà em viết dưới đây
 (defun CV:string-replace (a b c / i) (setq i 0) (while (setq i (vl-string-search a c i)) (setq c (vl-string-subst b a c) i (+ i 1)) ) c ) 

Hề hề hề,

Rất cám ơn bác Tue_NV đã góp ý chân thành.

Thú thực với các bác là cái món vl- vla-, vlax- này mình vốn dĩ đã ngại sờ tới vì...... dốt. Qua cái việc viết này mới vỡ dần dần ra chứ chưa hiểu và sử dụng thành thục ngay được. Khi viết xong mình chỉ kiểm tra theo mấy phép thử đơn giản rồi post lên chứ không có cái nhìn hoàn chỉnh như các bác. Vì thế để lại các lỗi mà các bác phát hiện. Xin thành thật xin lỗi mọi người. Cũng qua đó mình có thêm những kiến thức để hoàn thiện mình.

Về việc sử dụng cái hàm CV-string-findm cũng là một việc mà mình muốn kế thừa những điều đã được kiểm chứng chứ không muốn làm lại từ đầu. Như vậy nếu như bổ sung thêm một hàm kiểm tra điều kiện tồn tại của cái thằng CV:string-findm vào trong đoạn lisp mình viết thì có thể sửa được cái lỗi mà mình đã mắc các bác nhể.

Về cái lisp bác Tue_Nv đã viết, mình thấy đúng là nó ngắn gọn hơn của mình nhiều. Tuy nhiên chưa chắc là nó sẽ chạy nhanh hơn vì tuy chỉ có một vòng lặp While nhưng nó lại phải duyệt qua tất cả các ký tự của chuỗi gốc c,( trong khi cái lisp của bác Ketxu lại giảm được số lần duyệt này thông qua biến strlen của chuỗi phải tìm b, nhưng sau đó lại phải lặp một lần nữa theo cái đoạn lisp mình viết).

Vì thế nếu chuỗi c là đủ dài và chuỗi b có số ký tự không ít thì có nhẽ số bước lặp thực tế theo cách của mình và cách của bác Tue_NV sẽ có sự chênh lệch đáng chú ý đó.

Các bác thử kiểm chứng xem sao nhé.

Hề hề hề,

Một lần nữa xin chân thành cám ơn những góp ý của bác Tue_NV.

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 của bác Tuệ số lần lặp cũng vậy ạ, vì i được tăng theo position của dãy tìm thấy. Tuy nhiên, bác Tuệ thử check với trường hợp này xem kết quả như thế nào thì phù hợp ^^ :

(CV:STRING-REPLACE "31" "123" "311")

(ACET-STRING-REPLACE "31" "123" "311")

 

Nguyên nhân cũng giống hàm Find String hôm trước

  • 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

Hề hề hề,

Rất cám ơn bác Tue_NV đã góp ý chân thành.

Thú thực với các bác là cái món vl- vla-, vlax- này mình vốn dĩ đã ngại sờ tới vì...... dốt. Qua cái việc viết này mới vỡ dần dần ra chứ chưa hiểu và sử dụng thành thục ngay được. Khi viết xong mình chỉ kiểm tra theo mấy phép thử đơn giản rồi post lên chứ không có cái nhìn hoàn chỉnh như các bác. Vì thế để lại các lỗi mà các bác phát hiện. Xin thành thật xin lỗi mọi người. Cũng qua đó mình có thêm những kiến thức để hoàn thiện mình.

Về việc sử dụng cái hàm CV-string-findm cũng là một việc mà mình muốn kế thừa những điều đã được kiểm chứng chứ không muốn làm lại từ đầu. Như vậy nếu như bổ sung thêm một hàm kiểm tra điều kiện tồn tại của cái thằng CV:string-findm vào trong đoạn lisp mình viết thì có thể sửa được cái lỗi mà mình đã mắc các bác nhể.

Về cái lisp bác Tue_Nv đã viết, mình thấy đúng là nó ngắn gọn hơn của mình nhiều. Tuy nhiên chưa chắc là nó sẽ chạy nhanh hơn vì tuy chỉ có một vòng lặp While nhưng nó lại phải duyệt qua tất cả các ký tự của chuỗi gốc c,( trong khi cái lisp của bác Ketxu lại giảm được số lần duyệt này thông qua biến strlen của chuỗi phải tìm b, nhưng sau đó lại phải lặp một lần nữa theo cái đoạn lisp mình viết).

Vì thế nếu chuỗi c là đủ dài và chuỗi b có số ký tự không ít thì có nhẽ số bước lặp thực tế theo cách của mình và cách của bác Tue_NV sẽ có sự chênh lệch đáng chú ý đó.

Các bác thử kiểm chứng xem sao nhé.

Hề hề hề,

Một lần nữa xin chân thành cám ơn những góp ý của bác Tue_NV.

Chào bác Bình!

(setq i (vl-string-search a c i)) rồi (setq i (1+ i)) thì i này nhảy tới từng vị trí của chuỗi a trong chuỗi c, chứ không lặp qua từng kí tự như bác đã viết đâu ạ

Nhảy tới vị trí là Replace luôn đó bác

Thanks KetXu đã phát hiện ra lỗi

Tue_NV sửa lại code


(defun CV:string-replace (a b c / i d)
 (setq i 0)
 (while (setq i (vl-string-search a c i))
   (setq  c (vl-string-subst b a c i) i (+ i (strlen B ) ) ) )
c)

Edit : Đã test các trường hợp.

  • 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ác thử cái này

(defun c:vl (/ p1 p2)

(setvar "cmdecho" 0)

(command "undo" "begin")

(setq p1 (getpoint (setq p2(getpoint)))) (repeat 200 (command "line" p1 p2 ""))

(command "undo" "end")(princ))

Chạy lệnh VL xong thì bác undo 1 phát. mình lặp 200 lần nên nếu bác rảnh rỗi để đếm thì sẽ thấy đủ 200 lần thông báo "(Lisp Expression)"

PS: riêng (command "undo"...) thì không bị trả về thông báo này.

 

Mấy bữa đi công tác, giờ về test thử thì đâu có lỗi như bác Thaistreetz nói nhỉ? Tôi dùng VL, sau khi vẽ 200 line xong, U một phát êm ro luôn! Các bác test giùm xem có đúng như tôi hay đúng như bác ấy, may ra mình tìm được một nguyên nhân quan trọng?

Hay cảm phiền bác Thaistreetz up bản vẽ lên để cùng nghiên cứu xem sao hè.

P/S: tôi dùng CAD 2007

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ấy bữa đi công tác, giờ về test thử thì đâu có lỗi như bác Thaistreetz nói nhỉ? Tôi dùng VL, sau khi vẽ 200 line xong, U một phát êm ro luôn! Các bác test giùm xem có đúng như tôi hay đúng như bác ấy, may ra mình tìm được một nguyên nhân quan trọng?

Hay cảm phiền bác Thaistreetz up bản vẽ lên để cùng nghiên cứu xem sao hè.

@ Doan Van Ha : bạn sử dụng phiên bản CAD mấy ?

 

Tôi test trên Cad 2010 thì k/quả giống như bác Thaistreetz.

 

Update : CAD2004 undo 1 phát cũng xong.

Chỉnh sửa theo gia_bach

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ào bác Bình!

(setq i (vl-string-search a c i)) rồi (setq i (1+ i)) thì i này nhảy tới từng vị trí của chuỗi a trong chuỗi c, chứ không lặp qua từng kí tự như bác đã viết đâu ạ

Nhảy tới vị trí là Replace luôn đó bác

Thanks KetXu đã phát hiện ra lỗi

Tue_NV sửa lại code


(defun CV:string-replace (a b c / i d)
 (setq i 0)
 (while (setq i (vl-string-search a c i))
   (setq  c (vl-string-subst b a c i) i (+ i (strlen B ) ) ) )
c)

Edit : Đã test các trường hợp.

Bổ sung thêm trường hợp có/không phân biệt chữ hoa/thường cho gần giống với Acet-STR-Replace


(defun CV:string-replace (Lst / i find rep str icase)
;;;;;write by Tue_NV
 ;;;;Example : (CV:STRING-REPLACE '("a" "c" "Autocad CAdViet"))   	-> "Autoccd CAdViet"
 ;;;;;hoac 	(CV:STRING-REPLACE '("a" "c" "Autocad CAdViet" nil))   -> "Autoccd CAdViet"
 ;;;;  (CV:STRING-REPLACE '("a" "c" "Autocad CAdViet" t)) -> "cutoccd CcdViet"
 (setq i 0)
 (mapcar 'set '(find rep str icase) Lst)
 (while (setq i (vl-string-search (if icase (strcase find) find)
 (if icase (strcase str) str) i))
   (if icase
(setq str (vl-string-subst (strcase find) find str i)
	str (vl-string-subst rep (strcase find) str i))
       (setq str (vl-string-subst rep find str i))
   )
   (setq i (+ i (strlen rep) ) ) )
str)

  • 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

Bổ sung thêm trường hợp có/không phân biệt chữ hoa/thường cho gần giống với Acet-STR-Replace

Liệu có cần tính đến wildcard không các bác nhỉ ? Như thế thì sẽ mệt hơn, n mà cũng thấy ít 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

Liệu có cần tính đến wildcard không các bác nhỉ ? Như thế thì sẽ mệt hơn, n mà cũng thấy ít dùng

Nếu viết được như thế thì tuyệt quá. Và phải xử lý hàm CV:string-find trước. Sau đó mới tới CV:string-replace .

Có điều code sẽ dài hơn, và xử lý sẽ mệt hơn.

 

Tue_NV nghĩ rằng hàm CV:string-replace như vầy cũng đủ rồi

 

Và chắc có lẽ là mình tìm cách Load bộ Express lên khi User chưa cài, khi viết chương trình LỚN

Chứ đằng nào cũng sử dụng Express : có mấy hàm độc mà Lisp chưa chắc viết lại được.

Còn viết những tiện ích nhỏ nhỏ thì viết lại các hàm Express mà Lisp có thể viết lại được, đó là điều hợp lý.

 

Topic này mà đổi lại thành [Thảo luận] Viết lại toàn bộ hàm Express hoặc viết lại các hàm Express mà Lisp chưa chắc làm được thì Tue_NV mới ủng hộ cả 2 tay.

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 hàm độc của Express lại là ARX bác Tuệ ạ. Còn những hàm bình thường, người ta viết được = Lisp, thì tất nhiên CVmems cũng sẽ viết được, và có thể còn hay hơn ấy chứ. Được hàm nào hay hàm ấy, và theo e thấy thì cũng nhiều người được lợi từ cái topic này r đó chứ ^^

  • 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

@Bác Tue_NV: Nghe bác lăn tăn nhiều về vấn đề có nên viết hay không viết lại các hàm acet (Vì chắc chắn là không thể viết lại được toàn bộ) nên em sẽ nói luôn về trường hợp của em để thấy rằng Mod Ketxu khởi động dự án này là cần thiết và nhiều người cần nó:

Vì muốn đạt được sự linh hoạt tối đa khi sử dụng, chỉ cần load và chạy trên bất kỳ máy nào nên toàn bộ lisp của em được đóng gói vào 1 project fas duy nhất (trong đó có tất cả các thứ fục vụ cho quá trình chay: thư viện hàm, block, dimstyle, texsty, layer,linetype...). lẽ dĩ nhiên việc đó đòi hỏi tất cả các thư viện em sử dụng fải được đóng gói luôn vào trong file fas đó. Rồi 1 lần sang máy lạ không cài express mới fát hiện ra gần như toàn bộ các lệnh của em đểu không chạy được do em hay sử dụng acet. Vấn đề là có 1 số lệnh tương đối đơn giản cũng không chạy được dù không sử dụng các hàm đặc biệt, khi đó em nhận ra là mình đã quá lệ thuộc vào acet, nếu em tự viết các hàm có cùng chức năng acet thì chương trình của em đã không bị lệ thuộc quá nhiều như vậy.

thực tế thì các hàm đặc biệt chỉ đôi khi chúng ta mới dùng, và nếu không có express thì em cũng chỉ mất 1 vài lệnh ít dùng là không thể chạy được. Em vẫn dùng acet và em vẫn ủng hộ topic này vì điều đó.

  • 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

Các hàm độc của Express lại là ARX bác Tuệ ạ. Còn những hàm bình thường, người ta viết được = Lisp, thì tất nhiên CVmems cũng sẽ viết được, và có thể còn hay hơn ấy chứ. Được hàm nào hay hàm ấy, và theo e thấy thì cũng nhiều người được lợi từ cái topic này r đó chứ ^^

Vậy ai thấy hàm nào độc thì quăng lên + giới thiệu chức năng -> ai biết thì viết lại, ko biết thì chờ

mình ngồi chờ. hehe

  • 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

Vậy ai thấy hàm nào độc thì quăng lên + giới thiệu chức năng -> ai biết thì viết lại, ko biết thì chờ

mình ngồi chờ. hehe

Thay vì ngồi chờ, mình sử dụng Express cho xong

Chỉ Load cái Arx và mấy cái file fas mà ngại chi User có cài Express hay không?

Ngại chi mà ngại chi... he he

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

Thay vì ngồi chờ, mình sử dụng Express cho xong

Chỉ Load cái Arx và mấy cái file fas mà ngại chi User có cài Express hay không?

Ngại chi mà ngại chi... he he

hehe,

Bác Tue_NV nói cũng có lý, tuy nhiên các bạn viết lại cũng là 1 cách nâng cao khả năng của họ, đôi khi họ làm ra thứ mà ACET chưa chắc làm dc.

Have fun!

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

hehe,

Bác Tue_NV nói cũng có lý, tuy nhiên các bạn viết lại cũng là 1 cách nâng cao khả năng của họ, đôi khi họ làm ra thứ mà ACET chưa chắc làm dc.

Have fun!

Quá có lý ấy chứ! Mình thì không chờ! Đã có sao ta không sử dụng nè! he he

 

Vấn đề mà bạn nói ở đây là viết lại để nâng cao khả năng tư duy thì mình OK vì mình có tham gia viết hàm trong topic này mà

 

Còn vấn đề viết lại hàm Express là để khỏi ngại User có cài Express hay không thì mình chưa tán đồng lắm vì lý do trên.

Nếu bạn sử dụng các hàm độc trong Express thì sao? Bạn phải xử lý như thế nào? Chắc cũng phải Load file ARX và mấy file fas lên (nếu bạn chưa cài)

 

Còn ACET chưa chắc làm được nhưng điều mà LISP viết thì mình không chắc vì mình chưa học ARX (nhưng hầu hết đều làm được vì ARX là 1 ngôn ngữ rất mạnh).

Và những điều ARX làm được nhưng với LISP thì không thể là 1 điều chắc chắ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
Đăng nhập để thực hiện theo  

×