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

Hỏi cách lấy dữ liệu trực tiếp từ dòng lệnh của AutoCAD!

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

Hi diễn đàn!

- Bạn tôi hỏi tôi mà tôi chưa biết làm thế nào. Rất mong anh em giúp đỡ. Vấn đề như sau:

>> Sau khi thực hiện 1 lệnh nào đó trong CAD thì thông tin được hiển thị trong dòng lệnh. Vậy, làm thế nào để có thể lấy thông tin ấy trực tiếp từ dòng lệnh của CAD (bằng AutoLISP hoặc VBA cũng được) sau đó ghi ra file *.txt.

- Vấn đề rắc rối ở chỗ: lệnh thực hiện đó không tác động lên đối tượng chuẩn của AutoCAD (như text, circle, LWPolyline...) mà tác động lên đối tượng do người dùng định nghĩa nên nó ko được hỗ trợ trong thư viện để cho VBA xử lý.

- Nếu là đối tượng hình học chuẩn của AutoCAD thì vấn đề lại trở lên đơn giản.

- Xin 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

Hi diễn đàn!

- Bạn tôi hỏi tôi mà tôi chưa biết làm thế nào. Rất mong anh em giúp đỡ. Vấn đề như sau:

>> Sau khi thực hiện 1 lệnh nào đó trong CAD thì thông tin được hiển thị trong dòng lệnh. Vậy, làm thế nào để có thể lấy thông tin ấy trực tiếp từ dòng lệnh của CAD (bằng AutoLISP hoặc VBA cũng được) sau đó ghi ra file *.txt.

- Vấn đề rắc rối ở chỗ: lệnh thực hiện đó không tác động lên đối tượng chuẩn của AutoCAD (như text, circle, LWPolyline...) mà tác động lên đối tượng do người dùng định nghĩa nên nó ko được hỗ trợ trong thư viện để cho VBA xử lý.

- Nếu là đối tượng hình học chuẩn của AutoCAD thì vấn đề lại trở lên đơn giản.

- Xin cảm ơn!

Đọc thì thấy bạn nói khá rõ ràng, nhưng ngẫm lại thì vẫn trừu tượng sao ấy. Bạn cho 1 ví dụ đi: lệnh gì, lấy những gì để ghi ra file?

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ước 1: Bấm F2

Bước 2: Ctrl+A

Bước 3: Ctrl+C

Bước 4: Mở notepad

Bước 5: Bấm Ctrl+V

Bước 6: Save as

- Xin cảm ơn câu trả lời vừa đơn giản mà hiệu quả của Mem "hochoaivandot"!

- Rất mong "hochoaivandot" bớt chút thời gian để xem xét vấn đề trên dưới góc độ Lập trình bằng AutoLISP hoặc VBA.

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 thì thấy bạn nói khá rõ ràng, nhưng ngẫm lại thì vẫn trừu tượng sao ấy. Bạn cho 1 ví dụ đi: lệnh gì, lấy những gì để ghi ra file?

- Xin cảm ơn Mem đã quan tâm!

 

- Tôi nghĩ vấn đề cũng khá rõ ràng rồi mà. Công cụ để giải quyết vấn đề này là AutoLISP or VBA nhé.

 

- Vấn đề là: Làm thế nào để lấy thông tin được hiển thị ở dòng lệnh?

 

>> Thông thường với các đối tượng hình học chuẩn của CAD (text, circle...) thì để lấy nội dung or lấy cao chữ or lấy bán kính or lấy tọa độ chèn x-y của nó ta chỉ việc tạo ra tập hợp chọn đối tượng ấy và xử lý chúng thông qua các thuộc tính của nó là ok. Sau đó ghi ra tệp txt là xong. Nghĩa là thay vì lấy trực tiếp từ dòng lệnh thì ta đã làm gián tiếp bằng việc tạo ra lệnh mới để có kết quả tương tự.

 

>> Nhưng với đối tượng do người dùng định nghĩa thì VBA "ko thể" tiếp cận để lấy dữ liệu được. Mà dữ liệu ấy lại được hiển thị ở dòng lệnh sau khi sử dụng lệnh do người dùng tạo ra. Vậy, có giải pháp nào để lấy dữ liệu ấy ko? Tất nhiên, là đang bàn phải lập trình.

 

>> Bạn tôi lấy VD cụ thể là: trong NOVA-TDN, sau khi dùng lệnh CDTN (cao độ tự nhiên) để kiểm tra cao độ của 1 điểm bất kỳ (kiểm tra bằng cách kích chọn bất kỳ) trên bình đồ thì kết quả cao độ z được hiển thị ngay trong dòng lệnh. Bây giờ, bạn ấy muốn tạo ra 1 lệnh/1 hàm có khả năng lấy cái z đó làm 1 số việc như sau: ghi z ra tệp txt chẳng hạn, tạo 1 text ghi cao độ z đó tại điểm đã kích chọn để kiểm tra cao độ...

 

>> Tóm lại, trong trường hợp tổng quát: để lấy thông tin từ dòng lệnh ta phải làm như thế nào?

 

>> Vì không cài NOVA-TDN 2005 nên tôi ko biết là liệu có thể tương tác với đối tượng Point(x, y, z) bằng VBA trong NOVA ko. Anh em nào cài thì check dùm tôi với. Đơn giản là viết 1 hàm có tác dụng: chọn 1 điểm bất kỳ sau đó hiển thị cao độ z. Nếu cao độ của nhiều điểm đều có z=0 coi như thất bại. Nếu cao độ của nhiều điểm khác 0 thì vấn đề được giải quyết. Nghĩa là ta vẫn có thể tác động đến đối tượng Point được. Lúc này, thay vì việc lấy trực tiếp z từ dòng lệnh (thông qua lệnh CDTN) thì ta có thể lấy gián tiếp thông qua việc kích chọn 1 điểm rồi lấy z của nó.

 

>> Hy vọng Mem đã rõ. Xin 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

- Xin cảm ơn Mem đã quan tâm!

 

- Tôi nghĩ vấn đề cũng khá rõ ràng rồi mà. Công cụ để giải quyết vấn đề này là AutoLISP or VBA nhé.

 

- Vấn đề là: Làm thế nào để lấy thông tin được hiển thị ở dòng lệnh?

 

>> Thông thường với các đối tượng hình học chuẩn của CAD (text, circle...) thì để lấy nội dung or lấy cao chữ or lấy bán kính or lấy tọa độ chèn x-y của nó ta chỉ việc tạo ra tập hợp chọn đối tượng ấy và xử lý chúng thông qua các thuộc tính của nó là ok. Sau đó ghi ra tệp txt là xong. Nghĩa là thay vì lấy trực tiếp từ dòng lệnh thì ta đã làm gián tiếp bằng việc tạo ra lệnh mới để có kết quả tương tự.

 

>> Nhưng với đối tượng do người dùng định nghĩa thì VBA "ko thể" tiếp cận để lấy dữ liệu được. Mà dữ liệu ấy lại được hiển thị ở dòng lệnh sau khi sử dụng lệnh do người dùng tạo ra. Vậy, có giải pháp nào để lấy dữ liệu ấy ko? Tất nhiên, là đang bàn phải lập trình.

 

>> Bạn tôi lấy VD cụ thể là: trong NOVA-TDN, sau khi dùng lệnh CDTN (cao độ tự nhiên) để kiểm tra cao độ của 1 điểm bất kỳ (kiểm tra bằng cách kích chọn bất kỳ) trên bình đồ thì kết quả cao độ z được hiển thị ngay trong dòng lệnh. Bây giờ, bạn ấy muốn tạo ra 1 lệnh/1 hàm có khả năng lấy cái z đó làm 1 số việc như sau: ghi z ra tệp txt chẳng hạn, tạo 1 text ghi cao độ z đó tại điểm đã kích chọn để kiểm tra cao độ...

 

>> Tóm lại, trong trường hợp tổng quát: để lấy thông tin từ dòng lệnh ta phải làm như thế nào?

 

>> Vì không cài NOVA-TDN 2005 nên tôi ko biết là liệu có thể tương tác với đối tượng Point(x, y, z) bằng VBA trong NOVA ko. Anh em nào cài thì check dùm tôi với. Đơn giản là viết 1 hàm có tác dụng: chọn 1 điểm bất kỳ sau đó hiển thị cao độ z. Nếu cao độ của nhiều điểm đều có z=0 coi như thất bại. Nếu cao độ của nhiều điểm khác 0 thì vấn đề được giải quyết. Nghĩa là ta vẫn có thể tác động đến đối tượng Point được. Lúc này, thay vì việc lấy trực tiếp z từ dòng lệnh (thông qua lệnh CDTN) thì ta có thể lấy gián tiếp thông qua việc kích chọn 1 điểm rồi lấy z của nó.

 

>> Hy vọng Mem đã rõ. Xin cảm ơn!

Tóm lại: bây giờ bạn có muốn bấm chọn 1 điểm trên màn hình và xuất ra toạ độ Z cho bạn hay không?

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óm lại: bây giờ bạn có muốn bấm chọn 1 điểm trên màn hình và xuất ra toạ độ Z cho bạn hay không?

Bạn Doan Van Ha chưa hiểu ý của bạn doan281.

doan281 yêu cầu lấy dòng text cuối cùng (hoặc n dòng cuối cùng) trên command prompt sau khi 1 lệnh nào đó kết thúc vậy thôi, cái Z chỉ là ví dụ.

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 Doan Van Ha chưa hiểu ý của bạn doan281.

doan281 yêu cầu lấy dòng text cuối cùng (hoặc n dòng cuối cùng) trên command prompt sau khi 1 lệnh nào đó kết thúc vậy thôi, cái Z chỉ là ví dụ.

- Vâng, đây là mong muốn của bạn tôi và tôi.

- Rất mong các Mem giúp đỡ!

- Góp ý: thông thường nếu có thể can thiệp được thuộc tính của đối tượng thì có lẽ không ai lấy thông tin từ dòng lệnh mà sẽ tạo ra 1 tập hợp chọn đối tượng rồi tham chiếu tới thuộc tính của nó. Như vậy, mục đích đạt được là như nhau. Còn lấy từ dòng lệnh thì tôi chưa biết làm thế nào?

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 nghiên cứu 3 biến LogfileOn LogFileOff LogfilePath và các hàm xử lý string :)

- Xin Mem nói thêm về cách sử dụng 3 cái trên được không?

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

- Xin Mem nói thêm về cách sử dụng 3 cái trên được không?

Đây là lisp cho bạn (để lấy các thông tin trên Text Window của bản vẽ hiện hành):

;Doan Van Ha - CADViet.com - Ngay 23-02-2012
;Muc dich: Lay thong tin cua file ban ve the hien tren text window.
(defun C:HA()
(acet-sysvar-set (list "logfilemode" 1))
(setq fnc (getvar "logfilename"))
(setq pr (open fnc "r"))
(setq fnm (getfiled "Chon File de xuat ket qua" "" "txt" 1))
(setq pw (open fnm "w"))
(while (setq dong (read-line pr))
 (princ (strcat dong "\n") pw))
(close pw)
(close pr)
(acet-sysvar-set (list "logfilemode" 1))
(acet-sysvar-restore)
(princ))

P/S: sửa lúc 22h05-23/02/2012

  • 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

Đây là lisp cho bạn (để lấy các thông tin trên Text Window của bản vẽ hiện hành):

- Xin cảm ơn Mem Doan Van Ha rất nhiều!

 

- Mình ko rành về AutoLISP, rất mong Mem Doan Van Ha có thể sửa code để cho cái Notepad nó ko hiển thị lên được ko? Thay vào đó, lưu thông tin lấy được ấy vào 1 cái tệp txt nằm ở ổ C:\ chẳng hạn.

 

- Mong sớm nhận được hồi âm của Mod Doan Van Ha và các Mem khác.

 

- Xin chân thành 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

- Xin cảm ơn Mem Doan Van Ha rất nhiều!

 

- Mình ko rành về AutoLISP, rất mong Mem Doan Van Ha có thể sửa code để cho cái Notepad nó ko hiển thị lên được ko? Thay vào đó, lưu thông tin lấy được ấy vào 1 cái tệp txt nằm ở ổ C:\ chẳng hạn.

- Mong sớm nhận được hồi âm của Mod Doan Van Ha và các Mem khác.

- Xin chân thành cảm ơn!

Chỉ 1 động tác "Save as" thôi mà, có gì khó lắm đâu.

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ỉ 1 động tác "Save as" thôi mà, có gì khó lắm đâu.

- Nếu "thò" tay bấm Save/Save as thì lại tương tự cách làm của "hochoaivandot" à, phải ko Mem?

- Nếu Mem nhiệt tình thì giúp tôi 1 việc đó là: đừng cho hiển thị lên cái Notepad nữa mà thay vào đó lưu thông tin nhận được vào 1 biến. Việc còn lại tôi sẽ nghiên cứu tiếp.

- Xin cảm ơn Mem rất nhiều!

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

- Nếu "thò" tay bấm Save/Save as thì lại tương tự cách làm của "hochoaivandot" à, phải ko Mem?

- Nếu Mem nhiệt tình thì giúp tôi 1 việc đó là: đừng cho hiển thị lên cái Notepad nữa mà thay vào đó lưu thông tin nhận được vào 1 biến. Việc còn lại tôi sẽ nghiên cứu tiếp.

- Xin cảm ơn Mem rất nhiều!

Ok, tôi sẽ giúp!

P/S(22h05-23-02-2012): tôi đã sửa lisp, vẫn link cũ để đỡ tốn đất CV.

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

@OP : mình gợi ý 3 biến hệ thống đó, đáng lý dù là VBA hay Lisp gì thì cũng có thể làm được chứ hè.

Bạn đã đọc nội dung ý nghĩa 3 biến đó chưa ???

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

@OP : mình gợi ý 3 biến hệ thống đó, đáng lý dù là VBA hay Lisp gì thì cũng có thể làm được chứ hè.

Bạn đã đọc nội dung ý nghĩa 3 biến đó chưa ???

- Ghi nhận lời góp ý của Mem.

- Tôi đã xem và sẽ nghiên cứu thêm để hoàn thiện mấy vấn đề xung quanh của nó nữa.

- Xin cảm ơn Mem Doan Van Ha nhiều nhé!

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

Ok, tôi sẽ giúp!

P/S(22h05-23-02-2012): tôi đã sửa lisp, vẫn link cũ để đỡ tốn đất CV.

- Cảm ơn Mem nhiều nhé!

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 nhé, nhờ các bác e cũng viết đc đoạn mã VBA cho Nova 2005 có thể tra cao độ tự nhiên sau đó điền lên 1 text hoặc Block bên cạnh rồi ! cũng có khá nhiều ứng dụng khi m lấy đc thông tin từ dòng lệnh CAD đấy 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

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  

×