Esses dias comecei a trabalhar com projetos usando objetos e blocos para legendas e me veio a necessidade de listar todos as propriedades de um bloco em uma lista no prompt de comando.
Este pequeno código é uma prova de funcionalidade de como é possível listar as propriedades de um Block Reference da tela.
Associado com outras funções que já apresentei nesse blog é possível criar uma ferramenta completa até mesmo listando e referenciando.
Código em C#:
using Autodesk.AutoCAD; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; namespace Exemplos { public class FunccoesParaBlocos { [CommandMethod("LISTA_ATRIBUTOS")] public void LISTA_ATRIBUTOS() { Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; Database db = HostApplicationServices.WorkingDatabase; Transaction tr = db.TransactionManager.StartTransaction(); // Inicia a transferência de ações para o documento ativo try { // Utiliza um filtro para não pressicar fazer um loop e varrer todos os //elementos do desenho TypedValue[] filList = new TypedValue[1] { new TypedValue((int)DxfCode.Start, "INSERT") }; SelectionFilter filter = new SelectionFilter(filList); PromptSelectionOptions opts = new PromptSelectionOptions(); opts.MessageForAdding = "Selecione os blocos da tela: "; PromptSelectionResult res = ed.GetSelection(opts, filter); // Trata seleção vazia if (res.Status != PromptStatus.OK) return; SelectionSet selSet = res.Value; ObjectId[] idArray = selSet.GetObjectIds(); foreach (ObjectId blkId in idArray) { BlockReference blkRef = (BlockReference)tr.GetObject(blkId, OpenMode.ForRead); BlockTableRecord btr = (BlockTableRecord)tr.GetObject( blkRef.BlockTableRecord, OpenMode.ForRead ); ed.WriteMessage("\nBloco: " + btr.Name ); btr.Dispose(); AttributeCollection attCol = blkRef.AttributeCollection; foreach (ObjectId attId in attCol) { AttributeReference attRef = (AttributeReference)tr.GetObject(attId,OpenMode.ForRead); string str = ("\n Atributo " + attRef.Tag + " = " + attRef.TextString); ed.WriteMessage(str); } } tr.Commit(); } catch (Autodesk.AutoCAD.Runtime.Exception ex) { //Tratamento de erros ed.WriteMessage(("Ocorreu um erro bizarro: " + ex.Message)); } finally { //Finaliza a transaction para não ficar no buffer de memória. tr.Dispose(); } } } }
A coisa mais interessante que tem nesse código é a utilização
do filtro para selecionar apenas os blocos. Geralmente nos meus códigos utilizo
métodos de varredura que são muito demorados dessa forma fica realmente rápido.
Espero que esse código seja útil.
Solução em Visual Studio: Download
Espero que esse código seja útil.
Solução em Visual Studio: Download
Comentários
Postar um comentário