Chuyển đến nội dung
Diễn đàn CADViet
dovananh.xd

[Yêu cầu]Lisp hatch nhanh theo layer

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

Em muốn hatch nhiều vùng kín được tạo từ các layer, mà chỉ cần chọn theo layer không phải pick điểm hoặc chọn đối tượng. Ví dụ như trong hình vẽ có 3 layer với 3 màu khác nhau, bây h muốn hacth theo trong vùng kín được tạo bởi layer màu xanh và màu vàng chẳng hạn thì chỉ cần chọn layer không cần pick điểm. Nếu pick điểm thì rất mất thời gian. Xin cám ơn!89140_1.jpg

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

Rất mong các pro ghé qua topic nà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

Hiểu ý bạn nhưng để làm được k phải dễ ^^

Topic chưa có file minh họa, đầu vào đầu ra (chọn layer ntn, bnhieu layer, hatch ra sao....)

  • 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

file đây bác, không biết thế đã đủ chưa. Yêu cầu là: hatch các vùng tạo bởi 2 layer, chọn 2 layer, hatch được bình thường như pick điểm hoặc chọn đối tượng.

http://www.cadviet.com/upfiles/3/89140_drawing1.dwg

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

file đây bác, không biết thế đã đủ chưa. Yêu cầu là: hatch các vùng tạo bởi 2 layer, chọn 2 layer, hatch được bình thường như pick điểm hoặc chọn đối tượng.

http://www.cadviet.c...40_drawing1.dwg

Thanks!

Bạn thử nhé :


