Pular para o conteúdo principal

Simulações com Suporte Geométrico do AutoCAD

Existem muitas coisas que partem de geometrias para calcular valores. Esses dias eu estive envolvido no calculo de sistemas de aterramento novo para uma condição especial.

O grande problema relacionado com projeto de sistemas de aterramento está nas proximidades das subestações, porque as primeiras torres sofrem injeção grandes correntes de curto-circuito e quando em solos propícios pode até ocorrer potencias elevados que possam ser letais a pessoas que estejam nas proximidades da malha. Nas proximidades dos cabos da alha, por ingratidão exatamente em cima do cabo potencial é bem mais baixo.

Como na empresa já existia um programa para esse tipo de calculo, na verdade é para uma função parecida, o meu papel era primeiramente avaliar que ele realmente poderia ser utilizado (papel que eu assumi porque o restante da equipe tem muita dificuldade com esse tipo de coisa) e depois utilizar o programa.

O programa em si servia para o que eu desejava e poderia ser utilizado com prudência, não vou entrar em méritos mais técnicos porque esse não é o foco aqui.

Minha dificuldade era que todas às vezes eu tinha que definir um arranjo do sistema e converte-lo para o formato de entrada do programa, um cartão de texto como era feito antigamente - o programa foi feito em Fortran77.

Naturalmente o pessoal já tinha recursos para montar parcialmente o arquivo de entrada através de um desenho de AutoCAD, a pessoa desenhava no AutoCAD, dava um list para arquivo de texto e colocava num Excel com macro que fazia o "trabalho sujo". Depois o mesmo processo era feito para desmontar o arquivo de saída e montar gráficos.

Todo esse processo era um transtorno e mais a mais para mim que ainda não tinha o feeling de coma fazer o arranjo da malha ainda se tornava mais trabalhoso.

Pensando nisso eu resolvi entrar no mérito de fazer de alguma coisa que me ajudasse a processar essa informação e gerar os cartões e os gráficos. Pensei varias vezes e a única coisa que poderia ser feita que solucionaria de uma vez por todos seria uma dll integrada que pudesse gerar a partir do AutoCAD o cartão de entrada completo, rodar o programa e interpretar as saídas para um gráfico.

A primeira parte de escrever o cartão era relativamente simples, bastava ler o AutoCAD com a geometria e passar para um formato de um cartão de texto assim como mandava os exemplos do programa.

A segunda parte que era mais complexa como fazer para integrar a dll que eu estava criando um executável, a final eu não queria modificar o mil vezes consagrado programa marciano. Mas pasmem é possível, eu sabia que era já mas não sabia como tive que fazer uma longa pesquisa e um noite de testes até chegar numa solução através do assembly execute:

 _assembly = Assembly.GetExecutingAssembly();  
 _imageStream = _assembly.GetManifestResourceStream("AutoCAD_Malha_Plug_in.MALHA.exe");  
 _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("AutoCAD_Malha_Plug_in.MALHA.exe"));  
 _textStreamReader.Close();  
 Assembly currentAssembly = Assembly.GetExecutingAssembly();  
 string outputPath = Path.Combine(WorkDir.ToString(), "MALHA.exe");  
 using (FileStream fStream = new FileStream(outputPath, FileMode.Create))  
 {  
   fStream.Write(Resources.MALHA, 0, Resources.MALHA.Length);  
 }  


É o chamada Executing Assembly, através dele você pode descompactar um executável e faze-lo utilizável, no meu caso eu crio uma pasta nos locais temporários onde eu crio o arquivo de saída e coloco o programa que está dentro da dll no Resources.

Feito isso era necessário executar o programa, mais um desafio porque trata-se de um executável que exige comandos como informar o arquivo de entrada e o arquivo de saída. Como queria fazer isso tudo de maneira oculta optei por escrever um *.bat responsável pela execução do *.exe e de passar os comando para ele. Isso realmente foi muito louco!

 String batchFileDirectory = Path.Combine(WorkDir.ToString(), "EXECUTE.BAT");  
 StreamWriter batchFile = new StreamWriter(batchFileDirectory);  
 batchFile.WriteLine("@echo off");  
 batchFile.WriteLine("color 0A");  
 batchFile.WriteLine("echo " + "malha" + ".DAD" + " > file.tmp");  
 batchFile.WriteLine("echo " + "malha" + ".SAI" + " >> file.tmp");  
 batchFile.WriteLine("echo N" + " >> file.tmp");  
 batchFile.WriteLine("echo N" + " >> file.tmp");  
 batchFile.WriteLine("MALHA.exe < file.tmp");  
 //batchFile.WriteLine("exit");  
 batchFile.Close();  
 batchFile.Dispose();  
 //System.Windows.Application.DoEvents();  
 //----------------------------------------------//  
 //     Executando o EXECUTE.BAT      //  
 //----------------------------------------------//  
 ProcessStartInfo processInfo;  
 Process process;  
 processInfo = new ProcessStartInfo(@"C:\Windows\system32\cmd.exe", "/c " + batchFileDirectory);  
 processInfo.CreateNoWindow = false;  
 processInfo.UseShellExecute = false;  
 processInfo.WindowStyle = ProcessWindowStyle.Normal;  
 processInfo.UseShellExecute = true;  
 processInfo.WorkingDirectory = WorkDir.ToString();  
 // *** Redirect the output ***  
 // processInfo.RedirectStandardError = true;  
 // processInfo.RedirectStandardOutput = true;  
 process = Process.Start(processInfo);  
 Thread.Sleep(int.Parse(egfrm.txtBoxKillTime.Text));  
 process.WaitForExit();  
 process.Close();  

Essa foi a forma mais confiável de garantir no windows que ele será executado independente da máquina, mesmo assim tive que colocar uma variável auxiliar relacionada ao tempo de execução de tal forma que pudesse encerrar o processo de ele não saísse da execução naturalmente. Isso foi uma limitação ainda estou buscando algo mais eficiente para isso.


Pro fim precisei fazer algo para processar o arquivo de saída, trata-se de ler um arquivo de texto com valores de planilha e desenhar um gráfico, fiz isso com o Chart do Windows Forms ficou bem legal mesmo e consegui ter um desempenho bom mantendo as duas janelas do autoCAD e do programa abertas ao mesmo tempo.

O Resultado:






























Comentários

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