API Reference
=============
This section documents the main modules, operators, and property groups in EM Tools.
.. note::
EM Tools uses the external `s3dgraphy `_ library for graph management.
Graph classes (nodes, edges, graph operations) are provided by s3dgraphy, not by EM Tools directly.
Architecture Overview
---------------------
EM Tools is structured as a Blender Extension with the following main components:
- **s3dgraphy**: external Python library for Extended Matrix graph operations (GraphML parsing, node/edge management)
- **Blender Operators**: import, export, and UI interaction operators
- **Property Groups**: Blender properties for addon settings, scene state, and UI data
- **Panel modules**: UI panels organized by functional area (em_setup, visual_manager, epoch_manager, etc.)
Graph Access
------------
Graphs are managed by the external ``s3dgraphy`` library. EM Tools exposes the
top-level helpers directly, while ``load_graph_from_file`` lives under
``s3dgraphy.multigraph.multigraph``.
.. code-block:: python
from s3dgraphy import get_graph, remove_graph, get_all_graph_ids
from s3dgraphy.multigraph.multigraph import load_graph_from_file
# Load a graph from a GraphML file (returns the graph identifier / name)
graph_id = load_graph_from_file(filepath)
# Fetch a graph already loaded in memory, by name
graph = get_graph(graph_id)
# List all loaded graph IDs
for gid in get_all_graph_ids():
g = get_graph(gid)
# Drop a graph from memory
remove_graph(graph_id)
EM Tools tracks the set of GraphML files the user has imported in
``scene.em_tools.graphml_files`` (see :ref:`api-prop-em-tools`). The name of
each file in that collection matches the graph ID used by ``get_graph``.
Import Operators
----------------
.. py:class:: EM_import_GraphML
Import an Extended Matrix GraphML file.
:bl_idname: ``import.em_graphml``
:bl_label: Import EM GraphML
:file: ``import_operators/importer_graphml.py``
.. py:class:: EM_OT_import_3dgis_database
Import an external database (Generic Excel, PyArchInit, or EMdb Excel). The
import type is read from ``scene.em_tools.mode_3dgis_import_type``
(``generic_xlsx`` / ``pyarchinit`` / ``emdb_xlsx``).
:bl_idname: ``em.import_3dgis_database``
:bl_label: Import 3D GIS Database
:file: ``import_operators/import_EMdb.py``
Importer Registry
^^^^^^^^^^^^^^^^^
EM Tools uses a registry so new importer back-ends can be plugged in without
touching the operator:
.. code-block:: python
from import_operators.importer_registry import (
IMPORTER_REGISTRY,
create_importer,
get_supported_formats,
get_required_params,
)
# Supported importer types (keys of IMPORTER_REGISTRY):
# 'generic_xlsx' - Generic Excel spreadsheet (GenericXLSXImporter)
# 'emdb_xlsx' - EMdb Excel format (s3dgraphy.MappedXLSXImporter)
# 'pyarchinit' - PyArchInit SQLite database (s3dgraphy.PyArchInitImporter)
# Build an importer. ``settings`` is a dict carrying at least the required
# parameters for that type (see get_required_params(import_type)).
settings = {
'filepath': '/path/to/file.xlsx',
'sheet_name': 'Sheet1',
'id_column': 'ID',
'desc_column': 'Description', # optional
}
importer = create_importer('generic_xlsx', settings, existing_graph=None)
:file: ``import_operators/importer_registry.py``
Export Operators
----------------
.. py:class:: EXPORT_OT_heriverse
Main Heriverse project export: GLTF geometry, DosCo documents, RM and SF
models, and the Heriverse JSON descriptor. Options are read from
``scene.heriverse_*`` and ``context.window_manager.export_vars``.
:bl_idname: ``export.heriverse``
:bl_label: Export Heriverse Project
:file: ``export_operators/heriverse/operator.py``
.. py:class:: EXPORT_OT_heriverse_threaded
Threaded / background variant of the Heriverse export that drives the same
GLTF pipeline via a background job queue. Uses
``export_operators.heriverse.gltf.export_gltf_with_animation_support``
internally.
:bl_idname: ``export.heriverse_threaded``
:file: ``export_threaded.py``
.. py:class:: HERIVERSE_OT_export_json
JSON-only export of publishable graphs (skips geometry / textures). The
Python class was previously named ``JSON_OT_exportEMformat``; it was renamed
during the Heriverse split so the class name no longer clashes with the
removed EMviq operator. The Blender ``bl_idname`` is unchanged, so existing
callers of ``bpy.ops.export.heriversejson(...)`` keep working.
:bl_idname: ``export.heriversejson``
:bl_label: Export Heriverse JSON
:file: ``export_operators/heriverse/json_export.py``
.. py:class:: HERIVERSE_OT_make_collections_visible
Convenience operator that unhides every collection containing at least one
RM object (i.e. any object with ``EM_ep_belong_ob`` entries). Useful before
launching an export so all publishable RMs are selectable.
:bl_idname: ``heriverse.make_collections_visible``
:file: ``export_operators/heriverse/collections_op.py``
.. py:class:: EM_export_GraphML
Write the currently active graph back to its original ``.graphml`` file.
Invoked from the EM Data Tree header, not from the Export panel.
:bl_idname: ``export.graphml_update``
:file: ``export_operators/exporter_graphml.py``
.. py:class:: EM_export_GraphML_SaveAs
Save the active graph to a new ``.graphml`` file chosen by the user.
:bl_idname: ``export.graphml_saveas``
:file: ``export_operators/exporter_graphml.py``
.. py:class:: EMExportCSV
Experimental CSV export of per-object mesh statistics (volume, weight,
surface areas) driven by ``scene.em_properties``.
:bl_idname: ``export_mesh.csv``
:file: ``em_statistics/operators.py``
.. py:class:: OBJECT_OT_ExportUUSS / ExportuussData
Tabular CSV export of Stratigraphic Units, Sources or Extractors. The
first operator simply opens the second via ``INVOKE_DEFAULT``; the second
does the actual file writing. Driven by
``context.window_manager.export_tables_vars.table_type``.
:bl_idname: ``export.uuss_export`` / ``export.uuss_data``
:file: ``export_manager/providers/tabular/operators.py``
Export Provider Registry
^^^^^^^^^^^^^^^^^^^^^^^^
The Export Manager panel is plugin-style: every collapsible section is an
``ExportProvider`` registered into a central list that the panel iterates.
Adding a new exporter UI section does not require modifying the panel.
.. code-block:: python
from export_manager.registry import (
ExportProvider,
register_provider,
unregister_provider,
get_providers,
)
def _poll(context):
return context.scene.em_tools.mode_em_advanced
def _draw(box, context):
box.row().operator("export.my_exporter", text="Run My Export")
PROVIDER = ExportProvider(
id="my_exporter", # must match the `{id}_expanded` attr on ExportVars
# if you want a collapsible toggle (optional)
label="My Exporter",
order=30,
icon='EXPORT',
poll=_poll,
draw=_draw,
)
def register():
register_provider(PROVIDER)
def unregister():
unregister_provider(PROVIDER.id)
:file: ``export_manager/registry.py``
Currently shipped providers live under ``export_manager/providers/``:
- ``tabular`` — CSV exports of US/USV, Sources, Extractors
- ``heriverse`` — UI for ``export.heriverse`` (Advanced mode only)
Property Groups
---------------
EMAddonSettings
^^^^^^^^^^^^^^^
Global addon settings, stored in the addon preferences
(``bpy.context.preferences.addons[__package__].preferences``).
:file: ``__init__.py``
Properties:
- ``preserve_web_url`` (BoolProperty, default ``True``): Preserve URLs from GraphML nodes
- ``overwrite_url_with_dosco_filepath`` (BoolProperty, default ``True``): Use DosCo folder paths instead of web URLs
- ``dosco_options`` (BoolProperty, default ``False``): Show DosCo options in the UI
- ``dosco_advanced_options`` (BoolProperty, default ``False``): Show advanced DosCo import options
- ``verbose_logging`` (BoolProperty, computed): Enable detailed console logging. Backed by addon preferences via a getter/setter pair
ExportVars
^^^^^^^^^^
Export UI settings. Attached to ``bpy.types.WindowManager`` as
``window_manager.export_vars``.
:file: ``__init__.py``
Expand toggles (used by the Export panel provider loop):
- ``tabular_expanded`` (BoolProperty, default ``True``)
- ``heriverse_expanded`` (BoolProperty, default ``False``)
- ``emviq_expanded`` (BoolProperty, default ``False``) — legacy flag, EMviq exporter was removed
- ``heriverse_advanced_options`` (BoolProperty)
Heriverse pipeline flags (consumed by ``EXPORT_OT_heriverse``):
- ``heriverse_overwrite_json`` / ``heriverse_export_dosco``
- ``heriverse_export_proxies`` / ``heriverse_export_rm``
/ ``heriverse_export_rmdoc`` / ``heriverse_export_rmsf``
- ``heriverse_create_zip``
- ``heriverse_use_draco`` / ``heriverse_draco_level`` (1–10)
- ``heriverse_separate_textures`` / ``heriverse_use_gpu_instancing``
- ``heriverse_skip_extracted_tilesets``
- ``heriverse_export_animations`` / ``heriverse_export_all_animations``
/ ``heriverse_animation_frame_range``
Generic format selector (legacy EMviq-era):
- ``format_file`` (EnumProperty: ``gltf`` / ``obj`` / ``fbx``, default ``gltf``)
Texture / path settings live on the Scene, not on ``ExportVars`` (see below).
ExportTablesVars
^^^^^^^^^^^^^^^^
Settings for the Tabular CSV export provider.
:file: ``__init__.py``
Properties:
- ``table_type`` (EnumProperty: ``US/USV`` / ``Sources`` / ``Extractors``)
Scene-level Heriverse settings
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Registered by the Heriverse provider when the provider loads. Attached to
``bpy.types.Scene``:
- ``heriverse_export_path`` (StringProperty, DIR_PATH)
- ``heriverse_project_name`` (StringProperty)
- ``heriverse_export_panorama`` (BoolProperty)
- ``heriverse_enable_compression`` (BoolProperty)
- ``heriverse_texture_max_res`` (IntProperty, 512–8192)
- ``heriverse_texture_quality`` (IntProperty, 10–100)
- ``heriverse_paradata_texture_compression`` (BoolProperty)
- ``heriverse_paradata_texture_quality`` (IntProperty, 10–100)
- ``heriverse_rmdoc_texture_max_res`` (IntProperty, 512–8192)
- ``heriverse_rmdoc_texture_quality`` (IntProperty, 10–100)
- ``heriverse_preserve_rmdoc_transform`` (BoolProperty)
:file: ``export_manager/providers/heriverse/properties.py``
.. _api-prop-em-tools:
EM_Tools
^^^^^^^^
Main container for all EM Tools scene-level state. Attached to
``bpy.types.Scene`` as ``scene.em_tools``. Every manager exposes its state
through a ``PointerProperty`` on this container.
:file: ``em_props.py``
Manager pointers:
- ``stratigraphy`` (``StratigraphyManagerProps``)
- ``epochs`` (``EpochManagerProps``)
- ``visual`` (``VisualManagerProps``)
- ``anastylosis`` (``AnastylosisManagerProps``)
- ``rm`` (``RMManagerProps``)
- ``proxy_box`` (``ProxyBoxSettings``)
- ``tapestry`` (``TapestryManagerProps``)
- ``surface_areale`` (``SurfaceArealeSettings``)
GraphML file management:
- ``graphml_files`` (CollectionProperty of ``GraphMLFileItem``) — all loaded graphs
- ``active_file_index`` (IntProperty, default ``-1``)
Global settings and mode flags:
- ``mode_em_advanced`` (BoolProperty, default ``True``) — switch between 3D GIS and EM Advanced UIs
- ``experimental_features`` (BoolProperty, default ``False``) — gates the experimental panels (see below)
- ``show_advanced_tools`` (BoolProperty)
- ``show_collection_manager`` (BoolProperty)
- ``exp_create_graphml_expanded`` (BoolProperty)
- ``mode_3dgis_import_type`` (EnumProperty: ``generic_xlsx`` / ``pyarchinit`` / ``emdb_xlsx``)
Anastylosis LOD helpers
^^^^^^^^^^^^^^^^^^^^^^^
Public helpers exported by ``anastylosis_manager`` (useful for scripts that
need to introspect LOD variants without going through operators):
.. code-block:: python
from anastylosis_manager import detect_lod_variants
from anastylosis_manager.lod_utils import (
LOD_MIN_LEVEL, LOD_MAX_LEVEL,
_resolve_lod_with_fallback,
_switch_linked_mesh_lod,
)
variants = detect_lod_variants("MyProxy") # [(lod_level, obj_name), ...]
:file: ``anastylosis_manager/lod_utils.py``
Proxy inflate hooks
^^^^^^^^^^^^^^^^^^^
``proxy_inflate_manager`` also exposes pre/post export hooks so callers can
temporarily solidify proxies around an export:
.. code-block:: python
from proxy_inflate_manager import (
auto_inflate_for_export,
cleanup_auto_inflate,
export_pre_hook,
export_post_hook,
)
:file: ``proxy_inflate_manager/helpers.py``
Panels Reference
----------------
Principal Blender panels registered by EM Tools. All sit in
``VIEW_3D > UI`` unless stated otherwise.
+---------------------------------+-----------------------------+-----------------------+-------------------------------------+
| Class | bl_label | bl_category | File |
+=================================+=============================+=======================+=====================================+
| ``EM_SetupPanel`` | EM Data Tree {version} | EM | ``em_setup/ui.py`` |
+---------------------------------+-----------------------------+-----------------------+-------------------------------------+
| ``VIEW3D_PT_visual_panel`` | Visual Manager | EM | ``visual_manager/ui.py`` |
+---------------------------------+-----------------------------+-----------------------+-------------------------------------+
| ``VIEW3D_PT_ToolsPanel`` | Stratigraphy Manager | EM | ``stratigraphy_manager/ui.py`` |
+---------------------------------+-----------------------------+-----------------------+-------------------------------------+
| ``VIEW3D_PT_BasePanel`` | Epochs Manager | EM | ``epoch_manager/ui.py`` |
+---------------------------------+-----------------------------+-----------------------+-------------------------------------+
| ``VIEW3D_PT_activity_manager`` | Activity Manager | EM | ``activity_manager/ui.py`` |
+---------------------------------+-----------------------------+-----------------------+-------------------------------------+
| ``VIEW3D_PT_RM_Manager`` | Representation Model (RM) | EM Annotator | ``rm_manager/ui.py`` |
+---------------------------------+-----------------------------+-----------------------+-------------------------------------+
| ``VIEW3D_PT_Anastylosis_Manager``| Anastylosis (RMSF) | EM Annotator | ``anastylosis_manager/ui.py`` |
+---------------------------------+-----------------------------+-----------------------+-------------------------------------+
| ``VIEW3D_PT_ParadataPanel`` | Paradata Manager | EM | ``paradata_manager/ui.py`` |
+---------------------------------+-----------------------------+-----------------------+-------------------------------------+
| ``VIEW3D_PT_3DDocumentManager`` | Document Manager | EM Annotator | ``document_manager/ui.py`` |
+---------------------------------+-----------------------------+-----------------------+-------------------------------------+
| ``VIEW3D_PT_RMDoc_Manager`` | Representation Model Document (RMDoc) | EM Annotator | ``document_manager/ui.py`` |
+---------------------------------+-----------------------------+-----------------------+-------------------------------------+
| ``VIEW3D_PT_ExportPanel`` | Export Manager | EM Bridge | ``export_manager/panel.py`` |
+---------------------------------+-----------------------------+-----------------------+-------------------------------------+
| ``VIEW3D_PT_graphedit_sync`` | EMGraph (Experimental) | EM | ``graph_editor/ui.py`` |
+---------------------------------+-----------------------------+-----------------------+-------------------------------------+
| ``CF_PT_cronofilter`` | CronoFilter | EM | ``cronofilter/ui.py`` |
+---------------------------------+-----------------------------+-----------------------+-------------------------------------+
| ``VIEW3D_PT_ServerPanel`` | EM Server | EM | ``server.py`` |
+---------------------------------+-----------------------------+-----------------------+-------------------------------------+
Experimental panels (gated behind ``scene.em_tools.experimental_features``):
+---------------------------------+--------------------------------------+-----------------------+-------------------------------------------+
| Class | bl_label | Location | File |
+=================================+======================================+=======================+===========================================+
| ``EM_PT_ExportPanel`` | Export statistics (Experimental) | EM Bridge | ``em_statistics/ui.py`` |
+---------------------------------+--------------------------------------+-----------------------+-------------------------------------------+
| ``VIEW3D_PT_ProxyInflatePanel`` | Proxy Inflate Manager | Child of Visual Mgr | ``proxy_inflate_manager/ui.py`` |
+---------------------------------+--------------------------------------+-----------------------+-------------------------------------------+
| ``VIEW3D_PT_proxy_projection_panel`` | Proxy to RM Projection (Experimental) | EM | ``proxy_to_rm_projection/ui.py`` |
+---------------------------------+--------------------------------------+-----------------------+-------------------------------------------+
| ``VIEW3D_PT_graphml_wizard_bridge`` | GraphML Wizard (Experimental) | EM | ``em_setup/ui.py`` |
+---------------------------------+--------------------------------------+-----------------------+-------------------------------------------+
.. note::
"RM Coloring (Experimental)" is **not** a separate panel: it is drawn inline
inside Visual Manager by ``visual_manager.ui.VisualManager.draw_rm_coloring``.
Its backend operators (``proxy_projection.apply``, ``proxy_projection.clear``,
``proxy_projection.update``, ``proxy_projection.toggle``, …) live in
``proxy_to_rm_projection/operators.py``.
.. note::
The "Proxy Inflate Manager (Experimental)" collapsible box visible inside
Visual Manager is also an *inline* rendering, produced by
``visual_manager.ui.VisualManager.draw_proxy_inflate_tools``. It exposes the
same operators as ``VIEW3D_PT_ProxyInflatePanel`` (the standalone
sub-panel); the inline version adds the red header and the
``(Experimental)`` suffix, the standalone sub-panel uses the plain label.
Module Structure
----------------
.. code-block:: text
EM-blender-tools/
├── __init__.py # Main entry point, registration
├── em_props.py # Core property definitions
├── em_base_props.py # Base property groups
├── functions.py # Shared utility functions
├── em_setup/ # EM Data Tree panel
│ ├── ui.py # Panel UI
│ ├── operators.py # Setup operators
│ └── resource_utils.py # Resource folder utilities
├── visual_manager/ # Visual Manager panel
│ ├── ui.py # Panel UI (hosts inline "RM Coloring" experimental section)
│ ├── operators.py # Material/display operators
│ ├── color_ramps.py # Color scheme definitions
│ └── label_tools.py # Label creation
├── epoch_manager/ # Epochs Manager panel
│ ├── ui.py # Panel UI
│ └── operators.py # Epoch operators
├── stratigraphy_manager/ # Stratigraphy Manager panel
│ ├── ui.py # Panel UI
│ └── data.py # Filter data
├── activity_manager/ # Activity Manager panel
│ ├── __init__.py # Register hub
│ ├── properties.py # ActivityItem / ActivityManagerProperties
│ ├── operators.py # ACTIVITY_OT_refresh_list
│ └── ui.py # UIList + Panel
├── anastylosis_manager/ # Anastylosis / RMSF Manager
│ ├── __init__.py # Register hub
│ ├── properties.py # PropertyGroups (registered by em_props)
│ ├── lod_utils.py # LOD constants + parser + fallback helpers
│ ├── graph_utils.py # Graph cleanup + visibility analysis
│ ├── operators_list.py # List CRUD operators
│ ├── operators_link.py # SF/VSF linking operators
│ ├── operators_lod.py # LOD switching operators + menus
│ └── ui.py # UIList + Panel + load_post handler
├── rm_manager/ # RM Manager panel
│ ├── __init__.py # Register hub
│ ├── data.py # RMListItem + RM PropertyGroups
│ ├── handlers.py # load_post + depsgraph handlers
│ ├── operators.py # RM list CRUD + epoch selection + LOD
│ └── ui.py # VIEW3D_PT_RM_Manager + UIList + menus
├── paradata_manager/ # Paradata Manager panel
│ ├── __init__.py # Register hub
│ ├── data.py # ParadataImageProps + paradata list items
│ ├── operators.py # Document/Extractor/Combiner operators
│ └── ui.py # Panels (documents / extractors / combiners)
├── document_manager/ # 3D Document Manager panel
│ ├── __init__.py # Register hub
│ ├── data.py # 3D document PropertyGroups
│ ├── handlers.py # Scene-update handlers
│ ├── operators.py # Document CRUD + link-to-epoch operators
│ ├── ui.py # Panel + UIList
│ └── validators.py # Document data validation helpers
├── em_statistics/ # Mesh statistics CSV export (experimental panel)
│ ├── __init__.py # Register hub
│ ├── materials.py # CSV loading + material enum items + decimal formatting
│ ├── metrics.py # Volume / weight / surface computation
│ ├── properties.py # EMSceneProperties + Scene.em_properties
│ ├── operators.py # EMExportCSV
│ └── ui.py # EM_PT_ExportPanel (experimental-gated)
├── export_manager/ # Export Manager panel (plugin-style providers)
│ ├── __init__.py # Register hub + re-export registry API
│ ├── registry.py # ExportProvider + register/get_providers
│ ├── panel.py # VIEW3D_PT_ExportPanel (loops providers)
│ └── providers/
│ ├── __init__.py # Imports + registers each provider
│ ├── tabular/ # CSV export section
│ │ ├── __init__.py
│ │ ├── ui.py
│ │ └── operators.py # OBJECT_OT_ExportUUSS / ExportuussData
│ └── heriverse/ # Heriverse Export UI section
│ ├── __init__.py
│ ├── ui.py
│ └── properties.py # Scene.heriverse_* settings
├── cronofilter/ # CronoFilter panel (custom chronological horizons)
│ ├── __init__.py # Register hub
│ ├── properties.py # CF_ChronologicalHorizon + CF_CronoFilterSettings + Scene.cf_settings
│ ├── operators.py # Add / Remove / Move / Save / Load / AutoHorizons
│ ├── ui.py # CF_UL_HorizonList + CF_PT_CronoFilterPanel
│ ├── integration.py # Runtime integration helpers (preview / validation)
│ └── json_exporter_patch.py # Patch wiring custom horizons into the JSON exporter
├── graph_editor/ # Graph Editor panels (node-based graph visualization)
│ ├── __init__.py # Register hub
│ ├── properties.py # GraphEditor PropertyGroups
│ ├── data.py # Internal data structures
│ ├── nodes.py # Node type definitions
│ ├── dynamic_nodes.py # Dynamically generated node classes
│ ├── socket_generator.py # Socket factory helpers
│ ├── layout.py # Graph layout algorithms
│ ├── operators.py # Graph manipulation operators
│ ├── keymap.py # Custom keymap bindings
│ ├── ui.py # Editor panel + overlays
│ └── utils.py # Shared utilities
├── proxy_box_creator/ # Proxy Box Creator panels
│ ├── __init__.py # Register hub
│ ├── data.py # ProxyBoxSettings + ProxyBoxPointSettings
│ ├── create_enhanced.py # Enhanced proxy-box generation logic
│ ├── document_picker.py # Document selection helpers
│ ├── operators.py # Creation / editing operators
│ ├── ui.py # Panel UI
│ └── utils.py # Geometry helpers
├── proxy_inflate_manager/ # Proxy Inflate Manager (experimental)
│ ├── __init__.py # Register hub + Scene.proxy_inflate_stats
│ ├── helpers.py # get_inflate_name + auto-inflate hooks
│ ├── operators.py # Add / Activate / Deactivate / Remove / InflateAll
│ └── ui.py # VIEW3D_PT_ProxyInflatePanel (gated by experimental_features)
├── proxy_to_rm_projection/ # RM Coloring backend (experimental)
│ ├── __init__.py
│ ├── data.py # proxy_projection_settings PropertyGroup
│ ├── operators.py # proxy_projection.* operators
│ ├── ui.py # Internal helpers (UI rendered inline in visual_manager/ui.py)
│ ├── material_override.py # Shader-node material overrides
│ └── utils.py # Projection / vertex paint helpers
├── tapestry_integration/ # Tapestry AI integration
│ ├── __init__.py # Register hub
│ ├── properties.py # Tapestry settings PropertyGroups
│ ├── operators.py # Export / submit operators
│ ├── ui.py # Tapestry panel (renamed from ui_panel.py)
│ ├── graph_bridge.py # Bridge between EM graph and Tapestry payload
│ ├── network_client.py # HTTP client for Tapestry service
│ ├── render_utils.py # Render helpers
│ └── semantic_extractor.py # Semantic data extraction from the graph
├── server.py # TCP Server panel (single-file, ~160 lines)
├── import_operators/ # Import functionality
│ ├── __init__.py # Re-exports
│ ├── importer_registry.py # Importer plug-in registry
│ ├── importer_graphml.py # GraphML importer
│ ├── importer_xlsx.py # XLSX importer
│ ├── import_EMdb.py # EMdb importer
│ └── import_validator.py # Input validation helpers
├── export_operators/ # Exporter pool (invoked by export_manager and elsewhere)
│ ├── __init__.py # Re-exports from heriverse + exporter_graphml
│ ├── exporter_graphml.py # GraphML save / save-as (invoked from EM tree header)
│ └── heriverse/ # Heriverse exporter subpackage
│ ├── __init__.py # Register + re-exports
│ ├── utils.py # clean_filename + layer-collection helpers
│ ├── gltf.py # export_gltf_with_animation_support wrapper
│ ├── json_export.py # HERIVERSE_OT_export_json (export.heriversejson)
│ ├── collections_op.py # HERIVERSE_OT_make_collections_visible
│ └── operator.py # EXPORT_OT_heriverse (main export.heriverse operator)
└── s3Dgraphy/ # Core graph library (bundled)
Experimental Features
^^^^^^^^^^^^^^^^^^^^^
The following panels/sections are gated behind
``scene.em_tools.experimental_features`` and render with a red header plus the
``EXPERIMENTAL`` icon:
- ``em_statistics`` — Export statistics (Experimental)
- ``proxy_inflate_manager`` — Proxy Inflate Manager (Experimental)
- ``proxy_to_rm_projection`` — RM Coloring (Experimental), drawn inline inside
the Visual Manager panel
- ``export_manager/providers/heriverse`` uses experimental flags for some
advanced options but the provider itself is not gated
Further Reading
---------------
- :doc:`/installation` - Installation and setup
- :doc:`/usage_examples` - Practical examples
- :doc:`/panels/index` - UI and structure overview
- `GitHub Repository `_ - Source code
- `s3dgraphy on PyPI `_ - Graph library documentation