Modification de bloc dynamique sous VBA

Modification de bloc dynamique sous VBA

nelson.tambuzzo
Participant Participant
1 662 Visites
10 Réponses
Message 1 sur 11

Modification de bloc dynamique sous VBA

nelson.tambuzzo
Participant
Participant

Bonjour a tous,

Débutant le VBA sous autocad, je suis à la recherche d'une solution permettant de modifier un paramètre(inverser dans mon cas) d'un bloc dynamique en fonction d'un de ses attributs( inversé si attribut<0, pas inversé si attribut>0).

Pourriez vous m'indiquer si cela est possible. Si oui, comment dois-je faire appel à l'attribut ainsi qu'au paramètre dans mon projet VBA sachant que le bloc est présent plus de neuf cent fois sur le dessin avec une valeur d'attribut  différente a chaque fois.

Merci d'avance.

0 J'aime
Solutions acceptées (1)
1 663 Visites
10 Réponses
Replies (10)
Message 2 sur 11

rebcao
Mentor
Mentor

Bonjour,

 

Pourquoi vouloir absolument passer par le VBA ?!

 

Au vu du manque de réponse, tu auras plus de chance en partant sur un LISP ! Et sans doute plus d'aide de la part des membres...

 

Christian


Formateur Indépendant, Consultant, AutoCAD, AutoCAD LT, REVIT MEP, INVENTOR -
www.rebcao.fr

Christian REB

0 J'aime
Message 3 sur 11

_gile
Consultant
Consultant

Salut,

Je ne pratique pas le VBA, mais je vais essayer de donner le principe.

 

Pour les référence d'attribut :

On obtient la collection des références d'attribut d'une référence de bloc avec la méthode GetAttributes, collection qu'il faut parcourir et chercher pour chaque AttributeReference si la propriété TagString correspond à l'étiquette de l'attribut recherchée puis récupérer sa valeur avec la propriété TextString.

 

Pour les propriété dynamiques :

On obtient la collection des propriétés dynamiques d'une référence de bloc avec la méthode GetDynamicBlockProperties, collection qu'il faut parcourir et chercher pour chaque DynamicBlockReferenceProperty si la propriété PropertyName correspond au paramètre dynamique recherché et ensuite modifier la propriété Value (0 pour pas inversé, 1 pour inversé).



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

0 J'aime
Message 4 sur 11

patrick.emin
Alumni
Alumni

Bonjour @nelson.tambuzzo 

Votre problème a-t-il été résolu? Si oui, pouvez vous nous indiquer de quelle façon pour que cela profite à la communauté, si non, pouvez vous nous dire si vous avez pu essayer les suggestions qui vous ont été faites?

Si une des réponses à votre question résout votre problème, vous a permis de le comprendre ou contribue significativement à sa résolution, voulez vous avoir l'amabilité de cliquer sur le bouton "Accepter comme solution" en bas de la réponse? Merci.


Patrick Emin animateur de la communauté francophone


Vous avez trouvé un message utile? Alors donnez un "J'aime" à ce message!
Votre question a eu une réponse satisfaisante? Voulez vous avoir l'amabilité de cliquer sur le bouton
 APPROUVER LA SOLUTION  en bas de la réponse qui apporte une solution?
Signez notre Livre d'Or
0 J'aime
Message 5 sur 11

nelson.tambuzzo
Participant
Participant

Bonjour a tous,

Tout d'abord merci pour l'intérêt porté a ma question.

Je suis actuellement entrain de d'essayer de programmer la fonction sous VBA, en suivant les conseils de gilles.

J'ai également entendu parler de la solution proposée par Christian , mais je n'ai malheureusement aucune notion de LISP.

Je vous tiendrai au courant de l'évolution des choses.

Je reste tout de même ouvert a d'autres solutions(si vous avez une idée je suis preneur).

Bonne journée.

 

0 J'aime
Message 6 sur 11

-didier-
Advisor
Advisor
Solution acceptée

Bonjour @nelson.tambuzzo 

 

Bien des années sont passées sur le clavier sans y avoir tapé de code VBA

Je m'y suis remis pour le coup et je propose ceci :

un bloc "zaza" qui est un rectangle avec deux propriétés dynamiques

LONGUEUR et LARGEUR Attention les paramètres sont sensibles à la casse

  1. sélection du bloc
  2. boite de saisie demande LONGUEUR
  3. boite de saisie demande LARGEUR
  4. et c'est fini, voir la vidéo

 

Sub BlocDynModifParam()
Dim Prop_Dyn As Variant, i As Integer
Dim Bloc_Obj As AcadEntity
ThisDrawing.Utility.GetEntity Bloc_Obj, pt, "Choisir le bloc à traiter :"
Dim Longueur As Double
Dim Largeur As Double
'ouverture d'une baoite de saisie
Longueur = InputBox("Entrez la LONGUEUR")
Largeur = InputBox("Entrez la LARGEUR")

