CADxp: Comment modifier attribut dans block imbriqué - CADxp

Aller au contenu

Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

Comment modifier attribut dans block imbriqué

#1 L'utilisateur est hors-ligne   kisscool73 

  • Member
  • PipPip
  • Groupe : Membres
  • Messages : 15
  • Inscrit(e) : 02-janvier 07

Posté 12 janvier 2018 - 15:36

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
0

#2 L'utilisateur est en ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 10743
  • Inscrit(e) : 02-septembre 05

Posté 12 janvier 2018 - 19:03

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
Image IPB
0

#3 L'utilisateur est hors-ligne   kisscool73 

  • Member
  • PipPip
  • Groupe : Membres
  • Messages : 15
  • Inscrit(e) : 02-janvier 07

Posté 15 janvier 2018 - 11:51

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
0

#4 L'utilisateur est en ligne   nG! Hebus 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 590
  • Inscrit(e) : 27-août 14

Posté 15 janvier 2018 - 12:14

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à :) )
Soutien crowdfunding BD

Citation

"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."
0

#5 L'utilisateur est en ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 10743
  • Inscrit(e) : 02-septembre 05

Posté 15 janvier 2018 - 13:13

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
Image IPB
0

#6 L'utilisateur est hors-ligne   kisscool73 

  • Member
  • PipPip
  • Groupe : Membres
  • Messages : 15
  • Inscrit(e) : 02-janvier 07

Posté 16 janvier 2018 - 15:52

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.
0

Partager ce sujet :


Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)