Đế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

#41 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 22 November 2011 - 09:47 AM

Đú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á....
  • 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


#42 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 22 November 2011 - 10:03 AM

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


#43 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 22 November 2011 - 10:12 AM

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.

Bài viết đã được chỉnh sửa nội dung bởi phamthanhbinh: 22 November 2011 - 10:28 AM
Bổ sung bài viết.

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

#44 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 22 November 2011 - 10:20 AM

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

#45 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 22 November 2011 - 10:39 AM

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

#46 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 22 November 2011 - 10:57 AM

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


#47 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 22 November 2011 - 11:05 AM

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


#48 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 22 November 2011 - 11:13 AM

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


#49 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 22 November 2011 - 11:22 AM

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

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


#50 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 22 November 2011 - 11:23 AM

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

#51 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 22 November 2011 - 11:28 AM

Cái logand này thì bác nào học IT chắc rành lắm, nó là phép logic AND theo từng bit của số nguyên đó :

http://www.gnu.org/s...Operations.html

=> nôm na theo đúng nghĩa AND, tức là trả về bit_code xuất hiện trong tất cả các số nguyên, và tất nhiên trả về số nhỏ hơn mọi số trong dãy
( 1 số được quy về tổng các bit-code cơ sở)


Em thì hay lợi dụng nó để kiểm tra trạng thái theo cách :
(logand số_bit_nguyên_tố số_bit_lấy_về) : nếu trả về số nhỏ => trong số_bit_lấy_về có bitcode số nhỏ.
Trả về 0 hoặc 1 số khác số nhỏ : trong không chứa.
Ví dụ ta biết 13 gồm các bit (1 4 8) : => (logand 1 13) = 1, (logand 4 13) = 4, (logand 8 13) = 8,
(logand 14 13) = 12 [do 14 = 2 + 4 + 8] => and = (4 8) = 12

Trường hợp của bác Bình : bitcode 4 trong mã dxf 70 của layer tương ứng với layer bị khóa. Lisp check (logand 4 (mã dxf 70)). Nếu khác 4 => chứng tỏ mã dxf 70 k chứa trạng thái bit 4 => k bị Lock

E dốt tin học nên diễn đạt hơi mù mờ theo ý hiểu vậy th, hy vọng có ích

P/s : sao bác k đưa bản vẽ để bạn lp_hai test ?
  • 2

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


#52 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 22 November 2011 - 11:58 AM

P/s : sao bác k đưa bản vẽ để bạn lp_hai test ?

Ko cần test, đúng như bác Bình nói thì cái hàm (cv-ss-visible) của em ko làm mấy thằng phức tạp như Hatch hay MText núp được. Em cũng thử kiểm tra các mã DXF của các thằng này sau khi ẩn đi bằng hàm acet-ss-visible. Thì thấy nó chỉ có cái mã 60 là thay đổi. Ko biết dc?! Chắc trước mắt là dự án treo.... chờ người chỉ điểm thôi. hic :)
  • 0
Hình đã gửi

#53 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 22 November 2011 - 12:18 PM

Cái logand này thì bác nào học IT chắc rành lắm, nó là phép logic AND theo từng bit của số nguyên đó :

http://www.gnu.org/s...Operations.html

=> nôm na theo đúng nghĩa AND, tức là trả về bit_code xuất hiện trong tất cả các số nguyên, và tất nhiên trả về số nhỏ hơn mọi số trong dãy
( 1 số được quy về tổng các bit-code cơ sở)


Em thì hay lợi dụng nó để kiểm tra trạng thái theo cách :
(logand số_bit_nguyên_tố số_bit_lấy_về) : nếu trả về số nhỏ => trong số_bit_lấy_về có bitcode số nhỏ.
Trả về 0 hoặc 1 số khác số nhỏ : trong không chứa.
Ví dụ ta biết 13 gồm các bit (1 4 8) : => (logand 1 13) = 1, (logand 4 13) = 4, (logand 8 13) = 8,
(logand 14 13) = 12 [do 14 = 2 + 4 + 8] => and = (4 8) = 12

