Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
6 replies to this topic

#1 almodeus

almodeus

    biết vẽ arc

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

Đã gửi 11 February 2011 - 08:54 PM

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

#2 elleHCSC

elleHCSC

    biết lệnh copy

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

Đã gửi 12 February 2011 - 12:27 AM

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

  • 0
Share for all, all will share !

--------------------
HTTP://WWW.HCSC.VN
HTTP://WWW.HCSC.COM.VN

#3 almodeus

almodeus

    biết vẽ arc

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

Đã gửi 12 February 2011 - 02:58 AM

OH, ĐƯỢC RỒI THANK BẠN...THÌ Ý MÌNH LA CHUYEN LINE SANG PLINE ROI TANG WIDTH ĐÓ...HÌ
  • 0

#4 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 12 February 2011 - 06:57 AM

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.

[code](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:")))
.......

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

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

  • 1

#5 almodeus

almodeus

    biết vẽ arc

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

Đã gửi 12 February 2011 - 08:48 PM

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

#6 elleHCSC

elleHCSC

    biết lệnh copy

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

Đã gửi 12 February 2011 - 09:36 PM

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

  • 1
Share for all, all will share !

--------------------
HTTP://WWW.HCSC.VN
HTTP://WWW.HCSC.COM.VN

#7 almodeus

almodeus

    biết vẽ arc

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

Đã gửi 13 February 2011 - 10:30 AM

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