Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
194 replies to this topic

#101 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 26 November 2011 - 09:30 PM

đú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 độ?
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#102 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 27 November 2011 - 09:07 AM

Ý, 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
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#103 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 27 November 2011 - 11:04 AM

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.
  • 2

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#104 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 27 November 2011 - 12:57 PM

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


  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#105 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 27 November 2011 - 02:52 PM

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!
  • 2

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#106 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 27 November 2011 - 08:57 PM

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.
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#107 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 29 November 2011 - 08:27 PM

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

  • 3
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#108 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 30 November 2011 - 06:34 AM

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 )

  • 1

#109 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 30 November 2011 - 11:07 AM

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.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#110 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 30 November 2011 - 11:23 AM

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
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#111 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 30 November 2011 - 11:37 AM

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.
  • 2

#112 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 01 December 2011 - 11:18 AM

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
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#113 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 01 December 2011 - 12:19 PM


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.

Bài viết đã được chỉnh sửa nội dung bởi gia_bach: 01 December 2011 - 03:44 PM

  • 0

#114 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 01 December 2011 - 01:18 PM

E cũng undo 1 phát xong ^^ CAD2007
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#115 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 01 December 2011 - 02:44 PM

vậy chắc cad2007 không bị hiện tượng này. đây là ảnh chụp màn hình của mình. Cad2010
Hình đã gửi
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#116 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 02 December 2011 - 08:30 AM

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)

  • 1

#117 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 02 December 2011 - 09:09 AM

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
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#118 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 03 December 2011 - 08:24 PM

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.
  • 0

#119 thichhoabinh

thichhoabinh

    biết vẽ circle

  • Members
  • PipPip
  • 32 Bài viết
Điểm đánh giá: 6 (bình thường)

Đã gửi 05 December 2011 - 12:54 PM

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ứ ^^
  • 1

#120 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 05 December 2011 - 02:12 PM

@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 đó.
  • 1

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD