E-Book 650 Dicas e Truques de Python - PDF com 1.200 páginas
Você está aqui: Revit C# ::: Dicas & Truques ::: Grupos - Groups

Como copiar grupos no Revit usando a função Create.PlaceGroup() da classe Document da Revit C# API

Quantidade de visualizações: 129 vezes
O código que apresento nesta dica mostra como podemos pedir para o usuário selecionar um grupo na área de desenho do Revit e, em seguida, usando a Revit C# API, criar uma cópia do grupo escolhido e posicioná-la em um ponto escolhido pelo usuário.

Em realidade, este código é o mesmo apresentado no tutorial "Como criar seu primeiro plug-in no Revit usando a Revit C# API" da documentação oficial fornecida pela Autodesk. O que fiz foi modificar o código para usar uma macro em vez de um plug-in, como mostrado no tutorial.

Vou até dar uma dica aqui para os iniciantes na Revit C# API. É muito mais fácil você desenvolver os seus códigos usando macros e depois convertê-los para um plug-in do que ir direto para o plug-in. As macros permitem um ciclo de desenvolvimento mais rápido, enquanto os plug-in são mais demorados para testar.

O primeiro passo é criar uma variável para acessarmos o documento atual do Revit via this.ActiveUIDocument.Document. Em seguida nós criamos uma referência Reference para guardar o elemento selecionado pelo usuário.

O passo seguinte é adquirir um objeto Selection usando this.ActiveUIDocument.Selection. De posse do objeto Selecion nós usamos sua função PickObject() para pedir para o usuário selecionar o grupo de elementos desejados. Veja que não forneci nenhum tipo de tratamento de erros aqui. Se o usuário selecionar um elemento que não seja do tipo grupo, com certeza um erro vai ocorrer no código.

Após o usuário selecionar o grupo nós fazemos uma chamada à função GetElement() da classe Document para retornar o Element selecionado. Note o cast de Element para Group.

Feita a seleção do grupo nós pedimos para o usuário escolher um ponto na área de desenho do Revit. Isso é feito por meio da função PickPoint() da classe Document, que nos retorna um objeto XYZ. O restante do código cria uma nova transação e usa a função Create.PlaceGroup() para copiar o grupo selecionado anteriormente pelo usuário para o ponto recém-selecionado.

Veja o código Revit C# API completo para o exemplo:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

using System;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.UI.Selection;
using System.Collections.Generic;
using System.Linq;
 
namespace Estudos {
  [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.
    TransactionMode.Manual)]
  [Autodesk.Revit.DB.Macros.AddInId("ED8EC6C4-9489-48F7-B04E-B45B5D1BEB12")]
  public partial class ThisApplication {
    private void Module_Startup(object sender, EventArgs e) {
      // vamos obter uma referência ao Document ativo
      Document doc = this.ActiveUIDocument.Document;
      
      // Vamos definir um objeto Reference para guardar
      // o elemento selecionado pelo usuário
      Reference ref_selecionado = null;
  
      // pedimos para o usuário selecionar um grupo
      Selection selecao = this.ActiveUIDocument.Selection;
      ref_selecionado = selecao.PickObject(ObjectType.Element, 
        "Selecione um grupo");
      Element elem = doc.GetElement(ref_selecionado);
      Group group = elem as Group;
      
      // vamos pedir para o usuário selecionar um ponto na área de
      // desenho do Revit
      XYZ ponto = selecao.PickPoint(
        "Selecione um ponto para posicionar o grupo");
      
      // criamos uma nova transação e posicionamos a cópia do
      // grupo nas coordenadas indicadas pelo usuário
      Transaction transacao = new Transaction(doc);
      transacao.Start("Copiar Grupo no Revit");
      doc.Create.PlaceGroup(ponto, group.GroupType);
      transacao.Commit();
      
      // mostramos o resultado
      TaskDialog.Show("Aviso", "O grupo foi copiado com sucesso.");
    }
    
    private void Module_Shutdown(object sender, EventArgs e) {
      // para fazer alguma limpeza de memória ou algo assim
    }
 
    #region Revit Macros generated code
    private void InternalStartup() {
      this.Startup += new System.EventHandler(Module_Startup);
      this.Shutdown += new System.EventHandler(Module_Shutdown);
    }
    #endregion
  }
}


Link para compartilhar na Internet ou com seus amigos:

Revit C# ::: Dicas & Truques ::: Revit C# Windows Forms