(defun c:hlay(/ ss Tue-dxf Tue-ent-Lpoint ename ename2 ss2 lh)
(defun Tue-dxf (dxf ename)(cdr(assoc dxf (entget ename))))
(defun lh(dt name tle goc)
(setvar "hpgaptol" 50.0)
(vl-cmdf "bhatch" "P" name tle goc "S" dt "" "")
) 
(defun Tue-ent-Lpoint(e / i Lpoint);Tue-dxf
(if (wcmatch (Tue-dxf 0 e) "*POLYLINE")
(progn
 (if (= (type e) 'VLA-OBJECT) (setq e (vlax-vla-object->ename e)))
 (setq i -1)
 (Repeat (if (wcmatch (Tue-dxf 0 e) "*POLYLINE") (fix (1+ (vlax-curve-getEndParam e))) 2)
   (setq Lpoint (append Lpoint (list (vlax-curve-getPointatParam e (setq i (1+ i))))))
 )
)
)
(if (wcmatch (Tue-dxf 0 e) "LINE")
 (setq Lpoint (append Lpoint (list (Tue-dxf 10 e) (Tue-dxf 11 e))))
)
Lpoint
)
 (if (setq ss (ssget '((0 . "*POLYLINE") (8 . "NVSS"))))
   (Progn
     ;(command "hatch" "P" "ANSI31" "1" "0" "")
     (setq i -1)
     (while (setq ename (ssname ss (setq i (1+ i))))
(setq ss2 (ssget "f" (Tue-ent-Lpoint ename) '((0 . "*POLYLINE") (8 . "NVSS,TUNHIEN"))))
(lh  ss2 "ANSI31" "1" "0")
     )
   ))
)

  • Vote tăng 4

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

Thanks bác nhiều!

Mong bác phát triển thêm chút nữa:

1/ Không nhất thiết phải dùng mẫu hatch "ANSI31", có thể tùy chọn mẫu hatch tùy ý như hatch bình thường;

2/ Các layer chọn không nhất thiết phải đúng tên "NVSS" hay "TUNHIEN", có thể chọn 2 layer khác nhau cùng lú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

Thanks bác nhiều!

Mong bác phát triển thêm chút nữa:

1/ Không nhất thiết phải dùng mẫu hatch "ANSI31", có thể tùy chọn mẫu hatch tùy ý như hatch bình thường;

2/ Các layer chọn không nhất thiết phải đúng tên "NVSS" hay "TUNHIEN", có thể chọn 2 layer khác nhau cùng lúc.

Sao cứ để phải viết đi viết lại thế bạn ?

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 cứ để phải viết đi viết lại thế bạn ?

Hix. Mong bác bỏ quá cho em. Nếu có thể thì bác viết lại cho em vớ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

Sửa lại 1 chút theo ý bạn, còn nguyên lý làm việc vẫn giữ nguyên ý bác Tuệ, chạy mượt hay không bạn tìm bác ấy nhé :)

(defun c:hlay(/ ss Tue-dxf Tue-ent-Lpoint ename ename2 ss2 lh ent fl)
(setq fl "")
(defun Tue-dxf (dxf ename)(cdr(assoc dxf (entget ename))))
(defun lh(dt tle goc)
(setvar "hpgaptol" 50.0)
(vl-cmdf "bhatch" "P" (getvar "hpname") tle goc "S" dt "" "")
)
(defun Tue-ent-Lpoint(e / i Lpoint);Tue-dxf
(if (wcmatch (Tue-dxf 0 e) "*POLYLINE")
(progn
 (if (= (type e) 'VLA-OBJECT) (setq e (vlax-vla-object->ename e)))
 (setq i -1)
 (Repeat (if (wcmatch (Tue-dxf 0 e) "*POLYLINE") (fix (1+ (vlax-curve-getEndParam e))) 2)
(setq Lpoint (append Lpoint (list (vlax-curve-getPointatParam e (setq i (1+ i))))))
 )
)
)
(if (wcmatch (Tue-dxf 0 e) "LINE")
 (setq Lpoint (append Lpoint (list (Tue-dxf 10 e) (Tue-dxf 11 e))))
)
Lpoint
)
(while (setq ent (entsel "\nDoi tuong chua layer mau :"))
 (setq  lay (Tue-dxf 8 (car ent))
fl (cond ((not (wcmatch lay fl))(strcat fl  lay ",")))
 )
)
(setq fl (vl-string-left-trim "," fl))
 (if (setq ss (ssget (list (cons 0 "*POLYLINE")
 (cons  8 (cond  ((setq tmp (vl-string-search "," fl)) (substr fl 1 (vl-string-search "," fl)))
  	(fl)
 )))))
(Progn     
 	(setq i -1)
 	(while (setq ename (ssname ss (setq i (1+ i))))
(setq ss2 (ssget "f" (Tue-ent-Lpoint ename) (list (cons 0 "*POLYLINE") (cons 8 fl))))
(lh  ss2  "1" "0")
 	)
))
)

  • Vote tăng 2

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ửa lại 1 chút theo ý bạn, còn nguyên lý làm việc vẫn giữ nguyên ý bác Tuệ, chạy mượt hay không bạn tìm bác ấy nhé :)

(defun c:hlay(/ ss Tue-dxf Tue-ent-Lpoint ename ename2 ss2 lh ent fl)
(setq fl "")
(defun Tue-dxf (dxf ename)(cdr(assoc dxf (entget ename))))
(defun lh(dt tle goc)
(setvar "hpgaptol" 50.0)
(vl-cmdf "bhatch" "P" (getvar "hpname") tle goc "S" dt "" "")
)
(defun Tue-ent-Lpoint(e / i Lpoint);Tue-dxf
(if (wcmatch (Tue-dxf 0 e) "*POLYLINE")
(progn
 (if (= (type e) 'VLA-OBJECT) (setq e (vlax-vla-object->ename e)))
 (setq i -1)
 (Repeat (if (wcmatch (Tue-dxf 0 e) "*POLYLINE") (fix (1+ (vlax-curve-getEndParam e))) 2)
(setq Lpoint (append Lpoint (list (vlax-curve-getPointatParam e (setq i (1+ i))))))
 )
)
)
(if (wcmatch (Tue-dxf 0 e) "LINE")
 (setq Lpoint (append Lpoint (list (Tue-dxf 10 e) (Tue-dxf 11 e))))
)
Lpoint
)
(while (setq ent (entsel "\nDoi tuong chua layer mau :"))
 (setq  lay (Tue-dxf 8 (car ent))
fl (cond ((not (wcmatch lay fl))(strcat fl  lay ",")))
 )
)
(setq fl (vl-string-left-trim "," fl))
 (if (setq ss (ssget (list (cons 0 "*POLYLINE")
 (cons  8 (cond  ((setq tmp (vl-string-search "," fl)) (substr fl 1 (vl-string-search "," fl)))
  	(fl)
 )))))
(Progn    
 	(setq i -1)
 	(while (setq ename (ssname ss (setq i (1+ i))))
(setq ss2 (ssget "f" (Tue-ent-Lpoint ename) (list (cons 0 "*POLYLINE") (cons 8 fl))))
(lh  ss2  "1" "0")
 	)
))
)

Cám ơn bác nhiều nhé!

Nhưng hình như bác mới sửa được một ý thứ 2 trong 2 ý mà em muốn.

Còn lựa chọn mẫu hatch và scale nữa.

Mong bác giúp đỡ!

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 muốn thao tác chọn mẫu Hatch như lệnh nguyên thủy thì k làm hàng loạt ngay được, vì hộp thoại trong thao tác chuẩn là để làm từng lần 1. Có thể thay đổi bằng cách bắt bạn nhập vào tên mẫu Hatch ngay ban đầu, nhưng như thế còn khó chịu hơn, liệu bạn có nhớ tên mẫu Hatch cần Hatch ?. Mình đang để lấy mẫu Hatch hiện tại, vì vậy bạn có thể linh hoạt hatch bằng loại mình muốn trc khi dùng lisp

- Ý 2 : chọn nhiều đối tượng để lấy tên layer, k nhất thiết là 2 (có thể 1,3...)

- Ý 3 : về tỉ lệ, ý này bạn vừa nói, trong bài trước không có. Trả lời tương tự ý 1, có thể làm bằng cách thay "1" trong dòng (lh ss2 "1" "0") thành (getreal "\nTi le :")

- Ý 1 + Ý 3 : thay vì chờ người viết, bạn có thể cứ sử dụng lisp rồi chọn hàng loạt Hatch, ấn Ctrl 1 và sửa. Chủ động giải quyết vấn đề k hơn sao :)

  • 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

Sau khi chọn xong đối tượng có Layer mẫu -> quét chọn đối tượng

 

-> Lisp sẽ gọi hộp thoại Hatch cho bạn lựa chọn mẫu hatch và scale , angle

Bạn nhấn nút Select Object -> OK trong hộp thoại Hatch là xong

đây là Code :

[Code]
(defun c:hlay(/ ss Tue-dxf Tue-ent-Lpoint ename ename2 ss2 lh ent fl)
(setq fl "")
(defun Tue-dxf (dxf ename)(cdr(assoc dxf (entget ename))))
(defun lh(dt tle goc)
(setvar "hpgaptol" 50.0)
(vl-cmdf "bhatch" "P" (getvar "hpname") tle goc "S" dt "" "")
)
(defun Tue-ent-Lpoint(e / i Lpoint);Tue-dxf
(if (wcmatch (Tue-dxf 0 e) "*POLYLINE")
(progn
(if (= (type e) 'VLA-OBJECT) (setq e (vlax-vla-object->ename e)))
(setq i -1)
(Repeat (if (wcmatch (Tue-dxf 0 e) "*POLYLINE") (fix (1+ (vlax-curve-getEndParam e))) 2)
(setq Lpoint (append Lpoint (list (vlax-curve-getPointatParam e (setq i (1+ i))))))
)
)
)
(if (wcmatch (Tue-dxf 0 e) "LINE")
(setq Lpoint (append Lpoint (list (Tue-dxf 10 e) (Tue-dxf 11 e))))
)
Lpoint
)
(while (setq ent (entsel "\nDoi tuong chua layer mau\Enter ket thuc"))
(setq lay (Tue-dxf 8 (car ent))
fl (cond ((not (wcmatch lay fl))(strcat fl lay ",")))
)
)
(setq fl (vl-string-left-trim "," fl))
(if (setq ss (ssget (list (cons 0 "*POLYLINE")
(cons 8 (cond ((setq tmp (vl-string-search "," fl)) (substr fl 1 (vl-string-search "," fl)))
(fl)
)))))
(Progn
(setq i -1) (initdia) (command "bhatch")
(while (setq ename (ssname ss (setq i (1+ i))))
(setq ss2 (ssget "f" (Tue-ent-Lpoint ename) (list (cons 0 "*POLYLINE") (cons 8 fl))))
(lh ss2 (getvar "Hpscale") (getvar "hpang"))
)
))
)
[/code]

 

Không biết thế nào mà code không chịu vào thẻ nữa

  • 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


×