BuiltInParameter from Integer

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)

Methods to get BuiltInParameter info

import clr

from System import Enum

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

bip_no = Enum.Parse(BuiltInParameter, "PHASE_CREATED")

bip = Enum.GetName(BuiltInParameter, bip_no)

ptypeid = ParameterUtils.GetParameterTypeId(bip_no)

bip_ftid = ParameterUtils.GetBuiltInParameter(ptypeid)

bip_label = LabelUtils.GetLabelFor(bip_no)

bip_label_ftid = LabelUtils.GetLabelForBuiltInParameter(ptypeid)

OUT = bip_no, bip, ptypeid, ptypeid.TypeId, bip_ftid, bip_label, bip_label_ftid

image

2 Likes

Going to save this into a node for future reference. Thanks for sharing @Mike.Buttery!

2 Likes