Pular para o conteúdo principal

PLDV - Seções Diagonais no AutoCAD

Desenhando a partir de informações


Já tem um tempo que desenvolvi esse aplicativo, mas gostaria de compartilhar aqui no Blog.
As vezes, muitas vezes na verdade, nos deparamos com situações especificas em que temos que realizar desenhos sistemáticos partindo de informações que temos disponíveis através de documentos de texto, planilhas ou até mesmo levantamentos feitos a mão. Esse é o caso das chamadas seções diagonais das torres.

O problema

Diferente de uma casa em que antes da construção é feito um serviço de aterro e planimetraria alinhando todo o terreno para receber a construção. Quando se trabalha com torres, postes e estradas a melhor solução é manter o terreno intacto adequando o projeto a variação do terreno evitando assim problemas de erosão e reduzindo o custo de construção.
Pensado dessa forma, em aproveitar o terreno do jeito que ele é, o projeto das torres de transmissão são feitos pensado em combinar diferentes tipos de geometrias de forma a permitir que o projetista ajuste a cada necessidade.
A torre é dividida então em pernas, extensões e uma parte comum. Cada torre tipo autoportante, por exemplo, possuí quatro pernas que podem se adaptar ao terreno combinando com a fundação.


De fato, para cada torre que será construída recebemos dados do tereno para escolha de pernas. Hora como a torre tem o formato de um losangolo aumentando a abertura das pernas cada vez mais em função do aumento da altura necessária precisamos avaliar onde cada perna exatamente será instalada.
Sendo assim o topografo levanta duas seções que se iniciam no ponto central onde a torre supostamente será instalada em direções que sejam condizentes com a geometria da torre. Se a torre é perfeitamente quadrada essas duas seções de cotas do terreno ficam a 45 º do alinhamento e 90° entre si.

O programa

Basicamente o programa precisa ler uma matriz de dados onde a primeira linha são as distâncias em relação ao ponto central e as demais 4 linhas representam as cotas em relação a referência que por algum motivo é a cota 100.
Bom isso seria bem simples com manipulação de texto e de planilhas do Excel formando conjuntos de pontos X,Y separados por tabulação e simplesmente dando o comando Line e colando os valores entraria com cada seção do AutoCAD. Pois bem, isso é possível sim, mas para mim seria muito trabalhoso. Existem linhas que possuem centenas de torres, preciso de uma solução mais prática.
Pensado assim, resolvi fazer um programa para desenhar as seções diagonais. Uma função bem básica que em um formulário de texto em que seja possível colar diretamente a informação do Excel e desenhar a seção diagonal.


