mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-13 02:47:48 +00:00
141 lines
4.3 KiB
Python
141 lines
4.3 KiB
Python
bl_info = {
|
|
"name": "IFC for Sverchok",
|
|
"author": "Dion Moult",
|
|
"version": (0, 0, 999999),
|
|
"blender": (2, 90, 0),
|
|
"location": "Node Editor",
|
|
"category": "Node",
|
|
"description": "An extension to Sverchok to work with IFC data",
|
|
"tracker_url": "https://github.com/IfcOpenShell/IfcOpenShell/issues",
|
|
"warning": "",
|
|
}
|
|
|
|
import sys
|
|
import importlib
|
|
import nodeitems_utils
|
|
import sverchok
|
|
from sverchok.core import sv_registration_utils, make_node_list
|
|
from sverchok.utils import auto_gather_node_classes, get_node_class_reference
|
|
from sverchok.menu import SverchNodeItem, SverchNodeCategory, register_node_panels
|
|
from sverchok.utils.extra_categories import register_extra_category_provider, unregister_extra_category_provider
|
|
from sverchok.ui.nodeview_space_menu import make_extra_category_menus
|
|
from sverchok.utils.logging import info, debug
|
|
|
|
|
|
def nodes_index():
|
|
return [
|
|
(
|
|
"IFC",
|
|
[
|
|
("ifc.create_file", "SvIfcCreateFile"),
|
|
("ifc.read_file", "SvIfcReadFile"),
|
|
("ifc.write_file", "SvIfcWriteFile"),
|
|
("ifc.create_entity", "SvIfcCreateEntity"),
|
|
("ifc.create_shape", "SvIfcCreateShape"),
|
|
("ifc.read_entity", "SvIfcReadEntity"),
|
|
("ifc.by_id", "SvIfcById"),
|
|
("ifc.by_guid", "SvIfcByGuid"),
|
|
("ifc.by_type", "SvIfcByType"),
|
|
("ifc.by_query", "SvIfcByQuery"),
|
|
("ifc.add", "SvIfcAdd"),
|
|
("ifc.remove", "SvIfcRemove"),
|
|
("ifc.generate_guid", "SvIfcGenerateGuid"),
|
|
("ifc.get_property", "SvIfcGetProperty"),
|
|
("ifc.get_attribute", "SvIfcGetAttribute"),
|
|
("ifc.select_blender_objects", "SvIfcSelectBlenderObjects"),
|
|
],
|
|
)
|
|
]
|
|
|
|
|
|
def make_node_list():
|
|
modules = []
|
|
base_name = "ifcsverchok.nodes"
|
|
index = nodes_index()
|
|
for category, items in index:
|
|
for module_name, node_name in items:
|
|
module = importlib.import_module(f".{module_name}", base_name)
|
|
modules.append(module)
|
|
return modules
|
|
|
|
|
|
imported_modules = make_node_list()
|
|
|
|
reload_event = False
|
|
|
|
import bpy
|
|
|
|
|
|
def register_nodes():
|
|
node_modules = make_node_list()
|
|
for module in node_modules:
|
|
module.register()
|
|
info("Registered %s nodes", len(node_modules))
|
|
|
|
|
|
def unregister_nodes():
|
|
global imported_modules
|
|
for module in reversed(imported_modules):
|
|
module.unregister()
|
|
|
|
|
|
def make_menu():
|
|
menu = []
|
|
index = nodes_index()
|
|
for category, items in index:
|
|
identifier = "IFCSVERCHOK_" + category.replace(" ", "_")
|
|
node_items = []
|
|
for item in items:
|
|
nodetype = item[1]
|
|
rna = get_node_class_reference(nodetype)
|
|
if not rna:
|
|
info("Node `%s' is not available (probably due to missing dependencies).", nodetype)
|
|
else:
|
|
node_item = SverchNodeItem.new(nodetype)
|
|
node_items.append(node_item)
|
|
if node_items:
|
|
cat = SverchNodeCategory(identifier, category, items=node_items)
|
|
menu.append(cat)
|
|
return menu
|
|
|
|
|
|
class SvExCategoryProvider(object):
|
|
def __init__(self, identifier, menu):
|
|
self.identifier = identifier
|
|
self.menu = menu
|
|
|
|
def get_categories(self):
|
|
return self.menu
|
|
|
|
|
|
our_menu_classes = []
|
|
|
|
|
|
def register():
|
|
global our_menu_classes
|
|
|
|
debug("Registering ifcsverchok")
|
|
|
|
register_nodes()
|
|
extra_nodes = importlib.import_module(".nodes", "ifcsverchok")
|
|
auto_gather_node_classes(extra_nodes)
|
|
menu = make_menu()
|
|
menu_category_provider = SvExCategoryProvider("IFCSVERCHOK", menu)
|
|
register_extra_category_provider(menu_category_provider) # if 'IFCSVERCHOK' in nodeitems_utils._node_categories:
|
|
nodeitems_utils.register_node_categories("IFCSVERCHOK", menu)
|
|
our_menu_classes = make_extra_category_menus()
|
|
|
|
|
|
def unregister():
|
|
global our_menu_classes
|
|
if "IFCSVERCHOK" in nodeitems_utils._node_categories:
|
|
nodeitems_utils.unregister_node_categories("IFCSVERCHOK")
|
|
for clazz in our_menu_classes:
|
|
try:
|
|
bpy.utils.unregister_class(clazz)
|
|
except Exception as e:
|
|
print("Can't unregister menu class %s" % clazz)
|
|
print(e)
|
|
unregister_extra_category_provider("IFCSVERCHOK")
|
|
unregister_nodes()
|