If Bloc_Obj.ObjectName = "AcDbBlockReference" Then
    If Bloc_Obj.IsDynamicBlock Then
        If Bloc_Obj.EffectiveName = "zaza" Then
        Prop_Dyn = Bloc_Obj.GetDynamicBlockProperties
        For i = LBound(Prop_Dyn) To UBound(Prop_Dyn)
            If Prop_Dyn(i).PropertyName = "LONGUEUR" Then
                Prop_Dyn(i).Value = Longueur
            End If
                           
            If Prop_Dyn(i).PropertyName = "LARGEUR" Then
                Prop_Dyn(i).Value = Largeur
            End If
        Next i
        End If
    End If
End If
End Sub

 

Amicalement

Éternel débutant.. my site for learning : Programmer dans AutoCAD

DA

EESignature

0 J'aime
Message 7 sur 11

nelson.tambuzzo
Participant
Participant

Bonjour à tous, 

J'ai réussi a compiler le code que Didier m'a fait parvenir(merci à toi Didier pour le code et la vidéo) avec  un autre code afin de pouvoir faire varier mes propriétés dynamiques en fonction des attributs des blocs.

Veuillez trouver ci-joint le code qui m'a servi avec celui de Didier dans l'espoir que cela puisse aider quelqu'un .

Public Sub ExtractAtt()
  Dim i, j As Integer
  Dim Entity As AcadEntity
  Dim BlocRef As AcadBlockReference
  Dim Attributes As Variant
  Dim S As String
  
  ' On parcourt tous les objets de l'espace objet  For i = 0 To ThisDrawing.ModelSpace.Count - 1
    Set Entity = ThisDrawing.ModelSpace.Item(i)
    
    ' Si l'objet est une insertion de bloc
    If Entity.ObjectName = "AcDbBlockReference" Then
      ' On précise le type de l'objet pour pouvoir accéder à ses propriétés et
      ' ses méthodes spécifiques      Set BlocRef = Entity
      
      ' Si il a des attributs      If BlocRef.HasAttributes Then
        ' On les récupére        Attributes = BlocRef.GetAttributes
        
        S = "Bloc : " & BlocRef.Name
        
        ' On parcourt le tableau        For j = LBound(Attributes) To UBound(Attributes)
          S = S & Chr(13) & _
          "Attribut : " & Attributes(j).TagString & " = " & Attributes(j).TextString
        Next
        
        ' On affiche        MsgBox S
        
      End If      
    End If  Next

Je remercie également Christian et Gilles pour leur réactivité.

Bonne journée à tous et bonne fin de semaine.

 

0 J'aime
Message 8 sur 11

-didier-
Advisor
Advisor

Bonjour @nelson.tambuzzo 

 

J'ai quelque peu du mal à suivre ta logique

En effet tu nous poses une question sur la gestion des "paramètres" de blocs dynamiques et tu nous renvoies un code traitant les valeurs textuelles présentes dans les attributs

Encore une fois c'est un problème de vocabulaire, paramètres et attributs ne sont pas la même chose, sinon il n'y aurait pas deux mots pour les décrire.

Toutefois tu as l'air content et c'est le but des ces forums, partager pour aider (donc contenter).

 

Amicalement

Éternel débutant.. my site for learning : Programmer dans AutoCAD

DA

EESignature

0 J'aime
Message 9 sur 11

nelson.tambuzzo
Participant
Participant

Bonjour @-didier- ,

Comme dit plus haut, j'ai compilé le code que tu m'as fourni(pour faire varier les propriétés dynamiques) et un autre code servant à récupérer les valeurs textuelles des attributs. En effet mon besoin était de faire varier un état d'inversion en fonction de la valeur textuelle d'un des attributs du bloc. Dans mon cas, j'importe un bloc 1900 fois avec à chaque fois un attribut nommé DESAXEMENT qui prend une valeur différente selon le bloc sur le dessin(les valeurs sont récupérées dans un fichier Excel). Il me fallait donc être capable de faire appel aux  attributs ainsi qu'aux  propriétés dynamiques via l'éditeur VBA de mon fichier Excel.

Amicalement.

 

 

0 J'aime
Message 10 sur 11

-didier-
Advisor
Advisor

Bonjour @nelson.tambuzzo 

 

Bon d'accord.

Je me permets de te demander de valider la réponse obtenue

(si elle te convient bien entendu pas question de te forcer la main).

 

Ceci étant fait cela permettra aux autres utilisateurs de se diriger dans les recherches

grâce à la mention "question résolue"

 

Amicalement

Éternel débutant.. my site for learning : Programmer dans AutoCAD

DA

EESignature

0 J'aime
Message 11 sur 11

patrick.emin
Alumni
Alumni

Bonjour @nelson.tambuzzo 

Si une des réponses résout votre problème ou vous a permis de mieux le comprendre, voulez vous avoir l'amabilité de cliquer sur le bouton  APPROUVER LA SOLUTION  en bas de la réponse qui apporte une solution?
Merci de ne pas accepter comme solution le message que vous êtes en train de lire.


Patrick Emin animateur de la communauté francophone


Vous avez trouvé un message utile? Alors donnez un "J'aime" à ce message!
Votre question a eu une réponse satisfaisante? Voulez vous avoir l'amabilité de cliquer sur le bouton
 APPROUVER LA SOLUTION  en bas de la réponse qui apporte une solution?
Signez notre Livre d'Or
0 J'aime