Trường hợp của bác Bình : bitcode 4 trong mã dxf 70 của layer tương ứng với layer bị khóa. Lisp check (logand 4 (mã dxf 70)). Nếu khác 4 => chứng tỏ mã dxf 70 k chứa trạng thái bit 4 => k bị Lock

E dốt tin học nên diễn đạt hơi mù mờ theo ý hiểu vậy th, hy vọng có ích

P/s : sao bác k đưa bản vẽ để bạn lp_hai test ?

Hề hề hề,
Thanks bác Ketxu về địa chỉ tham khảo. Đọc nó thấy toét cả mắt mà vẫn chửa thấy sáng thêm. Phần giải thích của bác có làm nó lập lòe thêm tí chút nhưng vẫn chưa đủ sáng để cái thằng thong manh về IT như mình hiểu được.
Thôi thì để mình mần mò thêm với cái địa chỉ bác cho xem may ra có được tí Virohto nào không hỉ????
Chúc các bác luôn mạnh khỏe và sáng mắt sáng lòng....
Hề hề hề,...
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#54 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 22 November 2011 - 12:30 PM

Ko cần test, đúng như bác Bình nói thì cái hàm (cv-ss-visible) của em ko làm mấy thằng phức tạp như Hatch hay MText núp được. Em cũng thử kiểm tra các mã DXF của các thằng này sau khi ẩn đi bằng hàm acet-ss-visible. Thì thấy nó chỉ có cái mã 60 là thay đổi. Ko biết dc?! Chắc trước mắt là dự án treo.... chờ người chỉ điểm thôi. hic :)


- Bạn nghĩ có phải entupd các đối tượng phức k?
- Bạn cons mã 60 vào trước list entget data của đối tượng thì liệu nó còn là 1 list entity data hợp lệ ? Bạn thử append ra sau xem sao ?
  • 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


#55 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 22 November 2011 - 01:13 PM

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

Bạn xem lại kết quả của dòng : (vl-list* (cons 60 vis) l) ?
Nên dùng hàm append



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

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ề,..

Hình như bác nhầm lẫn với việc lọc đối tuợng (dxf 70) khi tham khảo các Lisp khác ?

Nhờ các bác test dùm hàm SS-visible này :

(defun CV:ss-visible(ss vis / dxf_60 e edata n)
(setq n (sslength ss))
(while (setq e (ssname ss (setq n (1- n))))
(setq edata (entget e))
(setq dxf_60 (assoc 60 edata))
(if vis
(if (and dxf_60 (= 1 (cdr dxf_60)))
(entmod (subst (cons 60 0) dxf_60 edata)))
(if dxf_60
(if (= 0 (cdr dxf_60))
(entmod (subst (cons 60 1) dxf_60 edata)) )
(entmod (append edata (list (cons 60 1)))) ) ))
(princ))

  • 1

#56 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 22 November 2011 - 01:21 PM

Bác Bình nói về lisp hide/show object với mã kiểm tra đối tượng có thuộc layer bị khóa k a gia_bach ạ ^^


(defun CV:ss-visible (ss vis / n e)
(setq n (sslength ss))
(while (setq e (ssname ss (setq n (1- n))))
(if (/= 4 (logand 4 (cdr (assoc 70 (entget(tblobjname "layer" (cdr (assoc 8 (entget e)))))))))
(vla-put-visible (vlax-ename->vla-object e ) vis)
)
)
)

  • 2

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


#57 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 22 November 2011 - 03:06 PM

hàm của bác Ket la chuẩn rồi! hay cho cái hàm vla-put-visible, nhanh gọn mà hiệu quả
  • 0
Hình đã gửi

#58 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 22 November 2011 - 04:27 PM

