Netparty Posté(e) le 6 janvier 2022 Posté(e) le 6 janvier 2022 Bonjour à tous J'utilise ce code pour choisir un bloc : Dim objENT As AcadEntity Dim objBlk As AcadBlock Dim objBlkRef As AcadBlockReference Dim pt1 As Variant Dim attribs As Variant On Error Resume Next ThisDrawing.Utility.GetEntity objENT, basepnt, "pick block : " attribs = objBlk.objENT.GetAttributes Mais comment faire pour attribuer directement un nom de bloc sans devoir le choisir. Exemple la selection se fait directement sur le bloc qui s'appelle "BlocTest" qui se trouve dans l'espace papier. Merci
didier Posté(e) le 6 janvier 2022 Posté(e) le 6 janvier 2022 Bonjour @Netparty Il faut travailler avec les filtres, je te propose ça : Amicalement Private Sub SelectionDeBlocsparNom() Dim sset As AcadSelectionSet Dim gpCode(2) As Integer Dim dataValue(2) As Variant Dim groupCode As Variant Dim dataCode As Variant Set sset = ThisDrawing.SelectionSets.Add("JeuSel") gpCode(0) = 0 dataValue(0) = "INSERT" gpCode(1) = 2 dataValue(1) = "bloctest" gpCode(2) = 67 dataValue(2) = 0 groupCode = gpCode dataCode = dataValue sset.Select acSelectionSetAll, , , groupCode, dataCode sset.Highlight (True) 'Set sset = Nothing ' suppression du jeu de sélection End Sub Éternel débutant... Mon site perso : Programmer dans AutoCAD
Netparty Posté(e) le 6 janvier 2022 Auteur Posté(e) le 6 janvier 2022 Bonjour @didier Merci pour le code. Par contre comment je peux récupérer les infos de mes attributs dans mes textbox Avant j'avais ceci : ThisDrawing.Utility.GetEntity objENT, basepnt, "pick block : " attribs = objENT.GetAttributes TextBox1 = attribs(2).TextString TextBox2 = attribs(3).TextString TextBox3 = attribs(4).TextString TextBox4 = attribs(5).TextString TextBox5 = attribs(6).TextString Merci
didier Posté(e) le 6 janvier 2022 Posté(e) le 6 janvier 2022 Bonjour @Netparty Ouh la la ! t'en poses des questions... Tu as demandé comment sélectionner tes blocs, c'est fait. Maintenant tu as donc un jeu de sélection, il "suffit" de faire une boucle dans ce jeu de sélection pour interroger chaque entité contenue. Si tu trouves par toi-même tu seras bien plus content que si je te donne un code que tu copieras à l'envi sans "comprendre" le fonctionnement. Comme en lisp, comme dans tous les langages de programmation. Si tu ne sais pas faire c'est que t'as mis la barre trop haut, on ne cherche pas à courir quand on apprend à marcher, ceci dit sans aucun manque de respect. Si tu bloques, questionne on te débloquera... Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
Netparty Posté(e) le 6 janvier 2022 Auteur Posté(e) le 6 janvier 2022 @didier Est-on obliger de faire une boucle même si je n'ai qu'un seul bloc dont je dois récupérer les attribut? Car dans : ThisDrawing.Utility.GetEntity objENT, basepnt, "pick block : " attribs = objENT.GetAttributes Je ne vois pas ou mettre le jeu de selection Est-ce genre Thisdrawing.Nomdujeude selection. Merci
Curlygoth Posté(e) le 6 janvier 2022 Posté(e) le 6 janvier 2022 Doublons encore ??? Mon site Web (en cours de construction) : Site DA-CODE de @didier
Curlygoth Posté(e) le 6 janvier 2022 Posté(e) le 6 janvier 2022 pour un bloc : attribs=objENT.GetAttributes For ATT = LBound(attribs) To UBound(attribs) attribs(ATT).TagString 'nom de l'etiquette de l'attribut attribs(ATT).TextString ' valeur de l'attribut Next ATT donc je te conseil de mettre une vcondition pour remplir le bon attribut : attribs=objENT.GetAttributes For ATT = LBound(attribs) To UBound(attribs) if attribs(ATT).TagString = NOM_ATTRIBUT_A_REMPLIR then 'nom de l'etiquette de l'attribut attribs(ATT).TextString ' valeur de l'attribut else end if Next ATT HS : je te conseil même de vérifier si tu a bien sélectionner un bloc au lieu de mettre on error resume next if objENT.objectname <> "AcDbBlockReference" then exit sub et de définir ta variable pour voir les methode et propriété : dim blockref as acadblockreference pour ensuite faire : set blockref =objENT Mon site Web (en cours de construction) : Site DA-CODE de @didier
didier Posté(e) le 6 janvier 2022 Posté(e) le 6 janvier 2022 Bonjour @Netparty Oui il faut une boucle dans le jeu de sélection, une boucle qui ne fera qu'un seul tour si le bloc est unique, mais une boucle quand même. À moins de tout de suite lancer ta fonction sur la première entité trouvée dans le jeu de sélection. Tu peux en profiter pour faire une vérification sur le nombre de blocs sélectionnés, du style s'il y a plus de UN bloc de ce nom dans le dessin lancer un alerte... Les conseils de @Curlygothsont à prendre en compte, car au moment où on écrit le programme tout fonctionne bien, mais on n'est pas à l'abri qu'un utilisateur ayant, en toute bonne foi, ajouté des attributs au bloc te fera planter la chose. En parlant de conseils, je me permets de demander à @Curlygothd'utiliser les balises de code dans les messages, pour la lisibilité et la compréhension, merci d'avance. Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
Curlygoth Posté(e) le 6 janvier 2022 Posté(e) le 6 janvier 2022 A l'édit moins de bug de doublons ^^' Mon site Web (en cours de construction) : Site DA-CODE de @didier
Netparty Posté(e) le 6 janvier 2022 Auteur Posté(e) le 6 janvier 2022 Bonjour @Curlygoth Merci mais comment je peux lier ma selectionset avec mon getattribute
Curlygoth Posté(e) le 7 janvier 2022 Posté(e) le 7 janvier 2022 ta sélection set c'est ca : sset ta selection c'est une "liste" d'objet sélectionné pouqruoi ne pas boucler dessus ? for i = 0 to sset.count - 1 'ton code pour chaque sset(i) par exemple du coup : attribs = sset(i).GetAttributes 'etc... next i Mon site Web (en cours de construction) : Site DA-CODE de @didier
Netparty Posté(e) le 7 janvier 2022 Auteur Posté(e) le 7 janvier 2022 Bonjour @Curlygoth@didier Je reviens vers vous car je n'arrive pas à trouver la solution à mon problème pour récupérer les valeurs des attributs dans mes textbox de mon formulaire. Pourriez-vous m'avancer sur ce problème. Se serait super de votre part. Merci d'avance
Curlygoth Posté(e) le 7 janvier 2022 Posté(e) le 7 janvier 2022 valeurs des attributs dans mes textbox ? ben c'est le nom de la textbox ^^ Mon site Web (en cours de construction) : Site DA-CODE de @didier
Netparty Posté(e) le 8 janvier 2022 Auteur Posté(e) le 8 janvier 2022 Bonjour @didier@Curlygoth J'approche tu but, j'ai réussi à récupérer les infos des attributs dans les Textbox de mon formulaire. Private Sub SelectionDeBlocsparNom() Dim sset As AcadSelectionSet Dim gpCode(2) As Integer Dim dataValue(2) As Variant Dim groupCode As Variant Dim dataCode As Variant Set sset = ThisDrawing.SelectionSets.Add("JeuSel") gpCode(0) = 0 dataValue(0) = "INSERT" gpCode(1) = 2 dataValue(1) = "bloctest" gpCode(2) = 67 dataValue(2) = 0 groupCode = gpCode dataCode = dataValue sset.Select acSelectionSetAll, , , groupCode, dataCode sset.Highlight (True) For Each Elem In sset Array1 = Elem.GetAttributes Attribut1 = Array1(0).TextString Attribut2 = Array1(1).TagString Attribut3 = Array1(2).TagString Attribut4 = Array1(3).TagString Next UserForm1.TextBox1 = Attribut1 UserForm1.TextBox2 = Attribut2 UserForm1.TextBox3 = Attribut3 UserForm1.TextBox4 = Attribut4 'Set sset = Nothing ' suppression du jeu de sélection End Sub J'ai remplacé : dataValue(2) = 0 en dataValue(2) = 1 Pour récupérer les blocs de l'espace papier, mais j'ai plusieurs présentation et il ne prendre que l'info de la dernière présentation. Comment spécifier que je doit prendre les infos sur la présentation active? Merci
Curlygoth Posté(e) le 8 janvier 2022 Posté(e) le 8 janvier 2022 tu as vraiment besoin d'un filtre les objets sur tes présentations ? Mon site Web (en cours de construction) : Site DA-CODE de @didier
(gile) Posté(e) le 8 janvier 2022 Posté(e) le 8 janvier 2022 Il y a 4 heures, Netparty a dit : Comment spécifier que je doit prendre les infos sur la présentation active? grCode(3) = 410 dataValue(3) = ThisDrawing.GetVariable("CTAB") Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Netparty Posté(e) le 8 janvier 2022 Auteur Posté(e) le 8 janvier 2022 Bonjour @gile J'ai testé mais j'ai erreur suivante :
Netparty Posté(e) le 8 janvier 2022 Auteur Posté(e) le 8 janvier 2022 Il y a 3 heures, Curlygoth a dit : tu as vraiment besoin d'un filtre les objets sur tes présentations ? Oui car je veux récupérer l'info du bloc de la présentation active
(gile) Posté(e) le 8 janvier 2022 Posté(e) le 8 janvier 2022 As-tu bien redimensionné les tableaux ? Dim gpCode(3) As Integer Dim dataValue(3) As Variant Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 8 janvier 2022 Posté(e) le 8 janvier 2022 En fait, remplace : gpCode(2) = 67 dataValue(2) = 1 par : gpCode(2) = 410 dataValue(2) = ThisDrawing.GetVariable("CTAB") pour ne sélectionner que dans l'espace courant (CF CTAB) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Netparty Posté(e) le 9 janvier 2022 Auteur Posté(e) le 9 janvier 2022 @Luna@didier@Curlygoth@(gile) Bonjour à tous, Ce petit message pour vous remercier de votre aide pour la réalisation de mon tout petit projet. Mon projet n'est pas encore terminé mais il est fonctionnel donc je le partage cela pourrait peut-être aider d'autre personne du forum ou même donner des idées d'améliorations. Principe de fonctionnement : Dans la partie gauche on clique 2 fois sur la présentation dans laquelle se trouve le bloc source pour afficher ces valeurs (le bloc source s'appelle "CARTOUCHE") On fait de même dans la partie droite. Ainsi à l'aide du bouton copier ">>" on copie la valeur de l'attribut (pour l'instant je n'ai qu'un bouton mais par la suite il y aura un bouton pour chaque attribut), ensuite on colle cette valeur dans l'attribut destination de son choix. Si je doit déplacer le sujet vers une autre rubrique pour le partage n'hésiter pas à me le dire. Bonjour journée à tous Cartouche_Attribut-To-Attribut.dvb
Netparty Posté(e) le 10 janvier 2022 Auteur Posté(e) le 10 janvier 2022 Bonjour à tous Je reviens sur mon projet J'ai modifier mon bloc test en lui ajouter un paramètre de visibilité du coup mon bloc est dynamique et mon code n'a pas l'air de fonctionner il ne sélectionne pas mon bloc dynamique. Auriez-vous une idée pour palier à ce problème. Merci
(gile) Posté(e) le 10 janvier 2022 Posté(e) le 10 janvier 2022 Salut, On ne peut pas filtrer directement les blocs anonymes issus de blocs dynamiques avec un filtre de sélection. Il faut donc filtrer sur le nom du bloc et tous les blocs anonymes (dont le "nom" commence par : *U). dataValue(1) = "bloctest,`*U*" Et ensuite, quand tu parcours ton jeu de sélection, il faut que tu contrôles la propriété EffectiveName du bloc. For Each Elem In sset If Elem.EffeciveName = "bloctest" Then ... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Luna Posté(e) le 10 janvier 2022 Posté(e) le 10 janvier 2022 (modifié) Coucou, Le problème est récurrent et tu trouveras un nombre incalculable de sujets qui traite de ce soucis ! Un bloc dynamique possède un nom du style "*U146" alors que la définition de bloc est "Test" par exemple. Pour cela il faut utiliser la fonction 'EffectiveName (en VBA je n'ai pas idée de comment tu l'écris) lorsque tu veux comparer le nom de ton bloc avec le filtre. Il faut également penser à ajouter le pattern "`*U*" dans le filtre de sélection si jamais tu as défini un filtre sur le code DXF 2 ! Edit: (gile) est plus efficace et concis, j'ai encore du travail sur la simplification et la clarté des explications 🙂 Bisous, Luna Modifié le 10 janvier 2022 par Luna
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