Chuyển đến nội dung
Diễn đàn CADViet
Song Nhi

[Yêu cầu] LISP ghép nhiều file DWG cùng cỡ thành một file chung

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

Em có một tình huống như thế này, mong các bác giúp đỡ cho:

Có một số bản vẽ (*.dwg) cùng cỡ nằm cùng một folder, em muốn:

 

1. Dùng LISP ghép chúng lại với nhau thành một file duy nhất, mỗi bản cách nhau 1 khoảng trống cho trước (ví dụ: 300) theo hàng ngang (hoặc hàng dọc). Lưu vào folder đó với tên là fileghep0.

2. Dùng LISP tách ngược file chung đó, thành các file thành phần như ban đầu, tên lần lược là fileghep1; fileghep2; ...; fileghepn

 

Hình vẽ minh hoạ:

 

118347_untitled_1.jpg

 

Chân thành cám ơn các bác đã quan tâm!

 

P/S: Nếu các bác yêu cầu kích thước ngang-dọc của bản vẽ thành phần thì nhờ các bác viết LISP cho nhập vào bằng cách dùng chuột đo trực tiếp trên một bản vẽ thành phần! Một lần nữa, xin được cám ơ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

@ Chắc là yêu cầu của em hơi quá đáng với LIPS? Vậy các bác có thể giúp em bằng VBA hay NET? Cám ơn sự quan tâm của các bá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

Vấn đề này thật thiết thực, vì chúng ta thường thao tác các bản vẽ chung trên một file, sau khi hoàn thành lại phải tách ra làm từng trang riêng...

Tách thì có thể dùng đỡ lệnh WBLOCK thôi, nhập thì thật khó, e rằng LIPS không đáp ứng đượ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

Vấn đề này thật thiết thực, vì chúng ta thường thao tác các bản vẽ chung trên một file, sau khi hoàn thành lại phải tách ra làm từng trang riêng...

Tách thì có thể dùng đỡ lệnh WBLOCK thôi, nhập thì thật khó, e rằng LIPS không đáp ứng được?!

 

Dễ, dùng lệnh INSERT 

  • 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

Cám ơn các bác đã quan tâm đến vấn đề!

 

Dễ, dùng lệnh INSERT 

 

Các bác có thể giúp em thực hiện công việc này bằng LISP không ạ! 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

Cám ơn các bác đã quan tâm đến vấn đề!

 

Các bác có thể giúp em thực hiện công việc này bằng LISP không ạ! Thanks!

 

Mình nghĩ bạn đã biết về Lisp hãy tự thực hiện việc này xem sao

- Mở 1 file mới (file này sẽ chứa các bản vẽ cần nhập vào

- Tạo và lấy danh sách các file *.dwg trong thư mục nào đó

- Duyệt qua danh sách đó và thực hiện công việc Insert với điểm chèn do bạn chọn

 

Good luck!

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

Cám ơn anh! Em cũng rất muốn tự mình có thể viết được thì hay lắm, hiện tại em chỉ viết được mấy đoạn con con thôi ạ, hằng ngày phải lên diễn đàn, vào mục: Hỏi về Lisp (thuật toán, ý tưởng, coding,...) để học, kiến thức trong này hay và thú vị, tuy nhiên, nó hơi rối vì lộn xộn, đối với người mới học như em thì thấy khó hiểu, phải đọc và truy cứu tới nhiều nguồn, hix! Cám ơn anh đã nói cho em biết là LISP có thể giải quyết được yêu cầu của em, để em còn hi vọng! Hi, tại em cứ tưởng là LISP không làm được điều đó, nên các anh chị trên diễn đàn không viết giúp!

 

Chân thành cám ơn anh! 

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

Vấn đề này thật thiết thực, vì chúng ta thường thao tác các bản vẽ chung trên một file, sau khi hoàn thành lại phải tách ra làm từng trang riêng...

Tách thì có thể dùng đỡ lệnh WBLOCK thôi, nhập thì thật khó, e rằng LIPS không đáp ứng được?!

 

Xin lỗi mình đã comment tào lao!

Song Nhi có thể sử dụng lisp của Bác Nguyen Hoanh ở đây: http://www.cadviet.com/forum/topic/13203-viet-lisp-theo-yeu-cau-phan-2/page-50?do=findComment&comment=90892

  • 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

Tham khảo theo line Bác lyky, quả thật ý tưởng này đã được đề nghị trước đây 3 năm rồi, và lúc đó đã được Bác Nguyen Hoanh giải quyết, kể cả trường hợp ghép và tách file! Em đã down LISP về dùng thử, lưu trình thì hoàn toàn giống như Bác Tue_NV đã hướng dẫn ở #6, nhưng code dùng đến các nhóm hàm VL và VLAX, em đọc không hiểu, nên không thể tự sửa để áp dụng vào trường hợp riêng của mình được!

 

Mô tả: Áp dụng LISP imf_exf.lsp trên loạt file: Phi Phi Temp

 

1. Mở một file CAD mới, AP LISP, gọi lệnh: IMF, Browse đến thư mục: Phi Phi Temp ---> các file: Copy (1; Copy (2 ... ; Copy (23  lần lượt được insert vào thành một hàng ngang.

2. Mở file: Multiple drawings (Phi Phi Temp), hoặc thực hiện trực tiếp trên bản vẽ kết quả của bước 1. AP LISP, gọi lệnh: EXF, chọn một Block khung tên, Chọn một tag để làm quy luật đặt tên cho file được tách ra ---> kết quả chỉ có một file được tách ra (Bác Nguyen Hoanh đã giải thích: 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).

 

Yêu cầu:

Đối với LISP imf

1. Thay vì yêu cầu khung tên là một Block attribute, có thể thay bằng một rectangle (polyline).

2. Nếu có thể được, LISP sẽ ghép các bản vẽ thành một ma trận (ý kiến Bác Phi PhiCá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). Thay vì một dãy ngang, nếu nhiều file thì sẽ rất khó nhìn và thao tác!

 

Đối với LISP exf

1. Tách một bản vẽ lớn, thành nhiều bản vẽ thành phần đầy đủ, và lưu vào cùng thư mục với file mẹ.

2. Về đặt tên cho các file thành phần sau khi tách theo nguyên tắc: "Tên file mẹ + i" (với i là thứ tự của bản vẽ được tách ra), ví dụ: tên của bản vẽ thứ 3 tách ra từ file Songnhi.dwg là: Songnhi3.dwg.

3. Nếu tách loạt bản vẽ bố trí theo dạng ma trận thì theo thứ tự: từ TRÁI qua PHẢI, từ TRÊN xuống DƯỚI.

4. Mỗi file tách ra được đặt sao cho: Bottom Left (BL) của đường khung bao trùng với gốc tọa độ (0,0).

 

Cám ơn các Bác đã quan tâm đến vấn đề, vì em không có khả năng sửa được nên phải làm phiền đến các Bác!

Lisp và file test được đính kèm tại line: http://www.cadviet.com/upfiles/3/118347_songnhi.rar

  • 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

Bạn dùng code này để tách loạt bảng vẽ nằm theo phương ngang, đặt sát nhau:


(defun pxy(d x y) (polar (polar d 0 x) (* 0.5 pi) y))
(defun C:exf( / A FF I NAM NM NN PT1 PT10 PT11 PT2 PT20 PT21 SS)
(princ "\nVui long to chon khung ban ve khoi dau\n")
(setq pt10 (getpoint "\nPick Bottom Left:\n")
pt20 (getcorner pt10 "\nPick Top Right:\n"))
(setq pt11 (pxy pt10 -500 -500)
pt21 (pxy pt20 500 500))
(setq a (- (car pt20) (car pt10)))
(setq nn (getint "\nNhap so ban ve can tach: <5>\n"))
(setq nm (getvar "dwgname") nam (substr nm 1 (- (strlen nm) 4)))
(setq i 0)
(while (< i nn)
(setq pt1 (pxy pt11 (* i a) 0) pt2 (pxy pt21 (* i a) 0))
(command "_zoom" "W" pt1 pt2) (setq ss (ssget "_W" pt1 pt2))
(setq ff (strcat (getvar "dwgprefix") nam (itoa (+ i 1))))
(command "_.wblock" ff "" '(0 0 0) ss "") (setq i (+ i 1))))
  • 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

@ Admin: Không hiểu sao sau khi viết comment xong, gởi vào, chạy ... chạy ... chạy ... xong rồi biến mất tiêu! Hix hix hix!

 

Cám ơn sự quan tâm của các bác, LISP trên đã giải quyết được vấn đề cơ bản nhất là tách và đặt tên rất hợp lý, ngoài ra có thể Thumbnails sau khi tách nữa!

 

Tuy nhiên, còn một số hạn chế, nếu khắc phục được, có lẽ nó sẽ tương tác với người dùng thân thiện hơn! Như sau:

 

1. Chuyện nhập "Nhap so ban ve can tach:" là không hợp lý lắm, có thể xem như là tình thế, có thể giải quyết theo các hướng sau:

 

    1.1 Sau khi nhập pt1o, getcorner pt1o --> pt2o: xác định được kích thước khung bao mỗi bản vẽ thành phần. Tiếp tục: getcorner pt1o --> pt3o: xác nhận toàn vùng chứa nội dung cần tách. Từ các toạ độ: pt1o; pt2o và pt3o --> số hàng bản vẽ và số bản vẽ trên mỗi hàng (hoặc kêu bằng số hàng số cột cũng được!). Từ đó, có thể phát triển LISP cho việc tách loạt bản vẽ được sắp xếp theo dạng "ma trận"! Tuy nhiên, đây chỉ là một giải pháp "bán tự động".

 

    1.2 Nếu có thể tự động giải quyết được các thao tác nêu sau, LISP sẽ thực sự giao tiếp thân thiện hơn nhiều. Các khung bao bản vẽ thường là Polyline (rectangle), có cách nào yêu cầu pick chọn khung bao --> xuất ra toạ độ: Bottom Left và Top Right ? [*1] ---> toạ độ pt1o & pt2o. Sau đó, có cách nào tự động Extents môi trường vẽ --> toạ độ Bottom Left và Top Right toàn vùng? [*2] ---> toạ độ pt3o.

 

2. Sau khi LISP chạy xong, toàn bộ nội dung file gốc bị xoá hết, điều này có thể khắc phục được, bằng cách bổ xung (command "_.oops") vào vị trí:

(command "_.wblock" ff "" '(0 0 0) ss "")  (command "_.oops" (setq i (+ i 1))

 

3. Một số hạn chế nữa:

    3.1 Sau khi tách xong, bản vẽ thành phần chưa được move điểm Bottom Left của nó về gốc toạ độ! Tuy nhiên, có lẽ không có cách lồng quá trình move này vào trong WBlock, nhưng sau khi WBlock xong, ta có thể cho tự động Open từ file lên (vì ta đã có path từ file thành phần trong quá trình tách!) Move all to (0 0) >> Save >> Close! [*3]

 

    3.2 Chưa hợp lý hoá Layout cho các bản vẽ thành phần giống như file gốc?!!!

 

    3.3 Một vấn đề nữa là: Sau khi tách xong, các file thành phần chưa được PURGE! Đối với file gốc dung lượng nhỏ thì không sao, dung lượng càng lớn, vấn đề càng trở nên "nghiêm trọng". Có cách nào để PURGE bản vẽ tự động trước khi hoàn tất chương trình hay không? Có lẽ, Purge không thể lồng vào quá trình WBlock, cho nên có thể kết hợp vấn đề 3.3 này với 3.2 & 3.1: Cùng giải quyết, sau khi mở lại bản vẽ lên... Không biết như vậy có ổn không?!!

 

Cám ơn sự quan tâm của các Bác, các Bác có thể vui lòng hướng dẫn em các mục [*1] [*2] & [*3] hay không? Nếu các Bác thấy lưu đồ trên không hợp lý, mong các Bác Streamline lại dzùm!

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

@ Admin: Không hiểu sao sau khi viết comment xong, gởi vào, chạy ... chạy ... chạy ... xong rồi biến mất tiêu! Hix hix hix!

 

Cám ơn sự quan tâm của các bác, LISP trên đã giải quyết được vấn đề cơ bản nhất là tách và đặt tên rất hợp lý, ngoài ra có thể Thumbnails sau khi tách nữa!

 

Tuy nhiên, còn một số hạn chế, nếu khắc phục được, có lẽ nó sẽ tương tác với người dùng thân thiện hơn! Như sau:

 

1. Chuyện nhập "Nhap so ban ve can tach:" là không hợp lý lắm, có thể xem như là tình thế, có thể giải quyết theo các hướng sau:

 

    1.1 Sau khi nhập pt1o, getcorner pt1o --> pt2o: xác định được kích thước khung bao mỗi bản vẽ thành phần. Tiếp tục: getcorner pt1o --> pt3o: xác nhận toàn vùng chứa nội dung cần tách. Từ các toạ độ: pt1o; pt2o và pt3o --> số hàng bản vẽ và số bản vẽ trên mỗi hàng (hoặc kêu bằng số hàng số cột cũng được!). Từ đó, có thể phát triển LISP cho việc tách loạt bản vẽ được sắp xếp theo dạng "ma trận"! Tuy nhiên, đây chỉ là một giải pháp "bán tự động".

 

    1.2 Nếu có thể tự động giải quyết được các thao tác nêu sau, LISP sẽ thực sự giao tiếp thân thiện hơn nhiều. Các khung bao bản vẽ thường là Polyline (rectangle), có cách nào yêu cầu pick chọn khung bao --> xuất ra toạ độ: Bottom Left và Top Right ? [*1] ---> toạ độ pt1o & pt2o. Sau đó, có cách nào tự động Extents môi trường vẽ --> toạ độ Bottom Left và Top Right toàn vùng? [*2] ---> toạ độ pt3o.

 

2. Sau khi LISP chạy xong, toàn bộ nội dung file gốc bị xoá hết, điều này có thể khắc phục được, bằng cách bổ xung (command "_.oops") vào vị trí:

(command "_.wblock" ff "" '(0 0 0) ss "")  (command "_.oops" (setq i (+ i 1))

 

3. Một số hạn chế nữa:

    3.1 Sau khi tách xong, bản vẽ thành phần chưa được move điểm Bottom Left của nó về gốc toạ độ! Tuy nhiên, có lẽ không có cách lồng quá trình move này vào trong WBlock, nhưng sau khi WBlock xong, ta có thể cho tự động Open từ file lên (vì ta đã có path từ file thành phần trong quá trình tách!) Move all to (0 0) >> Save >> Close! [*3]

 

    3.2 Chưa hợp lý hoá Layout cho các bản vẽ thành phần giống như file gốc?!!!

 

    3.3 Một vấn đề nữa là: Sau khi tách xong, các file thành phần chưa được PURGE! Đối với file gốc dung lượng nhỏ thì không sao, dung lượng càng lớn, vấn đề càng trở nên "nghiêm trọng". Có cách nào để PURGE bản vẽ tự động trước khi hoàn tất chương trình hay không? Có lẽ, Purge không thể lồng vào quá trình WBlock, cho nên có thể kết hợp vấn đề 3.3 này với 3.2 & 3.1: Cùng giải quyết, sau khi mở lại bản vẽ lên... Không biết như vậy có ổn không?!!

 

Cám ơn sự quan tâm của các Bác, các Bác có thể vui lòng hướng dẫn em các mục [*1] [*2] & [*3] hay không? Nếu các Bác thấy lưu đồ trên không hợp lý, mong các Bác Streamline lại dzùm!

Hề hề hề,

Có một vài suy nghĩ xin trao đổi với bác như sau:

1/- về mục 3.1:

Thực ra điều này có thể thực hiện không quá khó nếu như khi tạo wblock, thay vì bác làm (command "_.wblock" ff "" '(0 0 0) ss "") 

Bác sẽ thay bằng (command "_.wblock" ff "" pt1o ss "") 

Và khi insert ra bản vẽ mới bác lấy điểm insert là '(0 0 0). Như vậy khỏi phải move hay miếc gì nữa.

2/- Về mục 3.3:

Sao bác không nghĩ tới việc purge bản vẽ gốc trước khi tách và xuất bản vẽ nhể. Chả nhẽ thằng purge này lại thích mới nới cũ hay sao??? Purge trước và purge sau thì kết quả có khác nhau cái chi không nhể???

3/- Về mục 1:

Điều bác nêu sẽ chỉ đúng khi trong vùng pt1o - pt3o chèn kín và đầy các khung pt1o - pt2o. Giả sử trong vùng này có một vài khung trống trơn, chả có nội dung gì thì cái việc tách và xuất này sẽ có sự lố đà.

Mục 1.2 thì phần yêu cầu thứ nhất là xác định bottom left và upper right của một polyline chữ nhật nằm theo hệ trục tọa độ là không khó. Bác có thể sử dụng (acet-geom-vểtx-list ename) để lấy ra tọa độ các dỉnh của polyline chữ nhật này. Từ đó dễ dàng lấy được bottom left và upper right.

Phần yêu cầu thứ 2 là zoom extend rồi lấy tọa độ các góc của vùng chọn cũng có thể làm được bằng cách bác hãy sử dụng (acet-ss-zoom-extents ss) để lấy danh sách các điểm này, trong đó ss là tập chọn gồm toàn bộ các đối tượng có trên màn hình sau khi đả zoom extend.

 

Thú thực là mình chưa làm, chỉ mới nghĩ và trao đổi với bác như vậy. nếu có chi đó chưa đúng xin bác đừng giận nhé.

Chúc bác thành công...

  • 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

Cám ơn Bác PhamThanhBinh đã quan tâm và hướng dẫn thật tận tình!
 
Cám ơn Bác đã hướng dẫn các hàm: (acet-geom-vertex-list(acet-ss-zoom-extents
Thú thật em đang xào xào những hàm tối căn bản nhất của lisp mà thôi, những hàm này em chưa có dịp ngâm kíu đến nữa! Hii
 
Vấn đề Purge, đối với những bản vẽ nhỏ, sau khi purge xong ---> ghép lại thành file chung thì không sao cả! Nhưng ngược lại, từ một file chung, mặc dù đã Purge, nhưng khi tách thành các file thành phần, đối với mỗi file con sẽ còn thừa nhiều "món" mà nó không dùng tới, do vậy, mới cần tới nó đó Bá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

Tham khảo theo line Bác lyky, quả thật ý tưởng này đã được đề nghị trước đây 3 năm rồi, và lúc đó đã được Bác Nguyen Hoanh giải quyết, kể cả trường hợp ghép và tách file! Em đã down LISP về dùng thử, lưu trình thì hoàn toàn giống như Bác Tue_NV đã hướng dẫn ở #6, nhưng code dùng đến các nhóm hàm VL và VLAX, em đọc không hiểu, nên không thể tự sửa để áp dụng vào trường hợp riêng của mình được!

 

Mô tả: Áp dụng LISP imf_exf.lsp trên loạt file: Phi Phi Temp

 

1. Mở một file CAD mới, AP LISP, gọi lệnh: IMF, Browse đến thư mục: Phi Phi Temp ---> các file: Copy (1; Copy (2 ... ; Copy (23  lần lượt được insert vào thành một hàng ngang.

2. Mở file: Multiple drawings (Phi Phi Temp), hoặc thực hiện trực tiếp trên bản vẽ kết quả của bước 1. AP LISP, gọi lệnh: EXF, chọn một Block khung tên, Chọn một tag để làm quy luật đặt tên cho file được tách ra ---> kết quả chỉ có một file được tách ra (Bác Nguyen Hoanh đã giải thích: 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).

 

Yêu cầu:

Đối với LISP imf

1. Thay vì yêu cầu khung tên là một Block attribute, có thể thay bằng một rectangle (polyline).

2. Nếu có thể được, LISP sẽ ghép các bản vẽ thành một ma trận (ý kiến Bác Phi PhiCá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). Thay vì một dãy ngang, nếu nhiều file thì sẽ rất khó nhìn và thao tác!

 

Đối với LISP exf

1. Tách một bản vẽ lớn, thành nhiều bản vẽ thành phần đầy đủ, và lưu vào cùng thư mục với file mẹ.

2. Về đặt tên cho các file thành phần sau khi tách theo nguyên tắc: "Tên file mẹ + i" (với i là thứ tự của bản vẽ được tách ra), ví dụ: tên của bản vẽ thứ 3 tách ra từ file Songnhi.dwg là: Songnhi3.dwg.

3. Nếu tách loạt bản vẽ bố trí theo dạng ma trận thì theo thứ tự: từ TRÁI qua PHẢI, từ TRÊN xuống DƯỚI.

4. Mỗi file tách ra được đặt sao cho: Bottom Left (BL) của đường khung bao trùng với gốc tọa độ (0,0).

 

Cám ơn các Bác đã quan tâm đến vấn đề, vì em không có khả năng sửa được nên phải làm phiền đến các Bác!

Lisp và file test được đính kèm tại line: http://www.cadviet.com/upfiles/3/118347_songnhi.rar

Mình thấy lisp của bạn rất hay nhưng khi mình sử dụng thì vướng 1 vấn đề nhỏ đó là các file dwg của mình không có khung tên mà chỉ chứa các chi tiết. khi ghép vào các chi tiết nằm sát nhau nên rất khó thao tác. Cho mình cách sửa file lisp để các chi tiết cách nhau 1 khoảng định trước với, mình không có kiến thức gì về viết lisp cả. 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

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

×