[CommandMethod("DesenhaSecao", "DesenhaSecao", "DesenhaSecao", CommandFlags.Modal)]
public void DesenharSecaoDiagonal() 
{
    //Abre o formulário para inserir as informações da seção diagonal.
    frmTerrainPLDV frm = new frmTerrainPLDV();
    if (frm.ShowDialog() != System.Windows.Forms.DialogResult.OK)
return;
    Document doc = Application.DocumentManager.MdiActiveDocument;
    Database db = doc.Database;
    Editor ed = doc.Editor;

    // Create a point collection to store our vertices
    Point3dCollection pts = new Point3dCollection();
    
    //x'x'
    // Set up the selection options
    // (used for all vertices)
    PromptPointOptions opt = 
new PromptPointOptions("\nSelecione um ponto de inserção: ");
    
    //Só permite a seleção de um unico ponto
    opt.AllowNone = true;

    // Get the start point for the polyline
    PromptPointResult res = ed.GetPoint(opt);

    //Pega as cores para desenhar as linhas.
    Color[] pldvs_color = new Color[] { Color.FromRgb(255, 0, 255), Color.FromRgb(0, 255, 255), Color.FromRgb(0, 255, 0), Color.FromRgb(255, 0, 0) };
    
    //Converte todos os separadores de virgula para ponto.
    if (frm.RichTextBox_Unic.Text.Contains(","))
    {
frm.RichTextBox_Unic.Text = 
    frm.RichTextBox_Unic.Text.Replace(",", ".");
    }
    
    //Converte as linhas para textos
    String[] lines = frm.RichTextBox_Unic.Text.Split('\n');

    //Separa as distâncias da primera linha
    string[] fields = null;
    if (lines[0].Contains("\t"))
    {
fields = lines[0].Split(new char[] { '\t' });
    }
    else
    {
fields = lines[0].Split(new char[] { ' ' });
    }

    //Cria o vetor de comprimentos e coloca as informações nele.
    double[] x = new double[fields.Length];
    for (int i = 0; i < fields.Length; i++)
    {
x[i] = Convert.ToDouble(fields[i]);
    }

    //Obtem as informações de elevação
    for (int j = 1; j < lines.Length; j++)
    {
string[] fields1 = null;
if (lines[0].Contains("\t"))
{
    fields1 = lines[j].Split(new char[] { '\t' });
}
else
{
    fields1 = lines[j].Split(new char[] { ' ' });
}
double[] y = new double[fields1.Length];

double xdir = 1;
if (j >= 3)
{
    xdir = -1;
}

//Cria o texto para cada linha de elevação
MText mtext = new MText();

//Cria as polylines
Polyline pline = new Polyline(fields1.Length);
pline.AddVertexAt(pline.NumberOfVertices, new Point2d(res.Value.X, res.Value.Y), 0, 0, 0);

for (int i = 0; i < fields1.Length; i++)
{
    y[i] = Convert.ToDouble(fields1[i].Replace(",", "."));
    pline.AddVertexAt(pline.NumberOfVertices, new Point2d(xdir * x[i] + res.Value.X, y[i] + res.Value.Y - 100), 0, 0, 0);
}

pline.Color = pldvs_color[j - 1];
mtext.Color = pldvs_color[j - 1];
mtext.Height = 2.25;

pline.LineWeight = LineWeight.LineWeight030;
if (j == 1)
{
    mtext.Contents = "A";
    mtext.Location = new Point3d(res.Value.X + 15, res.Value.Y + 10, 0);

}
else if (j == 2)
{
    mtext.Contents = "B";
    mtext.Location = new Point3d(res.Value.X + 15, res.Value.Y + 7.5, 0);
}
else if (j == 3)
{
    mtext.Contents = "C";
    mtext.Location = new Point3d(res.Value.X + 15, res.Value.Y + 5, 0);

}
else if (j == 4)
{
    mtext.Contents = "D";
    mtext.Location = new Point3d(res.Value.X + 15, res.Value.Y + 2.5, 0);
}


//Abre a transação de ações
Transaction tr = db.TransactionManager.StartTransaction();
using (tr)
{

    BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);

    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
    
    ObjectId plineId = btr.AppendEntity(pline);
    tr.AddNewlyCreatedDBObject(pline, true);

    ObjectId mt = btr.AppendEntity(mtext);
    tr.AddNewlyCreatedDBObject(mtext, true);

    tr.Commit();
    ed.Regen();
}
    }
}

Podemos dividir o código em duas partes basicamente: (1) o processamento da informação que será passada através de um texto em um formulário e (2) o desenho das linhas no AutoCAD.
A primeira parte o texto é quebrado em diversas partes primeiro se divide em linhas. A primeira linha é a informação das distâncias das cotas até o centro e as demais linhas tem que ser obrigatoriamente as pernas A, B, C e D. Então após fazer a leitura o texto é quebrado através de tabulação, "\t". A tabulação é o separador padrão quando se copia informações diretamente do Excel. Veja que é necessário utilizar os recursos de conversão de texto em valores decimais.


Para cada polyline se criou uma cor diferente. Essa cor é atribuída a tanto ao desenho da linha como ao desenho da letra no AutoCAD.
Assim como nos outros códigos a polyline é criada depois inserida através da Transaction. Todos os 8 objetos ao mesmo tempo.


O formulário é um formulário Windows que possuí um botão de OK que encerra a caixa de dialogo com um resultado positivo para trata-lo como um formulário.