Como criar um formulário Windows Forms a partir do Revit C#

Quantidade de visualizações: 356 vezes
Nesta dica mostrarei os passos necessários para se criar uma aplicação Revit C# contendo uma formulário Windows Forms. O objetivo é demonstrar como o usuário pode interagir com os elementos do formulário para acessar e manipular objetos do Revit a partir de códigos C#.

Antes de continuarmos, veja a janela Windows Forms que criamos logo abaixo:



Veja que temos um formulário contendo 6 Labels e 6 TextBox contendo as coordenadas inicias e finais de uma linha geométrica usada para criar um novo eixo na área de desenho do Revit. Ao informar as coordenadas e clicar o botão Desenhar Eixo, um novo objeto da classe Grid da Revit API é criado e desenhado no documento atual.

Este código é muito útil para iniciantes em programação Revit C# porque mostra como acessar o documento ativo usando ActiveUIDocument e em seguida passar este objeto para uma outra classe C#. De posse deste objeto nós podemos realizar várias tarefas, entre elas criar uma nova linha geométrica usando Line.CreateBound() e, em seguida, criar um novo Grid usando Grid.Create().

Veja o código completo para uma macro chamada Estudos do tipo Aplicativo. Se tiver dificuldades para executar, chama a gente nos contatos na parte superior do site que teremos prazer em ajudá-lo.

Eis a listagem do código C#:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

