Package sverchok.core

Expand source code
import importlib
import logging
import sys
import sverchok
import bpy
from sverchok.utils.development import get_version_string
from sverchok.utils.sv_logging import add_file_handler, remove_console_handler

root_modules = [
    "dependencies",
    "data_structure",
    "node_tree",
    "core",  # already imported but should be added to use register function
    "utils",  # already imported but should be added to use register function
    "ui", "nodes", "old_nodes"
]

core_modules = [
    "sv_custom_exceptions", "update_system",
    "sockets", "socket_data",
    "handlers",
    "events", "node_group",
    "tasks",
    "group_update_system",
    "event_system",
]


def imported_utils_modules():
    return [m for n, m in sys.modules.items() if 'sverchok.utils' in n]


def sv_register_modules(modules):
    for m in modules:
        if hasattr(m, "register"):
            # print("Registering module: {}".format(m.__name__))
            m.register()


def sv_unregister_modules(modules):
    for m in reversed(modules):
        if hasattr(m, "unregister"):
            try:
                m.unregister()
            except RuntimeError as e:
                print("Error unregistering module: {}".format(m.__name__))
                print(str(e))


def import_nodes():
    from sverchok import nodes
    node_modules = []
    base_name = "sverchok.nodes"
    for category, names in nodes.nodes_dict.items():
        importlib.import_module('.{}'.format(category), base_name)
        import_modules(names, '{}.{}'.format(base_name, category), node_modules)
    return node_modules


def import_modules(modules, base, im_list):
    for m in modules:
        # print(base, '.{}'.format(m))
        im = importlib.import_module('.{}'.format(m), base)
        im_list.append(im)


def handle_reload_event(imported_modules):
    node_modules = import_nodes()

    # reload base modules
    for module in imported_modules:
        importlib.reload(module)

    # reload util modules
    for module in imported_utils_modules():
        importlib.reload(module)

    # reload nodes
    for node in node_modules:
        importlib.reload(node)
    return node_modules


def import_settings(imported_modules):
    """Useful have the function to be sure that we do not import half of
    Sverchok modules wia settings"""
    settings = importlib.import_module(".settings", "sverchok")
    imported_modules.append(settings)


def import_logging(imported_modules):
    """Should be registered second after add-on settings"""
    module = importlib.import_module(".sv_logging", "sverchok.utils")
    # the module will be in imported_utils_modules - move sv_logging to core?
    # imported_modules.append(module)


def import_all_modules(imported_modules, mods_bases):
    for mods, base in mods_bases:
        import_modules(mods, base, imported_modules)


def init_architecture():
    """There is no too much sense to init settings module first. It just useful
    to make sure that we do not init half of Sverchok via the module.
    Settings (preferences) are only available when add-on is imported (during
    registration).

    Import core modules here like Sverchok node tree, sockets, settings,
    update system, user interface etc.
    Utils modules are imported only via core modules. If you need your module
    to be imported you either add import in some core module or convert it into
    a core module (for example by moving into the ui folder).
    List of core modules is used for calling their register function.
    """
    import sverchok.ui as ui

    imported_modules = []
    mods_bases = [
        (root_modules, "sverchok"),
        (core_modules, "sverchok.core"),
        (ui.module_names(), "sverchok.ui")
    ]
    # print('sv: import settings')
    import_settings(imported_modules)
    # print('sv: import all modules')
    import_logging(imported_modules)
    import_all_modules(imported_modules, mods_bases)
    return imported_modules


def enable_logging():
    """Should be called after registration the add-on settings.
    Adds additional handlers according the add-on settings and set logging level"""
    if sverchok.reload_event:
        return

    addon = bpy.context.preferences.addons.get(sverchok.__name__)
    prefs = addon.preferences

    sv_logger = logging.getLogger('sverchok')
    level = getattr(logging, prefs.log_level)
    sv_logger.setLevel(level)
    if prefs.log_to_file:
        add_file_handler(prefs.log_file_name)
    if not prefs.log_to_console:
        remove_console_handler()

    logging.captureWarnings(True)
    sv_logger.info(f'Initializing Sverchok logging (level={prefs.log_level}). '
                   f'Blender version={bpy.app.version_string},'
                   f' Sverchok version={get_version_string()}')


def disable_logging():
    sv_logger = logging.getLogger('sverchok')
    for handler in sv_logger.handlers[:]:
        handler.close()
        sv_logger.removeHandler(handler)


def interupted_activation_detected():
    activation_message = """\n
    ** Sverchok needs a couple of seconds to become activated when you enable it for the first time. **
    ** Please restart Blender and enable it by pressing the tick box only once -- be patient!        ** 
    """
    return NameError(activation_message)


undo_handler_node_count = {}
undo_handler_node_count['sv_groups'] = 0

Sub-modules

sverchok.core.event_system
sverchok.core.events

Events keep information about which Blender trigger was executed and with which context

sverchok.core.group_update_system
sverchok.core.handlers
sverchok.core.main_tree_handler
sverchok.core.node_group
sverchok.core.socket_conversions
sverchok.core.socket_data

For internal usage of the sockets module

sverchok.core.sockets
sverchok.core.sv_custom_exceptions
sverchok.core.tasks
sverchok.core.update_system

Functions

