Good morning, I have been trying to learn how to dimension elements, using for my case a electrical Conduit Fitting to Conduit Fitting, using its Geometry Origin and Direction for the NewDimension creation, and the StableRepresentation of its Center point as the references. I have spent the last week scouring what is already online for examples in C#, and GeniusLocis nodes, and finally have a grasp on what I am doing somewhat having tested many different ways to achieve this unsuccessfully prior . I can get this to work in multiple variations of code changing up the line and references, where If the dimensions are horizontal or vertical I am able to move the dimension away from the element, but when I make it at an angle, then attempt to move it, it reverts to the horizontal distance instead of the hypotenuse from center of bend to center of bend I need… See images below, first one has the move commented out, second, move is uncommented.
Any suggestions on what I can do to make the references more stable at an angle?
import clr
import sys
sys.path.append('C:\Program Files (x86)\IronPython 2.7\Lib')
import System
from System import Array
from System.Collections.Generic import *
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
clr.AddReference("RevitAPI")
clr.AddReference("RevitAPIUI")
import Autodesk
from Autodesk.Revit.DB import *
import traceback
doc = DocumentManager.Instance.CurrentDBDocument
activeView = doc.ActiveView
result = []
#Options for Geometry Selection
opt1 = Options()
opt1.ComputeReferences = True
opt1.IncludeNonVisibleObjects = True
opt1.View = activeView
#Create Ref Array
refArray = ReferenceArray()
#Conduit Offset
conFit = doc.GetElement(ElementId(1036830))
conFit1 = doc.GetElement(ElementId(1036834))
conGeom = conFit.get_Geometry(opt1)
for c in conGeom:
if "Line" in c.ToString():
eP0 = c.Origin
eP1 = c.Direction
#Does Center to Center for Conduit Fittings
conRef = Reference.ParseFromStableRepresentation(doc, conFit.UniqueId + ":0:INSTANCE:" + conFit.Symbol.UniqueId + ":1:SURFACE")
#Does Center to Center for Conduit Fittings
conRef1 = Reference.ParseFromStableRepresentation(doc, conFit1.UniqueId + ":0:INSTANCE:" + conFit1.Symbol.UniqueId + ":1:SURFACE")
refArray.Append(conRef)
refArray.Append(conRef1)
TransactionManager.Instance.EnsureInTransaction(doc)
if None not in refArray and refArray != 1:
try:
line = Line.CreateUnbound(eP0, eP1)
newDimension = doc.Create.NewDimension(activeView, line, refArray)
result.Add("Dimension Created")
except:
message = traceback.format_exc()
result.Add([message, "Create Dimension Failed"])
TransactionManager.Instance.EnsureInTransaction(doc)
distanceFromObject = 5#can be changed to input later
location = XYZ(0,distanceFromObject,0)
ElementTransformUtils.MoveElement(doc,newDimension.Id,location)
TransactionManager.Instance.TransactionTaskDone()
try:
OUT = result
except:
OUT = result
I can keep stability on any Conduit/Fitting, just not from a Conduit Fitting to a Conduit Fitting:
the dimensions without the move function are closest to the elements, the second run with the move command back in is the further our section.
Another iteration, that has some much different results, and has some looping in it it shouldn’t. Using the guts from from GeniusLoci and MEPOver Nodes along with my adjustments.
import clr
clr.AddReference("RevitAPIUI")
from Autodesk.Revit.UI import *
clr.AddReference("RevitAPI")
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
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)
from System.Collections.Generic import List
import collections
import traceback
doc = DocumentManager.Instance.CurrentDBDocument
uidoc = DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument
result = []
activeView = doc.ActiveView
#conduitFEC = FilteredElementCollector(doc, activeView.Id).OfCategory(BuiltInCategory.OST_Conduit).WhereElementIsNotElementType().ToElements()
#conduitFittingFEC = FilteredElementCollector(doc, activeView.Id).OfCategory(BuiltInCategory.OST_ConduitFitting).WhereElementIsNotElementType().ToElements()
def nextElements(elem):
listout = []
if elem.GetType() == Connector:
conn = elem
for c in conn.AllRefs:
if c.Owner.Id.Equals(elem.Owner.Id):
continue
elif isinstance(c.Owner,MEPSystem):
continue
else:
newelem = c.Owner
listout.append(newelem)
return listout
try:
connectors = elem.ConnectorManager.Connectors
except:
connectors = elem.MEPModel.ConnectorManager.Connectors
for conn in connectors:
for c in conn.AllRefs:
if c.Owner.Id.Equals(elem.Id):
continue
elif isinstance(c.Owner,MEPSystem):
continue
elif c.Owner.Id.Equals(ownerId):
continue
else:
newelem = c.Owner
listout.append(newelem)
return listout
def collector(elem):
cont = 0
elements = nextElements(elem)
for x in elements:
if x.Id in lookup:
cont += 1
else:
item = doc.GetElement(x.Id)
lookup[x.Id] = item
collector(x)
if cont == len(elements):
return elem
sel = uidoc.Selection
ot = Selection.ObjectType.Element
elemParamRef = sel.PickObjects(ot, "Select Elements to Start Dimension From")
elements = [doc.GetElement(ePR) for ePR in elemParamRef]
#For each selected element:
runId = []
t = []
for e in elements:
refArray = ReferenceArray()
#listout = []
try:
#Conduits
connectors = e.ConnectorManager.Connectors
for conn in connectors:
for c in conn.AllRefs:
lookup = collections.OrderedDict()
ownerId = c.Owner.Id
collector(c)
#listout.append(lookup.Values)
except:
try:
#Conduit Fittings
connectors = e.MEPModel.ConnectorManager.Connectors
for conn in connectors:
for c in conn.AllRefs:
lookup = collections.OrderedDict()
ownerId = c.Owner.Id
collector(c)
#listout.append(lookup.Values)
except:
result.Add("Something Failed")
combined = [e]
combined.extend(lookup.Values)
i=0
while i < len(combined):
refArray.Clear()
for lV in lookup.Values:
opt1 = Options()
opt1.ComputeReferences = True
opt1.IncludeNonVisibleObjects = True
opt1.View = activeView
try:
conGeom = lV.get_Geometry(opt1)
for cG in conGeom:
if "Line" in cG.ToString():
eP0 = cG.GetEndPoint(0)
eP1 = cG.GetEndPoint(1)
conRef = Reference.ParseFromStableRepresentation(doc, lV.UniqueId + ":0:INSTANCE:" + lV.UniqueId + ":2:LINEAR")
conRef1 = Reference.ParseFromStableRepresentation(doc, lV.UniqueId + ":0:INSTANCE:" + lV.UniqueId + ":1:LINEAR")
refArray.Append(conRef)
refArray.Append(conRef1)
if None not in refArray and refArray != 1:
try:
line = Line.CreateBound(eP0, eP1)
TransactionManager.Instance.EnsureInTransaction(doc)
newDimension = doc.Create.NewDimension(activeView, line, refArray)
TransactionManager.Instance.TransactionTaskDone()
result.Add("Dimension Created")
except:
message = traceback.format_exc()
result.Add([message, "Create Dimension Failed"])
TransactionManager.Instance.EnsureInTransaction(doc)
distanceToObject = 6#can be changed to input later
location = XYZ(0,distanceToObject,0)
ElementTransformUtils.MoveElement(doc,newDimension.Id,location)
TransactionManager.Instance.TransactionTaskDone()
i += 1
except:
conGeom = lV.get_Geometry(opt1)
for cG in conGeom:
if "Line" in cG.ToString():
eP0 = cG.Origin
eP1 = cG.Direction
conRef = Reference.ParseFromStableRepresentation(doc, lV.UniqueId + ":0:INSTANCE:" + lV.Symbol.UniqueId + ":0:LINEAR")
conRef1 = Reference.ParseFromStableRepresentation(doc, lV.UniqueId + ":0:INSTANCE:" + lV.Symbol.UniqueId + ":1:LINEAR")
#conRef2 = Reference.ParseFromStableRepresentation(doc, lV.UniqueId + ":0:INSTANCE:" + lV.Symbol.UniqueId + ":2:LINEAR")
refArray.Append(conRef)
refArray.Append(conRef1)
#refArray.Append(conRef2)
if None not in refArray and refArray != 1:
try:
line = Line.CreateUnbound(eP0, eP1)
TransactionManager.Instance.EnsureInTransaction(doc)
newDimension = doc.Create.NewDimension(activeView, line, refArray)
TransactionManager.Instance.TransactionTaskDone()
result.Add("Dimension Created")
except:
message = traceback.format_exc()
result.Add([message, "Create Dimension Failed"])
TransactionManager.Instance.EnsureInTransaction(doc)
distanceToObject = 6#can be changed to input later
location = XYZ(0,distanceToObject,0)
ElementTransformUtils.MoveElement(doc,newDimension.Id,location)
TransactionManager.Instance.TransactionTaskDone()
refArray.Clear()
conGeom = lV.get_Geometry(opt1)
for cG in conGeom:
if "Line" in cG.ToString():
eP0 = cG.Origin
eP1 = cG.Direction
conRef = Reference.ParseFromStableRepresentation(doc, lV.UniqueId + ":0:INSTANCE:" + lV.Symbol.UniqueId + ":0:LINEAR")
conRef2 = Reference.ParseFromStableRepresentation(doc, lV.UniqueId + ":0:INSTANCE:" + lV.Symbol.UniqueId + ":2:LINEAR")
refArray.Append(conRef)
refArray.Append(conRef2)
if None not in refArray and refArray != 1:
try:
line = Line.CreateUnbound(eP0, eP1)
TransactionManager.Instance.EnsureInTransaction(doc)
newDimension = doc.Create.NewDimension(activeView, line, refArray)
TransactionManager.Instance.TransactionTaskDone()
result.Add("Dimension Created")
except:
message = traceback.format_exc()
result.Add([message, "Create Dimension Failed"])
TransactionManager.Instance.EnsureInTransaction(doc)
distanceToObject = 6#can be changed to input later
location = XYZ(0,distanceToObject,0)
ElementTransformUtils.MoveElement(doc,newDimension.Id,location)
TransactionManager.Instance.TransactionTaskDone()
refArray.Clear()
i += 1
try:
OUT = result, lV
except:
OUT = result
1 Like