using System;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI.Selection;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace Estudos {
  [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.
    TransactionMode.Manual)]
  [Autodesk.Revit.DB.Macros.AddInId("ED8EC6C4-9489-48F7-B04E-B45B5D1BEB12")]
  public partial class ThisApplication {
    private void Module_Startup(object sender, EventArgs e) {
      JanelaPrincipal janela = new JanelaPrincipal();
      janela.uidoc = this.ActiveUIDocument;
      janela.ShowDialog();
    }

    private void Module_Shutdown(object sender, EventArgs e) {
      // para fazer alguma limpeza de memória ou algo assim
    }

    #region Revit Macros generated code
    private void InternalStartup() {
    this.Startup += new System.EventHandler(Module_Startup);
    this.Shutdown += new System.EventHandler(Module_Shutdown);
    }
    #endregion
  }
  
  // classe para representar o formulário
  public class JanelaPrincipal : System.Windows.Forms.Form {
    public UIDocument uidoc;
    public System.Windows.Forms.TextBox txtX0;
    public System.Windows.Forms.TextBox txtY0;    
    public System.Windows.Forms.TextBox txtZ0;
    public System.Windows.Forms.TextBox txtX1;
    public System.Windows.Forms.TextBox txtY1;    
    public System.Windows.Forms.TextBox txtZ1;
    
    // construtor da classe
    public JanelaPrincipal() {
      this.Text = "Meu Formulário Revit C# Windows Forms"; // título da janela 
      this.Width = 390; // largura da janela
      this.Height = 240; // altura da janela
      // define a posição atual da janela
      this.StartPosition = FormStartPosition.CenterScreen;
      
      // vamos criar quatro labels e quatro caixas de texto
      Label label1 = new Label();
      label1.Text = "X Inicial:";
      label1.Location = new System.Drawing.Point(20, 20);
      label1.Height = 15;
      label1.Width = 80;

      Label label2 = new Label();
      label2.Text = "Y Inicial:";
      label2.Location = new System.Drawing.Point(120, 20);
      label2.Height = 15;
      label2.Width = 80;
      
      Label label3 = new Label();
      label3.Text = "Z Inicial:";
      label3.Location = new System.Drawing.Point(220, 20);
      label3.Height = 15;
      label3.Width = 80;
      
      txtX0 = new System.Windows.Forms.TextBox();   
      txtX0.Location = new System.Drawing.Point(20, 40);
      txtX0.Width = 80;
      txtX0.Height = 15;
      
      txtY0 = new System.Windows.Forms.TextBox();   
      txtY0.Location = new System.Drawing.Point(120, 40);
      txtY0.Width = 80;
      txtY0.Height = 15;
      
      txtZ0 = new System.Windows.Forms.TextBox();   
      txtZ0.Location = new System.Drawing.Point(220, 40);
      txtZ0.Width = 80;
      txtZ0.Height = 15;
      
      Label label4 = new Label();
      label4.Text = "X Final:";
      label4.Location = new System.Drawing.Point(20, 80);
      label4.Height = 15;
      label4.Width = 80;

      Label label5 = new Label();
      label5.Text = "Y Final:";
      label5.Location = new System.Drawing.Point(120, 80);
      label5.Height = 15;
      label5.Width = 80;
      
      Label label6 = new Label();
      label6.Text = "Z Final:";
      label6.Location = new System.Drawing.Point(220, 80);
      label6.Height = 15;
      label6.Width = 80;
      
      txtX1 = new System.Windows.Forms.TextBox();   
      txtX1.Location = new System.Drawing.Point(20, 97);
      txtX1.Width = 80;
      txtX1.Height = 15;
      
      txtY1 = new System.Windows.Forms.TextBox();   
      txtY1.Location = new System.Drawing.Point(120, 97);
      txtY1.Width = 80;
      txtY1.Height = 15;
      
      txtZ1 = new System.Windows.Forms.TextBox();   
      txtZ1.Location = new System.Drawing.Point(220, 97);
      txtZ1.Width = 80;
      txtZ1.Height = 15;
      
      // botão que desenha o eixo nas coordenadas indicadas      
      Button button1 = new Button();
      button1.Text = "Desenhar Eixo";
      button1.Location = new System.Drawing.Point(95, 160);
      button1.Width = 150;
      button1.Click += new System.EventHandler(DesenharEixo);
                
      // botão que fecha a janela      
      Button button2 = new Button();
      button2.Text = "Fechar";
      button2.Location = new System.Drawing.Point(265, 160);
      button2.Width = 80;
      button2.Click += new System.EventHandler(FecharJanela);
      
      // adiciona os controles à janela
      this.Controls.Add(label1);
      this.Controls.Add(label2);
      this.Controls.Add(label3);
      this.Controls.Add(label4);
      this.Controls.Add(label5);
      this.Controls.Add(label6);
      this.Controls.Add(txtX0);
      this.Controls.Add(txtY0);
      this.Controls.Add(txtZ0);
      this.Controls.Add(txtX1);
      this.Controls.Add(txtY1);
      this.Controls.Add(txtZ1);
      this.Controls.Add(button1);
      this.Controls.Add(button2);
    }
    
    // função usada para desenhar um novo eixo no documento atual
    private void DesenharEixo(object sender, System.EventArgs e) {
      // primeiro obtemos uma referência ao documento atual
      Document doc = uidoc.Document;
			
      // criamos a linha geométrica para posicionar o eixo 	
      XYZ inicio = new XYZ(Double.Parse(txtX0.Text), Double.Parse(txtY0.Text),
        Double.Parse(txtZ0.Text));
      XYZ final = new XYZ(Double.Parse(txtX1.Text), Double.Parse(txtY1.Text),
        Double.Parse(txtZ1.Text));
     
      // construímos a linha
      Line linhaGeometrica = Line.CreateBound(inicio, final);

      // iniciamos uma nova transação
      using(Transaction t= new Transaction(doc)) {
	t.Start("Criar um novo Grid");
	Grid grid = Grid.Create(doc, linhaGeometrica);
	t.Commit();
      }
    }
    
    // função usada para fechar a janela
    private void FecharJanela(object sender, System.EventArgs e) {
      this.Close();  
    }
  }
}

Não se esqueça de adicionar referências a System.Windows.Forms e System.Drawing. Basta, dentro do SharpDevelop, ir no menu Projeto -> Adicionar Referência.


Revit C# ::: Dicas & Truques ::: Selection, Seleção

Como pedir para o usuário selecionar um ou mais elementos no Revit usando a função PickElementsByRectangle() do objeto Selection da Revit C# API

Quantidade de visualizações: 205 vezes
A Seleção por Retângulo (ou Retângulo de Seleção) do Revit funciona da seguinte forma:

a) Desenhe uma caixa de seleção ao colocar o cursor em um dos lados do elemento a ser selecionado e arraste-o na diagonal para formar um limite retangular.

b) Para selecionar somente os elementos que estejam completamente dentro do limite da caixa de seleção, arraste o cursor da esquerda para a direita.

c) Para selecionar quaisquer elementos que estejam completamente ou parcialmente dentro do limite da caixa de seleção, arraste o cursor da direita para a esquerda.

Via código C# usando a API do Revit, nós podemos pedir para o usuário selecionar elementos usando o retângulo de seleção por meio da função PickElementsByRectangle() do objeto Selection e retornar os elementos selecionados em uma IList.

