jeudi 20 juin 2013

Générer automatiquement un champ sur les objets sélectionnés

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()


        End Using

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