Aller au contenu

Comment modifier attribut dans block imbriqué


kisscool73

Messages recommandés

Bonjour,

 

voila j'aimerais en vb.net trouver la position en Z par rapport au scu espace objet d'un block avec attribut ("BlockLevel").

et modifier l'attribut avec cette valeur.

sauf que ce block("BlockLevel") peut être soit dans l'espace objet ,soit imbriqué dans d'autre block("BlockParent") à n'importe quel niveau.

et bien sur tous ces blocks peuvent avoir plusieurs référence dans l'espace objet.

 

j'ai essayé quelque chose comme ça:

 

If acBlkTbl.Has("BlockLevel") Then

Dim btr As BlockTableRecord = myT.GetObject(acBlkTbl("BlockLevel"), OpenMode.ForRead)

blockReferenceIDs = btr.GetBlockReferenceIds(True, True)

End If

 

For Each blockReferenceID As ObjectId In blockReferenceIDs

 

Dim br As BlockReference = CType(myT.GetObject(blockReferenceID, OpenMode.ForWrite), BlockReference)

 

Dim arColl As Autodesk.AutoCAD.DatabaseServices.AttributeCollection = br.AttributeCollection

 

Dim ar As AttributeReference = CType(myT.GetObject(arColl(0), OpenMode.ForWrite), AttributeReference)

 

ar.TextString = br.Position.Z

 

OU

 

ar.TextString = "%<\AcObjProp Object(%<\_ObjId " & ar.AcadObject.ObjectId & ">%,2).InsertionPoint \f " & """" & "%lu2%pt4%pr0" & """" & ">%"

 

 

mais cela ne fonctionne pas quand le block contenant l'attribut se trouve au nieme niveau d'imbriquation

ou qu'il y à plusieurs reference dans l'espace objet

 

si quelqu'un peut m'aider je suis preneur

 

merci d'avance

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Pour modifier la valeur d'un attribut dans un bloc imbriqué, il faut le faire dans la définition du bloc parent et ce changement affectera donc toutes les références du bloc parent.

 

De plus, dans ton cas, br.Position.Z est l'altitude de la référence de bloc dans la définition du bloc parent (très probablement 0.0).

 

Personnellement, à part peut-être quelques cas très exceptionnels dont aucun ne me vient à l'esprit, je pense que l'utilisation d'attributs dans des blocs imbriqués ne présente aucun intérêt (surtout si valeur de l'attribut doit refléter l'altitude de la référence de bloc).

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

Salut,

merci d'avoir répondu.

je vais essayer d’être un peut plus précis.

Déjà dans l'entreprise ou je travail nous utilisons autocad avec des blocs 3D

pour faire simple imaginons que je crée un réseau hydraulique,

j'ai une bibliothèque de blocs de type Tube(longueurs différentes),raccords(en T,en y,en étoile),des coudes (rayon différents).....tous ça en 3D

dans chacun de ces blocs j'ai un bloc "BlockLevel" à chaque jonction.

j'ai un programme qui me permet de choisir un élément dans la bibliothèque et par sélection a l’écran de l'inséré à la suite.

avec choix de la jonction et rotation autour de l'axe.

Ce "BlockLevel" possède des attributs.

Maintenant on me demande de renseigner altimétrie à chaque jonction.

je dois donc trouver la position des blocs "BlockLevel" imbriqué dans mes références de bloc bibliothèque par rapport au scu général et renseigner la propriété TextString de l'attribut.

 

voila j’espère avoir été un peu plus clair

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Du coup est ce qu'il ne vaut mieux pas intégrer ,pas en blocs, le niveau par rapport au z du SCG et mettre un attribut correspondant? Du coup dans ton bloc cela n'implique qu'un attribut à ajouter et tu aura toutes les positions en Z par rapport au SCG sans avoir de blocs imbriqués...

 

Cordialement

 

EDIT : héhé j'ai été plus rapide que Master Gile (bon c'est moins bien dit, mais l'idée était là :) )

"98% des soucis informatiques sont assis entre la chaise et le bureau !"

 

"C'est parce que la vitesse de la lumière est supérieure à celle du son que tant de gens paraissent brillants avant d'avoir l'air con."
Lien vers le commentaire
Partager sur d’autres sites

Salut, je vais essayer de m'exprimer autrement.

 

Ton problème n'est pas un problème de programmation (pas encore), mais un problème d'utilisation des blocs avec attributs.

 

Il faut bien comprendre la différence entre définition de bloc (BlockTableRecord) et référence de bloc (BlockReference).

 

Quand tu dis : "J'ai un bloc "Tube" et dans ce bloc j'ai un bloc "BlockLevel", ça veut dire qu'une référence de bloc "BlockLevel" est insérée dans la définition du bloc "Tube" (très probablement à une altitude Z = 0).

Les attributs de de cette référence de "BlockLevel" ne sont accessible que depuis la définition du bloc "Tube" (par programmation ou depuis l'éditeur de bloc).

Si tu insères le bloc "Tube", tu ne peux pas accéder aux attributs de "BlockLevel" depuis cette référence de "Tube", il faut aller dans la définition de "Tube". et si, dans la définition de "Tube", tu affectes a l'attribut de "BlockLevel" la valeur Z du point d'insertion de la référence de "Tube", tu modifies la définition de "Tube" et toutes les références de "Tube" seront affectées par cette modification.

 

Tu ne peux pas utiliser la valeur d'un attribut d'un bloc imbriqué pour refléter l'altitude d'insertion de différentes références d'un même bloc parent.

 

Autrement dit, pour être accessible indépendamment dans chaque référence insérée, il faut que l'attribut "altitude" soit dans le bloc au plus haut niveau, celui que tu insères dans l'espace objet (l'espace objet étant aussi de type BlockTableRecord).

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

Salut,

 

effectivement je ne peut pas modifier la valeur d'un attribut imbriqué sans affecter toutes les références du bloc parent.

 

Il faut bien comprendre la différence entre définition de bloc (BlockTableRecord) et référence de bloc (BlockReference).

ça c'est fait!!

 

mais je pensais logiquement que : modifier un attribut au premier niveau d'un bloc(BlockReference) inséré

dans l'espace objet (BlockTableRecord)

(espace objet n'étant autre qu'un BlockTableRecord ouvert ou en mode edition).

 

on pouvait : modifier l'attribut au premier niveau d'un bloc(BlockReference) inséré

dans un bloc (BlockTableRecord)(ouvert ou en mode edition).

 

La seul différence c'est que le parent BlockTableRecord est soit l'espace objet soit un bloc.

Lien vers le commentaire
Partager sur d’autres sites

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é