REDO10
April 6, 2023, 4:20pm
1
Hi everybody
In order to learn how to use Revit API I thought to create a simple line, the line is created inside dynamo but not displayed in Revit Interface…why and what I should do to display it??
Here my code:
import sys
import clr
clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
uidoc = DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument
TransactionManager.Instance.EnsureInTransaction(doc)
PT1 = XYZ(0,0,0)
PT2 = XYZ(15,0,0)
Line = Line.CreateBound(PT1, PT2)
TransactionManager.Instance.TransactionTaskDone()
OUT = Line
Thanks.
A line in Revit is just a geometry type, not an element. The elements you see in a model are either a ModelCurve
or a DetailCurve
. You have to create a curve element from a line/curve.
Online Documentation for Autodesk's Revit API: 2015, 2016, 2017, 2017.1, 2018
Online Documentation for Autodesk's Revit API: 2015, 2016, 2017, 2017.1, 2018
1 Like
REDO10
April 6, 2023, 6:18pm
3
@Nick_Boyts
I created my line using NewModelCurve Methode, but my line length is measured in feet and I want it to be in meter so how to convert it?
Here my code:
import sys
import clr
clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
clr.AddReference('RevitNodes')
doc = DocumentManager.Instance.CurrentDBDocument
uidoc = DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument
origin = XYZ(0,0,0)
norm = XYZ(1,0,0)
plane = Plane.CreateByNormalAndOrigin(norm, origin)
TransactionManager.Instance.EnsureInTransaction(doc)
sketch = SketchPlane.Create(doc, plane)
PT1 = XYZ(0,0,0)
PT2 = XYZ(0,20,0)
curve = Line.CreateBound(PT1, PT2)
Line = doc.Create.NewModelCurve(curve, sketch)
TransactionManager.Instance.TransactionTaskDone()
OUT = Line
Thanks.
It should use your project units. You can change these or include a conversion in your code.
REDO10
April 6, 2023, 6:57pm
5
@Nick_Boyts
No it didn’t take my project units which is in meters…so hwo to add conversion in my code?
Thanks
Hello, here is a possible addition
import sys
import clr
clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
clr.AddReference('RevitNodes')
doc = DocumentManager.Instance.CurrentDBDocument
uidoc = DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument
#to convert point
def feet_to_m(a,b,c):
k=0.3048
return XYZ(a/k,b/k,c/k)
origin = XYZ(0,0,0)
norm = XYZ(1,0,0)
plane = Plane.CreateByNormalAndOrigin(norm, origin)
TransactionManager.Instance.EnsureInTransaction(doc)
sketch = SketchPlane.Create(doc, plane)
PT1 = feet_to_m(0,0,0)
PT2 = feet_to_m(0,40,0)
curve = Line.CreateBound(PT1, PT2)
Line = doc.Create.NewModelCurve(curve, sketch)
TransactionManager.Instance.TransactionTaskDone()
OUT = Line
Cordially
christian.stan
2 Likes
I just mean mathematically convert the units. This post has a well thought-out solution to match project units.
So this method does not work for Revit 2022 because the Unit Methods have changed.
I changed the code an it seems to work heres a comparison of the code lines:
#Revit 2022
unitType = SpecTypeId.Length
currentDisplayUnits = doc.GetUnits().GetFormatOptions(unitType).GetUnitTypeId()
return UnitUtils.Convert(float(num), UnitTypeId.Millimeters, currentDisplayUnits)
#Revit 2021
unitType = UnitType.UT_Length
currentDisplayUnits = doc.GetUnits().GetFormatOptions(unitType).DisplayUnits
…