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ị

 

Chắc chắn là có bác ạ. Vì vậy khi viết lisp nếu sử dụng bất kỳ hàm nào của Vlisp ta đều cần có (vl-load-com) ở đầu. Vì hàm này chỉ cần load 1 lần cho toàn phiên làm việc nên trong từng hàm con ta không nên đưa nó vào nữa

Hề hề hề,

Chờ thì chờ......

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ắc chắn là có bác ạ. Vì vậy khi viết lisp nếu sử dụng bất kỳ hàm nào của Vlisp ta đều cần có (vl-load-com) ở đầu. Vì hàm này chỉ cần load 1 lần cho toàn phiên làm việc nên trong từng hàm con ta không nên đưa nó vào nữa

 

Nếu có 1 cái List đầu topic. Trong đó có cột tick đã viết. Có 1 cột đăng ký viết. Có lẽ như thế sẽ dễ theo dõi cho các thành viên hơn. Thu hút được nhiều người tham gia mà không bị chồng chéo viết đi viết lại. Hơn nữa nếu ai muốn viết code nào (hoặc có người đã viết rồi mà chưa post) tick vào đăng ký viết post lên thì sẽ tiết kiệm time hơn và giảm sức nặng cho ketxu. Mình nghĩ như vậy tổ sẽ mau đầy 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

Tiếp theo là hàm ACET-Dxf.

- Hàm này cho phép lấy giá trị mã Dxf của 1 assoc list, ta thường lợi dụng để lấy giá trị từ entget ename

- Ngắn gọn có thể viết :

(defun Cv:dxf (dxf en)(cdr(assoc dxf (entget en))))

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 cũng bon chen xin góp một hàm: SS-visible, ẩn hiện đối tượng

ss là tập chọn, vis là 0 (hiện dt) hoặc 1 là ẩn dt

(defun CV:ss-visible(ss vis / e n l)
 (setq n (sslength ss))
 (while (setq e (ssname ss (setq n (1- n))))
(setq l (entget e)
  l(vl-remove (assoc 60 l) l)
  l(vl-list* (cons 60 vis) l)
  )
(entmod l)
)
 )

  • 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ái vụ cãi nhau này cuối cùng cũng dứt được rồi ah. :rolleyes:

Mình góp đây:

acet-pixel-unit : lấy ra tỷ lệ số đơn vị bản vẽ chứa trong 1 pixel màn hình (rất hữu dụng với bác nào hay dùng vector)

(defun CV:pixel-unit nil (/ (getvar "viewsize")(cadr (getvar"screensize"))))

acet-sys-sleep: tạm dừng mọi tính toán trong thời gian ms (đôi khi chúng ta muốn làm chậm chương trình của mình lại 1 chút)

(defun CV:sys-sleep  (ms / x) (setq x (+ (getvar "cdate")(* ms 1E-8)))(while (> x (getvar "cdate"))))

Còn vài cái nữa, cứ từ từ kiếm thank, hê hê

@ketxu: Sếp nên test rồi cập nhật các hàm đã được viết lên post #1 cho anh em dễ theo dõi. lưu ý cho anh em cách đặt tên nữa đi, lung tung cả rồi kìa

  • 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 cũng bon chen xin góp một hàm: SS-visible, ẩn hiện đối tượng
 (defun CV:ss-visible(ss vis / e n l) (setq n (sslength ss)) (while (setq e (ssname ss (setq n (1- n)))) (setq l (entget e) l(vl-remove (assoc 60 l) l) l(vl-list* (cons 60 vis) l) ) (entmod l) ) ) 

Hề hề hề,

Bác lp_hai thử check lại xem nhé. có vẻ như chưa được ngon như thằng (acet-ss-visible ss vis) bác ạ. Hình như cái dxf 60 còn phải có thêm điều kiện chi đó nữa bác ạ.

Hề 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

Cái vụ cãi nhau này cuối cùng cũng dứt được rồi ah. :rolleyes:

Mình góp đây:

 

Còn vài cái nữa, cứ từ từ kiếm thank, hê hê

@ketxu: Sếp nên test rồi cập nhật các hàm đã được viết lên post #1 cho anh em dễ theo dõi. lưu ý cho anh em cách đặt tên nữa đi, lung tung cả rồi kìa

Hề hề hề,

Liều mạng thử phát xem có được không hè, mong các bác cứ chỉ dạy tận tình nghen.

 

