Skip to content

Colored Surface Display Style to Show Honeybee Results in revit #36

Description

@SamDehghani

Hi there,
To show HB results in Revit as colored surfaces I made some minor/major changes to "Colored Surface Display Style" node of Archi_Lab.

#Copyright(c) 2015, Konrad K Sobon

@arch_laboratory, http://archi-lab.net

import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

Import DocumentManager and TransactionManager

clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

from System.Collections.Generic import *

Import RevitAPI

clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *
from Autodesk.Revit.DB.Analysis import *

doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
app = uiapp.Application

Import ToDSType(bool) extension method

clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)

#The inputs to this node will be stored as a list in the IN variable.
dataEnteringNode = IN

values = IN[0]
faces = UnwrapElement(IN[1])
UVPoints = IN[2]

colorSettings = IN[3]
legendSettings = IN[4]
styleSettings = IN[5]

displayStyleName = IN[6]
analysisResultName = IN[7]
analysisResultDescription = IN[8]
unitNames = IN[9]
unitMultipliers = IN[10]
displayUnit = IN[11]

message = None

facesRefs = []
for face in faces:
try:
ref = face.Tags.LookupTag("RevitFaceReference")
face = doc.GetElement(ref).GetGeometryObjectFromReference(ref)
facesRefs.append(ref)
except:
facesRefs.append(list())

#"Start" the transaction
TransactionManager.Instance.EnsureInTransaction(doc)

#create spatial field manager if one doesn't already exist
sfm = SpatialFieldManager.GetSpatialFieldManager(doc.ActiveView)
if sfm == None:
sfm = SpatialFieldManager.CreateSpatialFieldManager(doc.ActiveView, 1)
sfm.Clear()

#get result schema index if existing else crete one
regResults = sfm.GetRegisteredResults()
if len(regResults) != 0:
for i in regResults:
if sfm.GetResultSchema(i).Name == analysisResultName:
resultSchema = sfm.GetResultSchema(i)
else:
resultSchema = AnalysisResultSchema(analysisResultName, analysisResultDescription)

names = Liststr
multipliers = Listfloat
for i,j in zip(unitMultipliers, unitNames):
multipliers.Add(i)
names.Add(j)
resultSchema.SetUnits(names, multipliers)

for i in range(0, resultSchema.GetNumberOfUnits(), 1):
if resultSchema.GetUnitsName(i) == displayUnit:
resultSchema.CurrentUnits = i
message = "Success! Remember that your current \ndisplay units are set to " + displayUnit
else:
continue
if resultSchema.GetUnitsName(resultSchema.CurrentUnits) != displayUnit:
message = "Display Units supplied not available. \nEither add those units to results or \nspecify one of the already supplied."

schemaIndex = sfm.RegisterResult(resultSchema)

#unwrap surfaces

for faceRef, value, UVPoint in zip(facesRefs, values, UVPoints):
idx = sfm.AddSpatialFieldPrimitive(faceRef)
valList = ListValueAtPoint
fieldPointsUV = ListAutodesk.Revit.DB.UV
valList.Add(ValueAtPoint([value]))
fieldPointsUV.Add(UVPoint)
vals = FieldValues(valList)
pnts = FieldDomainPointsByUV(fieldPointsUV)
sfm.UpdateSpatialFieldPrimitive(idx, pnts, vals, schemaIndex)
valList.Clear()
fieldPointsUV.Clear()

#create display style for colored surfaces and apply to current view
collector = FilteredElementCollector(doc)
collection = collector.OfClass(AnalysisDisplayStyle).ToElements()
displayStyle = []
for i in collection:
if i.Name == displayStyleName and i.HasColoredSurfaceSettings():
displayStyle.append(i)
elif i.Name == displayStyleName and not i.HasColoredSurfaceSettings():
message = "Specified Display Style name already \nexists; please supply different name"
else:
continue
if len(displayStyle) == 0:
try:
analysisDisplayStyle = AnalysisDisplayStyle.CreateAnalysisDisplayStyle(doc, displayStyleName, styleSettings, colorSettings, legendSettings)
except:
pass
else:
analysisDisplayStyle = displayStyle[0]
analysisDisplayStyle.SetLegendSettings(legendSettings)
analysisDisplayStyle.SetColorSettings(colorSettings)
analysisDisplayStyle.SetColoredSurfaceSettings(styleSettings)

try:
doc.ActiveView.AnalysisDisplayStyleId = analysisDisplayStyle.Id
except:
pass

"End" the transaction

TransactionManager.Instance.TransactionTaskDone()

#Assign your output to the OUT variable
if message != None:
OUT = message

else:
OUT = 0
I appreciate if you take a look at it and let me know if anything needs to be changed.

Sam

screen capture

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions