What’s the correct syntax for getting a BuiltInParameter by it’s integer value using CPython3?
in IronPython2 the following code produces the expected result
OUT = (BuiltInParameter)(-1012805)
when i use this code in CPython3 i get an error that reads
Cannot instantiate enumeration
i’ve tried getting the element using doc.GetElement()
for the BiP ElementId, but it returns null, which i think is expected behavior.
the specific context for this is trying to retrieve data from a ColorFillScheme. The Genius Loci node does not appear to yield the expected values for ColorFillSchemes that use BuiltInParameter data so i’m modifying the function as follows:
#Alban de Chasteigner 2021
#twitter : @geniusloci_bim
#geniusloci.bim@gmail.com
#https://github.com/albandechasteigner/GeniusLociForDynamo
import clr, sys
clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
doc = DocumentManager.Instance.CurrentDBDocument
clr.AddReference('RevitNodes')
import Revit
clr.AddReference('DSCoreNodes')
import DSCore
from DSCore import Color
def GetSchemeData (element):
values,colors,visible,used,patterns=[],[],[],[],[]
if isinstance(element, Autodesk.Revit.DB.ColorFillScheme):
scheme = element
elif isinstance(element, basestring):
scheme = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_ColorFillSchema).ToElements().Find(lambda x : x.Name == element)
entries = scheme.GetEntries()
name = scheme.Name
title = scheme.Title
linked = scheme.IsLinkedFilesIncluded
range = scheme.IsByRange
catId = scheme.CategoryId
category = Revit.Elements.Category.ById(catId.IntegerValue)
fec = FilteredElementCollector(doc).OfCategoryId(catId).ToElements()
try:
#BuiltinParameter by Id
check_parameter = scheme.ParameterDefinition
if check_parameter.IntegerValue < 0:
BIP = (BuiltInParameter)(check_parameter.IntegerValue)
paramName = LabelUtils.GetLabelFor(BIP)
else:
paramElem = doc.GetElement(check_parameter)
if hasattr(paramElem, "GuidValue"):
BIP = paramElem.GuidValue
paramName = paramElem.Name
else:
BIP = paramElem.GetDefinition()
paramName = paramElem.Name
except Exception as e:
errors.append((e, check_parameter, type(check_parameter),sys.exc_info()[-1].tb_lineno))
#parameter = fec[0].get_Parameter(BIP)
"""
for entry in entries:
if entry.StorageType == StorageType.ElementId:
if entry.GetElementIdValue().IntegerValue > 0:
value = doc.GetElement(entry.GetElementIdValue()).Name
else:
value = "(none)"
elif entry.StorageType == StorageType.Double:
#entries for ranges are defined by the lower value
#the lowest value has a lower bound of -infinity
try:
value = round(UnitUtils.ConvertFromInternalUnits(entry.GetDoubleValue(),parameter.GetUnitTypeId()),3)
except:
value = "lower"
elif entry.StorageType == StorageType.String:
value = entry.GetStringValue()
elif entry.StorageType == StorageType.Integer:
try:
value = UnitUtils.ConvertFromInternalUnits(entry.GetIntegerValue(),parameter.GetUnitTypeId())
except:
value = "lower"
values.append(value)
colors.append(DSCore.Color.ByARGB(255, entry.Color.Red, entry.Color.Green, entry.Color.Blue))
patterns.append(doc.GetElement(entry.FillPatternId))
visible.append(entry.IsVisible)
used.append(entry.IsInUse)
"""
return [values,entries]
color_fill_scheme = UnwrapElement(IN[0])
trace = []
errors = []
OUT = (GetSchemeData(color_fill_scheme), errors)