Bạn xem lại kết quả của dòng : (vl-list* (cons 60 vis) l) ? Nên dùng hàm append Hình như bác nhầm lẫn với việc lọc đối tuợng (dxf 70) khi tham khảo các Lisp khác ? Nhờ các bác test dùm hàm SS-visible này :

 (defun CV:ss-visible(ss vis / dxf_60 e edata n) (setq n (sslength ss)) (while (setq e (ssname ss (setq n (1- n)))) (setq edata (entget e)) (setq dxf_60 (assoc 60 edata)) (if vis (if (and dxf_60 (= 1 (cdr dxf_60))) (entmod (subst (cons 60 0) dxf_60 edata))) (if dxf_60 (if (= 0 (cdr dxf_60)) (entmod (subst (cons 60 1) dxf_60 edata)) ) (entmod (append edata (list (cons 60 1)))) ) )) (princ)) 


Hề hề hề,
Không hiểu sao khi test cái hàm của bác Giabach lại thấy nó hổng chạy. Mình mày mò sửa lại như sau thì thấy nó chạy được, tuy nhiên với các đối tượng thuộc layer bị khóa thì chưa được kiểm tra loại trừ như hàm của bác Ketxu.


(defun CV:ss-visible (ss vis / dxf_60 e edata n)
(setq n (sslength ss))
(while (setq e (ssname ss (setq n (1- n))))
(setq edata (entget e))
(setq dxf_60 (assoc 60 edata))
(if vis
;;;;;(if (and dxf_60 (= 0 (cdr dxf_60)))
;;;;;;;;; (entmod (subst (cons 60 1) dxf_60 edata)))
(if dxf_60
;;;;(if (= 0 (cdr dxf_60))
(entmod (subst (cons 60 vis) dxf_60 edata))
;;;; )
(entmod (append edata (list (cons 60 vis))))
)
)
)
(princ)
)

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

#59 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 22 November 2011 - 04:28 PM

Thêm 2 hàm mọi người hay dùng của acet :
- ACET-sysvar-set (list vars + value) : có tác dụng thay đổi sysvar của hệ thống đồng thời lưu lại các giá trị sysvar ngay trước thời điểm thiết đặt này để restore lần sau :
VD : (acet-sysvar-set (list "osmode" 1 "cmdecho" 1))
Trả về ((("OSMODE" 0) ("CMDECHO" 0)))
Tiếp tục (acet-sysvar-set (list "osmode" 4 "cmdecho" 1))
=> trả về ((("OSMODE" 0) ("CMDECHO" 0)) (("OSMODE" 1) ("CMDECHO" 1)))
- ACET-sysvar-restore : hàm không đối số, reset lại các biến sysvar tại thời điểm đầu tiên sử dụng acet-sysvar-set trong hàm
Mọi người chú ý 2 chỗ in đậm, là 2 chỗ thiếu mềm dẻo của cặp đôi hàm này
- Ta chỉ muốn ghi nhớ list các biến + giá trị tại 1 thời điểm nhưng chưa muốn thay đổi ngay lúc đó , hoặc chỉ đơn giản là lấy list giá trị ?
- Ta chỉ muốn quay lại 1 thời điểm nào đó xác định sau một bước thay đổi sysvar ?
- Đồng thời ta cũng chưa xác định được list value hàm lưu ở đâu

=> 2 hàm ket mới viết sáng nay để xử lý 2 vấn đề trên, chưa test kỹ ná ^^

