Ajouter automatiquement les réseaux de conduites aux vues en profil avec un plugiciel .NET

C# code calling AddToProfileView, with an arrow to a Civil 3D profile view showing pipes and manholes

Sur les projets chargés en services, chaque vue en profil doit afficher les conduites et les structures qui croisent ou suivent son alignement. Le faire à la main avec Dessiner des pièces dans la vue en profil, c’est sélectionner les pièces une par une, feuille après feuille, et il est facile d’en oublier une. Un petit plugiciel .NET peut faire le travail en quelques secondes.

C’est l’approche derrière une commande que j’ai développée pour le travail de production quotidien. Voici une version simplifiée que vous pouvez adapter.

La méthode clé de l’API

Dans l’API .NET de Civil 3D, les objets Pipe et Structure exposent tous deux une méthode AddToProfileView(ObjectId profileViewId). Tout le reste consiste à trouver les bonnes pièces et à l’appeler.

Une commande minimale

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.Civil.ApplicationServices;
using Autodesk.Civil.DatabaseServices;

public class ProfileCommands
{
    [CommandMethod("ADDPIPEPROFILE")]
    public void AddPipesToProfileView()
    {
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Editor ed = doc.Editor;
        CivilDocument civDoc = CivilApplication.ActiveDocument;

        var peo = new PromptEntityOptions("\nSélectionnez une vue en profil : ");
        peo.SetRejectMessage("\nL'objet doit être une vue en profil.");
        peo.AddAllowedClass(typeof(ProfileView), true);
        PromptEntityResult per = ed.GetEntity(peo);
        if (per.Status != PromptStatus.OK) return;

        int count = 0;
        using (Transaction tr = doc.TransactionManager.StartTransaction())
        {
            foreach (ObjectId netId in civDoc.GetPipeNetworkIds())
            {
                var net = (Network)tr.GetObject(netId, OpenMode.ForRead);

                foreach (ObjectId pipeId in net.GetPipeIds())
                {
                    var pipe = (Pipe)tr.GetObject(pipeId, OpenMode.ForWrite);
                    pipe.AddToProfileView(per.ObjectId);
                    count++;
                }

                foreach (ObjectId strId in net.GetStructureIds())
                {
                    var str = (Structure)tr.GetObject(strId, OpenMode.ForWrite);
                    str.AddToProfileView(per.ObjectId);
                    count++;
                }
            }
            tr.Commit();
        }
        ed.WriteMessage($"\n{count} pièce(s) ajoutée(s) à la vue en profil.");
    }
}

Le rendre prêt pour la production

L’exemple ajoute toutes les pièces de tous les réseaux, ce qui est rarement souhaité. Un vrai outil devrait ajouter quelques filtres :

  • Distance par rapport à l’alignement : récupérez l’alignement de la vue en profil et utilisez Alignment.StationOffset() pour ne garder que les pièces à l’intérieur d’une distance donnée et du chaînage de la vue.
  • Choix des réseaux : laissez l’utilisateur choisir les réseaux à inclure (sanitaire, pluvial, aqueduc).
  • Ignorer les pièces déjà affichées pour éviter les doublons quand la commande est lancée deux fois.
  • Réseaux sous pression : traitez aussi les conduites, raccords et accessoires sous pression, car les croisements de services comptent tout autant. Consultez la référence de l’API pour votre version de Civil 3D.
  • Mode par lots : parcourez toutes les vues en profil du dessin pour un vrai résultat en un clic.

Le déployer

Compilez avec les assemblages Civil 3D et AutoCAD de votre version (AcMgd, AcDbMgd, AcCoreMgd, AeccDbMgd), mettez Copy Local à false, puis chargez la DLL avec NETLOAD. Pour un déploiement en équipe, un bundle autoloader (PackageContents.xml dans le dossier ApplicationPlugins) charge le plugiciel automatiquement au démarrage.

Quelques lignes de C# peuvent faire gagner des heures sur chaque projet de services. Commencez petit, puis ajoutez les filtres dont votre méthode de travail a besoin.