Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
15 replies to this topic

#1 united

united

    biết vẽ arc

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

Đã gửi 09 August 2015 - 10:16 PM

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

  • 0

#2 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 10 August 2015 - 07:43 AM

Cad 2015 có thể dùng các lệnh laylck layulk layiso Layuniso thay thế cho Lisp trên.


  • 1

#3 united

united

    biết vẽ arc

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

Đã gửi 10 August 2015 - 08:07 AM

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.


  • 0

#4 hoquangvinh

hoquangvinh

    biết lệnh mirror

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

Đã gửi 10 August 2015 - 08:55 AM

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ứ 


  • 1

#5 united

united

    biết vẽ arc

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

Đã gửi 10 August 2015 - 09:35 AM

 

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.


  • 0

#6 hoquangvinh

hoquangvinh

    biết lệnh mirror

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

Đã gửi 10 August 2015 - 09:44 AM

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


  • 1

#7 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 665 Bài viết
Điểm đánh giá: 312 (khá)

Đã gửi 10 August 2015 - 03:26 PM

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

  • 1

#8 united

united

    biết vẽ arc

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

Đã gửi 14 August 2015 - 12:27 PM

 

Chuẩn rồi anh! Nhưng sao khi lock layer mà đối tượng không bị mờ đi anh nhỉ? Dùng lệnh LAYLCK thì vẫn mờ.


  • 0

#9 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 665 Bài viết
Điểm đánh giá: 312 (khá)

Đã gửi 14 August 2015 - 10:36 PM

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

  • 1

#10 united

united

    biết vẽ arc

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

Đã gửi 15 August 2015 - 01:27 AM

 

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

  • 0

#11 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 665 Bài viết
Điểm đánh giá: 312 (khá)

Đã gửi 15 August 2015 - 08:19 AM

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ì đó.


  • 1

#12 united

united

    biết vẽ arc

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

Đã gửi 18 August 2015 - 12:21 AM

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


  • 0

#13 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 665 Bài viết
Điểm đánh giá: 312 (khá)

Đã gửi 18 August 2015 - 05:55 AM

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

  • 1

#14 united

united

    biết vẽ arc

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

Đã gửi 18 August 2015 - 10:12 AM

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.


  • 0

#15 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 18 August 2015 - 10:56 AM

@quocmanh04tt : bạn set biến peditaccept đi.


  • 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


#16 Tr.CongSon

Tr.CongSon

    biết lệnh array

  • Members
  • PipPipPip
  • 183 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 18 August 2015 - 11:19 AM

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


  • 1