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: 717 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:
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
}
}
|
C ::: Dicas & Truques ::: Strings e Caracteres |
Como escrever uma função is_numeric() em C que verifica se uma string contém apenas dígitos de 0 a 9Quantidade de visualizações: 10699 vezes |
Em algumas situações precisamos verificar se uma string contém apenas dígitos de 0 a 9, ou seja, é um valor numérico inteiro válido. Para isso podemos usar a função personalizada em C que mostro nesta dica. Veja que o segredo é passar todos os caracteres individualmente para a função isdigit(). Veja o código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
// função personalizada que permite verificar se uma
// string contém apenas dígitos de 0 a 9
int is_numeric(const char *str){
int res = 1; // passou no teste
// vamos percorrer todos os caracteres da string
// e testar se cada um é um dígito. Se não
// for nós marcamos res como 0 e retornamos
while(*str){
if(!isdigit(*str)){
res = 0;
break;
}
// vamos passar para o próximo caractere
str++;
}
return res;
}
int main(int argc, char *argv[]){
char valor[20]; // vamos guardar o valor digitado aqui
// vamos ler o valor informado pelo usuário
printf("Digite qualquer coisa e tecle ENTER: ");
gets(valor);
// vamos verificar se o usuário informou uma string
// que contém apenas dígitos de 0 a 9
if(is_numeric(valor))
printf("Voce informou uma string numerica");
else
printf("Voce NAO informou uma string numerica");
puts("\n\n");
system("PAUSE");
return 0;
}
E, antes que perguntem como é possível verificar se a string contém um valor fracionário válido, a seguinte alteração pode ser feita:
int is_numeric(const char *str){
int res = 1; // passou no teste
// vamos percorrer todos os caracteres da string
// e testar se cada um é um dígito ou uma vírgula. Se não
// for nós marcamos res como 0 e retornamos
while(*str){
if((!isdigit(*str)) and (*str != ',')){
res = 0;
break;
}
// vamos passar para o próximo caractere
str++;
}
return res;
}
|
Firebird ::: Dicas & Truques ::: Tipos de Dados |
Como usar os tipos de dados DATE, TIME e TIMESTAMP do FirebirdQuantidade de visualizações: 31093 vezes |
|
No dialeto 3 (SQL DIALECT 3), o tipo de dados DATE do Firebird armazena apenas a data sozinha, ou seja, sem as horas. Esta forma de guardar apenas a data resulta em uma ocupação de 4 bytes (32 bits) na memória. A data armazenada pode variar de 01/01/0001 até 31/12/9999. No dialeto 1, (SQL DIALECT 1), o tipo DATE é o equivalente ao tipo TIMESTAMP do dialeto 3 (o tipo TIMESTAMP passou a existir somente a partir do dialeto 3). Veja um comando DDL CREATE TABLE que cria uma tabela do Firebird contendo um campo do tipo DATE: CREATE TABLE ALUNOS ( ID INTEGER NOT NULL, NOME VARCHAR(40) NOT NULL, NASCIMENTO DATE NOT NULL ); Aqui o campo ID é do tipo INTEGER, NOME é do tipo VARCHAR(40) e NASCIMENTO é do tipo DATE. Veja agora um comando DML INSERT INTO que insere um novo registro nesta tabela. Fique atento à forma como o valor da data é informado: INSERT INTO ALUNOS VALUES(1, 'OSMAR J. SILVA', '1981-11-28'); Veja que a data, assim como o valor para o campo NOME, foi informada entre aspas simples e seguindo o formato YYYY-MM-DD, ou seja, o ano, mês e dia separados por hifens. Para obter os dados inseridos pela query anterior, podemos usar o seguinte comando DML SELECT FROM: SELECT * FROM ALUNOS; Esta query resulta na exibição dos seguintes dados: ID NOME NASCIMENTO 1 OSMAR J. SILVA 28/11/1981 O tipo de dados TIME, disponível apenas a partir do dialeto 3 (SQL DIALECT 3) nos permite armazenar as horas, sem a data. Este tipo ocupa 4 bytes (32 bits) de memória e pode conter valores na faixa de 00:00 até 23:59:59.9999. Veja um comando DDL CREATE TABLE que cria uma tabela do Firebird contendo um campo do tipo TIME: CREATE TABLE COMPROMISSOS ( ID INTEGER NOT NULL, DESCRICAO VARCHAR(80) NOT NULL, DATA DATE NOT NULL, HORA TIME NOT NULL ); Veja que esta tabela possui 4 campos: ID do tipo INTEGER, DESCRICAO do tipo VARCHAR(80), DATA do tipo DATE e HORA do tipo TIME. Eis um comando DML INSERT INTO que mostra como inserir um registro nesta tabela: INSERT INTO COMPROMISSOS VALUES(10, 'ALMOÇO COM A ESPOSA', '2010-12-10', '19:00:00'); Note que, assim como fazemos com campos do tipo DATE, os valores para campos do tipo TIME também devem ser informados entre aspas simples. Veja um comando DML SELECT FROM que lista o registro inserido na query anterior: SELECT * FROM COMPROMISSOS; Esta query produz o seguinte resultado: ID DESCRICAO DATA HORA 10 ALMOÇO COM A ESPOSA 10/12/2010 19:00:00 O tipo TIMESTAMP, disponível apenas a partir do dialeto 3 (SQL DIALECT 3) nos permite armazenar a data e hora juntas. Este tipo ocupa 8 bytes (64 bits) de memória e é equivalente ao tipo DATE do dialeto 1. Veja um comando DDL CREATE TABLE que cria uma tabela do Firebird contendo um campo do tipo TIMESTAMP: CREATE TABLE COMPROMISSOS ( ID INTEGER NOT NULL, DESCRICAO VARCHAR(80) NOT NULL, DATA_HORA TIMESTAMP NOT NULL ); Veja que esta tabela possui três campos: ID é do tipo INTEGER, DESCRICAO é do tipo VARCHAR(80) e DATA_HORA é do tipo TIMESTAMP. Eis um comando DML INSERT INTO que mostra como inserir um registro nesta tabela: INSERT INTO COMPROMISSOS VALUES(20, 'ALMOÇO COM A ESPOSA', '2010-10-23 19:00:00'); Note que os valores para campos do tipo TIMESTAMP também devem ser informados entre aspas simples. Para finalizar, Veja um comando DML SELECT FROM que lista o registro inserido na query anterior: SELECT * FROM COMPROMISSOS; Esta query produz o seguinte resultado: ID DESCRICAO DATA_HORA 20 ALMOÇO COM A ESPOSA 23/10/2010 19:00:00 |
C ::: Desafios e Lista de Exercícios Resolvidos ::: Laços de Repetição |
Exercício Resolvido de C - Escreva um programa C que usa o laço for para desenhar um padrão de diamante de estrelasQuantidade de visualizações: 2759 vezes |
|
Pergunta/Tarefa: Neste exercício para a prática da linguagem C você deverá usar o laço for para desenhar o famoso padrão de diamante de estrelas. Você pode também usar o laço while, se assim você o desejar. O programa deverá pedir que o usuário informe a quantidade de linhas que marcará a metade do diamante. Seu programa deve apresentar a seguinte saída:
Informe a quantidade de linhas: 5
*
***
*****
*******
*********
*******
*****
***
*
Pressione qualquer tecla para continuar...
Veja a resolução comentada deste exercício em C:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
int i, j; // para controlar o laço externo e interno
int linhas; // quantidade de linhas
int estrelas, espacos; // quantidade de estrelas e espaços
// vamos pedir a quantidade de linhas
printf("Informe a quantidade de linhas: ");
// vamos ler a entrada do usuário
scanf("%d", &linhas);
estrelas = 1; // começamos com uma estrela (no topo do diamante)
espacos = linhas - 1; // se linhas for igual a 5 nós começamos
// com 4 espaços
// repete duas vezes a quantidade de linhas informadas
for(i = 1; i < linhas * 2; i++){
// vamos imprimir os espaços
for(j = 1; j <= espacos; j++){
printf(" ");
}
// agora vamos imprimir estrelas
for(j = 1; j < estrelas * 2; j++){
printf("*");
}
// passamos para a próxima linha
printf("\n");
if(i < linhas){ // é a parte superior do diamante
espacos--; // diminui os espaços
estrelas++; // e aumenta as estrelas
}
else{ // é a parte inferior do diamente
espacos++; // aumenta os espaços
estrelas--; // e diminui as estrelas
}
}
printf("\n\n");
system("pause");
return 0;
}
|
Nossas 20 dicas & truques de programação mais populares |
|
C# - Como retornar a quantidade de elementos que podem ser armazenados na List do C# sem redimensioná-la Delphi - Como obter a quantidade de dias para um determinado ano usando a função DaysInAYear() do Delphi |
Você também poderá gostar das dicas e truques de programação abaixo |
|
VB.NET - Como retornar a versão do .NET a partir de seus códigos VB.NET usando Environment.Version.ToString() |
Nossas 20 dicas & truques de programação mais recentes |
Últimos Projetos e Códigos Fonte Liberados Para Apoiadores do Site |
|
Python - Como criar o jogo Pedra, Papel, Tesoura em Python - Jogo completo em Python com código comentado |
Últimos Exercícios Resolvidos |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
|
1º lugar: Java |






