Désormais, nous allons intéresser à l'ajout de champs.
Pour pouvoir générer des champs automatiquement sur des objets sélectionnés, nous allons réutiliser les même procédé que pour la génération du tableau.
Pour réaliser notre module, nous allons d'abord créer un boite de dialogue avec un simple bouton.
En un premier temps, nous allons créer une classe 'Champs' dans laquelle nous allons ajouter le code suivant:
Using zctran As Transaction =
zcDB.TransactionManager.StartTransaction
Dim zcBLT As BlockTable
zcBLT = zctran.GetObject(zcDB.BlockTableId, OpenMode.ForRead)
Dim zcBLTR As BlockTableRecord
zcBLTR = zctran.GetObject(zcBLT(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
For
Each ObjSelect As
SelectedObject In
psr
Dim
minor As Entity
= zctran.GetObject(ObjSelect.ObjectId, OpenMode.ForWrite)
Dim
objs As DBObjectCollection
= New DBObjectCollection()
Dim
item As MText
= New MText()
minor.Explode(objs)
Dim
Solid As New Solid3d()
Solid.Extrude(DirectCast(Region.CreateFromCurves(objs)(0),
Region), 1, 0)
Dim
centroid As New
Point3d(Solid.MassProperties.Centroid.X,
Solid.MassProperties.Centroid.Y, Solid.MassProperties.Centroid.Z)
Solid.Dispose()
Dim
s As String =
ObjSelect.ObjectId.ToString
s = s.Trim(New Char() {"("c, ")"c})
Dim
a As String = "%<\AcObjProp Object(%<\_ObjId " +
s + ">%).Area \f
""%lu2"">%"
item.Contents = a
item.Location = centroid
item.TextHeight = taille
zcBLTR.AppendEntity(item)
zctran.AddNewlyCreatedDBObject(item,
True)
item.ZcadObject.TextString = a
Next
zctran.Commit()
Pour pouvoir créer un champ, il faut tout d'abord que l'on définisse une variable de type MText (item), qui constitue un simple texte multiligne.
Ensuite, on utilise la méthode Explode qui permet de créer, modifier ou supprimer des données lié à des objets ZwCAD: ici, les objets qui ont été sélectionnés.
Dans mon cas, je définis le centroïde de mon objet (barycentre), auquel j'y attacherais mon champ.
minor.Explode(objs)
Dim
Solid As New Solid3d()
Solid.Extrude(DirectCast(Region.CreateFromCurves(objs)(0),
Region), 1, 0)
Dim
centroid As New
Point3d(Solid.MassProperties.Centroid.X,
Solid.MassProperties.Centroid.Y, Solid.MassProperties.Centroid.Z)
Solid.Dispose()
Maintenant nous allons nous intéressé à la particularité des champs: nous allons utiliser une commande spécifique:
Dim
a As String = "%<\AcObjProp Object(%<\_ObjId " +
s + ">%).Area \f
""%lu2"">%"
Pour pouvoir retrouver les commandes correspondantes à l'utilisation des champs et de leur options, ouvrer la fenêtre 'Champ':
Insertion>Champ...
Sélectionnez ensuite 'Objet' puis sélectionnez un objet de votre dessin à l'aide de l’icône:
Ainsi, vous pouvez récupérrer la commande correspondante dans le cadre du bas.
Attention, lorsque vous utilisez la commande suivante "%<\AcObjProp Object(%<\_ObjId " +
s + ">%).Area \f
""%lu2"">%", il ne faut pas oublier de renseigner l'identifiant de l'objet sélectionné. C'est pourquoi, j'utilise la ligne de code suivante qui me permet de récupérer l'identifiant de l'objet et ensuite de retirer les parenthèses qui s'ajoutent automatiquement au début et à la fin de ma chaine de caractères.
Dim
s As String =
ObjSelect.ObjectId.ToString
s = s.Trim(New Char() {"("c, ")"c})
Enfin, il ne vous reste plus qu'à ajouter l'identifiant à la commande: "%<\AcObjProp Object(%<\_ObjId " +
s + ">%).Area \f
""%lu2"">%".
Après, on rajoute les informations à notre texte multiligne afin de le transformer en un champ.
item.Contents = a
item.Location = centroid
item.TextHeight = taille
Pour finir, nous avons besoin du code suivant pour notre boite de dialogue:
Public Sub Position_Click_Champ(ByVal
sender As System.Object,
ByVal e As
System.EventArgs) Handles
ButtonChamps.Click
Me.DialogResult
= System.Windows.Forms.DialogResult.OK
Dim ed
As ZwSoft.ZwCAD.EditorInput.Editor = ZwSoft.ZwCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor
Dim
psr As PromptSelectionResult
= ed.GetSelection()
If
psr.Status = PromptStatus.OK Then
Dim
acSSet As SelectionSet
= psr.Value
Champ.AddChamp(acSSet)
End If
Me.Show()
End Sub
On donne l'accès au dessin ZwCAD pour sélection d'objets en utilisant la classe GetSelection() et ensuite on passe le paramètre 'acSSet' qui correspond à la sélection d'objets à la classe 'Champ'.
Nous devons alors avoir un résultat similaire à celui-ci, en utilisant notre module:
Aucun commentaire:
Enregistrer un commentaire