Hi,
I'm a newbie in dotnet and want to now if is possible to iterate through items of a block reference.
My problem is the following : I explode a block reference in dotnet (it works well) and I want to change the items layer that compose the bloc reference. It's the reason why i need to browse items of this block.
If sombody have another solution, I take it.
Thak you in advance for your help...
Solved! Go to Solution.
Solved by _gile. Go to Solution.
Hi,
It seems to me you do not completely understand what a block reference is an what are the differences and relationship between block definitions (BlockTableRecord object in .NET) and block references (BlockReference).
A block reference does not contains entities, it is only a geometric representation of a block definition.
If you want to change the block components layer, you have to do it within the block definition itereting it (without exploding nothing) and the changes will affect all the inserted references.
Bonjour Gile,
Merci de ta réponse si rapide.
Je suis tout à fait d'accord sur le fait que je n'ai pas tout à fait compris la notion de block reference et c'est d'ailleurs pour cette raison que je solicite votre aide.
J' ai lu plusieurs de vos tutoriaux et j'avoue que cela m'a permis d'avancer sur pas mal de point.
Je vais essayer de vous expliquer mon problème en français :
1 - J'ai besoin d'exploser un block qui est inséré dans mon desssin (dans mon model_space) , jusqu'ici ça va
2 - mais ce block contient plusieurs solides qui ont des layers différents et pour cela, je voudrais pouvoir leur (solides) attribuer le même layer que celui du block d'origine.
voici le code
1 -
Public Sub ExplodeBlockOfSameLayerInModelSpace() Dim zDlg As Form_EBL = New Form_EBL() Dim zResult As System.Windows.Forms.DialogResult = AcadAp.ShowModalDialog(zDlg) Dim zDoc As Document = Application.DocumentManager.MdiActiveDocument Dim zDb As Database = zDoc.Database Dim zEd As Editor = zDoc.Editor If zResult = Windows.Forms.DialogResult.OK Then Dim i As Integer = 0 Using zTrans As Transaction = zDb.TransactionManager.StartTransaction() Dim zBlkTbl As BlockTable = zTrans.GetObject(zDb.BlockTableId, OpenMode.ForRead) Dim zBlkTblRec As BlockTableRecord = zTrans.GetObject(zBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForRead) Dim zBlkCl As RXClass = RXClass.GetClass(GetType(BlockReference)) For Each zBlkTblRecId As ObjectId In zBlkTblRec Try If zBlkTblRecId.ObjectClass = zBlkCl Then Dim zBlkRef As BlockReference = TryCast(zTrans.GetObject(zBlkTblRecId, OpenMode.ForWrite, False), BlockReference) If zBlkRef.Layer = zDlg.LstLayer.SelectedItem Then zEd.WriteMessage(String.Format(vbLf + "Block : {0} -- Id : {1} -- Layer : {2}", zBlkRef.Name, zBlkTblRecId, zBlkRef.Layer)) zBlkRef.ExplodeToOwnerSpace() zBlkRef.Erase(True) i = i + 1 End If End If Catch ex As SystemException zEd.WriteMessage(vbLf + "Problème rencontré : ", ex.Message()) End Try Next zEd.WriteMessage(String.Format(vbLf + "Total des blocs exploxés : {0} ", i)) zTrans.Commit() End Using Else zEd.WriteMessage(vbLf + "Opération annulée par l'utulisateur.") End If
En fait un formulaire s'affiche avec la liste de layers spécifiques de blocs que je veux exploser. Une fois les blocs explosés, je voudrais le layer des solides qui composent celui-ci soient le même que le layer du bloc.
J'ai besoin des solides pour une autre utilité.
J'espère avoir été suffisament clair dans les détails.
Merci d'avance...
D'accord, c'est moi qui avait mal compris.
À la place de ExplodeToOwnerSpace(), il faut utiliser la méthode Explode() qui requiert un paramètre de type DBObjectCollection.
Pseudo code :