;;; Ham xoa cac doi tuong trong tap chon ss
;;; Doi so la bo chon ss duoc tra ve tu cac ham ssget, ssadd, ssdel, acet-list-to-ss, Cv:list-to-ss.


(defun CV:ss-entdel (ss / n e )
(setq n (sslength ss))
(while (setq e (ssname ss (1- n))
             (setq n (1- n))
             (entdel e)
)
)

 

Hề hề hề, đang phân vân không biết có nên nhét thằng (princ) vô hay không vì hàm trả về tên đối tượng cuối cùng bị xóa. Các bác cho ý kiến hè....

Chỉnh sửa theo phamthanhbinh
Sai lỗi chính tả.
  • 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

Hề hề, có nên cho bác ạ. Cái này tùy người sử dụng thôi.

À, nếu các bác không ngại, có thể ghi cả trường hợp sử dụng những hàm mang tính kế thừa vào hàm của mình (nếu có thể), như vậy ai thích sự hệ thống thì có thể xài luôn : (k cũng k sao, thì càng dễ nhớ hơn và k phải mang thêm hàm khác)

VD :

(defun CV:ss-entdel (ss)(mapcar 'entdel (CV:ss-to-list ss nil)))

(defun CV:ss-visible (ss visible )(mapcar '(lambda(x)(vla-put-visible x visible))(CV:ss-to-list ss T)))

 

Hàm bác Bình viết hơi syntax error, e xin phép chỉnh lại :

 

(defun CV:ss-entdel (ss / n e )
(setq n (sslength ss))
(while (setq e (ssname ss (setq n (1- n))))
        	(entdel e)
)
(princ)
)

 

P/s : dạo này 4r làm sao ý, e sửa lại bài thì nó lại thành bài đầu tiên e post :|

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

À, nếu các bác không ngại, có thể ghi cả trường hợp sử dụng những hàm mang tính kế thừa vào hàm của mình (nếu có thể), như vậy ai thích sự hệ thống thì có thể xài luôn : (k cũng k sao, thì càng dễ nhớ hơn)

VD :

(defun CV:ss-entdel (ss)(mapcar 'entdel (CV:ss-to-list ss nil)))

Mới mấy tiếng đồng hồ mà kho hàm "CV-..." đã khấm khá rồi đấy. Chắc lúc nào rảnh rảnh cũng góp vui một cái cho xôm.

Thảo luận tí: viết kế thừa là quá tốt, viết ngắn cũng quá tốt, nhưng viết dài chưa chắc đã không tốt. Chúng ta đang làm từng thằng lẻ nên chúng ta ít để ý đến tốc độ của nó. Tuy nhiên khi đưa nó vào trong các chương trình dài hơi thì điều này là cực quan trọng. Vì vậy, cần phải quan tâm tới tốc độ hơn là dài/ngắn. Mà làm sao để biết tốc độ hàm mình viết ra có nhanh không nhỉ? Bàn thêm chút này cũng hữu ích các bác nhỉ!

Thân thương!

P/S: nói thêm 1 chút về tốc độ: thường chúng ta viết các trình lisp hay cố giảm biến cục bộ càng nhiều càng hay, nhưng cũng có đôi lúc nhiều biến cục bộ lại chạy nhanh hơn ít biến mới nghiệt chứ.

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ề tốc độ thì bên Topic Đố vui với lisp đã có mấy trang rồi, mọi người tự cảm nhận và test thôi :)

Nhưng tất nhiên khi viết điều quan trọng nhất vẫn là tốc độ rồi => k thể k nói trong mỗi hàm => một hàm viết ra sẽ có nhiều ý kiến để cùng sửa sang lại

Riêng ví dụ ketxu viết bên trên thì không cần bàn, chắc chắn là chậm hơn hàm bác Bình + bạn lp_hai viết rồi, vì nó duyệt lại list thêm 1 lần nữa, thế nên e mới nói là có thể :) (vì nêu trong 1 chương trình phải convert nhiều đoạn ss, không tội gì viết đi viết lại đoạn while, nhất là chương trình dài hơi như bác ĐVH nói)

 

Thêm 1 hàm nữa trước khi đi ngủ :

Acet-string-to-list : hàm tách string thành list các string bởi string ngăn cách.

Sử dụng : (Acet-string-to-list str_ngăn cách str_gốc)

VD : (acet-str-to-list " " "a b c") => ("a" "b" "c")

- Nhược điểm : không chấp nhận nhiều str ngăn cách liền nhau :

(defun CV:Str-to-list ( del str  / pos lst )
;@ketxu 21-11-11 based on LM
 (while (setq pos (vl-string-search del str))
(setq lst (cons (substr str 1 pos) lst) str (substr str (+ pos 1 (strlen del))))
 )
 (vl-remove "" (reverse (cons str lst))) ; add vl-remove here
)

  • 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àn về tốc độ thì bên Topic Đố vui với lisp đã có mấy trang rồi, mọi người tự cảm nhận và test thôi :)

Nhưng tất nhiên khi viết điều quan trọng nhất vẫn là tốc độ rồi => k thể k nói trong mỗi hàm => một hàm viết ra sẽ có nhiều ý kiến để cùng sửa sang lại

Riêng ví dụ ketxu viết bên trên thì không cần bàn, chắc chắn là chậm hơn hàm bác Bình + bạn lp_hai viết rồi, vì nó duyệt lại list thêm 1 lần nữa, thế nên e mới nói là có thể :) (vì nêu trong 1 chương trình phải convert nhiều đoạn ss, không tội gì viết đi viết lại đoạn while, nhất là chương trình dài hơi như bác ĐVH nói)

Không nói về hàm mà Ket viết đâu. Ý tôi nói chung chung là rất khó để xác định tốc độ của 1 hàm mà ta viết ra có tốt không, vì khi ta viết 1 hàm thì không có gì làm chuẩn để so sánh. Thậm chí nếu có người khác viết 1 hàm tương tự thì ta cũng chỉ so sánh được 2 hàm này thôi, rồi biết đâu lại có hàm thứ 3, thứ 4 nhanh hơn. Khó là chỗ đó, nên mới thảo luận, nhưng chắc chịu 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

Hề hề hề,

Bác lp_hai thử check lại xem nhé. có vẻ như chưa được ngon như thằng (acet-ss-visible ss vis) bác ạ. Hình như cái dxf 60 còn phải có thêm điều kiện chi đó nữa bác ạ.

Hề hề hề,

heeeheh, thì hàm cơ bản em thấy nó chỉ xài 2 biến, trong đó vis là 0 hoặc 1 tương đương với hiện hoặc ẩn dt.

em check thế này ko biết có thiếu xót gì ko?

(setq dt (ssget))

(CV:SS-VISIBLE dt 1)

(CV:SS-VISIBLE dt 0)

....

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ói về hàm mà Ket viết đâu. Ý tôi nói chung chung là rất khó để xác định tốc độ của 1 hàm mà ta viết ra có tốt không, vì khi ta viết 1 hàm thì không có gì làm chuẩn để so sánh. Thậm chí nếu có người khác viết 1 hàm tương tự thì ta cũng chỉ so sánh được 2 hàm này thôi, rồi biết đâu lại có hàm thứ 3, thứ 4 nhanh hơn. Khó là chỗ đó, nên mới thảo luận, nhưng chắc chịu hè.

Bác bàn về tốc độ thì em có ý này: Mình đang viết lại các hàm trong ACET thì có nên lấy mấy cái hàm của ACET làm chuẩn. Rồi mình so sánh với cái hàm mình viết lại. Nếu nhanh hơn thì tốt rồi. Còn ai có cái thứ 3 thứ 4 mà nhanh hơn nữa thì càng tốt! :)

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ọi người cứ cùng nhau bàn bạc thôi ^^

P/s : hàm của lp_hai nếu dùng sub có nhanh hơn là xóa rồi lại tái tạo list k ? Bạn check thử xem sao ?

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ọi người cứ cùng nhau bàn bạc thôi ^^

P/s : hàm của lp_hai nếu dùng sub có nhanh hơn là xóa rồi lại tái tạo list k ? Bạn check thử xem sao ?

Dùng subst chỉ được khi đã có assoc 60: (60 . 1), còn khi ban đầu dt chưa có assoc 60 thì mình ko thay thế dc, còn remove thì ko có cũng ko sao có thể áp dụng cho cả 2 trường hợp (60 . 1) và cả khi ko có assoc 60

Các bác chỉ giáo thê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

Đúng là vậy, đã có bài nói về vđ này rồi, nên khi đó đã xử lí : if (assoc 60) => substr / no => append

 

P/s : diễn đàn đang down quá....

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 bàn về tốc độ thì em có ý này: Mình đang viết lại các hàm trong ACET thì có nên lấy mấy cái hàm của ACET làm chuẩn. Rồi mình so sánh với cái hàm mình viết lại. Nếu nhanh hơn thì tốt rồi. Còn ai có cái thứ 3 thứ 4 mà nhanh hơn nữa thì càng tốt! :)

Có lẽ lp_hai hơi hiểu nhầm tôi. Như lúc đầu chúng ta đã nói, viết lại các hàm acet có 1 hoặc/và 2 mục đích: 1 là dùng acet bị trở ngại bởi việc cài express, 2 là có 1 số hàm acet viết dựa trên command nên không tiện. Như vậy, nếu viết "CV-..." có chậm hơn acet thì vẫn có thể chấp nhận được, tất nhiên nếu nhanh hơn thì quá quý hoá rồi. Ý tôi muốn nói là làm sao chúng ta có thể viết được 1 hàm "CV-..." có tốc độ tốt, chứ không hẳn là code ngắn/dài/đẹp/xấu, bởi khi đã viết xong rồi thì khi sử dụng chúng ta vẫn chỉ đưa vào lisp cái hàm đó (chứ không đưa cách viết hàm đó mà). Một VD đơn giản thôi:

(+ 3 3)

(* 2 3)

Nếu chúng ta biết được tốc độ của phép toán "+" và "*" thì chúng ta mới lựa chọn nên dùng cái nào trong 2 cái trên. Tôi đưa ra vấn đề này để mong muốn các bác lưu tâm khi chọn hàm để viết cho các hàm "CV-..." mà thôi. Nhưng theo thiển nghĩ của cá nhân thì vấn đề này không dễ chút nào. Lạm bàn một chút vậy.

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

Hề hề, có nên cho bác ạ. Cái này tùy người sử dụng thôi.

À, nếu các bác không ngại, có thể ghi cả trường hợp sử dụng những hàm mang tính kế thừa vào hàm của mình (nếu có thể), như vậy ai thích sự hệ thống thì có thể xài luôn : (k cũng k sao, thì càng dễ nhớ hơn và k phải mang thêm hàm khác)

VD :

(defun CV:ss-entdel (ss)(mapcar 'entdel (CV:ss-to-list ss nil)))

(defun CV:ss-visible (ss visible )(mapcar '(lambda(x)(vla-put-visible x visible))(CV:ss-to-list ss T)))

 

Hàm bác Bình viết hơi syntax error, e xin phép chỉnh lại :

 

P/s : dạo này 4r làm sao ý, e sửa lại bài thì nó lại thành bài đầu tiên e post :|

Hề hề hề.

Cám ơn bác ketxu đã chỉnh sửa cho nó ngắn gọn hơn. Tuy nhiên mình chưa biết của mình sai syntax ở chỗ mô vì mình đã test thì thấy nó chạy ầm ầm bác ạ.

Hề hề hề, do cái vốn lận lưng hơi hẻo nên có chi sai sót mong các bác chớ trách.

 

Hề hề hề, tìm thấy lỗi rùi, không phải là lỗi syntax mà là lỗi chính tả bác ạ,(Whlie thay vì While). Lỗi này hôm qua mình đã phát hiện ra khi test song chỉ sửa ở bản nháp để chạy mà quên sửa trong bài post. Test xong thấy nó chạy tương tự như thằng acet là khoái nên quên bác ạ. Mong các bác tha thứ cho cái tội ẩu này nhé. Mình đa sửa lại ở bài post trước.

Chỉnh sửa theo phamthanhbinh
Bổ sung bài viết.

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
Dùng subst chỉ được khi đã có assoc 60: (60 . 1), còn khi ban đầu dt chưa có assoc 60 thì mình ko thay thế dc, còn remove thì ko có cũng ko sao có thể áp dụng cho cả 2 trường hợp (60 . 1) và cả khi ko có assoc 60 Các bác chỉ giáo thêm! :)

Khi ename chưa tồn tại mã dxf 60

-> Ta có thể thêm vào mã dxf 60 (dùng hàm append)

Khi ename đã có mã dxf 60 ta có thể thay thế (dùng hàm subst)

 

 

(if (not (assoc 60 ename))

(setq ename (append ename (list(cons 60 vis))))

(setq ename (subst (cons 60 vis) (assoc 60 ename) ename)))

)

(entmod ename)

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

Dùng subst chỉ được khi đã có assoc 60: (60 . 1), còn khi ban đầu dt chưa có assoc 60 thì mình ko thay thế dc, còn remove thì ko có cũng ko sao có thể áp dụng cho cả 2 trường hợp (60 . 1) và cả khi ko có assoc 60

Các bác chỉ giáo thêm! :)

Hề hề hề,

Thực tình mình chưa rõ cái cơ chế ẩn hiện của thằng (assoc 60 elist) này lắm. Tuy nhiên khi test thử thì thấy có một số đối tượng không bị ẩn đi. Kiểm tra lại bằng hàm (acet-ss-visible ....) thì lại thấy nó ẩn được nên mới có ý kiến như vầy.

Tham khảo một vài hàm ẩn hiện đã có trên diễn đàn thì thấy nó viết hơi loằng ngoằng, có thêm cả bước kiểm tra mã dxf 70 nữa bác ạ. và nó cũng dùng hàm điều kiện (if (assoc 60 elist) như bác Ketxu đã nói. Thay vì nó xóa đi rồi làm lại như bác thì nó lựa chọn hoặc là (subst ...._ hoặc là (append ......) hay (cons .....)

Nói chung cách như bác cũng được nếu như nó nhanh hơn bác ạ.

Vấn đề chỉ còn lại là vì sao có đối tượng chịu ẩn mà có đối tượng lại không chịu núp thôi. (thường là các đối tượng phức như hatch, mtext ...)

Cái mà dxf 70 mà họ dùng là có ý nghĩa chi, và tại sao họ lại phải dùng nó?????

Mong bác thử lưu ý xem sao.

Hề hề hề,..

  • 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ái logand và dxf 70 đấy để check layer có đang bị lock không bác ạ ^^

 

Cái dxf 70 nó còn lắm thứ phức tạp lắm (tuỳ kiểu object), chứ không như Ket nghĩ đâ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

Cái dxf 70 nó còn lắm thứ phức tạp lắm (tuỳ kiểu object), chứ không như Ket nghĩ đâu.

Trong trường hợp bác Bình nêu là dxf 70 của layer Object :)

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

Trong trường hợp bác Bình nêu là dxf 70 của layer Object :)

 

Trích dẫn để xem cho vui:

3DFACE: thể hiện tính chất trông thấy của các cạnh (0, 1, 2, 4, 8)

3DSOLID: số phiên bản dạng thức sử dụng

ATTDEF: cờ trạng thái của thuộc tính (1, 2, 4, 8)

ATTRIB: cờ trạng thái của thuộc tính (1, 2, 4, 8)

BODY: số phiên bản dạng thức sử dụng

DIMENSION: kiểu kích thước (0, 1, 2, 3, 4, 5, 6, 32, 64, 128)

HATCH: xác định trạng thái tô màu của solid (0, 1)

IMAGE: cách hiển thị hình ảnh (1, 2, 3, 4)

INSERT: số lượng các cột

LWPOLYLINE: cờ đánh dấu (0, 1, 128)

MLINE: cách định vị trí đường mline (0, 1, 2)

OLE2FRAME: số phiên bản OLE

POLYLINE: cờ xác định trạng thái của đa tuyến (1, 2, 4, 8, 16, 32, 64, 128)

REGION: số phiên bản sử dụng

SPLINE: cờ xác định kiểu spline (1, 2, 4, 8, 16)

VERTER: cờ xác định (1, 2, 4, 8, 16, 32, 64, 128)

v.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

Cái logand và dxf 70 đấy để check layer có đang bị lock không bác ạ ^^

Hề hề hề,

Mình đọc code và cũng hiểu láng máng là vậy, nhưng tại sao cái lisp của bác lp_hai thì ngay cả đối tượng trên lớp không bị lock cũng không xóa được nên mình nghĩ nó còn có cái tác dụng chi chi nữa đó.

Tiện thể hỏi luôn các bác về cái hàm (logand ..... ) này nữa. Theo Help thì: Returns the result of the logical bitwise AND of a list of integers

Mình dịch ra là trả về giá trị theo bit logic AND của một danh sách chứa các số nguyên.

Cái danh sách này thì mình thủng nhưng giá trị theo bit logic AND (logical bitwise AND) thí mù tịt chửa vỡ.

Hề 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

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  

×