def disable_logging()
Expand source code
def disable_logging():
    sv_logger = logging.getLogger('sverchok')
    for handler in sv_logger.handlers[:]:
        handler.close()
        sv_logger.removeHandler(handler)
def enable_logging()

Should be called after registration the add-on settings. Adds additional handlers according the add-on settings and set logging level

Expand source code
def enable_logging():
    """Should be called after registration the add-on settings.
    Adds additional handlers according the add-on settings and set logging level"""
    if sverchok.reload_event:
        return

    addon = bpy.context.preferences.addons.get(sverchok.__name__)
    prefs = addon.preferences

    sv_logger = logging.getLogger('sverchok')
    level = getattr(logging, prefs.log_level)
    sv_logger.setLevel(level)
    if prefs.log_to_file:
        add_file_handler(prefs.log_file_name)
    if not prefs.log_to_console:
        remove_console_handler()

    logging.captureWarnings(True)
    sv_logger.info(f'Initializing Sverchok logging (level={prefs.log_level}). '
                   f'Blender version={bpy.app.version_string},'
                   f' Sverchok version={get_version_string()}')
def handle_reload_event(imported_modules)
Expand source code
def handle_reload_event(imported_modules):
    node_modules = import_nodes()

    # reload base modules
    for module in imported_modules:
        importlib.reload(module)

    # reload util modules
    for module in imported_utils_modules():
        importlib.reload(module)

    # reload nodes
    for node in node_modules:
        importlib.reload(node)
    return node_modules
def import_all_modules(imported_modules, mods_bases)
Expand source code
def import_all_modules(imported_modules, mods_bases):
    for mods, base in mods_bases:
        import_modules(mods, base, imported_modules)
def import_logging(imported_modules)

Should be registered second after add-on settings

Expand source code
def import_logging(imported_modules):
    """Should be registered second after add-on settings"""
    module = importlib.import_module(".sv_logging", "sverchok.utils")
    # the module will be in imported_utils_modules - move sv_logging to core?
    # imported_modules.append(module)
def import_modules(modules, base, im_list)
Expand source code
def import_modules(modules, base, im_list):
    for m in modules:
        # print(base, '.{}'.format(m))
        im = importlib.import_module('.{}'.format(m), base)
        im_list.append(im)
def import_nodes()
Expand source code
def import_nodes():
    from sverchok import nodes
    node_modules = []
    base_name = "sverchok.nodes"
    for category, names in nodes.nodes_dict.items():
        importlib.import_module('.{}'.format(category), base_name)
        import_modules(names, '{}.{}'.format(base_name, category), node_modules)
    return node_modules
def import_settings(imported_modules)

Useful have the function to be sure that we do not import half of Sverchok modules wia settings

Expand source code
def import_settings(imported_modules):
    """Useful have the function to be sure that we do not import half of
    Sverchok modules wia settings"""
    settings = importlib.import_module(".settings", "sverchok")
    imported_modules.append(settings)
def imported_utils_modules()
Expand source code
def imported_utils_modules():
    return [m for n, m in sys.modules.items() if 'sverchok.utils' in n]
def init_architecture()

There is no too much sense to init settings module first. It just useful to make sure that we do not init half of Sverchok via the module. Settings (preferences) are only available when add-on is imported (during registration).

Import core modules here like Sverchok node tree, sockets, settings, update system, user interface etc. Utils modules are imported only via core modules. If you need your module to be imported you either add import in some core module or convert it into a core module (for example by moving into the ui folder). List of core modules is used for calling their register function.

Expand source code
def init_architecture():
    """There is no too much sense to init settings module first. It just useful
    to make sure that we do not init half of Sverchok via the module.
    Settings (preferences) are only available when add-on is imported (during
    registration).

    Import core modules here like Sverchok node tree, sockets, settings,
    update system, user interface etc.
    Utils modules are imported only via core modules. If you need your module
    to be imported you either add import in some core module or convert it into
    a core module (for example by moving into the ui folder).
    List of core modules is used for calling their register function.
    """
    import sverchok.ui as ui

    imported_modules = []
    mods_bases = [
        (root_modules, "sverchok"),
        (core_modules, "sverchok.core"),
        (ui.module_names(), "sverchok.ui")
    ]
    # print('sv: import settings')
    import_settings(imported_modules)
    # print('sv: import all modules')
    import_logging(imported_modules)
    import_all_modules(imported_modules, mods_bases)
    return imported_modules
def interupted_activation_detected()
Expand source code
def interupted_activation_detected():
    activation_message = """\n
    ** Sverchok needs a couple of seconds to become activated when you enable it for the first time. **
    ** Please restart Blender and enable it by pressing the tick box only once -- be patient!        ** 
    """
    return NameError(activation_message)
def sv_register_modules(modules)
Expand source code
def sv_register_modules(modules):
    for m in modules:
        if hasattr(m, "register"):
            # print("Registering module: {}".format(m.__name__))
            m.register()
def sv_unregister_modules(modules)
Expand source code
def sv_unregister_modules(modules):
    for m in reversed(modules):
        if hasattr(m, "unregister"):
            try:
                m.unregister()
            except RuntimeError as e:
                print("Error unregistering module: {}".format(m.__name__))
                print(str(e))