Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de
  AutoCAD VBA
  Lisp und VBA

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
  
PNY wird von NVIDIA zum Händler des Jahres gewählt - zum dritten Mal in Folge, eine Pressemitteilung
Autor Thema:  Lisp und VBA (4727 mal gelesen)
fuchsi
Mitglied
Programmierer c#.net Datawarehouse


Sehen Sie sich das Profil von fuchsi an!   Senden Sie eine Private Message an fuchsi  Schreiben Sie einen Gästebucheintrag für fuchsi

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 12. Nov. 2004 11:32    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

in einem anderen Thread habe ich auf die Typelibrary VL16.TLB hingeweisen, mit der man aus VBA Lisp-Ausdrücke auswerten kann.

Nach einiger Suche im Internet bin ich zum Schluß gekommen, dass das auch mit acad2000i (VL.TLB) und 2004 (TL16.TLB) auc funktionieren soll. (Zumindest nach einigen leider nur wenigen Beispilecodes )

Aber irgendwie bring ich das nicht zum Laufen


z.B.:

Dim vl As Object
Set vl = CreateObject("VL.Application.1")
vl.ActiveDocument.Functions.Item("c:test").funcall


wobai c:test eine lisp-funktion sein soll (defun c:test ...)

bei der zeile createobject sagt er mir immer :
Automatisierungsfehler %1 ist keine gültige Win32 Anwendung


ich vermute mal, das liegt daran, dass ich auf meinem rechner acad2000i acad20004 und acad2005 installiert habe, und die sich da irgendwie in die Quere kommen.


Vielleicht hat jemand Lust da ein wenig weiter zu forschen.

------------------
WWW.FFZELL.AT.TC

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

mapcar
Mitglied
CADmin



Sehen Sie sich das Profil von mapcar an!   Senden Sie eine Private Message an mapcar  Schreiben Sie einen Gästebucheintrag für mapcar

Beiträge: 1250
Registriert: 20.05.2002

Die Phönizier haben das Geld erfunden - aber warum so wenig?
(Johann Nepomuk Nestroy)

erstellt am: 12. Nov. 2004 13:34    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für fuchsi 10 Unities + Antwort hilfreich

Hi fuchsi,

schau mal nach, was du da in der Registry findest:

HKEY_CLASSES_ROOT\VL.Application.1 oder (Acad 2000-2002)
HKEY_CLASSES_ROOT\VL.Application.16 (Acad 2004/2005)

Fehlen die Einträge, dann kann die CLSID/GUID nicht ermittelt werden. Dann kannst du es immer noch mit einem manuellen Verweis versuchen.

Die Sache hat aber Einschränkungen. Das ist zwar eine TLB, aber es gibt keine Definitionen für die Rückgabe. Gibt dir Lisp einen Int, einen Double oder einen String zurück, hast du keine Probleme. Auch nil ist unproblematisch, da kriegst du gar nix zurück. Wenn Lisp aber eine Liste zurückgibt, kannst du auf dieses Object nicht mehr zugreifen.

Hier noch das VLAX-Klassenmodul von Frank Oquendo. Leider ist dessen Website seit Monaten down, und man kommt nicht an die Dokumentation dazu. Musst also etwas basteln. Bei mir funktioniert das alles irgendwie nicht so auf Anhieb - hatte aber noch nicht die Ruhe, mich wirklich ausführlich damit zu befassen. Mir ist auch unklar, wofür man diese unterschiedlichen Funktionen brauchen soll - 'SetLispSymbol' sollte man doch eigentlich mit 'EvalLispExpression' erschlagen können, denke ich. Beiden sind doch nur Lisp-Ausdrücke.

Code:

VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "VLAX"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
' VLAX.CLS v1.4 (Last updated 8/27/2001)
' Copyright 1999-2001 by Frank Oquendo
'
' Permission to use, copy, modify, and distribute this software
' for any purpose and without fee is hereby granted, provided
' that the above copyright notice appears in all copies and
' that both that copyright notice and the limited warranty and
' restricted rights notice below appear in all supporting
' documentation.
'
' FRANK OQUENDO (THE AUTHOR) PROVIDES THIS PROGRAM "AS IS" AND WITH
' ALL FAULTS. THE AUTHOR SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY
' OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE.  THE AUTHOR
' DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
' UNINTERRUPTED OR ERROR FREE.
'
' Use, duplication, or disclosure by the U.S. Government is subject to
' restrictions set forth in FAR 52.227-19 (Commercial Computer
' Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
' (Rights in Technical Data and Computer Software), as applicable.
'
' VLAX.cls allows developers to evaluate AutoLISP expressions from
' Visual Basic or VBA
'
' Notes:
' All code for this class module is publicly available througout various posts
' at news://discussion.autodesk.com/autodesk.autocad.customization.vba. I do not
' claim copyright or authorship on code presented in these posts, only on this
' compilation of that code. In addition, a great big "Thank you!" to Cyrille Fauvel
' demonstrating the use of the VisualLISP ActiveX Module.
'
' Dependencies:
' Use of this class module requires the following application:
' 1. VisualLISP