O primeiro passo é obter uma referência ao documento atual UIDocument a partir de uma chamada a this.ActiveUIDocument. Em seguida nós obtemos o objeto Selection a partir do UIDocument e chamamos a sua função PickElementsByRectangle(). Finalmente, de posse da lista IList de elementos selecionados nós só precisamos acessar sua propriedade Count para verificar a quantidade de elementos que o usuário selecionou.

Veja o código Revit C# completo para o exemplo:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

using System;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI.Selection;
using System.Collections.Generic;
using System.Linq;

namespace Estudos {
  [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.
    TransactionMode.Manual)]
  [Autodesk.Revit.DB.Macros.AddInId("ED8EC6C4-9489-48F7-B04E-B45B5D1BEB12")]
  public partial class ThisApplication {
    private void Module_Startup(object sender, EventArgs e) {
      // vamos obter uma referência ao UIDocument ativo
      UIDocument uidoc = this.ActiveUIDocument;
      
      // agora mostramos uma mensagem para o usuário selecionar um
      // elemento
      TaskDialog.Show("Aviso", "Selecione um ou mais elementos");
      
      // obtemos uma referência ao objeto Selection do
      // UIDocument ativo
      Selection selecao = uidoc.Selection;
    
      // e finalmente esperamos que o usuário selecione um ou
      // mais elementos usando a seleção de retângulo e os
      // guardamos em uma lista
      IList<Element> selecionados = selecao.PickElementsByRectangle(
        "Selecione os elementos");
      
      // agora mostramos a quantidade de elementos selecionados
      TaskDialog.Show("Aviso", "Você selecionou " + selecionados.Count +
        " elementos.");
    }

    private void Module_Shutdown(object sender, EventArgs e) {
      // para fazer alguma limpeza de memória ou algo assim
    }

    #region Revit Macros generated code
    private void InternalStartup() {
      this.Startup += new System.EventHandler(Module_Startup);
      this.Shutdown += new System.EventHandler(Module_Shutdown);
    }
    #endregion
  }
}

Ao executar esta macro você verá uma mensagem TaskDialog com o seguinte aviso:

Você selecionou 4 elementos.


Revit C# ::: Dicas & Truques ::: Tratamento de Erros

Como corrigir o erro OperationCanceledException em macros e add-ins do Revit C# API

Quantidade de visualizações: 163 vezes
Nesta dica mostrarei como podemos tratar a exceção OperationCanceledException em macros e plug-ins feitos para o Revit usando a Revit C# API. Esta exceção está no namespace Autodesk.Revit.Exceptions e deve ser declarada por seu nome completo, para não ser confundida com System.OperationCanceledException.

O erro OperationCanceledException ocorre quando uma operação é cancelada de forma inesperada. Por exemplo, no código abaixo nós pedimos para o usuário selecionar um grupo e, em seguida, informar um ponto na área de desenho do Revit para que o grupo seja copiado e colocado no ponto indicado.

Se o usuário clicar com o botão direito ou pressionar Esc, a operação é cancelada automaticamente. O tratamento da exceção OperationCanceledException nos permite reagir a isso, indicando ao usuário o melhor caminho a ser seguido.

O código apresentado aqui já foi visto em dicas e truques sobre a criação e manipulação de grupos de elementos no Revit usando a Revit C# API. No entanto, no código apresentado eu não fiz o tratamento de exceções.

Veja o código Revit C# API completo para o exemplo:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

using System;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.UI.Selection;
using System.Collections.Generic;
using System.Linq;
 
namespace Estudos {
  [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.
    TransactionMode.Manual)]
  [Autodesk.Revit.DB.Macros.AddInId("ED8EC6C4-9489-48F7-B04E-B45B5D1BEB12")]
  public partial class ThisApplication {
    private void Module_Startup(object sender, EventArgs e) {
      // vamos obter uma referência ao Document ativo
      Document doc = this.ActiveUIDocument.Document;
      
      // Vamos definir um objeto Reference para guardar
      // o elemento selecionado pelo usuário
      Reference ref_selecionado = null;
  
      // pedimos para o usuário selecionar um grupo
      Selection selecao = this.ActiveUIDocument.Selection;
      
      try {
        ref_selecionado = selecao.PickObject(ObjectType.Element,
          "Selecione um grupo");
        Element elem = doc.GetElement(ref_selecionado);
        Group group = elem as Group;
      
        // vamos pedir para o usuário selecionar um ponto na área de
        // desenho do Revit
        XYZ ponto = selecao.PickPoint(
          "Selecione um ponto para posicionar o grupo");
      
        // criamos uma nova transação e posicionamos a cópia do
        // grupo nas coordenadas indicadas pelo usuário
        Transaction transacao = new Transaction(doc);
        transacao.Start("Copiar Grupo no Revit");
        doc.Create.PlaceGroup(ponto, group.GroupType);
        transacao.Commit();
      
        // mostramos o resultado
        TaskDialog.Show("Aviso", "O grupo foi copiado com sucesso.");
      }
      // Se o usuário clicar com o botão direito ou pressionar Esc
      catch (Autodesk.Revit.Exceptions.OperationCanceledException ex) {
        TaskDialog.Show("Aviso", "Erro: Operação cancelada pelo usuário");
      }
      catch (Exception ex) {
        TaskDialog.Show("Aviso", "Erro: " + ex.Message);
      }
    }
    
    private void Module_Shutdown(object sender, EventArgs e) {
      // para fazer alguma limpeza de memória ou algo assim
    }
 
    #region Revit Macros generated code
    private void InternalStartup() {
      this.Startup += new System.EventHandler(Module_Startup);
      this.Shutdown += new System.EventHandler(Module_Shutdown);
    }
    #endregion
  }
}

Se o usuário cancelar a operação, ou seja, não selecionar nenhum grupo (talvez pressionando a tecla Esc), o código reagirá e mostrará a mensagem:

Erro: The user aborted the pick operation.

Se, em vez de selecionar um grupo, o usuário selecionar um outro elemento, então a mensagem de erro será:

Erro: Referência de objeto não definida para uma instância de um objeto.


Revit C# ::: Dicas & Truques ::: Colunas e Pilares

Como listar os tipos de colunas e pilares disponíveis no Revit usando a Revit C# API

Quantidade de visualizações: 169 vezes
Nesta dica mostrarei como podemos obter e retorna uma lista com as colunas e pilares disponíveis na sua instalação do Revit. Esse passo é muito importante quando precisamos informar o id do símbolo de família, ou seja, o tipo de coluna ou pilar que queremos criar, em um determinado momento, via programação Revit C# API.

O primeiro passo é acessar o documento atual do Revit usando uma chamada à this.ActiveUIDocument.Document. Em seguida nós obtemos um objeto FilteredElementCollector para filtrar e retornar os símbolos de família que se enquadrem na categoria OST_StructuralColumns. Para finalizar, nós convertemos os elementos Element em FamilySymbol.

Veja o código completo para o exemplo:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

using System;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.UI.Selection;
using System.Collections.Generic;
using Autodesk.Revit.DB.Architecture;
using System.Linq;
 
namespace Estudos {
  [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.
    TransactionMode.Manual)]
  [Autodesk.Revit.DB.Macros.AddInId("ED8EC6C4-9489-48F7-B04E-B45B5D1BEB12")]
  public partial class ThisApplication {
    private void Module_Startup(object sender, EventArgs e) {
      // vamos obter uma referência ao Document ativo
      Document doc = this.ActiveUIDocument.Document;
       
      // vamos obter um FilteredElementCollector contendo apenas
      // elementos que sejam ElementType e pertençam à categoria
      // OST_StructuralColumns
      try {
      FilteredElementCollector elementos = new FilteredElementCollector(doc)
        .WhereElementIsElementType().OfCategory(BuiltInCategory.OST_StructuralColumns);
  
      String lista = "";
      // vamos percorrer os elementos retornados
      foreach(Element elemento in elementos) {
        // vamos converter o Element em FamilySymbol
        FamilySymbol coluna = elemento as FamilySymbol;
        // agora montamos a lista de colunas (ou pilares)
        lista = lista + "Id: " + elemento.Id.IntegerValue + "; Nome: "
            + elemento.Name + "; Tipo: " + elemento.Category.Name +
            "; Família: " + coluna.Family.Name + "\n";
      }
   
      // mostramos o resultado
      TaskDialog.Show("Aviso", lista);
      }
      catch (Exception ex) {
        TaskDialog.Show("Aviso", "Erro: " + ex.Message);
      }
    }
      
    private void Module_Shutdown(object sender, EventArgs e) {
      // para fazer alguma limpeza de memória ou algo assim
    }
 
    #region Revit Macros generated code
    private void InternalStartup() {
      this.Startup += new System.EventHandler(Module_Startup);
      this.Shutdown += new System.EventHandler(Module_Shutdown);
    }
    #endregion
  }
}

