9 juin 2020

[Dynamo+=Python] Parser vos rapports d'avertissement (HTML)




Retrouver les éléments d'un rapport d'avertissement avec l'assembly mshtml

Exemple avec un cas d'usage.
Si vous travaillez avec des maquettes liées et des Familles avec hôte par face, lorsque vous recevrez une maquette architecte mise à jour, il se peut que vous ayez cette alerte. 

Exemple où l'architecte a supprimé un mur



Dans ce contexte il est recommandé d'exporter le rapport, car une fois la fenêtre fermée, il sera plus difficile de retrouver les éléments associés à ce rapport.
Un autre cas d'usage est celui d'utiliser des éléments contrôlés depuis une maquette liée lorsque celle ci est modifiée.

À savoir que tous les types avertissements ne sont pas systématiquement sauvegardés dans le gestionnaire d'avertissement (Revit applique une correction).

Voici un exemple de script qui permet de parser un rapport HTML  afin de retrouver les éléments associés. (via la librairie mshtml, interface COM).

import clr
import re
import codecs
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

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

clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
uidoc = uiapp.ActiveUIDocument

clr.AddReferenceByName(r'Microsoft.mshtml, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
import mshtml
from mshtml import HTMLDocumentClass

filepath = IN[0]
out = []
if sdkNumber < 2020:
    with open(filepath, 'r') as f:
        htmltoparse = f.read()
else:
    with codecs.open(filepath, 'r', 'utf-16') as f:
        htmltoparse = f.read()
htmlDocument = HTMLDocumentClass()
htmlDocument.write(htmltoparse)

allElements = htmlDocument.body.all
lstWarning = allElements.tags("tr")
for warn in lstWarning:
	warncont = warn.innerText
	stringIdR = re.search(r'ID.+?(d.+)' , warncont)
	if stringIdR is not None:
		elemId = ElementId(int(stringIdR.group(1)))
		elem = doc.GetElement(elemId)
		out.append([ warncont, elem])
htmlDocument.close()
OUT =  out

Aperçu en vidéo


Note 
si vous souhaitez utiliser mshtml avec le moteur CPython3 + PythonNet, il faudra obligatoirement caster toute vos variables

voici une comparaison entre les 2 moteurs :







0 commentaires:

Enregistrer un commentaire