Une astuce pour obtenir les données des configurations d'Export IFC
Dans le présent article, depuis Revit, nous cherchons à récupérer les données des configurations utilisateur d'export IFC.
Le but étant de permettre un export IFC depuis Dynamo suivant une configuration précise sans avoir à faire un export-import de celle-ci (au format json)
Le code Python
import clr
import sys
import System
# Import RevitAPI
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *
import Autodesk.Revit.DB as DB
from Autodesk.Revit.Attributes import *
from Autodesk.Revit.DB.IFC import *
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
uidoc = uiapp.ActiveUIDocument
app = uiapp.Application
sdkNumber = int(app.VersionNumber)
IFCExportConfiguration = None
IFCExportConfigurationsMap = None
pf_path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFilesX86)
pf_data_path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData)
ifc_bundle_path = "{0}\\Autodesk\\ApplicationPlugins\\IFC {1}.bundle\\Contents\\{1}".format(pf_data_path, sdkNumber)
if System.IO.Directory.Exists(ifc_bundle_path):
# 1st try
sys.path.append(ifc_bundle_path)
clr.AddReference("IFCExporterUIOverride")
from BIM.IFC.Export.UI import IFCExportConfigurationsMap, IFCExportConfiguration, IFCCommandOverrideApplication
else:
ifc_addin_path = "{}\\Autodesk\\Revit {}\\AddIns\IFCExporterUI".format(pf_path, sdkNumber)
if System.IO.Directory.Exists(ifc_addin_path):
# 2nd try
sys.path.append(ifc_addin_path)
clr.AddReference("Autodesk.IFC.Export.UI")
from BIM.IFC.Export.UI import IFCExportConfigurationsMap, IFCExportConfiguration, IFCCommandOverrideApplication
import json
ifc_dict_config = {}
if IFCExportConfigurationsMap is not None:
idfdocA = IFCCommandOverrideApplication.TheDocument
if idfdocA is None:
propinfo = clr.GetClrType(IFCCommandOverrideApplication).GetProperty('TheDocument')
propinfo.SetValue(None, doc)
configurationsMap = IFCExportConfigurationsMap()
configurationsMap.AddBuiltInConfigurations()
configurationsMap.AddSavedConfigurations()
for config in configurationsMap.Values:
dict_ifc_version_str = {"IFC_Version_str": config.IFCVersion.ToString() }
dict_config = json.loads(config.SerializeConfigToJson())
# merge dictionaries
merge_dict_3 = dict(dict_ifc_version_str,**dict_config)
ifc_dict_config[config.Name] = merge_dict_3
OUT = ifc_dict_config
- Note 1
il existe 2 addin export IFC, celui de base (qui est livré d'origine avec Revit) et celui que l'on met à jour manuellement par la suite via le Repo Github d'Autodesk, ce dernier vient remplacer le 1er, mais ne partage pas le même dossier.
Il faut donc veiller à charger la bonne assembly (voir code ci dessus)
- Note 2
Une petite explication concernant ces lignes
idfdocA = IFCCommandOverrideApplication.TheDocument
if idfdocA is None:
propinfo = clr.GetClrType(IFCCommandOverrideApplication).GetProperty('TheDocument')
propinfo.SetValue(None, doc)
Ces lignes de code effectuent une opération de réflexion (.NET Reflection)
pour modifier dynamiquement la propriété
TheDocument
d'une instance de la classe
IFCCommandOverrideApplication
.
Le but de ces lignes est de s'assurer que l'application d'exportation IFC
IFCCommandOverrideApplication
est configurée pour utiliser le document Revit actuel (doc) comme contexte
pour l'exportation. Cela peut être nécessaire si l'application d'exportation
IFC n'est pas automatiquement configurée pour utiliser le bon document Revit
ou si vous devez réaffecter explicitement le document cible pour
l'exportation dans des scénarios spécifiques.
Résultat
Vous pouvez ensuite compléter le script dynamo en rajoutant par exemple le nœud Export IFC du package GeniusLoci
Le monde se divise en deux catégories...... NWC VS IFC Close VS Open sans hôte VS hôte par face Modèle Générique VS Site Etc... La meilleure, c'est celle qui fait avancer le projet… |
0 commentaires:
Enregistrer un commentaire