Você está aqui: Revit C# ::: Dicas & Truques ::: Tratamento de Erros |
Como corrigir o erro OperationCanceledException em macros e add-ins do Revit C# APIQuantidade de visualizações: 303 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 para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- 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 ::: Selection, Seleção |
Como pedir para o usuário selecionar somente um elemento no Revit usando a função PickObject() do objeto Selection da Revit C# APIQuantidade de visualizações: 440 vezes |
Durante o desenvolvimento de plug-ins e macros para o Revit usando C# e a API do Revit, nós precisamos pedir para o usuário selecionar um elemento e efetuar alguma operação com ele. Para isso nós podemos usar a função PickObject() do objeto Selection. O objeto Selection é obtido a partir de um UIDocument, que, por sua vez, é obtido usando this.ActiveUIDocument. Após a aquisição do objeto Selection, nós chamamos a função PickObject() e retornamos um objeto Reference, para representar o elemento selecionado pelo usuário na área de desenho do Revit. Se o objeto Reference retornado for diferente de null, então sabemos que o usuário selecionou o elemento e podemos proseguir com a execução do código do Plug-in ou macro. Veja o código Revit C# completo para o exemplo: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- 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 elemento"); // 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); // agora testamos se o usuário realmente selecionou um // elemento if (selecionado != null) { TaskDialog.Show("Aviso", "Você selecionou um elemento."); } } 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 } } |
Revit C# ::: Dicas & Truques ::: Eixos - Grids |
Como criar eixos no Revit via programação usando a função Create() da classe Grid da Revit C# APIQuantidade de visualizações: 307 vezes |
Os eixos, ou grids, são linhas que auxiliam na construção de um projeto, ou seja, uma espécie de malha de linhas. Eles são mais utilizados quando se trabalha com elementos estruturais, para a locação de colunas e pilares. No Revit, os eixos podem ser verticais, horizontais, inclinados e até em forma de arcos. Para criá-los, vá na aba Arquitetura, seção Dados e localize o item Eixo (ou digite GR). Via programação nós podemos criar um eixo no Revit usando a função Create() da classe Grid da Revit C# API. Neste exemplo mostrarei, em detalhes, como isso pode ser feito. O primeiro passo é obter uma referência ao documento UI atual usando this.ActiveUIDocument. Após isso acessar o documento usando uidoc.Document. As coordenadas geométricas de início e fim do eixo são criadas como objetos da classe XYZ. Então, de posse das coordenadas, nós criamos um objeto Line usando a função Line.CreateBound(). Para finalizar nós usamos a função Grid.Create() para desenhar o eixo na área de desenho do Revit. Note como passamos o objeto Line e uma referência ao documento atual para esta função. Veja ainda o uso de uma Transaction para abrir uma transação do Revit, criar o elemento e fechá-la em seguida. Este exemplo criará um eixo com o LevelId -1, ou seja, no primeiro nível do documento. Em outras dicas dessa seção eu mostro como definir o nível para o grid recém-criado. Veja o código Revit C# API completo para o exemplo: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- using System; using System.Collections.Generic; using System.IO; using System.Linq; using Autodesk.Revit.DB; using Autodesk.Revit.DB.Architecture; using Autodesk.Revit.DB.Structure; using Autodesk.Revit.UI; using Autodesk.Revit.UI.Selection; 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) { // primeiro obtemos uma referência ao documento atual UIDocument uidoc = this.ActiveUIDocument; Document doc = uidoc.Document; // criamos a linha geométrica para posicionar o eixo // não se esqueça de converter metros para pés XYZ inicio = new XYZ(0, -100, 0); XYZ final = new XYZ(0, 100, 0); // 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"); // e criamos o novo eixo Grid eixo = Grid.Create(doc, linhaGeometrica); t.Commit(); // e mostramos o resultado TaskDialog.Show("Aviso", "O novo eixo foi criado com o ID: " + eixo.Id); } } 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# API teremos o seguinte resultado: O novo eixo foi criado com o ID: 49827 |
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# APIQuantidade de visualizações: 347 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 para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- 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 ::: Revit C# Windows Forms |
Como criar um formulário Windows Forms a partir do Revit C#Quantidade de visualizações: 602 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 para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- 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 ::: Colunas e Pilares |
Como rotacionar colunas e pilares no Revit via programação usando a função RotateElement() da classe ElementTransformUtils da Revit C# APIQuantidade de visualizações: 333 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 para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- 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 } } |
Revit C# ::: Dicas & Truques ::: Pontos e Coordenadas |
Como pedir para o usuário selecionar um ponto na área de desenho do Revit usando a função PickPoint() do objeto Selection da Revit C# APIQuantidade de visualizações: 311 vezes |
Em várias situações nós precisamos que o usuário indique um ponto na área de desenho do Revit, ou seja, as coordenadas x, y e z na qual nosso código Revit C# efetuará alguma ação. Para isso nós podemos usar a função PickPoint() do objeto Selection, que retorna um objeto da classe XYZ. O primeiro passo é acessar o documento ativo UIDocument, por meio de uma chamada a this.ActiveUIDocument. Em seguida nós definimos o tipo de snap usando a enumeração ObjectSnapTypes. Para este exemplo eu usei Endpoints e Intersections, mas você pode usar outros também, tais como Midpoints, Nearest, Intersections, etc. Uma vez obtido o tipo de snap, nós o usamos para a chamada à função PickPoint(). Feito isso nós só precisamos acessar o objeto XYZ retornado e mostrar as suas coordenadas. Veja o código Revit C# completo para o exemplo: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- 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 ponto na área de desenho"); // vamos escolher o tipo de snap ObjectSnapTypes tiposSnap = ObjectSnapTypes.Endpoints | ObjectSnapTypes.Intersections; // agora o usuário seleciona um ponto e nós o guardamos na // variável ponto, do tipo XYZ XYZ ponto = uidoc.Selection.PickPoint(tiposSnap, "Selecione um ponto de extremidade ou intersecção"); // acessamos as coordenadas do ponto string coordenadas = "X = " + ponto.X + "\nY = " + ponto.Y + "\nZ = " + ponto.Z; // e mostramos o resultado TaskDialog.Show("Revit", "As coordenadas do ponto são:\n" + coordenadas); } 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# você terá uma mensagem TaskDialog com um resultado parecido com: As coordenadas do ponto são: X = 4.7533122 Y = 11.429872 Z = 23.3871198 |
Revit C# ::: Dicas & Truques ::: Colunas e Pilares |
Como listar os tipos de colunas e pilares disponíveis no Revit usando a Revit C# APIQuantidade de visualizações: 278 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 para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- 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 ::: Selection, Seleção |
Como pedir para o usuário selecionar vários elementos no Revit usando a função PickObjects() do objeto Selection da Revit C# APIQuantidade de visualizações: 360 vezes |
Nesta dica mostrarei como podemos usar a função PickObjects() do objeto Selection da Revit C# API para pedir ao usuário que selecione vários elementos na área de desenho do Revit e então efetuar alguma operação envolvendo todos eles, de uma só vez. Veja que o objeto Selection é retornado a partir de um UIDocument, que é obtido a partir de uma chamada this.ActiveUIDocument. Então nós chamamos a função PickObjects(), fornecendo o parâmetro ObjectType.Element e guardamos as referências retornadas como um objeto IList. O passo seguinte é acessar a propriedade Count da IList para mostrar a quantidade de objetos selecionados. Note que é preciso clicar o botão Concluir (fica entre o botão Cancelar e a caixa de seleção Múltiplo) para indicar que o usuário concluiu a seleção e nosso código poder prosseguir. Veja o código Revit C# completo para o exemplo: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- 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 e os guardamos em uma lista IList<Reference> selecionados = selecao.PickObjects(ObjectType.Element); // 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 } } Execute a macro, selecione um ou mais elementos, clique o botão Concluir e você verá uma janela TaskDialog com a seguinte mensagem: Você selecionou 5 elementos. |
Vamos testar seus conhecimentos em Fenômeno de Transportes e Hidráulica |
Raio Hidráulico Qual é o raio hidráulico em um canal de seção retangular com 2,00 m de largura por 1,20 m de altura? Considere que este canal está preenchido com 1/3 de água da sua capacidade. ![]() A) 0,10 m B) 0,29 m C) 0,19 m D) 2,29 m E) 0,39 m Verificar Resposta Estudar Cards Todas as Questões |
Vamos testar seus conhecimentos em Fenômeno de Transportes e Hidráulica |
Escoamento laminar Em escoamento laminar, a região de entrada do fluido é definida por um comprimento de entrada. Esse comprimento é compreendido entre quais distâncias? A) Entre a região de entrada e a região de comportamento completamente desenvolvido. B) Entre a região de entrada e a região de comportamento parcialmente desenvolvido. C) Entre a região de entrada e a região de saída do escoamento. D) Entre a região de comportamento completamente desenvolvido e a região de saída do escoamento. E) Entre a região de entrada e a região com defeito de velocidade. Verificar Resposta Estudar Cards Todas as Questões |
Vamos testar seus conhecimentos em |
Domínios de Deformações Para o dimensionamento de elementos de concreto armado sujeitos a solicitações normais, é necessário utilizar as relações de tensão-deformação (σ x ε) dos materiais (concreto e aço), as relações de compatibilidade de deformações e as relações de igualdade entre os esforços atuantes e os esforços resistentes. Analise as informações a seguir a respeito das relações referenciadas: I) As relações tensão-deformação referem-se ao comportamento do concreto simples. II) As relações de compatibilidade de deformações são o resultado da hipótese de que as seções permanecem planas até a ruptura e dos domínios de deformação. III) As relações de igualdade entre os esforços atuantes e os resistentes correspondem às equações de equilíbrio de forças e momentos em uma seção de concreto armado. Assinale e alternativa correta: A) Somente a afirmação I está correta. B) Somente as afirmações II e III estão corretas. C) Somente a afirmação II está correta. D) Somente a afirmação III está correta. E) Somente as afirmações I e II estão corretas. Verificar Resposta Estudar Cards Todas as Questões |
Vamos testar seus conhecimentos em Python |
Qual o resultado da execução do seguinte código Python?for i in range(0, 10, 3): print(i, end=" ") A) 0 3 6 9 B) 0 1 2 3 C) 3 6 9 12 D) 10 20 30 40 E) 0 0 0 0 Verificar Resposta Estudar Cards Todas as Questões |
Vamos testar seus conhecimentos em |
Vigas a flexão simples: seções retangulares O objetivo do dimensionamento de estruturas de concreto é obter segurança e economia. Muitas vezes, o projeto arquitetônico não possibilita vigas muito altas para grandes vãos. Uma solução adotada para esse tipo de situação, quando o concreto da seção da viga mais solicitada pode não resistir ao esforço de compressão, é adotar armadura dupla. Considere que uma viga V (20x30) tem uma solicitação de momento fletor de 65,20kN.m. O concreto utilizado nessa viga tem resistência de 30MPa e a agressividade ambiental do local é classe II (considere que é uma viga pouco solicitada). Das alternativas a seguir, assinale aquela que apresenta a área de aço da armadura comprimida dessa viga. A) 1,48cm2. B) 1,94cm2. C) 5,48cm2. D) 7,83cm2. E) 9,77cm2. Verificar Resposta Estudar Cards Todas as Questões |
Veja mais Dicas e truques de Revit C# |
Dicas e truques de outras linguagens |
Java - Como calcular a velocidade de um corpo dado sua massa e sua energia cinética usando a linguagem Java JavaScript - Como calcular o cateto oposto dadas as medidas da hipotenusa e do cateto adjascente em JavaScript |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
1º lugar: Java |