Aller au contenu

Utilisation du presse-papier entre Lisp et VBA.


DenisHen

Messages recommandés

Bonjour à la communauté.
Je cherche à passer du texte entre du VBA et du Lisp (on est dans la section Lisp, mais dois-je aussi poster dans VBA ?).
Ce texte est en fait un ou plusieurs paragraphes.
Je pense que la meilleur solution est de passer par le presse-papier, éphémère et supportant n'importe quel texte.
Je ne sais pas si une clef dans la base de registre serait plus appropriée, ou un (vlax-ldata le serait aussi.

Ma première question sera donc porté sur vos conseils, ai-je raison de vouloir utiliser le presse papier ?
Et ma deuxième : "Si oui, comment faire, tant au niveau VBA qu'au niveau Lisp ?"

Bien à toi la communauté.
Denis...
 

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Encore une fois, vouloir mixer plusieurs environnements de programmation dans le même programme est la plupart du temps une fausse bonne idée qui finit par s'avérer plus complexe que de tout écrire (ou traduire) dans un des deux langages.

Là il s'agirait d'en ajouter un troisième ("htmlfile" ou autre) pour faire communiquer les deux, je crains que tu ne t'égares...

Pour des données sous forme de chaine accessibles aussi bien en LISP qu'en VBA (ou autre) :

  • données accessible dans le dessin pendant la session : variables systèmes USERS[1-5]
  • données enregistrées dans le dessin : dictionnaires et xrecords
  • données accessibles entre plusieurs dessin : base de registre ou fichier texte

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Salut @(gile)et merci pour tes conseils.
Je sais, mais je fais en Lisp ce que je ne sais pas faire en VBA, et vice-versa. Je suis un vieux débutant 😉.
Je suis encore d'accord avec toi, c'est plus complexe, mais j'y arriverais plus facilement, enfin je pense.
Par contre, je n'arrive pas à savoir les différentes "tailles" ou "longueurs" de variable dans les quatre solutions que tu me proposes, de combien de "caractère" je dispose.
Mais un fichier texte "temporaire" (que j'effacerais après son utilisation) me parait un bon compromis, mais j'ai un peu peur au temps d'accès.
Encore merci à toi.
Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Sinon, pour le presse papier, en LISP :

(defun SetClipboardText	(text / htmlfile data)
  (setq	htmlfile (vlax-create-object "htmlfile")
	data	 (vlax-get (vlax-get htmlfile 'ParentWindow) 'ClipBoardData)
  )
  (vlax-invoke data 'SetData "Text" text)
  (vlax-release-object htmlfile)
)


(defun GetClipboardText	(/ htmlfile data text)
  (setq	htmlfile (vlax-create-object "htmlfile")
	data	 (vlax-get (vlax-get htmlfile 'ParentWindow) 'ClipBoardData)
	text     (vlax-invoke data 'GetData "Text")
  )
  (vlax-release-object htmlfile)
  text
)

En VBA ça devrait être quelque chose comme ça (pas testé) :

Sub SetClipboardText(text As String)
  With CreateObject("htmlfile")
    With .parentWindow.clipboardData
         .setData "text", text
    End With
  End With
End Sub

Function GetClipboardText() As String
  With CreateObject("htmlfile")
    With .parentWindow.clipboardData
         GetClipboardText = .GetData("text")
    End With
  End With
End Function

 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Mille mercis @(gile)pour ces codes.
Je me sers de VBA presque uniquement pour les fenêtres, car je suis incapable de les faire en DCL.
Le reste de mes codes est en Lisp (à 95%).
La facilité de faire des fenêtres et de gérer leurs contenus en VBA n'est plus à prouver, on le sait.
Par contre, le code en lui-même et son interaction avec AutoCAD est bien plus efficace en Lisp (et ton "Introduction à AutoLISP" y est pour beaucoup, ainsi que Da-Code de didier).
Donc, quand j'ai des petites fenêtres, je me débrouille avec le DCL et surtout avec tes codes (GetLayers, GetLayouts, InputBox, ListBox, MsgBox... dont je me sers très souvent, pour ne pas dire tout le temps). Mais si elles sont plus complexes, je ne peux faire autrement que passer par le VBA. Cette solution ne me plaît pas trop, mais je fais avec.
J'ai longtemps essayé le DCL (et aussi ObjectDCL), mais j'ai abandonné. Mes connaissances ne me donnent pas assez le contrôle des DCL, surtout les interactions des éléments de la DCL entre eux. Malgré LeeMac et TheSwamp. Par contre, Da-Code développe sa section DCL, je vais suivre son élocution de très près.
As-tu déjà pensé à un "Introduction au langage DCL" ? 😉 
Encore un super grand merci à toi et à la communauté.

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Pour communiquer entre LISP et VBA, on peut utiliser les variables système USERI1-5, USERR1-5 et USERS1-5 ou, bien mieux à mon avis, ces fonctions VBA de Tony Tanzillo qui utilisent Vl.Application (il faut qu'un (vl-load-com) ait été exécuté côté LISP avant de les utiliser) :

' Credit to Tony Tanzillo

Public Sub SetLispVar(Symbol As String, value)
	Dim vlapp As Object
	Dim vlFuncs As Object
	Dim vlSet As Object
	Dim vlSym
	Set vlapp = CreateObject("Vl.Application.16")
	Set vlFuncs = vlapp.ActiveDocument.Functions
	Set vlSym = vlFuncs.Item("read").funcall(Symbol)
	Set vlSet = vlFuncs.Item("set")
	Select Case VarType(value)
		Case vbByte, vbInteger, vbLong
			Dim lVal As Long
			lVal = value
			vlSet.funcall vlSym, lVal
		Case vbString
			Dim strVal As String
			strVal = value
			vlSet.funcall vlSym, strVal
		Case vbDouble
			Dim dblVal As String
			dblVal = value
			vlSet.funcall vlSym, dblVal
		Case vbEmpty
			vlSet.funcall vlSym, vlFuncs.Item("read").funcall("nil")
		Case Else
			If IsArray(value) Then
				Dim List As Variant
				List = value
				vlSet.funcall vlSym, List
			Else
				vlSet.funcall vlSym, value
			End If
	End Select
End Sub

Public Function GetLispVar(Symbol As String) As Variant
	Dim vlapp As Object
	Dim vlFuncs As Object
	Set vlapp = CreateObject("Vl.Application.16")
	Set vlFuncs = vlapp.ActiveDocument.Functions
	GetLispVar = vlFuncs.Item("eval").funcall(vlFuncs.Item("read").funcall(Symbol))
End Function

 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Sub PRESS_PAPIER_IN(TEXTE)
Dim DataObj As New MSForms.DataObject
    With DataObj
      .SetText TEXTE
      .PutInClipboard
    End With
End Sub
Function PRESS_PAPIER_OUT()
Dim MSForm As Object
    Set MSForm = New DataObject
    MSForm.GetFromClipboard
    TEXTE = MSForm.GetText
    Set MSForm = Nothing
PRESS_PAPIER_OUT = TEXTE
End Function

Code de mon press papier dans mon module

Lien vers le commentaire
Partager sur d’autres sites

Un grand merci @(gile).
J'ai testé le code de Tony Tanzillo mais il fait planter l'IDE Lisp d'AutoCAD, sans faire planter AutoCAD.

Public Sub TestVarTanzillo()
    GetLispVar "Denis"
    MsgBox "Denis"
End Sub

Je peux dessiner ou lancer du VBA, mais pas les Lisp.

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Salut @Curlygoth pour ton aide.
Je vais regarder ça avec attention.

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

si tu as diu mal sur les deux languages fixe toi a en maitriser un a fond

je maitrise pas le lisp mais je les appelle depuis vba par exemple et en lisp tu appeler du vba.

Je suis sur que tu pourras faire des choses sympa avec ce qui existe deja

pour remplir un formulaire passer par du csv est une base a maitriser !

 

Lien vers le commentaire
Partager sur d’autres sites

Je prend bien note de vos remarques, et merci de m'en faire part.
Quand j'ai besoin d'écrire une macro, je sais ce qu'elle doit faire et ce dont elle a besoin pour le faire (c'est déjà un bon début).
Je préfèrerais toujours tout faire en Lisp, c'est pour ça que je commence systématiquement à l'écrire en Lisp, parfois je vais jusqu'au bout, mais d'autres fois, je côtoie les limites de mes piètres connaissances.
Alors je tente dans un autre langage (le VBA), et c'est la même chose, soit j'y arrive, soit non.
C'est à ce moment là que j'utilise plusieurs langages, et ça ne m'enchante pas beaucoup.
Ce n'est ni par choix, ni par préférence, ni par caprice mais bien par "obligations".
Encore merci à la communauté.
Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Oui, je sais qu'on peut les mêmes choses en Lisp tant qu'en VBA, mais pas moi, je n'ai pas les mêmes connaissances dans ces deux langages.
Et faire du Lisp dans du VBA, ça doit être une galère sans nom ! ! ! 😁

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité