Aller au contenu

Aide code VBA


Netparty
 Partager

Messages recommandés

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

Lien vers le commentaire
Partager sur d’autres sites

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

 

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

 

Lien vers le commentaire
Partager sur d’autres sites

@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

Lien vers le commentaire
Partager sur d’autres sites

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

 

Lien vers le commentaire
Partager sur d’autres sites

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 tout 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

 

Lien vers le commentaire
Partager sur d’autres sites

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

 

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

@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

Lien vers le commentaire
Partager sur d’autres sites

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

 

Lien vers le commentaire
Partager sur d’autres sites

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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

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
Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

Chargement
 Partager

×
×
  • Créer...