DenisHen Posté(e) le 6 février 2023 Posté(e) le 6 février 2023 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)
(gile) Posté(e) le 6 février 2023 Posté(e) le 6 février 2023 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
DenisHen Posté(e) le 6 février 2023 Auteur Posté(e) le 6 février 2023 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)
(gile) Posté(e) le 6 février 2023 Posté(e) le 6 février 2023 il y a 3 minutes, DenisHen a dit : c'est plus complexe, mais j'y arriverais plus facilement Je pense que tu es en passe de devenir un vrai spécialiste de la fuite en avant... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 7 février 2023 Posté(e) le 7 février 2023 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
DenisHen Posté(e) le 7 février 2023 Auteur Posté(e) le 7 février 2023 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)
(gile) Posté(e) le 7 février 2023 Posté(e) le 7 février 2023 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
Curlygoth Posté(e) le 7 février 2023 Posté(e) le 7 février 2023 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 Mon site Web (en cours de construction) : Site DA-CODE de @didier
DenisHen Posté(e) le 7 février 2023 Auteur Posté(e) le 7 février 2023 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)
DenisHen Posté(e) le 7 février 2023 Auteur Posté(e) le 7 février 2023 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)
Curlygoth Posté(e) le 7 février 2023 Posté(e) le 7 février 2023 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 ! Mon site Web (en cours de construction) : Site DA-CODE de @didier
DenisHen Posté(e) le 7 février 2023 Auteur Posté(e) le 7 février 2023 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)
Curlygoth Posté(e) le 8 février 2023 Posté(e) le 8 février 2023 heu tu peux faire les même chose en lisp et en VBA... en terme de controles/ d'évènements etc... et en plus tu peux écrire du lisp dans du vba ! je sais pas si tu peux faire l'inverse mais tu peux injecter du code ! Mon site Web (en cours de construction) : Site DA-CODE de @didier
DenisHen Posté(e) le 8 février 2023 Auteur Posté(e) le 8 février 2023 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)
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant