Desenhando Linhas, Arcos e Curvas com API do Revit e Python

Tabela de conteúdo

            Introdução
            Desenhando uma linha
            Desenhando um arco
            Curva em onda
            Curva em espiral
            Matriz de curvas
    

Introdução

Depois de aprender a criar pontos, aprenda a criar pontos com API do Revit Python, e definir planos, aprenda a definir planos com API do Revit em Python, próximo conceito a aprender é o de linhas e curvas.

Existem dois métodos para criar curvas na API do Revit dentro do editor de família.      
  1. NewModelCurve(): Usa uma curva geométrica do Revit (linhas, arcos...) e um plano de esboço.
  2. NewCurveByPoints(): Usa uma matriz de pontos para gerar uma linha. 

Modelos de Curva

Para usar o método NewModelCurve você precisa primeiro definir a geometria da curva e um plano de esboço(sketch plane). Ambos precisam estar definidos dentro do código antes de chamar o método NewModelCurve(). Se caiu de paraquedas aqui, aprenda o que é necessário para começar a criar plugins no revit

Desenhando uma linha

Um linha é definida usando XYZ do seu inicio e final e ai se cria o elemento curva, que no caso é uma linha reta, com o método NewModelCurve()

#-*- coding: utf-8 -*-
import clr
import math
clr.AddReference('RevitAPI')
clr.AddReference('RevitAPIUI')
from Autodesk.Revit.DB import *
doc = __revit__.ActiveUIDocument.Document
app = __revit__.Application
t = Transaction(doc, 'Criar linha')
t.Start()
#cria um plano com origem em (0,0,0) e normal (0,0,1)
origin = XYZ.Zero
normal = XYZ.BasisZ
plane = Plane.CreateByNormalAndOrigin(normal, origin)
#Cria o plano de esboço
skplane = SketchPlane.Create(doc,plane)
#Define as extremidades da linha
LINHA_INICIO = XYZ(0,0,0)
LINHA_FINAL = XYZ(20,20,0)
#Cria o vinculo entre o inicio e o final da linha com CreateBound()
LINHA = Line.CreateBound(LINHA_INICIO, LINHA_FINAL)
#Cria o elemento curva com o método NewModelCurve()
crv = doc.FamilyCreate.NewModelCurve(line, skplane)
t.Commit()
__window__.Close()
view raw linha.py hosted with ❤ by GitHub



Desenhando um arco

Um arco é criado usando a mesma técnica que uma linha. Porém, neste caso, vamos chamar o método Arc.Create() e é necessário passar os parâmetros de plano, raio, ângulo de entrada e ângulo final.

#-*- coding: utf-8 -*-
import clr
import math
clr.AddReference('RevitAPI')
clr.AddReference('RevitAPIUI')
from Autodesk.Revit.DB import *
doc = __revit__.ActiveUIDocument.Document
app = __revit__.Application
t = Transaction(doc, 'Create Line')
t.Start()
#Cria um plano com normal e origem
origin = XYZ.Zero
normal = XYZ.BasisZ
plane = Plane.CreateByNormalAndOrigin(normal, origin)
#Cria o plano de esboço
skplane = SketchPlane.Create(doc,plane)
#Define os parametros do arco
startAngle = 0
endAngle = 0.5* math.pi
radius = 100
#cria com Arc.Create()
arc = Arc.Create(plane, radius, startAngle, endAngle)
#Cria o elemento curva com NewModelCurve()
arc_crv = doc.FamilyCreate.NewModelCurve(arc, skplane)
t.Commit()
__window__.Close()
view raw arco.py hosted with ❤ by GitHub

Curva usando pontos

Curva em onda

Podemos criar matrizes complexas com pontos de referências com um loop for e conectar todos os pontos usando o método NewCurveByPoints()

#-*- coding: utf-8 -*-
import clr
import math
clr.AddReference('RevitAPI')
clr.AddReference('RevitAPIUI')
from Autodesk.Revit.DB import *
doc = __revit__.ActiveUIDocument.Document
app = __revit__.Application
t = Transaction(doc, 'Criar uma Curva por Pontos')
t.Start()
refptarr = ReferencePointArray()
#usa um loop for para criar uma série de pontos de referência
for i in range(0,20):
x = i*2
y = i*2
#a coordenada z é controlada por uma função seno
z = math.sin(i)*2
myXYZ = XYZ(x,y,z)
refPt = doc.FamilyCreate.NewReferencePoint(myXYZ)
#vamos colocar cada ponto dentro da matriz de pontos
refptarr.Append(refPt)
# Cria o elemento curva a partir dos pontos da matriz de pontos refptarr
crv = doc.FamilyCreate.NewCurveByPoints(refptarr)
t.Commit()
__window__.Close()


Curva em espiral

Podemos criar uma espiral fazendo com que os valores de x sejam controlados por seno, os valores y sejam controlados por cosseno e os valores de z incrementados em i. As coordenadas ficam (seno, cosseno, i).


#-*- coding: utf-8 -*-
import clr
import math
clr.AddReference('RevitAPI')
clr.AddReference('RevitAPIUI')
from Autodesk.Revit.DB import *
doc = __revit__.ActiveUIDocument.Document
app = __revit__.Application
t = Transaction(doc, 'Criar espiral')
t.Start()
refptarr = ReferencePointArray()
#usa o loop for para criar uma serie de pontos
for i in range(0,20):
x = math.sin(i)*5
y = math.cos(i)*5
z = i
myXYZ = XYZ(x,y,z)
refPt = doc.FamilyCreate.NewReferencePoint(myXYZ)
refptarr.Append(refPt)
crv = doc.FamilyCreate.NewCurveByPoints(refptarr)
t.Commit()
__window__.Close()
view raw espiral.py hosted with ❤ by GitHub


Matriz de curvas 

Podemos criar uma matriz de curvas em ondas usando um loop for embutido.

#-*- coding: utf-8 -*-
import clr
import math
clr.AddReference('RevitAPI')
clr.AddReference('RevitAPIUI')
from Autodesk.Revit.DB import *
doc = __revit__.ActiveUIDocument.Document
app = __revit__.Application
t = Transaction(doc, 'Cria uma matriz de curvas')
t.Start()
for i in range(0,20):
#embutindo pontos de referencia e matriz de pontos de referencia (são coisas diferentes)
refptarr = ReferencePointArray()
for j in range(0,20):
x = i * 10
y = j * 10
z = (10*math.cos(i)) + (10*math.sin(j))
myXYZ = XYZ(x,y,z)
refPoint = doc.FamilyCreate.NewReferencePoint(myXYZ)
refptarr.Append(refPoint)
crv = doc.FamilyCreate.NewCurveByPoints(refptarr)
t.Commit()
__window__.Close()

Comentários