Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
thaihoa123

in Block theo thứ tự trái qua phải

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

em định viết LSP in tự động nhưng chưa có cách nào để in theo thứ tư từ trái qua phải được mà chỉ in theo thứ tự chọn Block, bác giúp em với nhé

Link file đã làm: http://www.cadviet.com/upfiles/3/in.lsp

Bạn lập danh sách gồm hoành độ điểm chèn và ename của cái block. VD : '((30 ename1) (10 ename2) (20 ename3))

sd hàm (vl-sort ((30 ename1) (10 ename2) (20 ename3)) (function (lambda (e1 e2) (< (car e1) (car e2))))) để sắp xếp theo phần tử thứ nhất bạn sẽ đc

((10 ename1) (20 ename2) (30 ename3)).

Duyệt qua ds này để in ename1, ename2, ename3

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 lập danh sách gồm hoành độ điểm chèn và ename của cái block. VD : '((30 ename1) (10 ename2) (20 ename3))

sd hàm (vl-sort ((30 ename1) (10 ename2) (20 ename3)) (function (lambda (e1 e2) (< (car e1) (car e2))))) để sắp xếp theo phần tử thứ nhất bạn sẽ đc

((10 ename1) (20 ename2) (30 ename3)).

Duyệt qua ds này để in ename1, ename2, ename3

 

e đã làm theo cách này nhưng không được (vì làm mò và thử dần thôi), nếu được bác chèn luôn đoạn lệnh đó vào file giúp e nhé.

(ví dụ file cần in: http://www.cadviet.com/upfiles/3/a.dwg)

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
e đã làm theo cách này nhưng không được (vì làm mò và thử dần thôi), nếu được bác chèn luôn đoạn lệnh đó vào file giúp e nhé.

(ví dụ file cần in: http://www.cadviet.com/upfiles/3/a.dwg)

Mình kg down đc cái file của bạn và trong đoạn lisp của bạn mình cũng kg quen cách dùng các hàm VL nên mình chỉ viết giúp bạn đoạn lisp tạo và sắp xếp các block theo hoành độ điểm chèn (ở đây mình nghĩ điểm chèn các block của bạn sẽ tăng dần theo hoành độ)

 

(defun dxf( name n)

(cdr (assoc n (entget name)))

)

(defun haminBlock( e)

(prompt "\nBan dang in block")

(print e)

)

 

(defun c:inBL( / ss n e p ListB dx)

(setq ss (ssget '((0 . "INSERT"))))

(setq n 0 listB nil)

(while (< n (sslength ss))

(setq e (ssname ss n))

(setq p (dxf e 10) dx (car p))

(setq listB (append listB (list (list dx e))))

(setq n (1+ n))

)

(setq listB (vl-sort ListB (function (lambda (e1 e2) (< (car e1) (car e2))))))

(foreach n ListB (haminBlock (cadr n)))

)

 

Bạn chỉ cần viết thêm hàm in block theo ename của nó thay vào hàm haminBlock là được

  • 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
e đã làm theo cách này nhưng không được (vì làm mò và thử dần thôi), nếu được bác chèn luôn đoạn lệnh đó vào file giúp e nhé.

(ví dụ file cần in: http://www.cadviet.com/upfiles/3/a.dwg)

Tue_NV không download file bạn về được

Bạn có thể làm theo ý của bác TrungNgaMy hoặc làm theo cách này :

 

1. Bạn nên thêm và thay dòng này trong code của bạn :

Thay dòng :

(setq ss (ssget '((0 . "INSERT"))))

bằng dòng này :

(setq Blockname (cdr(assoc 2 (entget (car(entsel "\nPick chon Block mau :"))))))

(setq ss (ssget (list (cons 0 "INSERT") (cons 2 Blockname) ) ) )

 

-> Chạy Code

Command: q

Pick chän vïng chøa c¸c ®èi t­îng cÇn in

Pick chon Block mau : -> Pick chon Block mau

Select objects: f -> gõ f

-> Kéo 1 đường từ trái qua phải cắt Block rồi enter

Lisp sẽ thực hiện việc in từ trái qua phải như ý của bạn

 

Nếu mà bạn chọn kiểu cắt từ phải qua trái -> Lisp sẽ in theo thứ tự từ phải qua trái

Nếu mà bạn chọn kiểu cắt từ trên xuống dưới -> Lisp sẽ in theo thứ tự từ trên xuống dưới,

Nếu mà bạn chọn kiểu cắt từ dưới lên trên -> Lisp sẽ in theo thứ tự từ dưới lên trên

 

Chúc thành công.

  • 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
Mình kg down đc cái file của bạn và trong đoạn lisp của bạn mình cũng kg quen cách dùng các hàm VL nên mình chỉ viết giúp bạn đoạn lisp tạo và sắp xếp các block theo hoành độ điểm chèn (ở đây mình nghĩ điểm chèn các block của bạn sẽ tăng dần theo hoành độ)

 

(defun dxf( name n)

(cdr (assoc n (entget name)))

)

(defun haminBlock( e)

(prompt "\nBan dang in block")

(print e)

)

 

(defun c:inBL( / ss n e p ListB dx)

(setq ss (ssget '((0 . "INSERT"))))

(setq n 0 listB nil)

(while (< n (sslength ss))

(setq e (ssname ss n))

(setq p (dxf e 10) dx (car p))

(setq listB (append listB (list (list dx e))))

(setq n (1+ n))

)

(setq listB (vl-sort ListB (function (lambda (e1 e2) (< (car e1) (car e2))))))

(foreach n ListB (haminBlock (cadr n)))

)

 

Bạn chỉ cần viết thêm hàm in block theo ename của nó thay vào hàm haminBlock là được

e Đã thử theo hướng dẫn (không biết làm đã đúng chưa) nhưng chỉ in theo thứ tự chọn, nhờ bác xem giúp

Link file LSP: http://www.cadviet.com/upfiles/3/in_1.lsp

Link file Cad: http://www.cadviet.com/upfiles/3/in.dwg

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
e Đã thử theo hướng dẫn (không biết làm đã đúng chưa) nhưng chỉ in theo thứ tự chọn, nhờ bác xem giúp

Link file LSP: http://www.cadviet.com/upfiles/3/in_1.lsp

Link file Cad: http://www.cadviet.com/upfiles/3/in.dwg

Mình vẫn kg down đc file của bạn. Theo mình nghĩ đoạn lisp mình viết cũng khá đơn giản và dễ hiểu. Nếu đúng là các block của bạn có điểm insert tăng đần theo trục X thì nó sẽ đc sắp xếp lại từ trái qua phải, bạn chỉ cần thêm dòng (print ListB) trước và sau dòng (setq listB (vl-sort ListB (function (lambda (e1 e2) (< (car e1) (car e2))))))sẽ thấy. nhưng nếu các điểm insert kg đảm bảo tăng dần theo trục X thì bạn phải chọn tiêu chuẩn khác làm căn cứ để sắp xếp (ví dụ tâm hay điểm extmax, hoặc extmin của các thực thể trong block, cái này xác định hơi khó một tý)

Mình thấy trên DĐ có rất nhiều lisp in hàng loạt, bạn xem thử TH của bạn đã có chưa, đỡ mất công suy nghĩ

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  

×