Ao executar este código Revit C# nós teremos o seguinte resultado:

Id: 12190; Nome: UC305x305x97; Tipo: Pilares estruturais; Família: UC-Universal Columns-Column
Id: 355634; Nome: 80 x 50; Tipo: Pilares estruturais; Família: Pila de Concreto - Retangular
Id: 355636; Nome: 50 x 50; Tipo: Pilares estruturais; Família: Pila de Concreto - Retangular


Revit C# ::: Dicas & Truques ::: Colunas e Pilares

Como rotacionar colunas e pilares no Revit via programação usando a função RotateElement() da classe ElementTransformUtils da Revit C# API

Quantidade de visualizações: 190 vezes
Nesta dica mostrarei como podemos usar a função RotateElement() da classe ElementTransformUtils da Revit C# API para rotacionar uma coluna ou pilar no Revit, tudo isso via programação.

Essa dica é muito útil para programadores Revit C#, pois traz as técnicas necessárias para selecionar um único elemento na área de desenho do Revit, assim como obter sua caixa delimitadora (BoundingBox), seu ponto geométrico central e, o mais importante, fazer a rotação do elemento em seus eixos.

O primeiro passo é pedir para o usuário selecionar o pilar ou a coluna usando a função PickObject() da classe Selection, que retorna uma Reference. Após a seleção do elemento nós usamos a função GetElement() da classe Document para retornar o elemento como uma variável FamilyInstance, ou seja, uma instância de família do Revit.

De posse da instância de família nós usamos a função get_BoundingBox() para obter e retornar um objeto da classe BoundingBoxXYZ. É esse objeto que usamos para obter o ponto máximo, o ponto mínimo e o ponto geométrico central da coluna ou pilar.

O passo final é usar a função RotateElement() da classe ElementTransformUtils para rotacionar a coluna ou pilar de acordo com o ângulo de rotação desejado. Note que fiz a conversão de ângulos em graus para ângulos em radianos antes de efetuar a rotação.

Veja o código Revit C# API completo para o exemplo:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

using System;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.UI.Selection;
using System.Collections.Generic;
using Autodesk.Revit.DB.Architecture;
using System.Linq;
 
namespace Estudos {
  [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.
    TransactionMode.Manual)]
  [Autodesk.Revit.DB.Macros.AddInId("ED8EC6C4-9489-48F7-B04E-B45B5D1BEB12")]
  public partial class ThisApplication {
    private void Module_Startup(object sender, EventArgs e) {
      // vamos obter uma referência ao Document ativo
      Document doc = this.ActiveUIDocument.Document;
      UIDocument uidoc = this.ActiveUIDocument; 
      
      // agora mostramos uma mensagem para o usuário selecionar uma
      // coluna ou pilar
      TaskDialog.Show("Aviso", "Selecione uma coluna ou pilar");
        
      // obtemos uma referência ao objeto Selection do
      // UIDocument ativo
      Selection selecao = uidoc.Selection;
      
      // e finalmente esperamos que o usuário selecione o elemento
      Reference selecionado = selecao.PickObject(ObjectType.Element,
        "Selecione uma coluna ou pilar");
      
      // agora testamos se o usuário realmente selecionou um
      // elemento
      if (selecionado != null) {
        // vamos obter o elemento selecionado a partir da
        // referência
        FamilyInstance coluna = uidoc.Document.GetElement(selecionado) 
          as FamilyInstance;
        // vamos obter o elemento BoundingBoxXYZ
        BoundingBoxXYZ bounding = coluna.get_BoundingBox(null);
         
        // vamos obter as informações da BoundingBoxXYZ
        // primeiro o ponto mínimo (canto esquerdo inferior e
        // a parte de trás da caixa delimitadora)
        XYZ pontoMinimo = bounding.Min;
        // agora o ponto máximo (canto direito superior e
        // a parte da frente da caixa delimitadora)
        XYZ pontoMaximo = bounding.Max;
        
        // agora obtemos o ponto central da coluna         
        XYZ centro = (pontoMaximo + pontoMinimo) * 0.5;
        // construímos a linha que servirá de eixo de rotação
        Line eixos = Line.CreateBound(centro, centro + XYZ.BasisZ);
        // definimos o ângulo de rotação em graus        
        double angulo_rotacao_graus = 45;
        // convertemos para radianos
        double angulo_rotacao_radianos = angulo_rotacao_graus * (Math.PI / 180);        
        
        // iniciamos a transação
        Transaction transacao = new Transaction(doc);
        transacao.Start("Como rotacionar colunas e pilares no Revit");
        
        // rotacionamos a coluna ou pilar
        ElementTransformUtils.RotateElement(doc, coluna.Id, eixos,
          angulo_rotacao_radianos);
        
        // fazemos o commit da transação
        transacao.Commit();      
     
        // e mostramos o resultado
        TaskDialog.Show("Aviso", "A coluna foi rotacionada com sucesso.");
      }
    }
      
    private void Module_Shutdown(object sender, EventArgs e) {
      // para fazer alguma limpeza de memória ou algo assim
    }
 
    #region Revit Macros generated code
    private void InternalStartup() {
      this.Startup += new System.EventHandler(Module_Startup);
      this.Shutdown += new System.EventHandler(Module_Shutdown);
    }
    #endregion
  }
}