(defun CV:Sysvar-Set (lstVar lstVal id)
;@Ketxu 22-11-11
(or id (setq id 0))
(vl-bb-set '# (append (vl-bb-ref '#) (list (list id (mapcar 'cons lstVar (mapcar 'getvar lstVar))))))
(if lstVal (mapcar 'setvar lstvar lstVal))
)


(defun CV:Sysvar-Restore(id / df)
;@Ketxu 22-11-11
(defun df (id / tmp)
(if (and id (setq tmp (assoc id (vl-bb-ref '#))))
(mapcar '(lambda(x)(setvar (car x)(cdr x))) (cadr tmp))
))
(if id (df id)(and (mapcar 'df (mapcar 'car (reverse (vl-bb-ref '#)))) (vl-bb-set '# nil)))
)

Sử dụng :
- CV:Sysvar-Set (list các variable) (list giá trị) ID
Thiết đặt các sysvar theo giá trị tương ứng, lưu tại thời điểm ID
+ List các variable : '("cmdecho" "osmode" "clayer"...) - Không thể nil
+ List giá trị : '(1 2 "0")... - Có thể nil. Nếu = nil : hàm chỉ ghi nhớ, không set giá trị mới
+ ID : flag thể hiện thời điểm cần lưu lại biến (0,1,2.....) - Có thể nil
Ví dụ :
(CV:Sysvar-Set '("hpscale" "hpang" "hpname" "clayer" "cmdecho") '(1 0 "ANSI31" "MATCAT" 0) 0)
(CV:Sysvar-Set '("hpscale" "hpang" "hpname" "clayer" "cmdecho") nil 1)

- CV:Sysvar-Restore (ID)
Reset lại sysvar tại thời điểm ID
- ID : bất kỳ, có thể nil.Nếu nil hàm sẽ reset tại thời điểm đầu tiên dùng đến hàm trong toàn bộ phiên làm việc, đồng thời clear toàn bộ list giá trị lưu
VD :
(CV:Sysvar-Restore 0)
(CV:Sysvar-Restore nil)

- Vài điểm chú ý :
+ Cách thức đặt đối số do mọi người quy định và thay đổi theo ý thích (có thể là list dạng '(var1 . val1)(var2 . val2)... hoặc dạng '(var1 val1 var2 val2...) , ketxu thích dùng kiểu kia cho dễ mapcar ^^
+ Hàm không tạo ra bất kỳ biến nào, nhưng sử dụng một "blackboard namespace", cái này có cái lợi và có cái hại. Vì vậy mọi người cũng có thể sử dụng nơi lưu trữ khác cho mình (biến toàn cục, file, ini, reg...)
+ Ket không xử lý trường hợp ghi lại trùng ID, vì như vậy hơi vô duyên, nhưng nếu muốn có thể thêm vào 1 đoạn subst ^^
  • 2

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


#60 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 24 November 2011 - 02:40 PM


- Vài điểm chú ý :
+ Cách thức đặt đối số do mọi người quy định và thay đổi theo ý thích (có thể là list dạng '(var1 . val1)(var2 . val2)... hoặc dạng '(var1 val1 var2 val2...) , ketxu thích dùng kiểu kia cho dễ mapcar ^^
+ Hàm không tạo ra bất kỳ biến nào, nhưng sử dụng một "blackboard namespace", cái này có cái lợi và có cái hại. Vì vậy mọi người cũng có thể sử dụng nơi lưu trữ khác cho mình (biến toàn cục, file, ini, reg...)
+ Ket không xử lý trường hợp ghi lại trùng ID, vì như vậy hơi vô duyên, nhưng nếu muốn có thể thêm vào 1 đoạn subst ^^

Hề hề hề,
Bác ketxu nên lưu ý cập nhật thêm các hàm CV:..... đã được thẩm định vô danh sách nghen.
Xin bổ sung một thằng ngớ ngẩn nữa. Hàm CV:geom-midpoint:


(defun CV:geom-midpoint (p1 p2 )
(setq mp (mapcar '(lambda (x y) (/ (+ x y) 2)) p1 p2))
mp
)


P/s : Bác Bình test thử với '(0 0 0) '(1 1 1) chưa ạ ^^ (lỗi chia số nguyên 1 / 2)
Theo em thì :

(defun CV:Geom-Midpoint (p1 p2 )(mapcar '(lambda (x y) (* (+ x y) 0.5)) p1 p2))

Bài viết đã được chỉnh sửa nội dung bởi ketxu: 24 November 2011 - 03:06 PM
Check

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