Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
6 replies to this topic

#1 thaihoa123

thaihoa123

    biết pan

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

Đã gửi 12 September 2010 - 01:12 AM

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.c...pfiles/3/in.lsp
  • 0

#2 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 12 September 2010 - 03:09 AM

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.c...pfiles/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
  • 0

#3 thaihoa123

thaihoa123

    biết pan

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

Đã gửi 12 September 2010 - 08:41 AM

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.c...pfiles/3/a.dwg)
  • 0

#4 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 12 September 2010 - 05:18 PM

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.c...pfiles/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
  • 1

#5 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 12 September 2010 - 05:58 PM

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.c...pfiles/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.
  • 2

#6 thaihoa123

thaihoa123

    biết pan

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

Đã gửi 13 September 2010 - 12:44 AM

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.c...iles/3/in_1.lsp
Link file Cad: http://www.cadviet.c...pfiles/3/in.dwg
  • 0

#7 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 13 September 2010 - 01:34 AM

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.c...iles/3/in_1.lsp
Link file Cad: http://www.cadviet.c...pfiles/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ĩ
  • 0