Sujan
May 6, 2022, 10:11am
1
Hi, I’m auditing a list of families. I am using the “Family Quick Check” tool from pyRevit. It does a pretty good job. The challenge is the data that is generated is painful to manage as there is no save to Excel/CSV option for the families with Errors.
I reviewed the original “FamilyQuickcheck_script.py” file from the pyRevit Master folder but my knowledge is not good enough to implement it in Dynamo yet.
Would be great if anyone could help to implement similar thing from dynamo.
Thanks in Advance.
Daan
May 6, 2022, 11:43am
2
Hi @Sujan ,
Could you share some screenshots/ code from the pyRevit code you described?
Sujan
May 6, 2022, 11:45am
3
Hi,
I have attached the original “.py” file here.
FamilyQuickcheck_script.py (3.2 KB)
Original Author of the code is Fredric Beaupere
Hello
here is an example with IFailuresPreprocessor , to be improved if necessary
import clr
import sys
import System
from System.Collections.Generic import List, IList, Dictionary
clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *
clr.AddReference('RevitAPIUI')
from Autodesk.Revit.UI import *
from Autodesk.Revit.UI.Events import ViewActivatedEventArgs, ViewActivatingEventArgs, DialogBoxShowingEventArgs
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
projDoc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
app = DocumentManager.Instance.CurrentUIApplication.Application
pf_path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFilesX86)
sys.path.append(pf_path + '\\IronPython 2.7\\Lib')
class FailureAdvancedHandler(IFailuresPreprocessor):
# create a dictionnary to store families with warnings
dict_Warning = Dictionary[System.String, List[System.String]]()
def __init__(self, famDoc):
self._famDoc = famDoc
def PreprocessFailures(self, failuresAccessor):
failMessages = failuresAccessor.GetFailureMessages()
if failMessages.Count == 0:
return FailureProcessingResult.Continue
transName = failuresAccessor.GetTransactionName()
try:
self.__class__.dict_Warning.Add(self._famDoc.Title, List[System.String]([m.GetDescriptionText() for m in failMessages]))
# if alert is an warn remove it
if failuresAccessor.GetSeverity() == FailureSeverity.Warning:
for currentMessage in failMessages:
failuresAccessor.DeleteWarning(currentMessage)
return FailureProcessingResult.Continue
# if alert is an error resolve it (by delete elements or by split group etc...)
elif failuresAccessor.GetSeverity() == FailureSeverity.Error:
for currentMessage in failMessages:
failuresAccessor.ResolveFailure(currentMessage)
return FailureProcessingResult.ProceedWithCommit
else:
pass
except Exception as e:
import traceback
errors.append(traceback.format_exc())
return FailureProcessingResult.Continue
toList = lambda x : x if hasattr(x, '__iter__') and not isinstance(x, (str, System.String)) else [x]
lstfamiliesPath = toList(IN[0])
errors = []
dict_warnings = None
dict_corrupted = Dictionary[System.String, System.String]()
for familyPath in lstfamiliesPath:
try:
famDoc = app.OpenDocumentFile(familyPath)
TransactionManager.Instance.ForceCloseTransaction()
t = Transaction(famDoc, 'Test')
t.Start()
failureOptions = t.GetFailureHandlingOptions()
handler = FailureAdvancedHandler(famDoc)
failureOptions.SetFailuresPreprocessor(handler)
t.SetFailureHandlingOptions(failureOptions)
if famDoc.IsFamilyDocument:
famManager = famDoc.FamilyManager
for familyType in famManager.Types:
famManager.CurrentType = familyType
famDoc.Regenerate()
except Exception as e:
import traceback
error = traceback.format_exc()
fileName = System.IO.Path.GetFileNameWithoutExtension(familyPath)
dict_corrupted.Add(fileName, error)
else:
t.Commit()
t.Dispose()
famDoc.Close(False)
famDoc.Dispose()
dict_warnings = FailureAdvancedHandler.dict_Warning
OUT = dict_corrupted, dict_warnings
3 Likes