Um recurso interessante é o ponto de inserção, depois de desenhar toda a seção o programa pede que os objetos sejam inseridos em determinado ponto da tela. Como eu tenho pouca padronização nesses formulário é muito importante que se tenha flexibilidade para inserir onde seja necessário na tela.
Claro que esse programa pode ser muito melhorado, com personalização e também especialmente com a colocação das letras nas posições corretas próximas as suas respectivas seções diagonais sem interferência umas com as outras. Isso é uma análise de posição bem complexa.
Espero ter esclarecido e mostrado adequadamente o processo e mais uma vez dando uma funcionalidade extra ao AutoCAD. Sem duvida nenhuma o AutoCAD hoje é a ferramenta mais utilizada nas empresas de engenharia e seguirá ainda por muitos anos.

Comentários

Postar um comentário

Postagens mais visitadas deste blog

Numeração Automática no AutoCAD

Sem dúvida esse é uma ferramenta única que fazia falta a tempos e foi introduzida recentemente no AutoCAD, na última década… Em 2013 tinha feito um programa para criar uma bolinhas de numeração automática usando o conceito de Leader eu fazia um controle dos números dos itens na mão mesmo, depois de um tempo resolvi fazer um menuzinho para controlar o conteúdo do número dos bullets, hoje isso não é mais necessário, existe um comando no próprio AutoCAD para isso e faz parte das Ferramentas Expressas do AutoCAD. Gosto de compartilhar ferramentas e dicas que tendem a ser menos conhecidas ou subutilizadas, mas ainda podem fornecer um impulso para sua produtividade e fluxo de trabalho e que eu mesmo me surpreendi quando as encontrei Hoje, quero apresentar outra ferramenta, a numeração automática. Como o nome indica, o comando Numeração automática permite que você adicione automaticamente um número às etiquetas ou texto em um desenho. Vou mostrar como a numeração automática pode ser usada par...

Alterar a cor de fundo do AutoCAD

Eu sou um adepto do fundo preto, tudo que eu posso mudo a cor do fundo para preto. Nas ultimas versões do AutoCAD tenho notado que não é mais o padrão o fundo preto absoluto, é um cinza escuro. As vezes gosto também de mudar a cor do Layout de branco para preto afinal de contas quando trabalhamos com penas e contraste no model space preto, ver um desenho no layout é impossível.  Você pode mudar sua cor de fundo do AutoCAD para a cor que quiser. Definindo cores personalizadas Primeiro, vá para o menu Opções (botão Aplicativo> Opções), selecione a guia Exibição e clique no botão Cores. Agora você deve ver a caixa de diálogo Cores da janela de desenho: Agora você pode atualizar as cores de qualquer elemento da interface. Isso incluí o plano de fundo em qualquer contexto (selecione Model e Layout). Você pode escolher qualquer uma das predefinições, ou você pode escolher a partir de todo o espectro (basta escolher a opção Selecionar Cor ...). Se você não gost...

Unindo blocos em AutoCAD utilizando .NET

Hoje me deparai com uma necessidade de unir blocos com propriedades então resolvi fazer um comando para realizar esses procedimento. A principio esse procedimento não é tão complexo de ser executado individualmente mas por outro lado gostaria também de analisar um pouco melhor as possibilidades de se manipular blocos utilizando o AutoCAD. Abaixo o código que utilizei: using Autodesk.AutoCAD.ApplicationServices ; using Autodesk.AutoCAD.DatabaseServices ; using Autodesk.AutoCAD.EditorInput ; using Autodesk.AutoCAD.Runtime ; using System.Linq ; // This line is not mandatory, but improves loading performances [assembly: CommandClass(typeof(Merging_AutoCAD_blocks.Comandos))] namespace Merging_AutoCAD_blocks { public class Comandos { /// <summary> /// Uni dois ou mais blocos em um unico bloco. /// </summary> [CommandMethod("MERGBLKS")] public static void UnindoBlocos () {...