Aller au contenu

Lisp to vba


MacStorm

Messages recommandés

Bonjour

 

Je cherche à comprendre cette ligne suivante:

 

(setvar "USERS1" (cdr (assoc 4 (entget (tblobjname "block" (getvar "USERS1"))))))

 

Cependant je ne connais pas, mais alors vraiment pas le lisp.

J'ai regardé un peux tout se que je pouvais trouver sur le lisp, et j'arrive, pour des expression simple, à me faire un équivalent en vba. Même si j'ai galéré pour comprendre certain site en anglais, alors que je ne parle que le français.

Cependant, pour cette dernière, je n'arrive pas à la comprendre, et je n'arrive pas a me faire un code vba équivalent.

 

Si une âme charitable pouvais me l'expliquer afin que je puisse me la codé en vba, ce serai très gentil.

 

A bientôt...

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

(getvar "USERS1") sert à récupérer la valeur de la variable utilisateur "USERS1" (il y en a 5 en tout)

Ici cela doit être une chaine de caractère: userS (S pour String) I pour Interger et R pour Real

 

Pour que la ligne lisp fonctionne "USERS1" devrait contenir le nom d'un bloc existant dans le dessin (pas forcément inséré!). Par défaut cette variable ne contient rien ("")

 

Donc si ce bloc de nom valide existe, (tblobjname) retournera le nom (entitie name) de la définition du bloc dans la table sous la forme: <Nom d'entité: 7ffffb54f10>

 

Alors (entget) avec ce nom d'entité va te retourner la définition du bloc sous la forme comme expliqué ICI

 

enfin (assoc x liste_entget) va te retourner la liste associé à la clé demandée

NB: Je vois pas quelle peut être la clé 4 demandé dans ton code, la clé 2 par exemple retournerai le nom du bloc (2 . "Nom_du_Bloc")

 

(cdr) retourne le second élément de la liste en paire pointée.

 

(setvar "USERS1" "xxx") redéfini la variable avec la nouvelle chaine indiquée.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

En partant de l'expression la plus imbriquée :

 

(getvar "USERS1")

retourne la valeur de la variable système USERS1 (String)

 

(tblobjname "block" (getvar "USERS1"))

retourne l'identifiant AutoLISP (ENAME) de l'entrée correspondant à la chaîne dans la table des blocs.

 

(entget (tblobjname "block" (getvar "USERS1")))

retourne la liste de données DXF pour le bloc correspondant à l'identifiant.

 

(cdr (assoc 4 (entget (tblobjname "block" (getvar "USERS1")))))

retourne la valeur du groupe DXF 4 (Description du bloc)

 

(setvar "USERS1" (cdr (assoc 4 (entget (tblobjname "block" (getvar "USERS1"))))))

affecte cette valeur à la variable système USERS1.

 

 

Je ne pratique pas le VBA (et je suis étonné qu'on continue à l'utiliser) mais une traduction littérale devrait ressembler à ça :

 

ThisDrawing.SetVariable "USERS1", ThisDrawing.Blocks.Item(ThisDrawing.GetVariable "USERS1").Comments

 

Mais il me semble qu'en VB(A) on a plutôt tendance à écrire les choses comme ça :

Dim blockName As String
Dim blockColl As AcadBlocks
Dim block As AcadBlock
Dim description As Variant

blockName = ThisDrawing.GetVariable "USERS1"
blockColl = ThisDrawing.Blocks
block = blockColl.Item(blockName)
description = block.Comments
ThisDrawing.SetVariable "USERS1", description

 

EDIT: bonuscad a été plus rapide...

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

Lien vers le commentaire
Partager sur d’autres sites

Merci pour vos explications...

 

Et si je code encore en VBA, c'est parce que je doit faire tourner un prog qui a suivie les évolution d'autocad depuis les début du VBA dans autocad.

Le prog est très gros, et avec le temps il est devenu très complexe.Il fait appel à du lisp pendant des exécutions du VBA, et ça fonctionnait bien jusqu’à la version 2013 d'autocad...

Ensuite, avec les version 64bit l'on m'a demander d'adapter ce code, mais je n'ai pas le temps de tout convertir en vb.net.

Donc je supprime tout les appelles au lisp dans le code vba pour commencer. Car le VBA et le lisp se marche dessus en 64bit et provoque des erreurs.Ceci m'a déjà permis de supprimer beaucoup de "missmatch error"...

Quand j'aurais le temps, je ferai la conversion du vba au .net, mais pour l'heure je part au plus urgent qui est de faire tourner les fonctions principale du programme.

 

Bref, quand je me relie, je sais pas si j'ai été très claire dans mes explications. Mais quoiqu'il en soit, je n'ai d'autre choix que de faire du VBA pour le moment...

Et vos explications vont me faire gagner du temps, surtout dans mes recherche de conversion...

 

Merci à vous deux

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

Je prend un petit moment pour finaliser ce poste en y mettant le bout de code que j'ai utilisé en m'inspirant du (gile). J'ai eu quand même des difficultés avec la variable collection "Dim blockColl As AcadBlocks" que j'ai fin par court-circuité. Je n'ai pas trouver de référence fonctionnel dans les bibliothèques que j'utilise.

 

 

Dim blockName As String
Dim block As AcadBlock
Dim description As Variant
With ThisDrawing
  blockName = .GetVariable("USERS1")
  Set block = .Blocks.Item(blockName)
  description = block.Comments
  .SetVariable "USERS1", description
End With

 

Merci a tous et si cela peut servir à d'autre, j'en serai content.

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é