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

[Yêu Cầu] Sửa Lisp Lock Layer Cho Cad 2015.

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

Chào các anh chị!

Ngày trước em kiếm được cái lisp lock layer này ở diễn đàn mình. Nó dùng tốt trên CAD 2013 trở về trước nhưng trên CAD2015 lại trục trặc 1 số cái. Ví dụ như nhập lệnh khóa layer rồi chọn đối tượng để khóa layer của đối tượng đó, nhưng sau khi chọn đối tượng thì nó lại hiện ra 1 loạt lựa chọn của lệnh -LAYER... Còn nhiều cái nữa... Rất mong các anh sửa giúp em.

Em cảm ơn nhiều!

(defun c:LK ()
(lkllk "lock" "l" "Chon doi tuong hoac an Enter de khoa tat ca" " Da duoc khoa")
)

(defun c:UL ()
(lkllk "unlock" "l" "Chon doi tuong hoac an Enter de mo khoa tat ca" " Da duoc mo khoa")
)

(defun c:LKK () ;Khoa tat ca,tru cai duoc chon
(lkllk "unlock" "rl" "Chon doi tuong hoac an Enter de mo khoa tat ca" " Da duoc giu lai")
)
(defun lkllk ( lenh opt msg1 msg2 / NewLayers Layer1 Set1)
(princ msg1)  	
	(setq Set1 (ssget))
	(if (= Set1 nil)(command "-layer" lenh "*" "")
		(progn
			(setq i 0)
			(repeat (sslength Set1)
				(setq Layer1 (list (cdr(	assoc 8 (entget(ssname Set1 i))))))
				(if NewLayers
		   			(setq NewLayers (append NewLayers Layer1))
		   			(setq NewLayers Layer1)
				)
				(setq i (+ i 1))
			)
			(princ NewLayers)
			(if (= opt "l")(command  "layer") 
						(command  "layer"  "lock" "*")
			)
			(mapcar  '(lambda (x) (command lenh x)) NewLayers)
			(command "")			
			(princ (sslength Set1))
			(princ msg2)))
			;
			(setq lenh nil 
				msg1 nil 
				msg2 nil)			
	(princ))

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ạ cái đó thì em biết ạ. Nhưng còn cái chức năng "khóa tất cả layer, trừ layer của đối tượng được chọn" (lệnh LKK của lisp trên) thì phải làm thế nào ạ? Dùng Layiso với lựa chọn "Lock and fade" thì khá bất tiện trong 1 số trường hợp.

Em đang dùng song song CAD 2007 và 2015 nên muốn 2 thằng đồng nhất 1 chút về thao tác.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Dạ cái đó thì em biết ạ. Nhưng còn cái chức năng "khóa tất cả layer, trừ layer của đối tượng được chọn" (lệnh LKK của lisp trên) thì phải làm thế nào ạ? Dùng Layiso với lựa chọn "Lock and fade" thì khá bất tiện trong 1 số trường hợp.

Em đang dùng song song CAD 2007 và 2015 nên muốn 2 thằng đồng nhất 1 chút về thao tác.

 

lệnh khóa tất cả các layer là layiso chứ bạn, layiso thì có 2 lựa chọn:

1. tắt tất cả các layer khác chỉ hiện mỗi layer hiện hành. Layiso => S=>O=>chọn laye

2. đóng băng tất cả các layer khác (có bị mờ đi) và hiển thị layer hiện hành. Layiso => S=>L=>chọn độ sáng của layer hiện hành=>chọn layer

ko biết lệnh LKK của bạn khác cái này như thế nào nữa chứ 

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

 

lệnh khóa tất cả các layer là layiso chứ bạn, layiso thì có 2 lựa chọn:

1. tắt tất cả các layer khác chỉ hiện mỗi layer hiện hành. Layiso => S=>O=>chọn laye

2. đóng băng tất cả các layer khác (có bị mờ đi) và hiển thị layer hiện hành. Layiso => S=>L=>chọn độ sáng của layer hiện hành=>chọn layer

ko biết lệnh LKK của bạn khác cái này như thế nào nữa chứ 

 

 Nhưng thao tác như thế đến lúc muốn dùng lệnh LAYISO theo kiểu ẩn layer của các đối tượng không được chọn  lại phải thao tác Layiso >>> S >>> 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

thế là bạn muốn sử dụng cả 2 trường hợp luôn à

nó cũng có lâu hơn gì mấy đâu, bên 1 enter bên 3 enter thôi mà

nếu vậy thì chờ các bác giải quyết hộ bạn thôi mình thì chịu khoản lisp này rồi

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

(defun lock_ulock_lay (lock / LayerTable ss)

(vl-load-com)

(setq LayerTable (vla-get-layers (vla-get-activedocument (vlax-get-Acad-Object))))

(if (ssget)

(progn (setq ss (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))

(if opt

(progn (vlax-for each LayerTable (vla-put-lock each :vlax-true))

(vlax-for obj ss (vla-put-lock (vla-item LayerTable (vla-get-layer obj)) :vlax-false)))

(vlax-for obj ss

(vla-put-lock (vla-item LayerTable (vla-get-layer obj))

(if lock

:vlax-true

:vlax-false))))

(vla-delete ss))

(vlax-for each LayerTable

(vla-put-lock each

(if lock

:vlax-true

:vlax-false))))

(princ))

(defun c:lk (/ lock) (setq lock t) (lock_ulock_lay lock))

(defun c:ul (/ lock) (setq lock nil) (lock_ulock_lay lock))

(defun c:lkk (/ lock opt) (setq lock nil opt t) (lock_ulock_lay lock))

  • 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ế lại cái khác:

(defun lock_unlock (lock / ss->objlist getlocklay)

(defun ss->objlist (ss / cntr objlist)

(setq cntr (sslength ss))

(repeat cntr

(setq objlist (append objlist

(list (vlax-ename->vla-object (ssname ss (- cntr 1))))))

(setq cntr (- cntr 1)))

(setq ss nil)

objlist)

(defun getlocklay (/ lays)

(vlax-map-collection (vla-get-Layers

(vla-get-ActiveDocument (vlax-get-acad-object)))

'(lambda (x)

(if (= (vla-get-Lock x) :vlax-true)

(setq lays (append lays (list (vla-get-Name x)))))))

lays)

;; Main ---

(setq locked (getlocklay)

objs (ss->objlist ss))

(if (and (>= (atof (substr (getvar "acadver") 1 4)) 17.1)

(not (minusp (getvar "LAYLOCKFADECTL"))))

(progn (setvar "LAYLOCKFADECTL" (* (getvar "LAYLOCKFADECTL") -1))

(setq fade "T")))

(foreach os objs

(if (eq lock 1)

(if (= (vl-position (vla-get-Layer os) locked) nil)

(progn

(vla-put-Lock (vla-Item (vla-get-Layers

(vla-get-ActiveDocument (vlax-get-Acad-Object)))

(vla-get-Layer os))

:vlax-true)))

(if (/= (vl-position (vla-get-Layer os) locked) nil)

(progn

(vla-put-Lock (vla-Item (vla-get-Layers

(vla-get-ActiveDocument (vlax-get-Acad-Object)))

(vla-get-Layer os))

:vlax-false)))))

(if (= fade "T")

(setvar "LAYLOCKFADECTL" (* (getvar "LAYLOCKFADECTL") -1))))

(vl-load-com)

;;;---

(defun c:lk (/ ss objs locked fade)

(setq ss (ssget))

(if (/= ss nil)

(lock_unlock 1)

(progn (setq ss (ssget "_X")) (lock_unlock 1)))

(princ))

(defun c:ul (/ ss objs locked fade)

(setq ss (ssget))

(if (/= ss nil)

(lock_unlock 0)

(progn (setq ss (ssget "_X")) (lock_unlock 0)))

(princ))

(defun c:lkk (/ ss objs locked fade ss1)

(setq ss (ssget "_X"))

(if (setq ss1 (ssget))

(progn (lock_unlock 1) (setq ss ss1) (lock_unlock 0)))

(princ))

  • 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

 

Dạ đã ngon ạ! Bác nhiệt tình quá ạ.

Có lẽ hơi tham nhưng bác cho em nhờ luôn ạ: Nhờ bác gộp cho em 2 lisp nối line, pline... sau đây thành 1 với ạ.

Cụ thể là như này: khi có đối tượng là line, arc thì CONVERT rồi JOIN, còn khi chỉ toàn polyline thì JOIN luôn ạ. Tại CAD đời thấp thì chỉ cần dùng thằng "N1" cho cả line, polyline... nhưng CAD2015 thì nối 2 polyline lại phải dùng lisp N2.Rất là bất tiện khi dùng cùng lúc 2 loại CAD.

(defun c:N1(/ ss)
 (vl-load-com)
 (if (setq ss (ssget '((0 . "*line,arc"))))
 (vl-cmdf ".pedit" "m" ss "" "y" "j" "0" ""))
 (princ))

(defun c:N2(/ ss)
(vl-load-com)
(if (setq ss (ssget '((0 . "*line,arc"))))
(vl-cmdf ".pedit" "m" ss "" "j" "0" ""))
(princ))

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 này trên diễn đàn có rồi mà. Bạn dung chức năng tìm kiếm xem! Hình như là lệnh NN gì đó.

Thực sự là rất mong bác gộp giúp em 2 cái lisp kia ạ! Em đã tìm nhưng  không cái nào vừa ý. Cái hoạt động tốt trên CAD 2007 thì lại không tốt trên 2015, và ngược lại.

Chỉ có cái vướng mắc là lisp "N1" hoạt động tốt trên CAD 2009 đối với cả (line và polyline) nhưng trên 2015 lại lỗi khi nối 2 polyline (do nó không yêu cầu convert nên thừa đoạn nhập "y").

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Bạn thử cái này xem sao: (Không biết cad2014 và cad2015 có khác nhau hay không?)

(defun c:N1+N2 (/ ss)

(vl-load-com)

(if (setq ss (ssget '((0 . "*line,arc"))))

(if (< (atof (substr (getvar "acadver") 1 4)) 20.0)

(vl-cmdf ".pedit" "m" ss "" "y" "j" "0" "")

(vl-cmdf ".pedit" "m" ss "" "j" "0" "")))

(princ))

  • 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 thử cái này xem sao: (Không biết cad2014 và cad2015 có khác nhau hay không?)

(defun c:N1+N2 (/ ss)

(vl-load-com)

(if (setq ss (ssget '((0 . "*line,arc"))))

(if (< (atof (substr (getvar "acadver") 1 4)) 20.0)

(vl-cmdf ".pedit" "m" ss "" "y" "j" "0" "")

(vl-cmdf ".pedit" "m" ss "" "j" "0" "")))

(princ))

Không được bác ạ. Với 2 pline thì được nhưng cứ có line là lại yêu cầu convert.

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ực sự là rất mong bác gộp giúp em 2 cái lisp kia ạ! Em đã tìm nhưng  không cái nào vừa ý. Cái hoạt động tốt trên CAD 2007 thì lại không tốt trên 2015, và ngược lại.

Chỉ có cái vướng mắc là lisp "N1" hoạt động tốt trên CAD 2009 đối với cả (line và polyline) nhưng trên 2015 lại lỗi khi nối 2 polyline (do nó không yêu cầu convert nên thừa đoạn nhập "y").

 

Của anh đây :)

 

(defun c:N1 (/ ss)

(vl-load-com)

(setvar "PEDITACCEPT" 1)

(if (setq ss (ssget '((0 . "*LINE,ARC"))))

(vl-cmdf ".pedit" "m" ss "" "j" "0" "")

)

(princ)

)

  • 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

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


×