Pular para o conteúdo principal

Detectando e apagando linhas de comprimento zero em um desenho do AutoCAD usando .NET

Esses dias fiz um pruge em alguns documentos e percebi que existam alguns elementos que ainda sim estava pensando no documento, mas não conseguia ver. Na verdade algum programa automático de topografia criou varias linhas com comprimento 0.

Isso deixaria o arquivo DWG muito pesado resolvi fazer uma função para apagar as linhas e eliminar toda geometria de comprimento zero.

Aqui está o código C#:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;


namespace AutoCADNetBlogExample202002

{
    public static class extensoes
    {
        /// <summary>
        /// Apaga entidades encontradas neste banco de dados baseado na condição.
        /// </summary>
        /// <param name="f">Function indicating whether an enity needs erasing.</param>
        /// <param name="countOnly">Optional parameter to count but not erase.</param>
        /// <returns>O número de entidades encontradas e apagadas</returns>

        public static int apagarobjetos(
          this Database db, Func<Entity, bool> f, bool countOnly = false
        )
        {
            int count = 0;
            using (var tr = db.TransactionManager.StartTransaction())
            {
                var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
                foreach (ObjectId btrId in bt)
                {
                    var btr = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead);
                    foreach (ObjectId entId in btr)
                    {
                        var ent = tr.GetObject(entId, OpenMode.ForRead) as Entity;
                        if (ent != null && f(ent))
                        {
                            if (!countOnly)
                            {
                                ent.UpgradeOpen();
                                ent.Erase();
                                ent.DowngradeOpen();
                            }
                            count++;
                        }
                    }
                }
                tr.Commit();
            }
            return count;
        }
    }

    public class cmmd
    {
        [CommandMethod("APAGAR_LINHAS_L0")]
        public void APAGAR_LINHAS_L0()
        {
            var doc1 = Application.DocumentManager.MdiActiveDocument;
            if (doc1 == null)
                return;
            var db = doc1.Database;
            var ed = doc1.Editor;

            var count = db.ConditionalErase(
              e =>
              {
                  var cur = e as Curve;
                  return
              cur != null &&
              cur.GetDistanceAtParameter(cur.EndParam) <
                Tolerance.Global.EqualPoint;
              }
            );

            ed.WriteMessage("\nForam apagadas {0} entidades!.", count);
        }
    }

}

A maneira mais simples de resolver o problema é executar “_-PURGE _Z” na linha de comando, mas vi isso mais como uma oportunidade para criar um auxiliar simples que percorreria todos as entidades em um desenho e apaga qualquer objeto com uma condição de comprimento zero. Nesse caso, seriam curvas com um comprimento menor que a tolerância global, mas o mesmo mecanismo certamente poderia ser usado para apagar a geometria que atende a outras condições.

O código apenas varre cada um dos elementos da tabela de entidades do desenho e verifica seu conteúdo com uma condição por uma condição de comprimento mínimo. A função ConditionalErase pega um argumento - uma entidade - e retorna um Booleano indicando se merece ser excluído ou não.

Esse código também apaga arcos com comprimento zero e polinhas com comprimento zero.

Comentários

  1. Parece que o nome do método de extensão apagarobjetos virou magicamente ConditionalErase ou será o contrário ConditionalErase virou apagarobjetos?

    ResponderExcluir

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