Electrical Settings. AddTemperatureRatingType

Hello everyone I would like to see if someone can guide me what happens is that I want to add a new TemperatureRating Type, based on WireMaterialType, correct me if I am wrong, but I think I followed the steps according to the ApiDocs page for what is related to temperatureRatingType Class, see the image below and the code I use, thank you very much in advance.

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 Autodesk.Revit.DB as DB
from Autodesk.Revit.DB.Electrical import *
from Autodesk.Revit.UI import *

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

#######OK NOW YOU CAN CODE########

# The inputs to this node will be stored as a list in the IN variables.
all_TempRat = FilteredElementCollector(doc).OfClass(TemperatureRatingType).OfCategory(BuiltInCategory.OST_WireTemperatureRatings).FirstElement()

Output = []

Elec = ElectricalSetting.GetElectricalSettings(doc)
WireMaT = next((x for x in Elec.WireMaterialTypes if x.ToDSType(False).Name == IN[0]), None)
TransactionManager.Instance.EnsureInTransaction(doc)
if WireMaT == "NEC 310-b3A":
	try:
		NewTempRat = WireMaterialType.AddTemperatureRatingType(WireMaT, "90", all_TempRat)
		Output.append(NewTempRat.ToDSType(True).Name)
	except:
		Output.append("TemperatureRatingType '{}' already exist".format(WireMaT))
TransactionManager.Instance.TransactionTaskDone()

OUT = Output

AddTempRating90_2021-12-30_09-52-40

this means that your “WireMat” property is not equals to “NEC 310-b3A”. Maybe you could show whats the output for “WireMat” first before continuing. I suspect its gonna be a null value

Hi @stillgotme First of all thank you for checking the code, you were right the WireMat is not equal to “NEC-310-b3A” I change a lil bit the code but now I have this result.

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 Autodesk.Revit.DB as DB
from Autodesk.Revit.DB.Electrical import *
from Autodesk.Revit.UI import *

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

#######OK NOW YOU CAN CODE########

# The inputs to this node will be stored as a list in the IN variables.
all_TempRat = FilteredElementCollector(doc).OfClass(TemperatureRatingType).OfCategory(BuiltInCategory.OST_WireTemperatureRatings).FirstElement()

NW_TRT = IN[0]
Output = []

Elec = ElectricalSetting.GetElectricalSettings(doc)
WireMaT = next((x for x in Elec.WireMaterialTypes if x.ToDSType(False).Name == IN[1]), None)
TransactionManager.Instance.EnsureInTransaction(doc)
try:
	NewTempRat = WireMaterialType.AddTemperatureRatingType(WireMaT, NW_TRT, all_TempRat)
	Output.append(NewTempRat.ToDSType(True).Name)
except:
	Output.append("TemperatureRatingType '{}' already exist".format(WireMaT))
TransactionManager.Instance.TransactionTaskDone()

OUT = WireMaT, Output, all_TempRat

# Import python modules
import clr # Enable loading of .NET libraries
import sys # Enable additional path binding to import other python modules

pyt_path = r'C:\Program Files (x86)\IronPython 2.7\Lib' #For full list of module, please go to the path stated above for reference
sys.path.append(pyt_path)

import os
import shutil
import math
import itertools
import json #Json file
import io
import datetime # DateTime

# Import System library
import System
from System.Collections.Generic import List

# Import Dynamo geometry
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

# Import Dynamo DSCore 
clr.AddReference('DSCoreNodes')
import DSCore #Enable namespace typing
from DSCore import *

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

# Import RevitAPI
clr.AddReference('RevitAPI')
import Autodesk #Enable namespace typing
from Autodesk.Revit.DB import *
from Autodesk.Revit.DB.Electrical import *

# Import Dynamo RevitNodes
clr.AddReference("RevitNodes")
import Revit #Enable namespace typing
from Revit.Elements import *
clr.ImportExtensions(Revit.Elements) # ToDSType(bool) extension method
clr.ImportExtensions(Revit.GeometryConversion)# Import ToProtoType(), ToRevitType() extension methods


#Internal Class (all custom defined classes to be in this region)

#Internal Definition (all custom defined functions to be in this region)
def ToList(input):
    if isinstance(input, (list, tuple)):
        return UnwrapElement(input)  
    else:
        return [UnwrapElement(input)]

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

Elec = doc.Settings.ElectricalSetting 

#Preparing input from dynamo to revit
foundWMT = next((wt for wt in Elec.WireMaterialTypes if IN[1] in wt.ToDSType(False).Name), None)
if not foundWMT:
	raise NameError("No WireMaterialType of name that contains '{0}' found".format(IN[1]))

all_TempRat = list(foundWMT.TemperatureRatings)
foundRefTempRat = next((tr for tr in all_TempRat if tr.ToDSType(False).Name == IN[0]), None)

if not foundRefTempRat:
	raise NameError("No TemperatureRatingType of name '{0}' found".format(IN[0]))
TransactionManager.Instance.EnsureInTransaction(doc)
#Main codes to be within this region

trs = list(foundWMT.TemperatureRatings)

if IN[2] in map(lambda tr: tr.ToDSType(False).Name, trs):
	raise Exception("TemperatureRatingType {0} already exist in {1}'s TemperatureRatings".format(IN[2], foundWMT.ToDSType(False).Name))

#newWMT = Elec.AddWireMaterialType("Testing", foundWMT);
addedTr = None
try:
	addedTr = foundWMT.AddTemperatureRatingType(IN[2], foundRefTempRat)
except Exception as e: addedTr = str(e) 

#End of region
TransactionManager.Instance.TransactionTaskDone()
TransactionManager.Instance.ForceCloseTransaction()

#Final output
OUT = addedTr

Got it to work! Hope you understood the code from above. Basically there are a few issue with your code.

  1. You must use the temperature rating type from the wirematerialtype, which means you cant use filteredelementcollector for that case.

  2. You must object instance instead of objecttype when calling AddTemperatureRatingType method

  3. I added a few checks beforehand to filter out any unwanted errors that could potentially happen

image

2 Likes

Thank you very much @stillgotme i will be more aware for this three considerations for the next time.