MacStorm Posté(e) le 25 septembre 2017 Posté(e) le 25 septembre 2017 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...
bonuscad Posté(e) le 25 septembre 2017 Posté(e) le 25 septembre 2017 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éeNB: 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
(gile) Posté(e) le 25 septembre 2017 Posté(e) le 25 septembre 2017 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
MacStorm Posté(e) le 25 septembre 2017 Auteur Posté(e) le 25 septembre 2017 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
MacStorm Posté(e) le 14 novembre 2017 Auteur Posté(e) le 14 novembre 2017 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.
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