Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
ntluyen

Trao đổi dữ liệu giữa Auto lisp và VBA

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

ntluyen    19

Tôi cũng mới nghiên cứu VBA và Autolisp, trong quá trình tính toán, tôi cần truyền dữ liệu giữa Auto lisp và VBA.

Cách cổ điển là thông qua file, tuy nhiên cách này hơi rườm rà.

Xin các bác chỉ giúp xem có cách nào truyền dữ liệu trực tiếp 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
vndesperados    253
Tôi cũng mới nghiên cứu VBA và Autolisp, trong quá trình tính toán, tôi cần truyền dữ liệu giữa Auto lisp và VBA.

Cách cổ điển là thông qua file, tuy nhiên cách này hơi rườm rà.

Xin các bác chỉ giúp xem có cách nào truyền dữ liệu trực tiếp không

 

Bất kỳ một ngôn ngữ lập trình nào cũng cho phép viết và gọi method theo cú pháp

 

FunctionName(args[])

 

Với VBA thi cú pháp như sau

 

VBAFunctionName(args[]) hoặc VBAFunctionName args[]

 

Với LISP thì cú pháp như sau

 

(LISPFunctionName args[])

 

Trong VBA hay LISP đều hỗ trợ các lệnh cho phép gọi lẫn nhau

 

Như vậy không cần qua file mới trao đổi dữ liệu đượ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
tien2005    97
Bất kỳ một ngôn ngữ lập trình nào cũng cho phép viết và gọi method theo cú pháp

 

FunctionName(args[])

 

Với VBA thi cú pháp như sau

 

VBAFunctionName(args[]) hoặc VBAFunctionName args[]

 

Với LISP thì cú pháp như sau

 

(LISPFunctionName args[])

 

Trong VBA hay LISP đều hỗ trợ các lệnh cho phép gọi lẫn nhau

 

Như vậy không cần qua file mới trao đổi dữ liệu được

 

 

Vấn đề này mình có hỏi http://www.cadviet.com/forum/index.php?sho...0&start=120 và cũng có nhiều người quan tâm nhưng chưa có câu trả lời

 

Vậy vndesperados có thể cho các mem 1 đoạn code mẫu bằng LISP lấy giá trị được tạo trong VBA và ngược lại ( VBA lấy giá trị được tạo trong LISP)

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
phantuhuong    204

Lisp và VBA hoạt động trong 2 môi trường khác nhau. Có thể gọi thủ tục lisp từ VBA hoặc ngược lại, nhưng cách truyền dữ liệu thì hiện tôi tìm vẫn chưa ra. Google vẫn chưa có câu trả lời thoả đá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
vndesperados    253

Vấn đề không đến nỗi quá phức tạp như các bạn thường nghĩ. Thông thường dữ liệu các bạn thường yêu cầu là một table hoặc một mảng, vậy nên việc truyền dữ liệu có thể khó khăn. Nếu là một kiểu dữ liệu cơ bản (string, number..) thì thế nào?

Có thể tham khảo khiểu dữ liệu JSON. Mặc dầu cái này mới đọc quá thấy nói về Java Script nhưng nếu xem xét kỹ nó đáp ứng được khá tốt mọi kiểu dữ liệu với mọi ngôn ngữ.

 

Tiếc là hiện tại tôi không có ACAD vậy nên tôi không thể viết VD.

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
Nguyen Hoanh    4.524
Vấn đề không đến nỗi quá phức tạp như các bạn thường nghĩ. Thông thường dữ liệu các bạn thường yêu cầu là một table hoặc một mảng, vậy nên việc truyền dữ liệu có thể khó khăn. Nếu là một kiểu dữ liệu cơ bản (string, number..) thì thế nào?

Có thể tham khảo khiểu dữ liệu JSON. Mặc dầu cái này mới đọc quá thấy nói về Java Script nhưng nếu xem xét kỹ nó đáp ứng được khá tốt mọi kiểu dữ liệu với mọi ngôn ngữ.

 

Tiếc là hiện tại tôi không có ACAD vậy nên tôi không thể viết VD.

Vấn đề này lý thuyết thì rất rất dễ, khó mỗi câu lệnh cụ thể của nó thế nào.

 

Sau khi search trên google, tôi kiếm được đoạn mã sau:

Dim VL As Object

Sub Lisp2VBA_example()
 Set VL = CreateObject("VL.Application.16")
 A = GetLispSym("A")
 Debug.Print "Symbol 'A' is: " & A
 MsgBox A
End Sub

Sub VBA2Lisp_example()
 Set VL = CreateObject("VL.Application.16")
 Dim value As Double
 value = 100#
 PutLispSym "B", value
End Sub

Function GetLispSym(symbolName As String) As Variant
 Dim sym As Object
 Set sym = VL.ActiveDocument.Functions.Item("read").funcall(symbolName)
 GetLispSym = VL.ActiveDocument.Functions.Item("eval").funcall(sym)
End Function

Sub PutLispSym(symbolName As String, value As Variant)
 Dim sym As Object
 Set sym = VL.ActiveDocument.Functions.Item("read").funcall(symbolName)
 VL.ActiveDocument.Functions.Item("set").funcall sym, value
End Sub

- Chạy thủ tục Lisp2VBA_example sẽ hiển thị giá trị của biến Autolisp A ra màn hình. Như vậy, giả sử trước khi chạy thủ tục này ta làm phép gán ở Lisp: (setq a "Chao CADViet") thì dòng thông báo sẽ hiển thị Chao CADViet lên màn hình khi chạy thủ tục này.

- Chạy thủ tục VBA2Lisp_example sẽ gán giá trị của biến Autolisp B bằng 100.0. Giả sử sau khi chạy thủ tục này, ta làm phép hiển thị ở lisp (princ B ) ta sẽ có kết quả là 100.0

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
ntluyen    19

Đoạn mã trên của bác "Nguyen Hoanh" đúng là cái tôi cần, dữ liệu truyền từ VBA sang LISP có thể làm theo cách đó.

Cám ơn 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
vndesperados    253

Đọan VBA trên cũng hay nhưng mà theo tôi một cách mà tôi cho là cũng đơn giản

Dùng Registry là dữ liệu trung gian

Có nghĩa là LISP hoặc VBA sẽ tạo một key trên Registry và viết dữ liệu vào đó

Sau đó VBA hoặc LISP sẽ đọc dữ liệu từ key đó và xử lý

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
ntluyen    19

Vấn đề là đọc registry trong VBA rất phức tạp, Hơn nữa cách truyền dữ liệu qua registry thì cũng không khác là mấy cách truyền dữ liệu qua 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

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  

×