Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
almodeus

Nhờ viết Lisp Match bề dày cho Line

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

almodeus    0

Mỗi lần muốn tăng Width cho nhiều Line lại phải ngồi sài lisp chỉnh width...có bác nào viết zùm mình cái Lisp Match từ một Pline co độ dày sẵn cho một hay nhiều Line bất kì không...trên diễn đàn có match width nhưng chỉ ứng match từ Pline sang Pline chứ từ Pline sang Line ko được

Lisp đó như sau: (chỉ từ Pline có độ dày sang cho một Pline khác thôi)

;;;-------------------------------------------------------------

(defun getthick (e) (cdr (assoc 43 (entget e))))

;;;-------------------------------------------------------------

(defun setthick (e th)

(setq

data (entget e)

old (assoc 43 data)

new (cons 43 th)

)

(entmod (subst new old data))

)

;;;-------------------------------------------------------------

(defun C:CTN()

(princ "\nCADViet.com © 2007")

(setq th (getthick (car (entsel "\nSelect source object:"))))

(while (setq e (car (entsel "\nSelect destination object:")))

(if e (setthick e th))

)

)

;;;-------------------------------------------------------------

 

 

(princ "\nCNT - free lisp from www.cadviet.com")

(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
elleHCSC    98

Mỗi lần muốn tăng Width cho nhiều Line lại phải ngồi sài lisp chỉnh width...có bác nào viết zùm mình cái Lisp Match từ một Pline co độ dày sẵn cho một hay nhiều Line bất kì không...trên diễn đàn có match width nhưng chỉ ứng match từ Pline sang Pline chứ từ Pline sang Line ko được

 

Cái Line không có thuộc tính width đâu bạn nhé, LWPOLYLINE thì mới có thuộc tính width thôi ah. Thử đoạn code sau xem sao.

 

(defun C:CTN (/ obj Vla-obj 2Width 2obj)
 (vl-load-com)
 (setvar "CmdEcho" 0)
 (prompt "\n<< Match PLINE ConstantWidth - elleHCSC >>")
 (setq obj (car(entsel "\n1. Select source PLINE: ")))
 (if obj
   (progn
     (if (/= (cdr(assoc 0 (entget obj)))"LWPOLYLINE")
(prompt "\n>>> Object must be PLINE !")
(progn
  (setq Vla-obj (vlax-ename->vla-object obj))
  (setq 2Width(vla-get-ConstantWidth Vla-obj))
  (while (setq 2obj (car(entsel "\n2. Select destination LINE, PLINE:")))
           (if 2obj
      (progn
	(if (= (cdr(assoc 0 (entget 2obj)))"LINE")
	  (progn
	    (VL-CMDF "PEDIT" 2obj "Y" "")
	    (setq Vla-obj (vlax-ename->vla-object (entlast)))
	     (vl-catch-all-apply
	       '(lambda()
	          (vla-put-ConstantWidth Vla-obj 2Width)
	       )
	     )	    
	  )
	  (progn
	    (setq Vla-obj (vlax-ename->vla-object 2obj))
	     (vl-catch-all-apply
	       '(lambda()
	          (vla-put-ConstantWidth Vla-obj 2Width)
	       )
	     )		    
	  )
	);if LINE
      )
    )
         );while
)
     )
   )
 );if obj
 (setvar "CmdEcho" 1)
 (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
Tue_NV    3.841

Cái Line không có thuộc tính width đâu bạn nhé, LWPOLYLINE thì mới có thuộc tính width thôi ah. Thử đoạn code sau xem sao.

 

(defun C:CTN (/ obj Vla-obj 2Width 2obj)
(vl-load-com)
(setvar "CmdEcho" 0)
(prompt "\n<< Match PLINE ConstantWidth - elleHCSC >>")
(setq obj (car(entsel "\n1. Select source PLINE: ")))
(if obj
(progn
(if (/= (cdr(assoc 0 (entget obj)))"LWPOLYLINE")
(prompt "\n>>> Object must be PLINE !")
(progn
(setq Vla-obj (vlax-ename->vla-object obj))
(setq 2Width(vla-get-ConstantWidth Vla-obj))
(while (setq 2obj (car(entsel "\n2. Select destination LINE, PLINE:")))
.......
[/quote]
Chào bác elleHCSC
Nếu đã sử dụng Lisp thì nên chọn đối tượng đích 1 loạt luôn, không cần phải chọn từng cái đâu, bác ạ.
Tue_NV đã viết lại, sử dụnglệng MA của CAD, sử lý luôn cho ARC
[codebox]
(defun C:CTN (/ obj Vla-obj 2Width 2obj)
(vl-load-com)
(setvar "CmdEcho" 0)
(prompt "\n<< Match PLINE ConstantWidth - Tue_NV >>")
(setq obj (car(entsel "\n1. Select source PLINE: ")))
(if obj
(progn
(if (/= (cdr(assoc 0 (entget obj)))"LWPOLYLINE")
(prompt "\n>>> Object must be PLINE !")
(progn
(setq Vla-obj (vlax-ename->vla-object obj))
(setq 2Width(vla-get-ConstantWidth Vla-obj))
))))
(command "MATCHPROP" obj (setq ss (ssget '((0 . "*LINE,ARC")))) "")
(setq i -1)
(while (setq 2obj (ssname ss (setq i (1+ i))))
(if (wcmatch (cdr(assoc 0 (entget 2obj)))"LINE,ARC")
(progn
(VL-CMDF "PEDIT" 2obj "Y" "")
(setq Vla-obj (vlax-ename->vla-object (entlast)))
(vl-catch-all-apply
'(lambda()
(vla-put-ConstantWidth Vla-obj 2Width)
)
)
)
)
)
)
[/codebox]

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

đang tính thắc mắc thì tue đã giải quyết zùm rồi: đúng lá nên kết hợp Ma luôn nó vừa đổi cả loại nét vừa đổi luôn bề dày, mà lại chọn Multi đối tượng luôn...quá hay...Thank Tue nhiề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
elleHCSC    98

Tue_NV đã viết lại, sử dụnglệng MA của CAD, sử lý luôn cho ARC

 

1. Cái lệnh MA này thì mình biết chứ nhưng làm theo yêu cầu đầu bài của bạn almodeus thôi, tức là chỉ MA width của PLINE thôi chứ ko MA để thay đổi cho các thuộc tính khác của 2obj như: Layer, Color... Các bạn dùng 2 cái lisp trên sẽ thấy nó khác biệt nhau về mục đích đó. Theo yêu cầu của đầu bài này thì không nên dùng (command "MATCHPROP" obj (setq ss (ssget '((0 . "*LINE,ARC")))) "") mà chỉ cần đoạn chọn 1 loạt đối tượng đích thông qua (setq ss (ssget)) là đủ.

2. *LINE ??? mà SPLINE hình như cũng không có thuộc tính width đâu.

3. Nếu đưa thêm cả ARC vào thì lệnh PEDIT vô tình cũng chuyển ARC này thành 1 PLINE khá đặc biệt đó, bạn thử kiểm nghiệm lại xem.

 

(defun C:CTN (/ obj Vla-obj 2Width 2obj ss sslen)
 (vl-load-com)
 (setvar "CmdEcho" 0)
 (prompt "\n<< Match ConstantWidth LWPOLYLINE >>")
 (setq obj (car(entsel "\n1. Select source LWPOLYLINE: ")))
 (if obj
   (progn
     (if (/= (cdr(assoc 0 (entget obj)))"LWPOLYLINE")
(prompt "\n>>> Object must be LWPOLYLINE !")
(progn
  (setq Vla-obj (vlax-ename->vla-object obj))
  (setq 2Width(vla-get-ConstantWidth Vla-obj))
  (prompt "\n2. Select destination: ")
  (setq ss(ssget))
  (if ss (progn
	   (setq sslen (sslength ss))
	   (while (> sslen 0)
             (setq 2obj (ssname ss (setq sslen (1- sslen))))
	     (if (wcmatch (cdr(assoc 0 (entget 2obj)))"LINE")
	       (progn
	         (VL-CMDF "PEDIT" 2obj "Y" "")
	         (setq Vla-obj (vlax-ename->vla-object (entlast)))
	         (vl-catch-all-apply '(lambda()(vla-put-ConstantWidth Vla-obj 2Width)))			 
	       )
	       (progn
	         (setq Vla-obj (vlax-ename->vla-object 2obj))
                        (vl-catch-all-apply '(lambda()(vla-put-ConstantWidth Vla-obj 2Width)))			 
	       )
	     )
	   );while
  ))	  
)
     )
   )
 );if obj
 (setvar "CmdEcho" 1)
 (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
almodeus    0

cái lisp của bạn elle cũng hay có thể dùng thay thế luôn cho match của Cad, match của cad lai không match một loạt đối tượ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

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  

×