Veja mais Dicas e truques de Revit C#

Dicas e truques de outras linguagens

Quem Somos

Osmar J. Silva
Programador Freelancer
WhatsApp +55 (062) 98553-6711

Goiânia-GO
Programador Freelancer - Full Stack Developer, Professional Java Developer, PHP, C/C++, Python Programmer, wxWidgets Professional C++ Programmer, Freelance Programmer. Formado em Ciência da Computação pela UNIP (Universidade Paulista Campus Goiânia) e cursando Engenharia Civil pela PUC-Goiás. Possuo conhecimentos avançados de Java, Python, JavaScript, C, C++, PHP, C#, VB.NET, Delphi, Android, Perl, e várias tecnologias que envolvem o desenvolvimento web, desktop, front-end e back-end. Atuo há mais de 20 anos como programador freelancer, atendendo clientes no Brasil, Portugal, Argentina e vários outros paises.
Entre em contato comigo para, juntos, vermos em que posso contribuir para resolver ou agilizar o desenvolvimento de seus códigos.
José de Angelis
Programador Freelancer
WhatsApp +55 (062) 98243-1195

Goiânia-GO
Programador Freelancer - Formado em Sistemas de Informação pela Faculdade Delta, Pós graduado em Engenharia de Software (PUC MINAS), Pós graduado Marketing Digital (IGTI) com ênfase em Growth Hacking. Mais de 15 anos de experiência em programação Web. Marketing Digital focado em desempenho, desenvolvimento de estratégia competitiva, analise de concorrência, SEO, webvitals, e Adwords, Métricas de retorno. Especialista Google Certificado desde 2011 Possui domínio nas linguagens PHP, C#, JavaScript, MySQL e frameworks Laravel, jQuery, flutter. Atualmente aluno de mestrado em Ciência da Computação (UFG)
Não basta ter um site. É necessário ter um site que é localizado e converte usuários em clientes. Se sua página não faz isso, Fale comigo e vamos fazer uma analise e conseguir resultados mais satisfatórios..

Linguagens Mais Populares

1º lugar: Java
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: Delphi
6º lugar: C
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby

Códigos Fonte

Programa de Gestão Financeira Controle de Contas a Pagar e a Receber com Cadastro de Clientes e FornecedoresSoftware de Gestão Financeira com código fonte em PHP, MySQL, Bootstrap, jQuery - Inclui cadastro de clientes, fornecedores e ticket de atendimento
Diga adeus às planilhas do Excel e tenha 100% de controle sobre suas contas a pagar e a receber, gestão de receitas e despesas, cadastro de clientes e fornecedores com fotos e histórico de atendimentos. Código fonte completo e funcional, com instruções para instalação e configuração do banco de dados MySQL. Fácil de modificar e adicionar novas funcionalidades. Clique aqui e saiba mais
Controle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidadesControle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidades
Tenha o seu próprio sistema de controle de estoque web. com cadastro de produtos, categorias, fornecedores, entradas e saídas de produtos, com relatórios por data, margem de lucro e muito mais. Código simples e fácil de modificar. Acompanha instruções para instalação e criação do banco de dados MySQL. Clique aqui e saiba mais


© 2024 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 69 usuários muito felizes estudando em nosso site.