Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
8 replies to this topic

#1 ntluyen

ntluyen

    biết vẽ ellipse

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

Đã gửi 23 August 2008 - 10:25 AM

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
  • 0

#2 vndesperados

vndesperados

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 547 Bài viết
Điểm đánh giá: 253 (khá)

Đã gửi 29 August 2008 - 07:34 AM

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
  • 0

#3 tien2005

tien2005

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 257 Bài viết
Điểm đánh giá: 94 (tàm tạm)

Đã gửi 31 August 2008 - 06:57 AM

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

#4 phantuhuong

phantuhuong

    biết dimstyle

  • Moderator
  • PipPipPipPipPip
  • 383 Bài viết
Điểm đánh giá: 200 (khá)

Đã gửi 01 September 2008 - 09:03 PM

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.
  • 0
Bồi dưỡng Excel & VBA cho các đơn vị ở Hà Nội và khu vực lân cận

Từng bước loại đồ Tàu ra khỏi cuộc sống!


#5 vndesperados

vndesperados

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 547 Bài viết
Điểm đánh giá: 253 (khá)

Đã gửi 02 September 2008 - 04:24 PM

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.
  • 0

#6 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 02 September 2008 - 05:07 PM

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
  • 0

#7 ntluyen

ntluyen

    biết vẽ ellipse

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

Đã gửi 04 September 2008 - 01:42 PM

Đ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.
  • 0

#8 vndesperados

vndesperados

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 547 Bài viết
Điểm đánh giá: 253 (khá)

Đã gửi 08 September 2008 - 04:47 PM

Đọ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ý
  • 0

#9 ntluyen

ntluyen

    biết vẽ ellipse

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

Đã gửi 13 September 2008 - 08:28 AM

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.
  • 0