Chuyển đến nội dung
Diễn đàn CADViet
gia_bach

Ứng dụng REACTOR trong quản lý bản vẽ theo layer.

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

list này kết hợp với list d2d_h2h_t2t_b2b dùng rất chi là khoái :( :(

nhưng có cách nào mỗi lần khởi động lên là cad bật luôn reactor lên không?? chứ mỗi lần mở 1 bản vẽ lại gõ layer_on thì cũng nhàm nhàm thế nào ấy :) :(

Lisp đã bật chế độ ON mỗi khi Load Lisp. (tại dòng (c:Layer_On))

 

alo alo alo!!! list nè gây lỗi cho lệnh copym

 

COPYM

.....

 

bác Gia_bach xem lại hộ cái!! :D :D :D

Bạn sài Lisp này với lệnh COPYM làm gì ?

Lisp trên chỉ nên sử dụng cho các nhóm lệnh tạo mới đối tượng.

Các lệnh COPYM (copy. move, rotate ,...) là nhóm lệnh modify đối tượng.

 

Hề hề hề,

Ấy chết, nhà bác hiểu thế là nhà em thất nghiệp đó. Cái chữ độc ở đây nó ..... độc đáo lắm bác ạ.... Hề hề hề.

Cái vụ này nếu không tin mời bác liên hệ với bác SonCad sẽ có ngay đáp án. Hề hề hề.....

hề hề ...

Nhà bác này chỉ được cái là .... rất hiểu ý em ! :D

  • 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
Lisp đã bật chế độ ON mỗi khi Load Lisp. (tại dòng (c:Layer_On))

Bạn sài Lisp này với lệnh COPYM làm gì ?

Lisp trên chỉ nên sử dụng cho các nhóm lệnh tạo mới đối tượng.

Các lệnh COPYM (copy. move, rotate ,...) là nhóm lệnh modify đối tượng.

hề hề ...

Nhà bác này chỉ được cái là .... rất hiểu ý em ! :(

 

Mô Phẹc

Các bác này ăn thịt ...

Admin đâu

Cho các bác này vô 1 nhóm đi, em xin mạn phép đặt tên luôn là : CayViet Team

:(

  • 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 sài Lisp này với lệnh COPYM làm gì ?

Lisp trên chỉ nên sử dụng cho các nhóm lệnh tạo mới đối tượng.

Các lệnh COPYM (copy. move, rotate ,...) là nhóm lệnh modify đối tượng.

ý em là khi mình add list này vào thì dùng lệnh copym trong cad bị lỗi, chứ không phải em dùng list này để áp dụng cho copym! (không thể copymuti được)!! các lênh modify đối tượng khác thì em chưa biết thế nào!! :( :) :(

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 là khi mình add list này vào thì dùng lệnh copym trong cad bị lỗi, chứ không phải em dùng list này để áp dụng cho copym! (không thể copymuti được)!! các lênh modify đối tượng khác thì em chưa biết thế nào!! :D :( :(

Đã kiểm tra : đúng như duonghung1210 phát hiện, Lisp có xung đột với lệnh COPYM. :)

Lý do : chắc phải hỏi thằng COPYM thôi.

Khắc phục tạm thời : khi nào dùng lệnh COPYM thì tắt Lisp này đi Layer_Off. :D

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

E thấy copym với copy thường bây giờ có khác j nhau đâu nhỉ ^^.Tại e thấy copy kiểu j nó cũng copy đến bao giờ mình hủy lệnh thì thôi.Hay nó còn điểm j khác hay hơ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
E thấy copym với copy thường bây giờ có khác j nhau đâu nhỉ ^^.Tại e thấy copy kiểu j nó cũng copy đến bao giờ mình hủy lệnh thì thôi.Hay nó còn điểm j khác hay hơn nữa ạ :(
CopyM hay hơn ở tùy chọn : Repeat (last)/Divide/Measure/Array

Command: COPYM

Select objects: Select the objects to be copied

Base point: Specify a base point

Second point or [Repeat (last)/Divide/Measure/Array (dynamic)/Undo] :

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
CopyM hay hơn ở tùy chọn : Repeat (last)/Divide/Measure/Array

Command: COPYM

Select objects: Select the objects to be copied

Base point: Specify a base point

Second point or [Repeat (last)/Divide/Measure/Array (dynamic)/Undo] :

Lisp trên khi Load cùng Líp copy liên tục trên diễn đàn thì Líp ac không dùng đcj nhờ các bạn sửa hộ mình cài

 

;;; =============================== COPY ARRAY ==============================

(defun cpa (/ ss1 a d di n std)

(setq cmdo (getvar "cmdecho"))

;(command "_.ucs" "")

(setvar "cmdecho" 0)

(princ "\nCopy array:")

(setq ss1 (ssget))

(setq p1 (getpoint "First point: "))

(setq p2 (getpoint p1 "Second point: "))

(if ca:distance

(progn

(setq std (rtos ca:distance 2 4))

(setq d (getdist (strcat "Distance between elements<" std ">: ")))

(if d

(setq ca:distance d)

)

) ;end progn

(setq ca:distance (getdist "Distance between elements: "))

) ;end if

(setq a (angle p1 p2))

(setq a (* (/ 180 pi) a))

(command "_.ucs" "z" a)

(setq di (distance p1 p2))

(setq d ca:distance)

(setq n (/ di d))

(setq n (+ 1 (atoi (rtos n 2 1))))

(command "_.array" ss1 "" "r" 1 n d)

(command "_.ucs" "")

(setvar "cmdecho" cmdo)

(princ)

) ;end defun

(defun c:Ac () (cpa))

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 dụng REACTOR trong quản lý bản vẽ theo layer.

 

Chú ý :

- vì mỗi nguời (cty) có qui định về Layer khác nhau nên cần phải có 1 buớc hiệu chỉnh cho phù hợp.

Cụ thể là tìm dòng (setq COMLAYLST (list

(list "DIMANGULAR" "KT-DIM" )

(list "DTEXT" "TEXT" )

….....................

; Add your own command layer lists here....

))

thay thế hay bổ sung-xóa các cặp danh sách tuơng ứng theo định dạng (list "tênLệnhCadViếtHoa" "tênLayer" ).

VD : thay dòng (list "DTEXT" "TEXT" ) bằng (list "DTEXT" "ChuSo" )

hay thêm (list "LINE" "DuongThang" )

(setq COMLAYLST (list

(list "DIMANGULAR" "KT-DIM" )

(list "DTEXT" "ChuSo" ) (list "LINE" "DuongThang" )

))

Sẳn bác coi chỉnh thêm cho khi muốn định luôn color, linetype, linetype scale khi tạo layer mới thì thêm sao luôn đi bác. đúng là thấy bở nên đào mãi bác đừng cười vì các hàm loại này mình mù 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
Ứng dụng REACTOR trong quản lý bản vẽ theo layer.

 

Trong truờng hợp quản lý bản vẽ theo layer, thông thuờng các đối tuợng khác nhau sẽ thuộc các layer khác nhau (có ngoại lệ).

VD : đối tuợng LINE thuộc layer “LINE”, đối tuợng Text thuộc layer “TEXT”, đối tuợng Dimension (kích thuớc) thuộc layer “DIMENSION”, ...

Cách vẽ thông thuờng là :

1. vẽ đối tuợng truớc, sau đó mới tạo layer rồi chuyển đối tuợng qua layer đó.

2. cách thứ 2 là tạo hàng loạt layer theo qui định, sau đó truớc khi vẽ đối tuợng sẽ set layer tuơng ứng về hiện hành. Vd : vẽ đối tuợng LINE thì set layer “LINE” về hiện hành.

 

Cách vẽ thứ 1 có lợi điểm là không cần quan tâm đến layer hiện hành, sau khi hoàn thành có thể sử dụng lệnh FILTER hay LISP để lọc các kiểu đối tuợng rồi chuyển qua layer tuơng ứng.

Cách vẽ thứ 2 có vẻ rắc rối hơn vì mỗi lần vào lệnh CAD lại phải thay đổi layer tuơng ứng về hiện hành.

Do đó phát sinh nhu cầu : làm thế nào để mỗi khi tạo đối tuợng mới, CAD “hiểu đuợc” chúng ta muốn đặt đối tuợng đó vào Layer tuơng ứng? (không cần thiết phải qua buớc set layer)

Truớc đây tôi có viết 1 lisp sử dụng biến hệ thống "CMDACTIVE", nhưng quả thật trong các t/hợp các lệnh có liên quan đến hộp thoại “vấn đề chưa đuợc giải quyết rốt ráo”.

Link tham khảo

 

Rất may là các lệnh REACTOR (hàm VLR-***) có cung cấp cho chúng ta cách giải quyết vấn đề.

Các bạn có thể tham khảo thêm trong “tàng kinh” của VisualLisp.

Cụ thể là : (vlr-command-reactor data callbacks) cho phép xây dựng các hành động tuơng ứng với các khả năng có thể xảy ra (tạm gọi là sự kiện) khi gọi 1 lệnh CAD.

Một vài sự kiện khi gọi 1 lệnh CAD :

- sự kiện bắt đầu gọi lệnh : :vlr-commandWillStart

- sự kiện khi lệnh kết thúc: :vlr-commandEnded

- sự kiện hủy bỏ lệnh : :vlr-commandCancelled

 

Như vậy đối với truờng hợp muốn Cad “hiểu đuợc” Layer tuơng ứng với mỗi lệnh, chúng ta phải xây dựng các hàm :

- đáp ứng sự kiện bắt đầu gọi lệnh ":vlr-commandWillStart

- đáp ứng sự kiện khi lệnh kết thúc “:vlr-commandEnded”

- đáp ứng sự kiện khi hủy bỏ lệnh “:vlr-commandEnded”

- tạo 1 danh sách các lệnh và layer tưong úng .

 

VD: khi gọi lệnh LINE, CAD sẽ kiểm tra xem layer hiện hành có phải là “LINE” không ?

- Nếu đúng → kết thúc

- Nếu sai → chuyển layer “LINE” về hiện hành (nếu chưa có : tao mới layer)

Tuơng tự cho các sự kiện khi kết thúc lệnh LINE hay sự kiện khi hủy bỏ lệnh (nguời dùng nhấn phím Cancel)

 

Chú ý :

- vì mỗi nguời (cty) có qui định về Layer khác nhau nên cần phải có 1 buớc hiệu chỉnh cho phù hợp.

Cụ thể là tìm dòng (setq COMLAYLST (list

(list "DIMANGULAR" "KT-DIM" )

(list "DTEXT" "TEXT" )

….....................

; Add your own command layer lists here....

))

thay thế hay bổ sung-xóa các cặp danh sách tuơng ứng theo định dạng (list "tênLệnhCadViếtHoa" "tênLayer" ).

VD : thay dòng (list "DTEXT" "TEXT" ) bằng (list "DTEXT" "ChuSo" )

hay thêm (list "LINE" "DuongThang" )

(setq COMLAYLST (list

(list "DIMANGULAR" "KT-DIM" )

(list "DTEXT" "ChuSo" ) (list "LINE" "DuongThang" )

))

- để tắt Reactor gọi lệnh Layer_Off, bật Reactor lại gọi lệnh Layer_On

- trong t/hợp Layer tuơng ứng ở tình trạng : Lock, Freeze, Thaw kết quả còn bị lỗi. <_<

Duới đây là toàn bộ code của Ứng dụng REACTOR trong quản lý bản vẽ theo layer.

(vl-load-com)
(defun StartCommand (CALL CALLBACK / COMLAYLST)
 (setq COMLAYLST (list
	    (list "DIMANGULAR" "KT-DIM" )
	    (list "DIMALIGNED" "KT-DIM" )
	    (list "DIMBASELINE" "KT-DIM" )
	    (list "DIMCENTER" "KT-DIM"  )
	    (list "DIMCONTINUE" "KT-DIM" )
	    (list "DIMDIAMETER" "KT-DIM")
	    (list "DIMLINEAR" "KT-DIM")
	    (list "DIMRADIUS" "KT-DIM" )
	    (list "QDIM" "KT-DIM" )
	    (list "LEADER" "KT-DIM" )
	    (list "TEXT" "TEXT" )
	    (list "MTEXT" "TEXT" )
	    (list "DTEXT" "TEXT" )
                   ; Add your own command layer lists here....
	    ))
 (if (setq N (assoc (strcase (car CALLBACK)) COMLAYLST))
   (progn
     (setq *Currentlayers* (cons (getvar "CLAYER") *Currentlayers*))
     (if (setq objLay(make_layers (cadr N) ))
(vla-put-activelayer *DOC* objLay  )    )    )
   (setq *Currentlayers* (cons nil *Currentlayers*))  )
 (princ)  )

(defun MAKE_LAYERS (LAY_NAM / LAYOBJ LAYSOBJ ) 
 (or *DOC* (setq *DOC* (vla-get-activedocument (vlax-get-acad-object))))
 (setq LAYSOBJ (vla-get-layers *DOC*))
 (if (tblobjname "layer" LAY_NAM)
   (setq LAYOBJ (vla-item LAYSOBJ LAY_NAM))
   (setq LAYOBJ (vl-catch-all-apply 'vla-add (list LAYSOBJ LAY_NAM)))  )
 (if (vl-catch-all-error-p LAYOBJ)
   (not (print (vl-catch-all-error-message LAYOBJ)))
   (progn
     (if (= (strcase (vla-get-name LAYOBJ)) (strcase (getvar "clayer")))
       (setvar "clayer" "0")      )
     (vla-put-lock LAYOBJ :vlax-false)
     (vla-put-layeron LAYOBJ :vlax-true)
     (vla-put-freeze LAYOBJ :vlax-false)      	
     LAYOBJ  )  ))

(defun endCommand (CALL CALLBACK)
 (if *Currentlayers*
   (if (car *Currentlayers*)
     (progn
       (vla-put-lock
         (vla-item
           (vla-get-layers *DOC*)
           (car *Currentlayers*)  )
         :vlax-false        )
       (setvar "CLAYER" (car *Currentlayers*)) ) ) )
 (setq *Currentlayers* (cdr *Currentlayers*)))

(defun cancelCommand (CALL CALLBACK)
 (if *Currentlayers*
   (if (car *Currentlayers*)
     (progn
       (vla-put-lock
         (vla-item
           (vla-get-layers *DOC*)
           (car *Currentlayers*)  )
         :vlax-false        )
       (setvar "CLAYER" (car *Currentlayers*)) ) ) )
 (setq *Currentlayers* (cdr *Currentlayers*)))

(defun C:Layer_On ()  
 (and *vlr-CWS (not (vlr-added-p *vlr-CWS)) (vlr-add *vlr-CWS))
 (and *vlr-CE (not (vlr-added-p *vlr-CE)) (vlr-add *vlr-CE))
 (and *vlr-CC (not (vlr-added-p *vlr-CC)) (vlr-add *vlr-CC))
 (or *vlr-CWS 
    (setq *vlr-CWS (vlr-command-reactor nil '((:vlr-commandwillstart . StartCommand)))))
 (or *vlr-CE
    (setq *vlr-CE (vlr-command-reactor nil '((:vlr-commandEnded . endCommand)))))
 (or *vlr-CC
    (setq *vlr-CC (vlr-command-reactor nil '((:vlr-commandCancelled . cancelCommand)))))
 (princ "\nLayer Reactor ON")
 (princ))
(c:Layer_On)

(defun C:Layer_Off ()
 (and *vlr-CWS (vlr-added-p *vlr-CWS) (vlr-remove *vlr-CWS))
 (and *vlr-CE (vlr-added-p *vlr-CE) (vlr-remove *vlr-CE))
 (and *vlr-CC (vlr-added-p *vlr-CC) (vlr-remove *vlr-CC))
 (princ "\nLayer Reactor OFF")
 (princ))

 

cái này ban đầu không hiểu gì, giờ ứng dụng kết hợp với quét layer nên việc vẽ nhanh hơn trước đây nhiều lắm. cái này diễn đàn phải cho nhấn nút thanks nhiều lần nhấn mới sướ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
Sẳn bác coi chỉnh thêm cho khi muốn định luôn color, linetype, linetype scale khi tạo layer mới thì thêm sao luôn đi bác. đúng là thấy bở nên đào mãi bác đừng cười vì các hàm loại này mình mù tịt.
Chào duy782006

Về nguyên tắc bạn có thể viết lại hàm (defun MAKE_LAYERS ...) để cập nhật các thông số "color, linetype, linetype scale" khi tạo layer mới.

Tuy nhiên tôi thuờng tách việc tạo mới (cập nhật) Layer thành 1 LISP riêng biệt để dễ quản lý.

Mỗi khi nhận bản vẽ mới chỉ cần chạy LISP này là các LAYER sẽ đuợc Set lại theo tiêu chuẩn của mình.

 

Bạn thử tham khảo :

- Trong đó hàm layer_lst định nghĩa các tên Layer, color, linetype theo các loại bản vẽ : Kien Truc, Ket Cau, Dien Nuoc, ... Bạn cần thay đổi các thông số này cho phù hợp với tiêu chuẩn của bạn.

 

(defun layer_lst(tc / layer_list) 
 (cond
   ((= tc "KienTruc")
    (setq layer_list (list (list "DIM" 2 "Continuous")  (list "TXT" 3 "hidden")  ) )
    )

   ((= tc "KetCau")
    (setq layer_list (list (list "DIM" 2 "center")  (list "TXT" 3 "Continuous")  ) )
    )

   ((= tc "DienNuoc")
    (setq layer_list (list (list "DIM" 2 "hidden")  (list "TXT" 3 "Continuous")  ) )
    )
   );cond
 layer_list
 )
(defun LayerMake (LName LColor LTyle)
 (if (not(tblsearch "layer" LName) )    
   (command "-layer" "n" LName "")    )
 (command "-layer" "c" LColor LName "l" LTyle LName  "")
 )
(defun c:NewLayer(/ tc layer_list)
 (setq tc (getstring "\nKieu ban ve < KienTruc, KetCau, DienNuoc> : "))
 (setq layer_list (layer_lst tc))
 (foreach e layer_list  (LayerMake (car e) (cadr e) (caddr e))  )
 (princ))

 

 

Lisp trên khi Load cùng Líp copy liên tục trên diễn đàn thì Líp ac không dùng đcj nhờ các bạn sửa hộ mình cài

 

;;; =============================== COPY ARRAY ==============================

..........

To : nghiautc

Lisp có xung đột với 1 vài lệnh.

Khắc phục tạm thời : tắt Lisp này đi Layer_Off khi có xung đột. <_<

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

Về nguyên tắc bạn có thể viết lại hàm (defun MAKE_LAYERS ...) để cập nhật các thông số "color, linetype, linetype scale" khi tạo layer mới.

Tuy nhiên tôi thuờng tách việc tạo mới (cập nhật) Layer thành 1 LISP riêng biệt để dễ quản lý.

Mỗi khi nhận bản vẽ mới chỉ cần chạy LISP này là các LAYER sẽ đuợc Set lại theo tiêu chuẩn của mình.

 

Bạn thử tham khảo :

- Trong đó hàm layer_lst định nghĩa các tên Layer, color, linetype theo các loại bản vẽ : Kien Truc, Ket Cau, Dien Nuoc, ... Bạn cần thay đổi các thông số này cho phù hợp với tiêu chuẩn của bạn.

 

(defun layer_lst(tc / layer_list) 
 (cond
   ((= tc "KienTruc")
    (setq layer_list (list (list "DIM" 2 "Continuous")  (list "TXT" 3 "hidden")  ) )
    )

   ((= tc "KetCau")
    (setq layer_list (list (list "DIM" 2 "center")  (list "TXT" 3 "Continuous")  ) )
    )

   ((= tc "DienNuoc")
    (setq layer_list (list (list "DIM" 2 "hidden")  (list "TXT" 3 "Continuous")  ) )
    )
   );cond
 layer_list
 )
(defun LayerMake (LName LColor LTyle)
 (if (not(tblsearch "layer" LName) )    
   (command "-layer" "n" LName "")    )
 (command "-layer" "c" LColor LName "l" LTyle LName  "")
 )
(defun c:NewLayer(/ tc layer_list)
 (setq tc (getstring "\nKieu ban ve < KienTruc, KetCau, DienNuoc> : "))
 (setq layer_list (layer_lst tc))
 (foreach e layer_list  (LayerMake (car e) (cadr e) (caddr e))  )
 (princ))

To : nghiautc

Lisp có xung đột với 1 vài lệnh.

Khắc phục tạm thời : tắt Lisp này đi Layer_Off khi có xung đột. <_<

[/qu> cảm ơn bạn gia_bach. Giờ mình đã tìm được cách khắc phục rôi

Thêm hàm (Layer_Off) vào đầu lisp bị xung đột để tắt Reactor cuối Lisp bật lại bằng hàm (Layer_On)

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

Hay quá!

Nhưng cũng chẳng ứng dụng được là bao khi bản vẽ có nhiều layer với nhiều color, linetyle, linetyle-scale........... Mạn phép xin cách giải quyết vấn đề này từ các PRO! (Em gà. 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

1. Nếu tại dòng Command : ta gõ Hacth hay .Hatch hay ..Hatch hay ...Hatch ........... bao nhiêu dấu chấm đằng trước cũng cho lệnh Hatch

2. Có bác nào biết cách làm cho CAD hiểu đc sự khác nhau khi ta thêm vào danh sách lệnh (setq COMLAYLST (list ....... của Lisp bác Bach đã đưa ra trong post 1 những lệnh như nhau nhưng khác nhau mỗi chỗ là có bao nhiêu dấu chấm đằng trước ko ?

3. Nếu làm đc như điều đó thì : .Hatch sẽ vô Layer Hatch-Tường _ ..Hatch sẽ vô Layer Hatch-BêTông _ ...Hatch vô Layer Hatch-NềnĐất .......v...v... Sẽ làm tưong tự cho tất cả các lệnh vẽ khác như Line , Pline .....v..v..

4. Kết hơp với acad.pgp để phân biêt các lệnh như nhau nhưng khác nhau là có bao nhiêu dấu chấm thì Lisp của bác Bach sẽ làm đc như thằng Autodesk Architectural Desktop đã làm . Quản lý Layer theo tên vật liệu và cấu kiện . Cty nào chẳng quản lý Layer kiểu vậy , chứ dại gì đưa hết Hatch vô 1 Layer , Text vô 1 Layer ...v....v...

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. Nếu tại dòng Command : ta gõ Hacth hay .Hatch hay ..Hatch hay ...Hatch ........... bao nhiêu dấu chấm đằng trước cũng cho lệnh Hatch

2. Có bác nào biết cách làm cho CAD hiểu đc sự khác nhau khi ta thêm vào danh sách lệnh (setq COMLAYLST (list ....... của Lisp bác Bach đã đưa ra trong post 1 những lệnh như nhau nhưng khác nhau mỗi chỗ là có bao nhiêu dấu chấm đằng trước ko ?

3. Nếu làm đc như điều đó thì : .Hatch sẽ vô Layer Hatch-Tường _ ..Hatch sẽ vô Layer Hatch-BêTông _ ...Hatch vô Layer Hatch-NềnĐất .......v...v... Sẽ làm tưong tự cho tất cả các lệnh vẽ khác như Line , Pline .....v..v..

4. Kết hơp với acad.pgp để phân biêt các lệnh như nhau nhưng khác nhau là có bao nhiêu dấu chấm thì Lisp của bác Bach sẽ làm đc như thằng Autodesk Architectural Desktop đã làm . Quản lý Layer theo tên vật liệu và cấu kiện . Cty nào chẳng quản lý Layer kiểu vậy , chứ dại gì đưa hết Hatch vô 1 Layer , Text vô 1 Layer ...v....v...

Đăng ký học lớp Lisp của CadViet ngay nha.

Gãi đúng ngay tuyệt chiêu của "thầy" Ketxu rồ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

Thưa bác là đã nói với thầy hôm đi OFF rồi nhưng thầy còn đang chảnh , kêu là : Em đang biên soạn giáo trình chưa xong mà hiện h các em gái cứ bu vào làm phiền tất cả các buổi tối trong tuần . Gớm mặt :D

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ó ai biết lỗi này là gì không, khi mình load lisp lên thì có thông báo ở dòng command "; error: malformed list on input" . Khi đánh lệnh Layer_on hoặc off đều có thông báo là không có lệnh này . Thank

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ó ai biết lỗi này là gì không, khi mình load lisp lên thì có thông báo ở dòng command "; error: malformed list on input" . Khi đánh lệnh Layer_on hoặc off đều có thông báo là không có lệnh này . Thank

Xem mục:

c). Các thông báo lỗi và nguyên nhân có thể:

Của link này:

http://www.cadviet.com/forum/topic/71467-thao-luan-code-lisp-nhu-the-nao-de-han-che-loi-cho-nguoi-dung/

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 dụng REACTOR trong quản lý bản vẽ theo layer.

 

Trong truờng hợp quản lý bản vẽ theo layer, thông thuờng các đối tuợng khác nhau sẽ thuộc các layer khác nhau (có ngoại lệ).

VD : đối tuợng LINE thuộc layer “LINE”, đối tuợng Text thuộc layer “TEXT”, đối tuợng Dimension (kích thuớc) thuộc layer “DIMENSION”, ...

Cách vẽ thông thuờng là :

1. vẽ đối tuợng truớc, sau đó mới tạo layer rồi chuyển đối tuợng qua layer đó.

2. cách thứ 2 là tạo hàng loạt layer theo qui định, sau đó truớc khi vẽ đối tuợng sẽ set layer tuơng ứng về hiện hành. Vd : vẽ đối tuợng LINE thì set layer “LINE” về hiện hành.

 

Cách vẽ thứ 1 có lợi điểm là không cần quan tâm đến layer hiện hành, sau khi hoàn thành có thể sử dụng lệnh FILTER hay LISP để lọc các kiểu đối tuợng rồi chuyển qua layer tuơng ứng.

Cách vẽ thứ 2 có vẻ rắc rối hơn vì mỗi lần vào lệnh CAD lại phải thay đổi layer tuơng ứng về hiện hành.

Do đó phát sinh nhu cầu : làm thế nào để mỗi khi tạo đối tuợng mới, CAD “hiểu đuợc” chúng ta muốn đặt đối tuợng đó vào Layer tuơng ứng? (không cần thiết phải qua buớc set layer)

Truớc đây tôi có viết 1 lisp sử dụng biến hệ thống "CMDACTIVE", nhưng quả thật trong các t/hợp các lệnh có liên quan đến hộp thoại “vấn đề chưa đuợc giải quyết rốt ráo”.

Link tham khảo

 

Rất may là các lệnh REACTOR (hàm VLR-***) có cung cấp cho chúng ta cách giải quyết vấn đề.

Các bạn có thể tham khảo thêm trong “tàng kinh” của VisualLisp.

Cụ thể là : (vlr-command-reactor data callbacks) cho phép xây dựng các hành động tuơng ứng với các khả năng có thể xảy ra (tạm gọi là sự kiện) khi gọi 1 lệnh CAD.

Một vài sự kiện khi gọi 1 lệnh CAD :

- sự kiện bắt đầu gọi lệnh : :vlr-commandWillStart

- sự kiện khi lệnh kết thúc: :vlr-commandEnded

- sự kiện hủy bỏ lệnh : :vlr-commandCancelled

 

Như vậy đối với truờng hợp muốn Cad “hiểu đuợc” Layer tuơng ứng với mỗi lệnh, chúng ta phải xây dựng các hàm :

- đáp ứng sự kiện bắt đầu gọi lệnh ":vlr-commandWillStart

- đáp ứng sự kiện khi lệnh kết thúc “:vlr-commandEnded”

- đáp ứng sự kiện khi hủy bỏ lệnh “:vlr-commandEnded”

- tạo 1 danh sách các lệnh và layer tưong úng .

 

VD: khi gọi lệnh LINE, CAD sẽ kiểm tra xem layer hiện hành có phải là “LINE” không ?

- Nếu đúng → kết thúc

- Nếu sai → chuyển layer “LINE” về hiện hành (nếu chưa có : tao mới layer)

Tuơng tự cho các sự kiện khi kết thúc lệnh LINE hay sự kiện khi hủy bỏ lệnh (nguời dùng nhấn phím Cancel)

 

Chú ý :

- vì mỗi nguời (cty) có qui định về Layer khác nhau nên cần phải có 1 buớc hiệu chỉnh cho phù hợp.

Cụ thể là tìm dòng (setq COMLAYLST (list

(list "DIMANGULAR" "KT-DIM" )

(list "DTEXT" "TEXT" )

….....................

; Add your own command layer lists here....

))

thay thế hay bổ sung-xóa các cặp danh sách tuơng ứng theo định dạng (list "tênLệnhCadViếtHoa" "tênLayer" ).

VD : thay dòng (list "DTEXT" "TEXT" ) bằng (list "DTEXT" "ChuSo" )

hay thêm (list "LINE" "DuongThang" )

(setq COMLAYLST (list

(list "DIMANGULAR" "KT-DIM" )

(list "DTEXT" "ChuSo" ) (list "LINE" "DuongThang" )

))

- để tắt Reactor gọi lệnh Layer_Off, bật Reactor lại gọi lệnh Layer_On

- trong t/hợp Layer tuơng ứng ở tình trạng : Lock, Freeze, Thaw kết quả còn bị lỗi. <_<

Duới đây là toàn bộ code của Ứng dụng REACTOR trong quản lý bản vẽ theo layer.

  (if (vl-catch-all-error-p LAYOBJ)

    (not (print (vl-catch-all-error-message LAYOBJ)))

    (progn

      (if (= (strcase (vla-get-name LAYOBJ)) (strcase (getvar "clayer")))

        (setvar "clayer" "0")      )

      (vla-put-lock LAYOBJ _linenums:0'>(vl-load-com)(defun StartCommand (CALL CALLBACK / COMLAYLST)  (setq COMLAYLST (list		    (list "DIMANGULAR" "KT-DIM" )		    (list "DIMALIGNED" "KT-DIM" )		    (list "DIMBASELINE" "KT-DIM" )		    (list "DIMCENTER" "KT-DIM"  )		    (list "DIMCONTINUE" "KT-DIM" )		    (list "DIMDIAMETER" "KT-DIM")		    (list "DIMLINEAR" "KT-DIM")		    (list "DIMRADIUS" "KT-DIM" )		    (list "QDIM" "KT-DIM" )		    (list "LEADER" "KT-DIM" )		    (list "TEXT" "TEXT" )		    (list "MTEXT" "TEXT" )		    (list "DTEXT" "TEXT" )                    ; Add your own command layer lists here....		    ))  (if (setq N (assoc (strcase (car CALLBACK)) COMLAYLST))    (progn      (setq *Currentlayers* (cons (getvar "CLAYER") *Currentlayers*))      (if (setq objLay(make_layers (cadr N) ))	(vla-put-activelayer *DOC* objLay  )    )    )    (setq *Currentlayers* (cons nil *Currentlayers*))  )  (princ)  )(defun MAKE_LAYERS (LAY_NAM / LAYOBJ LAYSOBJ )   (or *DOC* (setq *DOC* (vla-get-activedocument (vlax-get-acad-object))))  (setq LAYSOBJ (vla-get-layers *DOC*))  (if (tblobjname "layer" LAY_NAM)    (setq LAYOBJ (vla-item LAYSOBJ LAY_NAM))    (setq LAYOBJ (vl-catch-all-apply 'vla-add (list LAYSOBJ LAY_NAM)))  )  (if (vl-catch-all-error-p LAYOBJ)    (not (print (vl-catch-all-error-message LAYOBJ)))    (progn      (if (= (strcase (vla-get-name LAYOBJ)) (strcase (getvar "clayer")))        (setvar "clayer" "0")      )      (vla-put-lock LAYOBJ :vlax-false)      (vla-put-layeron LAYOBJ :vlax-true)      (vla-put-freeze LAYOBJ :vlax-false)      	      LAYOBJ  )  ))(defun endCommand (CALL CALLBACK)  (if *Currentlayers*    (if (car *Currentlayers*)      (progn        (vla-put-lock          (vla-item            (vla-get-layers *DOC*)            (car *Currentlayers*)  )          :vlax-false        )        (setvar "CLAYER" (car *Currentlayers*)) ) ) )  (setq *Currentlayers* (cdr *Currentlayers*)))(defun cancelCommand (CALL CALLBACK)  (if *Currentlayers*    (if (car *Currentlayers*)      (progn        (vla-put-lock          (vla-item            (vla-get-layers *DOC*)            (car *Currentlayers*)  )          :vlax-false        )        (setvar "CLAYER" (car *Currentlayers*)) ) ) )  (setq *Currentlayers* (cdr *Currentlayers*)))(defun C:Layer_On ()    (and *vlr-CWS (not (vlr-added-p *vlr-CWS)) (vlr-add *vlr-CWS))  (and *vlr-CE (not (vlr-added-p *vlr-CE)) (vlr-add *vlr-CE))  (and *vlr-CC (not (vlr-added-p *vlr-CC)) (vlr-add *vlr-CC))  (or *vlr-CWS      (setq *vlr-CWS (vlr-command-reactor nil '((:vlr-commandwillstart . StartCommand)))))  (or *vlr-CE     (setq *vlr-CE (vlr-command-reactor nil '((:vlr-commandEnded . endCommand)))))  (or *vlr-CC     (setq *vlr-CC (vlr-command-reactor nil '((:vlr-commandCancelled . cancelCommand)))))  (princ "\nLayer Reactor ON")  (princ))(c:Layer_On)(defun C:Layer_Off ()  (and *vlr-CWS (vlr-added-p *vlr-CWS) (vlr-remove *vlr-CWS))  (and *vlr-CE (vlr-added-p *vlr-CE) (vlr-remove *vlr-CE))  (and *vlr-CC (vlr-added-p *vlr-CC) (vlr-remove *vlr-CC))  (princ "\nLayer Reactor OFF")  (princ))

Sao mình tải về và add vào nhưng ko dung duoc, gõ lênh layer_on  thì không đượ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

Sao ,mình tảlisissp ve và add vào thi báo lỗi

Gõ lệnh AP và enter thì tại dòng command báo lỗi:

 error: malformed list on input

Nhờ mọi người giúp đỡ! thanks!

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 dụng REACTOR trong quản lý bản vẽ theo layer.

 

Trong truờng hợp quản lý bản vẽ theo layer, thông thuờng các đối tuợng khác nhau sẽ thuộc các layer khác nhau (có ngoại lệ).

VD : đối tuợng LINE thuộc layer “LINE”, đối tuợng Text thuộc layer “TEXT”, đối tuợng Dimension (kích thuớc) thuộc layer “DIMENSION”, ...

Cách vẽ thông thuờng là :

1. vẽ đối tuợng truớc, sau đó mới tạo layer rồi chuyển đối tuợng qua layer đó.

2. cách thứ 2 là tạo hàng loạt layer theo qui định, sau đó truớc khi vẽ đối tuợng sẽ set layer tuơng ứng về hiện hành. Vd : vẽ đối tuợng LINE thì set layer “LINE” về hiện hành.

 

Cách vẽ thứ 1 có lợi điểm là không cần quan tâm đến layer hiện hành, sau khi hoàn thành có thể sử dụng lệnh FILTER hay LISP để lọc các kiểu đối tuợng rồi chuyển qua layer tuơng ứng.

Cách vẽ thứ 2 có vẻ rắc rối hơn vì mỗi lần vào lệnh CAD lại phải thay đổi layer tuơng ứng về hiện hành.

Do đó phát sinh nhu cầu : làm thế nào để mỗi khi tạo đối tuợng mới, CAD “hiểu đuợc” chúng ta muốn đặt đối tuợng đó vào Layer tuơng ứng? (không cần thiết phải qua buớc set layer)

Truớc đây tôi có viết 1 lisp sử dụng biến hệ thống "CMDACTIVE", nhưng quả thật trong các t/hợp các lệnh có liên quan đến hộp thoại “vấn đề chưa đuợc giải quyết rốt ráo”.

Link tham khảo

 

Rất may là các lệnh REACTOR (hàm VLR-***) có cung cấp cho chúng ta cách giải quyết vấn đề.

Các bạn có thể tham khảo thêm trong “tàng kinh” của VisualLisp.

Cụ thể là : (vlr-command-reactor data callbacks) cho phép xây dựng các hành động tuơng ứng với các khả năng có thể xảy ra (tạm gọi là sự kiện) khi gọi 1 lệnh CAD.

Một vài sự kiện khi gọi 1 lệnh CAD :

- sự kiện bắt đầu gọi lệnh : :vlr-commandWillStart

- sự kiện khi lệnh kết thúc: :vlr-commandEnded

- sự kiện hủy bỏ lệnh : :vlr-commandCancelled

 

Như vậy đối với truờng hợp muốn Cad “hiểu đuợc” Layer tuơng ứng với mỗi lệnh, chúng ta phải xây dựng các hàm :

- đáp ứng sự kiện bắt đầu gọi lệnh ":vlr-commandWillStart

- đáp ứng sự kiện khi lệnh kết thúc “:vlr-commandEnded”

- đáp ứng sự kiện khi hủy bỏ lệnh “:vlr-commandEnded”

- tạo 1 danh sách các lệnh và layer tưong úng .

 

VD: khi gọi lệnh LINE, CAD sẽ kiểm tra xem layer hiện hành có phải là “LINE” không ?

- Nếu đúng → kết thúc

- Nếu sai → chuyển layer “LINE” về hiện hành (nếu chưa có : tao mới layer)

Tuơng tự cho các sự kiện khi kết thúc lệnh LINE hay sự kiện khi hủy bỏ lệnh (nguời dùng nhấn phím Cancel)

 

Chú ý :

- vì mỗi nguời (cty) có qui định về Layer khác nhau nên cần phải có 1 buớc hiệu chỉnh cho phù hợp.

Cụ thể là tìm dòng (setq COMLAYLST (list

(list "DIMANGULAR" "KT-DIM" )

(list "DTEXT" "TEXT" )

….....................

; Add your own command layer lists here....

))

thay thế hay bổ sung-xóa các cặp danh sách tuơng ứng theo định dạng (list "tênLệnhCadViếtHoa" "tênLayer" ).

VD : thay dòng (list "DTEXT" "TEXT" ) bằng (list "DTEXT" "ChuSo" )

hay thêm (list "LINE" "DuongThang" )

(setq COMLAYLST (list

(list "DIMANGULAR" "KT-DIM" )

(list "DTEXT" "ChuSo" ) (list "LINE" "DuongThang" )

))

- để tắt Reactor gọi lệnh Layer_Off, bật Reactor lại gọi lệnh Layer_On

- trong t/hợp Layer tuơng ứng ở tình trạng : Lock, Freeze, Thaw kết quả còn bị lỗi. <_<

Duới đây là toàn bộ code của Ứng dụng REACTOR trong quản lý bản vẽ theo layer.

  (if (vl-catch-all-error-p LAYOBJ)

    (not (print (vl-catch-all-error-message LAYOBJ)))

    (progn

      (if (= (strcase (vla-get-name LAYOBJ)) (strcase (getvar "clayer")))

        (setvar "clayer" "0")      )

      (vla-put-lock LAYOBJ _linenums:0'>(vl-load-com)(defun StartCommand (CALL CALLBACK / COMLAYLST)  (setq COMLAYLST (list		    (list "DIMANGULAR" "KT-DIM" )		    (list "DIMALIGNED" "KT-DIM" )		    (list "DIMBASELINE" "KT-DIM" )		    (list "DIMCENTER" "KT-DIM"  )		    (list "DIMCONTINUE" "KT-DIM" )		    (list "DIMDIAMETER" "KT-DIM")		    (list "DIMLINEAR" "KT-DIM")		    (list "DIMRADIUS" "KT-DIM" )		    (list "QDIM" "KT-DIM" )		    (list "LEADER" "KT-DIM" )		    (list "TEXT" "TEXT" )		    (list "MTEXT" "TEXT" )		    (list "DTEXT" "TEXT" )                    ; Add your own command layer lists here....		    ))  (if (setq N (assoc (strcase (car CALLBACK)) COMLAYLST))    (progn      (setq *Currentlayers* (cons (getvar "CLAYER") *Currentlayers*))      (if (setq objLay(make_layers (cadr N) ))	(vla-put-activelayer *DOC* objLay  )    )    )    (setq *Currentlayers* (cons nil *Currentlayers*))  )  (princ)  )(defun MAKE_LAYERS (LAY_NAM / LAYOBJ LAYSOBJ )   (or *DOC* (setq *DOC* (vla-get-activedocument (vlax-get-acad-object))))  (setq LAYSOBJ (vla-get-layers *DOC*))  (if (tblobjname "layer" LAY_NAM)    (setq LAYOBJ (vla-item LAYSOBJ LAY_NAM))    (setq LAYOBJ (vl-catch-all-apply 'vla-add (list LAYSOBJ LAY_NAM)))  )  (if (vl-catch-all-error-p LAYOBJ)    (not (print (vl-catch-all-error-message LAYOBJ)))    (progn      (if (= (strcase (vla-get-name LAYOBJ)) (strcase (getvar "clayer")))        (setvar "clayer" "0")      )      (vla-put-lock LAYOBJ :vlax-false)      (vla-put-layeron LAYOBJ :vlax-true)      (vla-put-freeze LAYOBJ :vlax-false)      	      LAYOBJ  )  ))(defun endCommand (CALL CALLBACK)  (if *Currentlayers*    (if (car *Currentlayers*)      (progn        (vla-put-lock          (vla-item            (vla-get-layers *DOC*)            (car *Currentlayers*)  )          :vlax-false        )        (setvar "CLAYER" (car *Currentlayers*)) ) ) )  (setq *Currentlayers* (cdr *Currentlayers*)))(defun cancelCommand (CALL CALLBACK)  (if *Currentlayers*    (if (car *Currentlayers*)      (progn        (vla-put-lock          (vla-item            (vla-get-layers *DOC*)            (car *Currentlayers*)  )          :vlax-false        )        (setvar "CLAYER" (car *Currentlayers*)) ) ) )  (setq *Currentlayers* (cdr *Currentlayers*)))(defun C:Layer_On ()    (and *vlr-CWS (not (vlr-added-p *vlr-CWS)) (vlr-add *vlr-CWS))  (and *vlr-CE (not (vlr-added-p *vlr-CE)) (vlr-add *vlr-CE))  (and *vlr-CC (not (vlr-added-p *vlr-CC)) (vlr-add *vlr-CC))  (or *vlr-CWS      (setq *vlr-CWS (vlr-command-reactor nil '((:vlr-commandwillstart . StartCommand)))))  (or *vlr-CE     (setq *vlr-CE (vlr-command-reactor nil '((:vlr-commandEnded . endCommand)))))  (or *vlr-CC     (setq *vlr-CC (vlr-command-reactor nil '((:vlr-commandCancelled . cancelCommand)))))  (princ "\nLayer Reactor ON")  (princ))(c:Layer_On)(defun C:Layer_Off ()  (and *vlr-CWS (vlr-added-p *vlr-CWS) (vlr-remove *vlr-CWS))  (and *vlr-CE (vlr-added-p *vlr-CE) (vlr-remove *vlr-CE))  (and *vlr-CC (vlr-added-p *vlr-CC) (vlr-remove *vlr-CC))  (princ "\nLayer Reactor OFF")  (princ))

em tham gia diễn đàn đc gần một năm rồi nhưng hôm nay mới có thời gian đọc bài viết của anh, đọc đi đọc lại mấy lần vẫn chưa thấy chán. đọc xong em hiểu mình đang đứng ở đâu những gì mình biết chỉ như một hạt cát giữa sa mạc rộng lớn. cảm ơn anh GIA BẠCH  đã chia sẻ kiến thức, để em biết mình còn phải học hỏi nhiều. thanks very much!

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 mới học CAD. Các bác cho em hỏi bản CAD của em bị như thế này là sao VD: 1 Line đang ở Layer "Net Thay". Khi mình chọn nó và muốn chuyển sang Layer " Net Truc " nhưng khi em chọn line rồi chọn Layer " Net Truc"  thì Line lại không thay đổi gì 

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 :D :D

Câu hỏi này khó ... trả lời.

Bạn nên tìm một thầy bói.

:D :D :D 

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


×