Đến nội dung


Hình ảnh
* * * - - 8 Bình chọn

Viết lisp theo yêu cầu [phần 2]


  • Chủ đề bị khóa Chủ đề bị khóa
3783 replies to this topic

#981 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 27 March 2010 - 04:20 PM

Phiphi dùng lisp IMF (insert multi files) dưới đây

(defun c:imf()
(setq pathname (vl-filename-directory (getfiled "Hay chon file dwg bat ky thuoc thu muc" "" "dwg" 0))
filelist (vl-sort (vl-directory-files pathname "*.dwg") '<)
p (getpoint "\nDiem chen: ")
xht (car p)
yht (cadr p)
)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(foreach filename filelist
(command "-insert" (strcat pathname "/" filename) (list xht yht) 1.0 1.0 0.0)
(vla-getboundingbox (vlax-ename->vla-object (entlast)) 'p1 'p2)
(setq
p1 (vlax-safearray->list p1)
p2 (vlax-safearray->list p2)
xht (+ xht (abs (car (mapcar '- p2 p1))))
blname (cdr (assoc 2 (entget (entlast))))
)
(command ".explode" (entlast) "")
(command "-purge" "Block" blname "N")
)
(setvar "osmode" oldos)
(princ)
)

Chào bác Hoành.
Đọc cái líp của bác và chạy hử mình thấy có thắc mắc như sau:
Tại sao theo lisp thì bác chỉ insert mỗi bản vẽ có 1 lần theo trật tự của cái filelist. Vậy mà kết quả thì mỗi bản vẽ được insert hai lần, một lần theo hàng ngang với đúng thứ tự của filelist và một lần nó tự sắp xếp thành một bảng có 5 cột và theo trật tự số từ 1 tới 23 bác ạ.
Vậy cái lần insert thú hai này là do đâu? Bác có thể giải thích thêm một chút chỗ này được không???
  • -1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#982 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 27 March 2010 - 04:26 PM

Chào bác Hoành.
Đọc cái líp của bác và chạy hử mình thấy có thắc mắc như sau:
Tại sao theo lisp thì bác chỉ insert mỗi bản vẽ có 1 lần theo trật tự của cái filelist. Vậy mà kết quả thì mỗi bản vẽ được insert hai lần, một lần theo hàng ngang với đúng thứ tự của filelist và một lần nó tự sắp xếp thành một bảng có 5 cột và theo trật tự số từ 1 tới 23 bác ạ.
Vậy cái lần insert thú hai này là do đâu? Bác có thể giải thích thêm một chút chỗ này được không???

là vì trong tập hợp các file Phiphi gửi có 1 file tên là Multiple drawings.dwg chứa kết quả (làm ví dụ).

Lisp chèn tất cả các file + file kết quả -> bác Bình nhìn thấy 2 lần kết quả.
  • 0

#983 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 27 March 2010 - 04:32 PM

là vì trong tập hợp các file Phiphi gửi có 1 file tên là Multiple drawings.dwg chứa kết quả (làm ví dụ).

Lisp chèn tất cả các file + file kết quả -> bác Bình nhìn thấy 2 lần kết quả.

Vừa pót xong mới phát hiện ra bác ạ, tại cái file multi... của bác phi phi.
Xin lỗi đã làm phiền bác.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#984 Phiphi-

Phiphi-

    biết lệnh minsert

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

Đã gửi 27 March 2010 - 05:21 PM

Tất nhiên là được, nhưng muốn hỏi Phiphi thêm một số thông tin:
- tên file được đặt theo nguyên tắc nào?
- Các khung tên được sắp xếp ra sao? (trên một hàng hay theo ma trận nhiều hàng)

1. Tên file sẽ dủng 1 attribute value của 1 Tagname trong khung tên do User chọn.
(thí du Tagname DRAWING_NUMBER trong các b/v mẫu PP đã post)
2. Cách trình bảy hợp lý nhất là dạng ma trận phù hợp với kích thước của User's monitors (16:9-wide screen hoặc 4:3), vì khi zoom all các b/v sẽ được fit toàn bộ trên màn hình.
Với LISP ghép chung b/v trên của Bác, PP nghỉ rằng Bác thêm vào phép tính tổng số files chia với tỷ lệ của monitor, Lisp sẽ tự động dàn theo ma trận hợp lý nhất.
Thank you Bác.
  • 0

#985 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 27 March 2010 - 06:22 PM

1. Tên file sẽ dủng 1 attribute value của 1 Tagname trong khung tên do User chọn.
(thí du Tagname DRAWING_NUMBER trong các b/v mẫu PP đã post)
2. Cách trình bảy hợp lý nhất là dạng ma trận phù hợp với kích thước của User's monitors (16:9-wide screen hoặc 4:3), vì khi zoom all các b/v sẽ được fit toàn bộ trên màn hình.
Với LISP ghép chung b/v trên của Bác, PP nghỉ rằng Bác thêm vào phép tính tổng số files chia với tỷ lệ của monitor, Lisp sẽ tự động dàn theo ma trận hợp lý nhất.
Thank you Bác.

Phiphi dùng lệnh EXF (EXtract file) sau đây:
(defun c:exf ()
(defun filenamevalid(str)
(vl-list->string (vl-remove-if '(lambda (x) (member x (vl-string->list "\\/:?>|"))) (vl-string->list str)))
)
(defun getboundingbox (ent / p1 p2)
(vla-getboundingbox
(vlax-ename->vla-object ent)
'p1
'p2
)
(list
(setq p1 (vlax-safearray->list p1))
(setq p2 (vlax-safearray->list p2))
)
)
(defun ss2ent (ss / sodt index lstent)
(setq
sodt (if ss
(sslength ss)
0
)
index 0
)
(repeat sodt
(setq ent (ssname ss index)
index (1+ index)
lstent (cons ent lstent)
)
)
(reverse lstent)
)

(defun dxf (ent code)
(cdr (assoc code (entget ent)))
)
(defun gettag (ent / entbl lst)
(setq entbl ent)
(while (and (setq entbl (entnext entbl))
(= (dxf entbl 0) "ATTRIB")
)
(setq lst (append lst (list (cons (dxf entbl 2) (dxf entbl 1)))))
)
lst
)
(setq
entbl (car (entsel "\nHay pick vao block khung ten"))
blname (dxf entbl 2)
taglst (gettag entbl)
index 0
)
(princ "\nCac tag trong block:")
(foreach pp taglst
(princ (strcat "\n" (itoa index) ": " (car pp)))
(setq index (1+ index))
)
(textscr)
(setq
tag (car
(nth (getint "\nHay nhan 0,1,2... de chon tag: ") taglst)
)
)
(graphscr)
(command ".zoom" "e")
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)

(setq ss (ssget "x" (list (cons 0 "INSERT") (cons 2 blname)))
lst (ss2ent ss)
lst (mapcar '(lambda (e) (append (list e (cdr (assoc tag (gettag e)))) (getboundingbox e))) lst)
)

(foreach pp lst
(setq e (nth 0 pp)
f (strcat (getvar "dwgprefix") (filenamevalid (nth 1 pp)) ".dwg")
p1 (nth 2 pp)
p2 (nth 3 pp)
ss (ssget "_w" p1 p2)
ss (ssadd e ss)
)
(command ".wblock" f)
(if (setq fh (open f "r")) (progn (close fh) (command "y")))
(command "" p1 ss "")
(command ".oops")
)

(setvar "osmode" oldos)
(command ".zoom" "p")
(princ)
)


Lưu ý là lisp sẽ overwrite các file có cùng tên, nếu chạy file Multiple drawings.dwg thì chỉ có được 1 kết quả duy nhất là SK-123456-001-X-01.dwg do các khung tên có attribute DRAWING_NUMBER giống nhau.

Bài viết đã được chỉnh sửa nội dung bởi Nguyen Hoanh: 27 March 2010 - 08:54 PM
Chỉnh sửa lại chỗ bị sai của lisp

  • 2

#986 truongthanh

truongthanh

    biết lệnh text

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

Đã gửi 27 March 2010 - 06:34 PM

Xin chân thành cảm ơn bạn truongthanh lệnh br2 chính là thứ mình đang cần. Mình là dân cơ khí nên rất cần nó để chuyển phần bị che khuất sang nét đứt.
Tiện thể bạn cho mình hỏi cách xem nội dung lisp br.fas của bạn. Lisp *.lsp thì có thể xem bằng note còn *.fas thì xem bằng cách nào, mình cũng đang muốn học lisp? Thank bạn

xin lỗi bạn nhé!mình down dc file FAS này thôi!mình ko có file LISP!
  • 1

#987 Phiphi-

Phiphi-

    biết lệnh minsert

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

Đã gửi 27 March 2010 - 07:23 PM

Phiphi dùng lệnh EXF (EXtract file) sau đây:
...
Lưu ý là lisp sẽ overwrite các file có cùng tên, nếu chạy file Multiple drawings.dwg thì chỉ có được 1 kết quả duy nhất là SK-123456-001-X-01.dwg do các khung tên có attribute DRAWING_NUMBER giống nhau.

PP nhờ Bác chỉnh thêm để các b/v sau khi tách riêng thì toạ độ 0,0 sẽ là góc trái phía dưới của khung tên (đây cũng chính là insert point của block khung tên)
Và làm cho Lisp IMF dàn bv theo dạng ma trận như PP đã post bài trên.

Áp dụng 2 Lisp IMFEXF mà bác Nguyen Hoanh vửa mới viết, PP nghỉ rằng các Drafters, Designers, Checkers từ nay sẽ dể dàng hơn khi làm việc với số lượng nhiều bản vẽ.
Kết hợp với Lisp MPLOT cũng của bác Nguyen Hoanh viết, việc in ấn với số lượng lớn các bv này (ra giấy hoặc PDF) để review, giao cho khách hàng cũng sẽ rất thuận tiện nhanh chóng.
Cũng cần nhắc lại rẳng nếu 1 bv dùng nhiều Layouts trong Paper Space thì lệnh PUBLISH sẽ giúp việc in ấn hàng loạt như Lisp MPLOT của bác Hoanh.
Và đừng quên đến Lisp LayoutsToDwg mà PP đã giới thiệu bài trên cũng như Lisp CHSPACE có sẳn trong Express tool của AutoCAD.
Rất cám ơn sự nhiệt tình cống hiến của bác Nguyen Hoanh cho cộng đồng CadViet.com.
PP.
  • 0

#988 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 27 March 2010 - 08:55 PM

PP nhờ Bác chỉnh thêm để các b/v sau khi tách riêng thì toạ độ 0,0 sẽ là góc trái phía dưới của khung tên (đây cũng chính là insert point của block khung tên)

Lisp EXF trước đây bị lỗi, đã chỉnh lại, Phiphi thử lại xem.
  • 1

#989 Phiphi-

Phiphi-

    biết lệnh minsert

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

Đã gửi 28 March 2010 - 10:38 AM

Lisp EXF trước đây bị lỗi, đã chỉnh lại, Phiphi thử lại xem.

Vẫn như cũ bác Hoanh ơi.
  • 0

#990 coxuong89

coxuong89

    biết lệnh erase

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

Đã gửi 28 March 2010 - 12:04 PM

em dùng lisp IMF của bác hoanh thì gặp lỗi sau...bác chỉ em với
Command: imf

Diem chen: -insert Enter block name or [?]: E:\Bao Chau\BIET THU LON/CHI
TIET.dwg
Units: Millimeters Conversion: 0.0394
Specify insertion point or [Basepoint/Scale/X/Y/Z/Rotate]:
Enter X scale factor, specify opposite corner, or [Corner/XYZ] <1>:
1.000000000000000 Enter Y scale factor : 1.000000000000000
Specify rotation angle <0>: 0.000000000000000
Command: ; error: no function definition: VLAX-ENAME->VLA-OBJECT
  • 0
Hình đã gửi

#991 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 28 March 2010 - 02:02 PM

em dùng lisp IMF của bác hoanh thì gặp lỗi sau...bác chỉ em với
.....
Command: ; error: no function definition: VLAX-ENAME->VLA-OBJECT

Bạn thêm dòng (vl-load-com) vào code. Có thể thêm như sau :
(defun c:imf ()
(vl-load-com)
.......
-> Sau đó chạy Lisp là OK

Với cả Lisp exf nữa nhé
  • 0

#992 Phiphi-

Phiphi-

    biết lệnh minsert

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

Đã gửi 28 March 2010 - 08:18 PM

PP nhờ Bác chỉnh thêm để các b/v sau khi tách riêng thì toạ độ 0,0 sẽ là góc trái phía dưới của khung tên (đây cũng chính là insert point của block khung tên)
Và làm cho Lisp IMF dàn bv theo dạng ma trận như PP đã post bài trên.

Áp dụng 2 Lisp IMFEXF mà bác Nguyen Hoanh vửa mới viết, PP nghỉ rằng các Drafters, Designers, Checkers từ nay sẽ dể dàng hơn khi làm việc với số lượng nhiều bản vẽ.
Kết hợp với Lisp MPLOT cũng của bác Nguyen Hoanh viết, việc in ấn với số lượng lớn các bv này (ra giấy hoặc PDF) để review, giao cho khách hàng cũng sẽ rất thuận tiện nhanh chóng.
Cũng cần nhắc lại rẳng nếu 1 bv dùng nhiều Layouts trong Paper Space thì lệnh PUBLISH sẽ giúp việc in ấn hàng loạt như Lisp MPLOT của bác Hoanh.
Và đừng quên đến Lisp LayoutsToDwg mà PP đã giới thiệu bài trên cũng như Lisp CHSPACE có sẳn trong Express tool của AutoCAD.
Rất cám ơn sự nhiệt tình cống hiến của bác Nguyen Hoanh cho cộng đồng CadViet.com.
PP.

PP vừa tìm được 1 freeware tên là Bulk Rename Utility.
Phần mềm này chỉ có 1.8mb, dùng để thay đổi với số lượng lớn các filenames với bất kỳ kiểu nào mà User muốn có.
Các Bác hãy kết hợp dùng p/m này với các Lisp trên để có được các tên file như ý muốn.
Xin giới thiệu các Bác cùng nhau sử dụng (free): http://www.bulkrenam.../Main_Intro.php
Forum của p/m trên: http://www.bulkrenam...ewforum.php?f=4
  • 0

#993 LXD

LXD

    biết vẽ pline

  • Members
  • PipPip
  • 67 Bài viết
Điểm đánh giá: 11 (tàm tạm)

Đã gửi 29 March 2010 - 09:17 AM

Chào các Bác. Tôi dùng CAD Map, và việc ghép các bản vẽ là một tiện ích đã có trong đó (ghép các mảnh Bản đồ lại với nhau). Nhưng đòi hỏi các file phải nằm cùng hệ tọa độ (cùng định nghĩa). Tức là mặc dù mỗi Mảnh Bản đồ là 1 file dwg, nhưng khi insert với điểm gốc là 0,0 thì khớp nhau.

Nếu Bác nào đã cài CAD Map và muốn biết thì Tôi sẽ post bài về vấn đề này ạ.

Tôi cũng có nhu cầu chia 1 bản vẽ thành nhiều bản vẽ, hiện tại Tôi dùng lệnh Wblock (có lisp hỗ trợ), thao tác còn lại là chọn đường dẫn (chỉ lần đầu tiên), select obj, file name.

Tôi nghĩ là nếu để tự động thì hơi khó vì 2 vấn đề là quy luật đặt tên file và quy luật phân bố vị trí bản vẽ (bao nhiêu theo hàng ngang và hàng dọc)

Nhưng nhu cầu của Bác Phiphi và Tôi cũng có khác nhau.

+ Về ghép bản vẽ: Bác Phiphi- Ghép tự do phục vụ Check & Print. Còn tôi là đúng tọa độ để ghép Biên.

+ Tách bản vẽ: Điểm gốc bản vẽ Bác Phiphi- cần là 0,0. Còn tôi là giữ nguyên.

Vài dòng chia sẻ ạ.
-
  • 1

#994 ngocchung1608

ngocchung1608

    biết pan

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

Đã gửi 29 March 2010 - 09:12 PM

Cắt các đối tượng : lines, lwplines, plines, splines, ellipse, circles & arcs tại các giao điểm.
Link : http://www.cadviet.c...showtopic=10514

Ngon. Líp này còn trên cả tuyệt. Thank bác lắm lắm
  • 0

#995 connaivang

connaivang

    biết vẽ arc

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

Đã gửi 30 March 2010 - 11:55 AM

Chào bác Nguyễn Hoành cùng toàn thể các bác trong diễn đàn.
Em muốn các bác viết cho em một đoạn lisp có nội dung như sau:
Sau khi đánh tên lệnh, CAD sẽ yêu cầu chọn đối tượng. Sau khi chọn được đối tượng, lisp có chức năng thống kê số lượng của từng loại đường tròn có đường kính khác nhau.(VD: -Duong tròn duong kinh la 10 có so luong la : 20 -Duong tròn duong kinh la 20 có so luong la : 30...)
Mong được các bác cao thủ trên diễn đàn giúp đỡ.
Chúc các bác mạnh khoẻ, công tác tốt và Xin cảm ơn nhiều.
  • 0

#996 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 30 March 2010 - 03:29 PM

Chào bác Nguyễn Hoành cùng toàn thể các bác trong diễn đàn.
Em muốn các bác viết cho em một đoạn lisp có nội dung như sau:
Sau khi đánh tên lệnh, CAD sẽ yêu cầu chọn đối tượng. Sau khi chọn được đối tượng, lisp có chức năng thống kê số lượng của từng loại đường tròn có đường kính khác nhau.(VD: -Duong tròn duong kinh la 10 có so luong la : 20 -Duong tròn duong kinh la 20 có so luong la : 30...)
Mong được các bác cao thủ trên diễn đàn giúp đỡ.
Chúc các bác mạnh khoẻ, công tác tốt và Xin cảm ơn nhiều.

Bạn chạy thử Lisp này nhé :

(defun c:tkc(/ ss r lisr old Res kq)
(setq ss (ssget '((0 . "CIRCLE"))) i -1 lisr '() Res '() kq "")
(while (setq ent (ssname ss (setq i (1+ i))))
(setq r (cdr (assoc 40 (entget ent))))
(setq lisr (cons r lisr))
)
(foreach x lisr
(if (setq old (assoc x Res))
(setq Res (subst (cons x (1+ (cdr old))) old Res))
(setq Res (append Res (list (cons x 1))))
)
)
(foreach x Res
(setq kq (STRCAT kq "Duong tron duong kinh la " (rtos (car x) 2 1) " \n co so luong la : "
(itoa(cdr x)) "\n\n"
)
)
)
(alert kq)
(princ)
)

  • 1

#997 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 30 March 2010 - 04:29 PM

Bạn chạy thử Lisp này nhé :


(defun c:tkc(/ ss r lisr old Res kq)
(setq ss (ssget '((0 . "CIRCLE"))) i -1 lisr '() Res '() kq "")
(while (setq ent (ssname ss (setq i (1+ i))))
(setq r (cdr (assoc 40 (entget ent))))
(setq lisr (cons r lisr))
)
(foreach x lisr
(if (setq old (assoc x Res))
(setq Res (subst (cons x (1+ (cdr old))) old Res))
(setq Res (append Res (list (cons x 1))))
)
)
(foreach x Res
(setq kq (STRCAT kq "Duong tron duong kinh la " (rtos (car x) 2 1) " \n co so luong la : "
(itoa(cdr x)) "\n\n"
)
)
)
(alert kq)
(princ)
)

Chào bác Tue_NV,
Đọc cái lisp của bác , mình mót được khá nhiều điều hay. Tỷ như cái cách lập vòng lặp While hay cách tạo biến res.
Tuy nhiên có một chỗ chưa đúng là cái thông báo kết quả, phải đổi lại là bán kinh chứ không phải đường kính bác ạ, vì bác lấy từ mã dxf 40 nên nó trả về bán kinh chứ không phải đường kính.
Bác kiểm tra lại nhé.

Còn một điều nữa là trong trường hợp các bán kính vòng tròn khác nhau không quá lớn, tỷ như là 0.01 đơn vị thì sẽ xảy ra kết quả hơi không đúng do trong thông báo kết quả bác lại làm tròn số bác ạ. Nên chăng ta cứ để nguyên giá trị bán kính mà khỏi làm tròn.??? Hoặc là ta làm tròn luôn bán kính trước khi tạo list các bán kính????
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#998 hoa35ktxd

hoa35ktxd

    biết lệnh move

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

Đã gửi 30 March 2010 - 07:55 PM

Một phương pháp làm rất ngắn gọn và sáng tạo.
Bái phục, bái phục.
  • 0

#999 vtd_xd

vtd_xd

    biết vẽ circle

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

Đã gửi 30 March 2010 - 11:04 PM

Bác nào co lisp thống kê cấu kiện không vây? thanks
  • 0
Chuc vui ve

#1000 thonghoang1

thonghoang1

    biết vẽ polygon

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

Đã gửi 31 March 2010 - 08:23 AM

s
  • 0