Aller au contenu

Aide code VBA


Messages recommandés

Posté(e)

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

Posté(e)

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

 

Posté(e)

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

Posté(e)

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

 

Posté(e)

@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

Posté(e)

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

 

Posté(e)

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

 

Posté(e)

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

 

Posté(e)

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

Posté(e)

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

Posté(e)
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

Posté(e)
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

 

Posté(e)

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

Posté(e)

@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 :

image.thumb.png.f2fb5f488ce7f58d5bd8ab16eab869b8.png

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

Posté(e)

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

 

Posté(e)

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

Posté(e) (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é par Luna

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é