Private VL As Object
Private VLF As Object

Private Sub Class_Initialize()

    Set VL = ThisDrawing.Application.GetInterfaceObject("VL.Application.1")
    Set VLF = VL.ActiveDocument.Functions

End Sub

Private Sub Class_Terminate()

    Set VLF = Nothing
    Set VL = Nothing

End Sub

Public Function EvalLispExpression(lispStatement As String)

    Dim sym As Object, ret As Object, retval

    Set sym = VLF.Item("read").funcall(lispStatement)
    On Error Resume Next
    retval = VLF.Item("eval").funcall(sym)
    If Err Then
        EvalLispExpression = ""
    Else
        EvalLispExpression = retval
    End If

End Function

Public Sub SetLispSymbol(symbolName As String, value)

    Dim sym As Object, ret, symValue

    symValue = value
    Set sym = VLF.Item("read").funcall(symbolName)
    ret = VLF.Item("set").funcall(sym, symValue)
    EvalLispExpression "(defun translate-variant (data) (cond ((= (type
data) 'list) (mapcar 'translate-variant data)) ((= (type data) 'variant)
(translate-variant (vlax-variant-value data))) ((= (type data) 'safearray)
(mapcar 'translate-variant (vlax-safearray->list data))) (t data)))"
    EvalLispExpression "(setq " & symbolName & "(translate-variant " &
symbolName & "))"
    EvalLispExpression "(setq translate-variant nil)"

End Sub

Public Function GetLispSymbol(symbolName As String)

    Dim sym As Object, ret, symValue

    symValue = value
    Set sym = VLF.Item("read").funcall(symbolName)
    GetLispSymbol = VLF.Item("eval").funcall(sym)

End Function

Public Function GetLispList(symbolName As String) As Variant

  Dim sym As Object, list As Object
  Dim Count, elements(), i As Long

  Set sym = VLF.Item("read").funcall(symbolName)
  Set list = VLF.Item("eval").funcall(sym)

  Count = VLF.Item("length").funcall(list)

  ReDim elements(0 To Count - 1) As Variant

  For i = 0 To Count - 1
        elements(i) = VLF.Item("nth").funcall(i, list)
  Next

  GetLispList = elements

End Function

Public Sub NullifySymbol(ParamArray symbolName())

    Dim i As Integer

    For i = LBound(symbolName) To UBound(symbolName)
        EvalLispExpression "(setq " & CStr(symbolName(i)) & " nil)"
    Next

End Sub


Sag mal Bescheid, wenn was draus geworden ist.

Gruß, Axel Strube-Zettler

------------------
(defun - Lisp over night - AutoLisp-Programmierung für AutoCad - Da weiß man, wann man's hat
Meine AutoLisp-Seiten Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

mapcar
Mitglied
CADmin



Sehen Sie sich das Profil von mapcar an!   Senden Sie eine Private Message an mapcar  Schreiben Sie einen Gästebucheintrag für mapcar

Beiträge: 1250
Registriert: 20.05.2002

Die Phönizier haben das Geld erfunden - aber warum so wenig?
(Johann Nepomuk Nestroy)

erstellt am: 12. Nov. 2004 13:52    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für fuchsi 10 Unities + Antwort hilfreich

Noch was vergessen, und zwar was entscheidendes: Um das Ganze zum Laufen zu kriegen, schreibt man sich am Besten (vl-load-com) in die acad.lsp! Sonst geht nix!

Gruß, Axel Strube-Zettler

PS: ich hab 2002,2004,2005 auf dem Rechner, in meiner REG stehen sowohl 1 als auch 16. That's _not_ the problem...

------------------
(defun - Lisp over night - AutoLisp-Programmierung für AutoCad - Da weiß man, wann man's hat
Meine AutoLisp-Seiten Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2025 CAD.de | Impressum | Datenschutz