Adicionar automaticamente redes de tubagens às vistas de perfil com um plugin .NET

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

Em projetos com muitas infraestruturas enterradas, cada vista de perfil deve mostrar as tubagens e estruturas que cruzam ou acompanham o seu alinhamento. Fazê-lo à mão com Draw Parts in Profile View obriga a selecionar as peças uma a uma, folha após folha, e é fácil esquecer alguma. Um pequeno plugin .NET faz o trabalho em segundos.

É esta a abordagem por trás de um comando que desenvolvi para o trabalho de produção diário. Segue-se uma versão simplificada que pode adaptar.

O método-chave da API

Na API .NET do Civil 3D, os objetos Pipe e Structure expõem o método AddToProfileView(ObjectId profileViewId). O resto é apenas encontrar as peças certas e chamá-lo.

Um comando mínimo

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("\nSelecione uma vista de perfil: ");
        peo.SetRejectMessage("\nO objeto tem de ser uma vista de perfil.");
        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} peça(s) adicionada(s) à vista de perfil.");
    }
}

Prepará-lo para produção

O exemplo adiciona todas as peças de todas as redes, o que raramente é o pretendido. Uma ferramenta real deve incluir alguns filtros:

  • Distância ao alinhamento: obtenha o alinhamento da vista de perfil e use Alignment.StationOffset() para manter apenas as peças dentro de uma distância definida e do intervalo de quilometragem da vista.
  • Escolha das redes: deixe o utilizador escolher as redes a incluir (doméstica, pluvial, abastecimento de água).
  • Ignorar peças já representadas para evitar duplicados quando o comando é executado duas vezes.
  • Redes sob pressão: trate também as tubagens, acessórios e equipamentos sob pressão, pois os cruzamentos de infraestruturas são igualmente importantes. Consulte a referência da API para a sua versão do Civil 3D.
  • Modo em lote: percorra todas as vistas de perfil do desenho para um verdadeiro resultado com um clique.

Implementação

Compile com as bibliotecas do Civil 3D e do AutoCAD da sua versão (AcMgd, AcDbMgd, AcCoreMgd, AeccDbMgd), defina Copy Local como false e carregue a DLL com NETLOAD. Para distribuir pela equipa, um bundle autoloader (PackageContents.xml na pasta ApplicationPlugins) carrega o plugin automaticamente no arranque.

Algumas linhas de C# podem poupar horas em cada projeto de infraestruturas. Comece pequeno e depois acrescente os filtros de que o seu fluxo de trabalho precisa.