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
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.
-
You must use the temperature rating type from the wirematerialtype, which means you cant use filteredelementcollector for that case.
-
You must object instance instead of objecttype when calling AddTemperatureRatingType method
-
I added a few checks beforehand to filter out any unwanted errors that could potentially happen
2 Likes
Thank you very much @stillgotme i will be more aware for this three considerations for the next time.