{
  "modules": {
    "__init__.py": {
      "path": "__init__.py",
      "lines": 49,
      "functions": [
        "classFactory(1 args)"
      ],
      "classes": [],
      "imports": [
        "__future__.annotations",
        "typing.TYPE_CHECKING",
        "qgis.gui.QgsInterface",
        "sec_interp_plugin.SecInterp"
      ],
      "complexity": 1,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {
          "classFactory": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 1,
        "typed_functions": 0,
        "coverage": 0.0
      },
      "halstead": {
        "vocabulary": 8,
        "length": 8,
        "volume": 24,
        "difficulty": 1.0,
        "effort": 24.0
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 3,
        "i18n_score": 0.0
      },
      "keywords": [
        "secinterp",
        "qgis",
        "plugin",
        "iface",
        "this"
      ],
      "file_size_kb": 1.8232421875,
      "syntax_error": false
    },
    "core/__init__.py": {
      "path": "core/__init__.py",
      "lines": 5,
      "functions": [],
      "classes": [],
      "imports": [],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {}
      },
      "has_main": false,
      "file_size_kb": 0.091796875,
      "syntax_error": false
    },
    "core/algorithms.py": {
      "path": "core/algorithms.py",
      "lines": 13,
      "functions": [],
      "classes": [],
      "imports": [],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {}
      },
      "has_main": false,
      "file_size_kb": 0.4306640625,
      "syntax_error": false
    },
    "core/controller.py": {
      "path": "core/controller.py",
      "lines": 286,
      "functions": [
        "__init__(1 args)",
        "connect_layer_notifications(2 args)",
        "get_cached_data(2 args)",
        "cache_data(3 args)",
        "generate_profile_data(2 args)",
        "_get_cache_sub_key(2 args)",
        "_process_topography(4 args)",
        "_process_geology(4 args)",
        "_process_structures(4 args)",
        "_process_drillholes(4 args)"
      ],
      "classes": [
        "ProfileController"
      ],
      "imports": [
        "__future__.annotations",
        "time",
        "typing.Any",
        "sec_interp.core.utils",
        "sec_interp.core.config.ConfigService",
        "sec_interp.core.data_cache.DataCache",
        "sec_interp.core.exceptions.ProcessingError",
        "sec_interp.core.services.DrillholeService",
        "sec_interp.core.services.GeologyService",
        "sec_interp.core.services.ProfileService",
        "sec_interp.core.services.StructureService",
        "sec_interp.core.types.PreviewParams",
        "sec_interp.logger_config.get_logger",
        "hashlib",
        "qgis.core.QgsMapLayer"
      ],
      "complexity": 27,
      "docstrings": {
        "module": true,
        "classes": {
          "ProfileController": true
        },
        "functions": {
          "__init__": true,
          "connect_layer_notifications": true,
          "get_cached_data": true,
          "cache_data": true,
          "generate_profile_data": true,
          "_get_cache_sub_key": true,
          "_process_topography": true,
          "_process_geology": true,
          "_process_structures": true,
          "_process_drillholes": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 10,
        "typed_functions": 9,
        "coverage": 90.0
      },
      "halstead": {
        "vocabulary": 104,
        "length": 424,
        "volume": 2544,
        "difficulty": 13.68,
        "effort": 34789.86
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 58,
        "i18n_score": 0.0
      },
      "keywords": [
        "params",
        "data",
        "messages",
        "data_cache",
        "list"
      ],
      "file_size_kb": 11.18359375,
      "syntax_error": false
    },
    "core/data_cache.py": {
      "path": "core/data_cache.py",
      "lines": 157,
      "functions": [
        "__init__(2 args)",
        "get_cache_key(2 args)",
        "get(3 args)",
        "set(5 args)",
        "invalidate(3 args)",
        "clear(1 args)",
        "get_metadata(3 args)",
        "get_cache_size(1 args)"
      ],
      "classes": [
        "DataCache(ICacheService)"
      ],
      "imports": [
        "hashlib",
        "time",
        "typing.Any",
        "sec_interp.core.interfaces.cache_interface.ICacheService",
        "sec_interp.logger_config.get_logger"
      ],
      "complexity": 22,
      "docstrings": {
        "module": true,
        "classes": {
          "DataCache": true
        },
        "functions": {
          "__init__": true,
          "get_cache_key": true,
          "get": true,
          "set": true,
          "invalidate": true,
          "clear": true,
          "get_metadata": true,
          "get_cache_size": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 8,
        "typed_functions": 8,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 68,
        "length": 221,
        "volume": 1326,
        "difficulty": 19.07,
        "effort": 25288.71
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 49,
        "i18n_score": 0.0
      },
      "keywords": [
        "bucket",
        "_buckets",
        "data",
        "cache",
        "metadata"
      ],
      "file_size_kb": 4.841796875,
      "syntax_error": false
    },
    "core/services/__init__.py": {
      "path": "core/services/__init__.py",
      "lines": 20,
      "functions": [],
      "classes": [],
      "imports": [
        "drillhole_service.DrillholeService",
        "geology_service.GeologyService",
        "profile_service.ProfileService",
        "structure_service.StructureService"
      ],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {}
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 0,
        "typed_functions": 0,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 6,
        "length": 6,
        "volume": 0,
        "difficulty": 0,
        "effort": 0
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 5,
        "i18n_score": 0.0
      },
      "keywords": [
        "data",
        "profileservice",
        "geologyservice",
        "structureservice",
        "package"
      ],
      "file_size_kb": 0.5615234375,
      "syntax_error": false
    },
    "core/performance_metrics.py": {
      "path": "core/performance_metrics.py",
      "lines": 328,
      "functions": [
        "format_duration(1 args)",
        "performance_monitor(1 args)",
        "__init__(1 args)",
        "record_timing(3 args)",
        "record_count(3 args)",
        "add_metadata(3 args)",
        "get_summary(1 args)",
        "clear(1 args)",
        "__init__(4 args)",
        "__enter__(1 args)",
        "__exit__(4 args)",
        "__init__(2 args)",
        "_setup_logger(2 args)",
        "measure_operation(2 args)",
        "_get_memory_usage(1 args)",
        "get_operation_stats(2 args)",
        "wrapper"
      ],
      "classes": [
        "MetricsCollector",
        "PerformanceTimer",
        "PerformanceMonitor"
      ],
      "imports": [
        "__future__.annotations",
        "time",
        "collections.abc.Callable",
        "collections.abc.Generator",
        "contextlib.contextmanager",
        "typing.Any",
        "sec_interp.logger_config.get_logger",
        "logging",
        "tracemalloc",
        "functools.wraps",
        "psutil"
      ],
      "complexity": 17,
      "docstrings": {
        "module": true,
        "classes": {
          "MetricsCollector": true,
          "PerformanceTimer": true,
          "PerformanceMonitor": true
        },
        "functions": {
          "format_duration": true,
          "performance_monitor": true,
          "__init__": true,
          "record_timing": true,
          "record_count": true,
          "add_metadata": true,
          "get_summary": true,
          "clear": true,
          "__enter__": true,
          "__exit__": true,
          "_setup_logger": true,
          "measure_operation": true,
          "_get_memory_usage": true,
          "get_operation_stats": true,
          "wrapper": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 17,
        "typed_functions": 12,
        "coverage": 70.58823529411765
      },
      "halstead": {
        "vocabulary": 131,
        "length": 351,
        "volume": 2457,
        "difficulty": 14.97,
        "effort": 36793.06
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 72,
        "i18n_score": 0.0
      },
      "keywords": [
        "operation_name",
        "metrics",
        "duration",
        "args",
        "performance"
      ],
      "file_size_kb": 9.099609375,
      "syntax_error": false
    },
    "core/services/drillhole_service.py": {
      "path": "core/services/drillhole_service.py",
      "lines": 587,
      "functions": [
        "project_collars(14 args)",
        "process_intervals(16 args)",
        "_fetch_bulk_data(4 args)",
        "_process_single_hole(12 args)",
        "_build_collar_coord_map(6 args)",
        "_extract_point(5 args)",
        "_get_survey_data(4 args)",
        "_get_interval_data(4 args)",
        "_interpolate_hole_intervals(4 args)",
        "_project_single_collar(13 args)",
        "_get_collar_info(9 args)",
        "_sample_dem(3 args)",
        "_safe_process_single_hole(14 args)",
        "_extract_data_tuple(4 args)"
      ],
      "classes": [
        "DrillholeService(IDrillholeService)"
      ],
      "imports": [
        "__future__.annotations",
        "contextlib",
        "typing.Any",
        "qgis.core.QgsCoordinateReferenceSystem",
        "qgis.core.QgsDistanceArea",
        "qgis.core.QgsFeature",
        "qgis.core.QgsFeatureRequest",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsPointXY",
        "qgis.core.QgsRaster",
        "qgis.core.QgsRasterLayer",
        "qgis.core.QgsVectorLayer",
        "sec_interp.core.utils",
        "sec_interp.core.exceptions.DataMissingError",
        "sec_interp.core.exceptions.GeometryError",
        "sec_interp.core.interfaces.drillhole_interface.IDrillholeService",
        "sec_interp.core.types.GeologySegment",
        "sec_interp.logger_config.get_logger",
        "traceback"
      ],
      "complexity": 69,
      "docstrings": {
        "module": true,
        "classes": {
          "DrillholeService": true
        },
        "functions": {
          "project_collars": true,
          "process_intervals": true,
          "_fetch_bulk_data": true,
          "_process_single_hole": true,
          "_build_collar_coord_map": true,
          "_extract_point": true,
          "_get_survey_data": true,
          "_get_interval_data": true,
          "_interpolate_hole_intervals": true,
          "_project_single_collar": true,
          "_get_collar_info": true,
          "_sample_dem": true,
          "_safe_process_single_hole": true,
          "_extract_data_tuple": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 14,
        "typed_functions": 14,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 193,
        "length": 830,
        "volume": 5810,
        "difficulty": 33.27,
        "effort": 193272.77
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 62,
        "i18n_score": 0.0
      },
      "keywords": [
        "float",
        "hole_id",
        "list",
        "tuple",
        "layer"
      ],
      "file_size_kb": 19.8017578125,
      "syntax_error": false
    },
    "core/services/geology_service.py": {
      "path": "core/services/geology_service.py",
      "lines": 510,
      "functions": [
        "generate_geological_profile(6 args)",
        "prepare_task_input(6 args)",
        "process_task_data(3 args)",
        "_process_detached_intersection(9 args)",
        "_create_segment_from_detached(9 args)",
        "_generate_master_profile_data(6 args)",
        "_process_intersection_geometry(9 args)",
        "_create_segment_from_geometry(9 args)",
        "_extract_line_info(2 args)",
        "_convert_to_segment_points(6 args)"
      ],
      "classes": [
        "GeologyService(IGeologyService)"
      ],
      "imports": [
        "__future__.annotations",
        "typing.Any",
        "qgis.core.QgsCoordinateReferenceSystem",
        "qgis.core.QgsDistanceArea",
        "qgis.core.QgsFeature",
        "qgis.core.QgsFeatureRequest",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsPointXY",
        "qgis.core.QgsRasterLayer",
        "qgis.core.QgsVectorLayer",
        "qgis.core.QgsWkbTypes",
        "sec_interp.core.utils",
        "sec_interp.core.exceptions.DataMissingError",
        "sec_interp.core.exceptions.GeometryError",
        "sec_interp.core.interfaces.geology_interface.IGeologyService",
        "sec_interp.core.performance_metrics.performance_monitor",
        "sec_interp.core.types.GeologyData",
        "sec_interp.core.types.GeologySegment",
        "sec_interp.core.types.GeologyTaskInput",
        "sec_interp.core.utils.sampling.interpolate_elevation",
        "sec_interp.logger_config.get_logger"
      ],
      "complexity": 49,
      "docstrings": {
        "module": true,
        "classes": {
          "GeologyService": true
        },
        "functions": {
          "generate_geological_profile": true,
          "prepare_task_input": true,
          "process_task_data": true,
          "_process_detached_intersection": true,
          "_create_segment_from_detached": true,
          "_generate_master_profile_data": true,
          "_process_intersection_geometry": true,
          "_create_segment_from_geometry": true,
          "_extract_line_info": true,
          "_convert_to_segment_points": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 10,
        "typed_functions": 10,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 136,
        "length": 608,
        "volume": 4256,
        "difficulty": 38.29,
        "effort": 162944.0
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 38,
        "i18n_score": 0.0
      },
      "keywords": [
        "float",
        "list",
        "line_start",
        "master_profile_data",
        "master_grid_dists"
      ],
      "file_size_kb": 18.4619140625,
      "syntax_error": false
    },
    "core/services/parallel_geology.py": {
      "path": "core/services/parallel_geology.py",
      "lines": 167,
      "functions": [
        "__init__(3 args)",
        "run(1 args)",
        "__init__(1 args)",
        "_get_optimal_thread_count(1 args)",
        "process_profiles_parallel(3 args)",
        "_on_chunk_finished(2 args)",
        "_cleanup_thread(2 args)",
        "_on_chunk_progress(2 args)",
        "_on_chunk_error(2 args)",
        "_process_profile_chunk(2 args)"
      ],
      "classes": [
        "GeologyProcessingThread(QThread)",
        "ParallelGeologyService(QObject)"
      ],
      "imports": [
        "concurrent.futures.ThreadPoolExecutor",
        "threading",
        "typing.Any",
        "typing.Callable",
        "typing.List",
        "qgis.PyQt.QtCore.QObject",
        "qgis.PyQt.QtCore.QThread",
        "qgis.PyQt.QtCore.pyqtSignal",
        "sec_interp.logger_config.get_logger",
        "os"
      ],
      "complexity": 18,
      "docstrings": {
        "module": true,
        "classes": {
          "GeologyProcessingThread": true,
          "ParallelGeologyService": true
        },
        "functions": {
          "__init__": false,
          "run": true,
          "_get_optimal_thread_count": true,
          "process_profiles_parallel": true,
          "_on_chunk_finished": true,
          "_cleanup_thread": true,
          "_on_chunk_progress": true,
          "_on_chunk_error": true,
          "_process_profile_chunk": true
        }
      },
      "has_main": false,
      "file_size_kb": 5.62109375,
      "syntax_error": false
    },
    "core/services/profile_service.py": {
      "path": "core/services/profile_service.py",
      "lines": 87,
      "functions": [
        "generate_topographic_profile(5 args)"
      ],
      "classes": [
        "ProfileService(IProfileService)"
      ],
      "imports": [
        "qgis.core.QgsRasterLayer",
        "qgis.core.QgsVectorLayer",
        "sec_interp.core.utils",
        "sec_interp.core.exceptions.DataMissingError",
        "sec_interp.core.exceptions.GeometryError",
        "sec_interp.core.interfaces.profile_interface.IProfileService",
        "sec_interp.core.types.ProfileData",
        "sec_interp.logger_config.get_logger"
      ],
      "complexity": 4,
      "docstrings": {
        "module": true,
        "classes": {
          "ProfileService": true
        },
        "functions": {
          "generate_topographic_profile": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 1,
        "typed_functions": 1,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 38,
        "length": 60,
        "volume": 300,
        "difficulty": 4.88,
        "effort": 1462.5
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 9,
        "i18n_score": 0.0
      },
      "keywords": [
        "line",
        "line_lyr",
        "layer",
        "profile",
        "topographic"
      ],
      "file_size_kb": 3.373046875,
      "syntax_error": false
    },
    "core/services/structure_service.py": {
      "path": "core/services/structure_service.py",
      "lines": 331,
      "functions": [
        "project_structures(9 args)",
        "_create_buffer_zone(4 args)",
        "_filter_structures(4 args)",
        "_process_single_structure(10 args)",
        "_extract_line_info(2 args)",
        "_sample_elevation(4 args)",
        "_parse_structural_data(5 args)"
      ],
      "classes": [
        "StructureService(IStructureService)"
      ],
      "imports": [
        "__future__.annotations",
        "collections.abc.Iterator",
        "qgis.core.QgsCoordinateReferenceSystem",
        "qgis.core.QgsDistanceArea",
        "qgis.core.QgsFeature",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsPointXY",
        "qgis.core.QgsRaster",
        "qgis.core.QgsRasterLayer",
        "qgis.core.QgsVectorLayer",
        "sec_interp.core.utils",
        "sec_interp.core.exceptions.DataMissingError",
        "sec_interp.core.exceptions.GeometryError",
        "sec_interp.core.exceptions.ProcessingError",
        "sec_interp.core.interfaces.structure_interface.IStructureService",
        "sec_interp.core.types.StructureData",
        "sec_interp.core.types.StructureMeasurement",
        "sec_interp.logger_config.get_logger"
      ],
      "complexity": 24,
      "docstrings": {
        "module": true,
        "classes": {
          "StructureService": true
        },
        "functions": {
          "project_structures": true,
          "_create_buffer_zone": true,
          "_filter_structures": true,
          "_process_single_structure": true,
          "_extract_line_info": true,
          "_sample_elevation": true,
          "_parse_structural_data": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 7,
        "typed_functions": 7,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 108,
        "length": 301,
        "volume": 1806,
        "difficulty": 14.8,
        "effort": 26726.94
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 30,
        "i18n_score": 0.0
      },
      "keywords": [
        "line",
        "line_geom",
        "layer",
        "section",
        "strike"
      ],
      "file_size_kb": 11.3291015625,
      "syntax_error": false
    },
    "core/types.py": {
      "path": "core/types.py",
      "lines": 374,
      "functions": [
        "validate(1 args)",
        "_validate_core_params(1 args)",
        "_validate_geology_params(1 args)",
        "_validate_structure_params(1 args)",
        "_validate_drillhole_params(1 args)",
        "_validate_survey_params(1 args)",
        "_validate_interval_params(1 args)",
        "get_elevation_range(1 args)",
        "get_distance_range(1 args)"
      ],
      "classes": [
        "FieldType(IntEnum)",
        "StructureMeasurement",
        "GeologySegment",
        "InterpretationPolygon",
        "InterpretationPolygon25D",
        "GeologyTaskInput",
        "PreviewParams",
        "PreviewResult"
      ],
      "imports": [
        "__future__.annotations",
        "dataclasses.dataclass",
        "dataclasses.field",
        "enum.IntEnum",
        "typing.Any",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsPointXY",
        "qgis.core.QgsRasterLayer",
        "qgis.core.QgsVectorLayer",
        "sec_interp.core.exceptions.ValidationError",
        "sec_interp.core.performance_metrics.MetricsCollector"
      ],
      "complexity": 44,
      "docstrings": {
        "module": true,
        "classes": {
          "FieldType": true,
          "StructureMeasurement": true,
          "GeologySegment": true,
          "InterpretationPolygon": true,
          "InterpretationPolygon25D": true,
          "GeologyTaskInput": true,
          "PreviewParams": true,
          "PreviewResult": true
        },
        "functions": {
          "validate": true,
          "_validate_core_params": true,
          "_validate_geology_params": true,
          "_validate_structure_params": true,
          "_validate_drillhole_params": true,
          "_validate_survey_params": true,
          "_validate_interval_params": true,
          "get_elevation_range": true,
          "get_distance_range": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 9,
        "typed_functions": 9,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 169,
        "length": 533,
        "volume": 3731,
        "difficulty": 13.99,
        "effort": 52210.53
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 61,
        "i18n_score": 0.0
      },
      "keywords": [
        "float",
        "name",
        "field",
        "layer",
        "attributes"
      ],
      "file_size_kb": 12.5849609375,
      "syntax_error": false
    },
    "core/utils/__init__.py": {
      "path": "core/utils/__init__.py",
      "lines": 103,
      "functions": [],
      "classes": [],
      "imports": [
        "__future__.annotations",
        "drillhole.calculate_drillhole_trajectory",
        "drillhole.interpolate_intervals_on_trajectory",
        "drillhole.project_trajectory_to_section",
        "geology.calculate_apparent_dip",
        "geometry.create_buffer_geometry",
        "geometry.create_memory_layer",
        "geometry.densify_line_by_interval",
        "geometry.filter_features_by_buffer",
        "geometry.get_line_vertices",
        "io.create_shapefile_writer",
        "parsing.cardinal_to_azimuth",
        "parsing.parse_dip",
        "parsing.parse_strike",
        "rendering.calculate_bounds",
        "rendering.calculate_interval",
        "rendering.create_coordinate_transform",
        "sampling.interpolate_elevation",
        "sampling.prepare_profile_context",
        "sampling.sample_elevation_along_line",
        "spatial.calculate_line_azimuth",
        "spatial.calculate_step_size",
        "spatial.create_distance_area",
        "spatial.get_line_start_point"
      ],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {}
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 0,
        "typed_functions": 0,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 25,
        "length": 26,
        "volume": 0,
        "difficulty": 0,
        "effort": 0
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 25,
        "i18n_score": 0.0
      },
      "keywords": [
        "geometry",
        "spatial",
        "sampling",
        "parsing",
        "utilities"
      ],
      "file_size_kb": 2.2119140625,
      "syntax_error": false
    },
    "core/utils/geology.py": {
      "path": "core/utils/geology.py",
      "lines": 39,
      "functions": [
        "calculate_apparent_dip(3 args)"
      ],
      "classes": [],
      "imports": [
        "math"
      ],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {
          "calculate_apparent_dip": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 1,
        "typed_functions": 1,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 14,
        "length": 27,
        "volume": 81,
        "difficulty": 3.27,
        "effort": 265.09
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 3,
        "i18n_score": 0.0
      },
      "keywords": [
        "math",
        "section",
        "plane",
        "strike",
        "alpha"
      ],
      "file_size_kb": 1.337890625,
      "syntax_error": false
    },
    "core/utils/geometry.py": {
      "path": "core/utils/geometry.py",
      "lines": 31,
      "functions": [],
      "classes": [],
      "imports": [
        "geometry_utils.extraction.extract_all_vertices",
        "geometry_utils.extraction.get_line_vertices",
        "geometry_utils.filtering.filter_features_by_buffer",
        "geometry_utils.processing.create_buffer_geometry",
        "geometry_utils.processing.create_memory_layer",
        "geometry_utils.processing.densify_line_by_interval",
        "geometry_utils.processing.run_geometry_operation"
      ],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {}
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 0,
        "typed_functions": 0,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 9,
        "length": 10,
        "volume": 0,
        "difficulty": 0,
        "effort": 0
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 9,
        "i18n_score": 0.0
      },
      "keywords": [
        "geometry_utils",
        "run_geometry_operation",
        "geometry",
        "facade",
        "extract_all_vertices"
      ],
      "file_size_kb": 0.712890625,
      "syntax_error": false
    },
    "core/utils/io.py": {
      "path": "core/utils/io.py",
      "lines": 58,
      "functions": [
        "create_shapefile_writer(4 args)"
      ],
      "classes": [],
      "imports": [
        "pathlib.Path",
        "qgis.core.QgsCoordinateReferenceSystem",
        "qgis.core.QgsFields",
        "qgis.core.QgsProject",
        "qgis.core.QgsVectorFileWriter",
        "qgis.core.QgsWkbTypes"
      ],
      "complexity": 1,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {
          "create_shapefile_writer": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 1,
        "typed_functions": 1,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 24,
        "length": 36,
        "volume": 144,
        "difficulty": 3.2,
        "effort": 460.8
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 6,
        "i18n_score": 0.0
      },
      "keywords": [
        "qgsvectorfilewriter",
        "writer",
        "output_path",
        "fields",
        "create"
      ],
      "file_size_kb": 1.54296875,
      "syntax_error": false
    },
    "core/utils/parsing.py": {
      "path": "core/utils/parsing.py",
      "lines": 130,
      "functions": [
        "parse_strike(1 args)",
        "parse_dip(1 args)",
        "cardinal_to_azimuth(1 args)"
      ],
      "classes": [],
      "imports": [
        "__future__.annotations",
        "re",
        "typing.Any"
      ],
      "complexity": 18,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {
          "parse_strike": true,
          "parse_dip": true,
          "cardinal_to_azimuth": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 3,
        "typed_functions": 3,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 60,
        "length": 171,
        "volume": 855,
        "difficulty": 15.04,
        "effort": 12859.9
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 43,
        "i18n_score": 0.0
      },
      "keywords": [
        "value",
        "float",
        "strike",
        "text",
        "match"
      ],
      "file_size_kb": 2.953125,
      "syntax_error": false
    },
    "core/utils/rendering.py": {
      "path": "core/utils/rendering.py",
      "lines": 127,
      "functions": [
        "calculate_bounds(2 args)",
        "create_coordinate_transform(5 args)",
        "calculate_interval(1 args)",
        "transform(2 args)"
      ],
      "classes": [],
      "imports": [
        "__future__.annotations",
        "math",
        "collections.abc.Callable",
        "sec_interp.core.types.GeologySegment"
      ],
      "complexity": 11,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {
          "calculate_bounds": true,
          "create_coordinate_transform": true,
          "calculate_interval": true,
          "transform": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 4,
        "typed_functions": 4,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 69,
        "length": 213,
        "volume": 1278,
        "difficulty": 15.74,
        "effort": 20117.48
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 28,
        "i18n_score": 0.0
      },
      "keywords": [
        "float",
        "min_d",
        "max_d",
        "min_e",
        "bounds"
      ],
      "file_size_kb": 3.673828125,
      "syntax_error": false
    },
    "core/utils/sampling.py": {
      "path": "core/utils/sampling.py",
      "lines": 154,
      "functions": [
        "sample_elevation_along_line(6 args)",
        "prepare_profile_context(1 args)",
        "interpolate_elevation(2 args)"
      ],
      "classes": [],
      "imports": [
        "__future__.annotations",
        "qgis.core.QgsDistanceArea",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsPointXY",
        "qgis.core.QgsRasterLayer",
        "qgis.core.QgsVectorLayer",
        "sec_interp.logger_config.get_logger",
        "geometry.densify_line_by_interval",
        "geometry.get_line_vertices",
        "spatial.create_distance_area",
        "spatial.get_line_start_point",
        "bisect"
      ],
      "complexity": 17,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {
          "sample_elevation_along_line": true,
          "prepare_profile_context": true,
          "interpolate_elevation": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 3,
        "typed_functions": 3,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 78,
        "length": 179,
        "volume": 1074,
        "difficulty": 18.58,
        "effort": 19955.61
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 9,
        "i18n_score": 0.0
      },
      "keywords": [
        "geometry",
        "distance",
        "elevation",
        "topo_data",
        "line"
      ],
      "file_size_kb": 4.4619140625,
      "syntax_error": false
    },
    "core/utils/spatial.py": {
      "path": "core/utils/spatial.py",
      "lines": 129,
      "functions": [
        "calculate_line_azimuth(1 args)",
        "calculate_step_size(2 args)",
        "get_line_start_point(1 args)",
        "create_distance_area(1 args)"
      ],
      "classes": [],
      "imports": [
        "math",
        "qgis.core.QgsCoordinateReferenceSystem",
        "qgis.core.QgsDistanceArea",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsPointXY",
        "qgis.core.QgsProject",
        "qgis.core.QgsWkbTypes"
      ],
      "complexity": 14,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {
          "calculate_line_azimuth": true,
          "calculate_step_size": true,
          "get_line_start_point": true,
          "create_distance_area": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 4,
        "typed_functions": 3,
        "coverage": 75.0
      },
      "halstead": {
        "vocabulary": 51,
        "length": 129,
        "volume": 645,
        "difficulty": 17.28,
        "effort": 11143.22
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 9,
        "i18n_score": 0.0
      },
      "keywords": [
        "geometry",
        "line",
        "azimuth",
        "geom",
        "line_pts"
      ],
      "file_size_kb": 3.5439453125,
      "syntax_error": false
    },
    "core/validation.py": {
      "path": "core/validation.py",
      "lines": 49,
      "functions": [],
      "classes": [],
      "imports": [
        "validation.validate_numeric_input",
        "validation.validate_integer_input",
        "validation.validate_angle_range",
        "validation.validate_field_exists",
        "validation.validate_field_type",
        "validation.validate_layer_exists",
        "validation.validate_layer_has_features",
        "validation.validate_layer_geometry",
        "validation.validate_raster_band",
        "validation.validate_structural_requirements",
        "validation.validate_layer_configuration",
        "validation.validate_crs_compatibility",
        "validation.validate_safe_output_path",
        "validation.validate_output_path",
        "validation.validate_reasonable_ranges",
        "validation.ValidationParams",
        "validation.ProjectValidator"
      ],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {}
      },
      "has_main": false,
      "file_size_kb": 1.3203125,
      "syntax_error": false
    },
    "drillsec/__init__.py": {
      "path": "drillsec/__init__.py",
      "lines": 17,
      "functions": [
        "classFactory(1 args)"
      ],
      "classes": [],
      "imports": [
        "drillsec.DrillSecPlugin"
      ],
      "complexity": 0,
      "docstrings": {
        "module": false,
        "classes": {},
        "functions": {
          "classFactory": false
        }
      },
      "has_main": false,
      "file_size_kb": 0.6103515625,
      "syntax_error": false
    },
    "drillsec/drillsec.py": {
      "path": "drillsec/drillsec.py",
      "lines": 327,
      "functions": [
        "__init__(2 args)",
        "log_message(3 args)",
        "initGui(1 args)",
        "update_collar_ui(1 args)",
        "toggle_coordinate_fields(2 args)",
        "unload(1 args)",
        "run(1 args)",
        "generate_profile(1 args)",
        "_render_preview(3 args)",
        "export_shapefiles(1 args)"
      ],
      "classes": [
        "DrillSecPlugin"
      ],
      "imports": [
        "os.path",
        "qgis.core.Qgis",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsMessageLog",
        "qgis.core.QgsPointXY",
        "qgis.core.QgsRaster",
        "qgis.core.QgsWkbTypes",
        "qgis.PyQt.QtGui.QIcon",
        "qgis.PyQt.QtWidgets.QAction",
        "qgis.PyQt.QtWidgets.QFileDialog",
        "si_core_utils",
        "drilsec_dialog.DrillSecDialog",
        "preview_renderer.PreviewRenderer",
        "sec_interp.core.controller.ProfileController",
        "datetime.datetime"
      ],
      "complexity": 46,
      "docstrings": {
        "module": false,
        "classes": {
          "DrillSecPlugin": false
        },
        "functions": {
          "__init__": false,
          "log_message": true,
          "initGui": false,
          "update_collar_ui": false,
          "toggle_coordinate_fields": false,
          "unload": false,
          "run": false,
          "generate_profile": false,
          "_render_preview": true,
          "export_shapefiles": true
        }
      },
      "has_main": false,
      "file_size_kb": 13.5869140625,
      "syntax_error": false
    },
    "drillsec/drilsec_dialog.py": {
      "path": "drillsec/drilsec_dialog.py",
      "lines": 250,
      "functions": [
        "__init__(2 args)"
      ],
      "classes": [
        "DrillSecDialog(QtWidgets.QDialog)"
      ],
      "imports": [
        "qgis.core.QgsMapLayerProxyModel",
        "qgis.gui.QgsFieldComboBox",
        "qgis.gui.QgsMapCanvas",
        "qgis.gui.QgsMapLayerComboBox",
        "qgis.PyQt.QtWidgets"
      ],
      "complexity": 0,
      "docstrings": {
        "module": false,
        "classes": {
          "DrillSecDialog": true
        },
        "functions": {
          "__init__": true
        }
      },
      "has_main": false,
      "file_size_kb": 11.7158203125,
      "syntax_error": false
    },
    "drillsec/logger_config.py": {
      "path": "drillsec/logger_config.py",
      "lines": 69,
      "functions": [
        "get_logger(1 args)",
        "__init__(2 args)",
        "emit(2 args)"
      ],
      "classes": [
        "QgsLogHandler(logging.Handler)"
      ],
      "imports": [
        "logging",
        "qgis.core.Qgis",
        "qgis.core.QgsMessageLog"
      ],
      "complexity": 7,
      "docstrings": {
        "module": true,
        "classes": {
          "QgsLogHandler": true
        },
        "functions": {
          "get_logger": true,
          "__init__": false,
          "emit": true
        }
      },
      "has_main": false,
      "file_size_kb": 1.9326171875,
      "syntax_error": false
    },
    "drillsec/preview_renderer.py": {
      "path": "drillsec/preview_renderer.py",
      "lines": 723,
      "functions": [
        "__init__(2 args)",
        "_get_color_for_unit(2 args)",
        "_create_topo_layer(3 args)",
        "_create_geol_layer(3 args)",
        "_create_struct_layer(4 args)",
        "_interpolate_elevation(3 args)",
        "_get_nice_interval(2 args)",
        "_create_axes_layer(3 args)",
        "_create_axes_labels_layer(3 args)",
        "render(5 args)",
        "export_to_image(7 args)",
        "draw_legend(3 args)"
      ],
      "classes": [
        "PreviewRenderer"
      ],
      "imports": [
        "math",
        "qgis.core.QgsCategorizedSymbolRenderer",
        "qgis.core.QgsFeature",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsLineString",
        "qgis.core.QgsLineSymbol",
        "qgis.core.QgsMapRendererCustomPainterJob",
        "qgis.core.QgsMapSettings",
        "qgis.core.QgsMarkerSymbol",
        "qgis.core.QgsPalLayerSettings",
        "qgis.core.QgsPointXY",
        "qgis.core.QgsProject",
        "qgis.core.QgsRendererCategory",
        "qgis.core.QgsSingleSymbolRenderer",
        "qgis.core.QgsTextFormat",
        "qgis.core.QgsVectorLayer",
        "qgis.core.QgsVectorLayerSimpleLabeling",
        "qgis.PyQt.QtCore.QRectF",
        "qgis.PyQt.QtCore.QSize",
        "qgis.PyQt.QtCore.Qt",
        "qgis.PyQt.QtGui.QColor",
        "qgis.PyQt.QtGui.QFont",
        "qgis.PyQt.QtGui.QImage",
        "qgis.PyQt.QtGui.QPainter",
        "qgis.PyQt.QtGui.QPen",
        "logger_config.get_logger"
      ],
      "complexity": 78,
      "docstrings": {
        "module": true,
        "classes": {
          "PreviewRenderer": true
        },
        "functions": {
          "__init__": true,
          "_get_color_for_unit": true,
          "_create_topo_layer": true,
          "_create_geol_layer": true,
          "_create_struct_layer": true,
          "_interpolate_elevation": true,
          "_get_nice_interval": true,
          "_create_axes_layer": true,
          "_create_axes_labels_layer": true,
          "render": true,
          "export_to_image": true,
          "draw_legend": true
        }
      },
      "has_main": false,
      "file_size_kb": 23.76171875,
      "syntax_error": false
    },
    "drillsec/si_core_utils.py": {
      "path": "drillsec/si_core_utils.py",
      "lines": 812,
      "functions": [
        "calculate_line_azimuth(1 args)",
        "calculate_step_size(2 args)",
        "get_line_start_point(1 args)",
        "create_distance_area(1 args)",
        "sample_elevation_along_line(5 args)",
        "create_shapefile_writer(4 args)",
        "prepare_profile_context(1 args)",
        "calculate_apparent_dip(3 args)",
        "calculate_bounds(2 args)",
        "create_coordinate_transform(5 args)",
        "calculate_interval(1 args)",
        "interpolate_elevation(2 args)",
        "parse_strike(1 args)",
        "parse_dip(1 args)",
        "cardinal_to_azimuth(1 args)",
        "calculate_drillhole_trajectory(5 args)",
        "project_trajectory_to_section(4 args)",
        "interpolate_intervals_on_trajectory(3 args)",
        "transform(2 args)",
        "__init__(4 args)",
        "export_profile_data(4 args)",
        "_export_topography(3 args)",
        "_export_traces(3 args)",
        "_export_geology(3 args)",
        "_export_collars(3 args)"
      ],
      "classes": [
        "ShapefileExporter"
      ],
      "imports": [
        "math",
        "re",
        "qgis.core.QgsCoordinateReferenceSystem",
        "qgis.core.QgsDistanceArea",
        "qgis.core.QgsFeature",
        "qgis.core.QgsField",
        "qgis.core.QgsFields",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsPointXY",
        "qgis.core.QgsProject",
        "qgis.core.QgsVectorFileWriter",
        "qgis.core.QgsWkbTypes",
        "qgis.PyQt.QtCore.QVariant"
      ],
      "complexity": 94,
      "docstrings": {
        "module": true,
        "classes": {
          "ShapefileExporter": true
        },
        "functions": {
          "calculate_line_azimuth": true,
          "calculate_step_size": true,
          "get_line_start_point": true,
          "create_distance_area": true,
          "sample_elevation_along_line": true,
          "create_shapefile_writer": true,
          "prepare_profile_context": true,
          "calculate_apparent_dip": true,
          "calculate_bounds": true,
          "create_coordinate_transform": true,
          "calculate_interval": true,
          "interpolate_elevation": true,
          "parse_strike": true,
          "parse_dip": true,
          "cardinal_to_azimuth": true,
          "calculate_drillhole_trajectory": true,
          "project_trajectory_to_section": true,
          "interpolate_intervals_on_trajectory": true,
          "transform": false,
          "__init__": true,
          "export_profile_data": true,
          "_export_topography": true,
          "_export_traces": true,
          "_export_geology": true,
          "_export_collars": true
        }
      },
      "has_main": false,
      "file_size_kb": 24.3955078125,
      "syntax_error": false
    },
    "drillsec/validation_utils.py": {
      "path": "drillsec/validation_utils.py",
      "lines": 517,
      "functions": [
        "validate_numeric_input(5 args)",
        "validate_integer_input(5 args)",
        "validate_layer_exists(1 args)",
        "validate_layer_has_features(1 args)",
        "validate_layer_geometry(2 args)",
        "validate_field_exists(2 args)",
        "validate_field_type(3 args)",
        "validate_raster_band(2 args)",
        "validate_output_path(1 args)",
        "validate_angle_range(4 args)",
        "validate_and_get_layers(1 args)"
      ],
      "classes": [],
      "imports": [
        "pathlib.Path",
        "typing.List",
        "typing.Optional",
        "typing.Tuple",
        "qgis.core.QgsMapLayer",
        "qgis.core.QgsRasterLayer",
        "qgis.core.QgsVectorLayer",
        "qgis.core.QgsWkbTypes",
        "qgis.PyQt.QtCore.QVariant",
        "qgis.core.QgsProject"
      ],
      "complexity": 106,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {
          "validate_numeric_input": true,
          "validate_integer_input": true,
          "validate_layer_exists": true,
          "validate_layer_has_features": true,
          "validate_layer_geometry": true,
          "validate_field_exists": true,
          "validate_field_type": true,
          "validate_raster_band": true,
          "validate_output_path": true,
          "validate_angle_range": true,
          "validate_and_get_layers": true
        }
      },
      "has_main": false,
      "file_size_kb": 15.98828125,
      "syntax_error": false
    },
    "exporters/__init__.py": {
      "path": "exporters/__init__.py",
      "lines": 72,
      "functions": [
        "get_exporter(2 args)"
      ],
      "classes": [],
      "imports": [
        "base_exporter.BaseExporter",
        "csv_exporter.CSVExporter",
        "drillhole_exporters.DrillholeIntervalShpExporter",
        "drillhole_exporters.DrillholeTraceShpExporter",
        "image_exporter.ImageExporter",
        "interpretation_3d_exporter.Interpretation3DExporter",
        "interpretation_exporters.Interpretation2DExporter",
        "pdf_exporter.PDFExporter",
        "profile_exporters.AxesShpExporter",
        "profile_exporters.GeologyShpExporter",
        "profile_exporters.ProfileLineShpExporter",
        "profile_exporters.StructureShpExporter",
        "shp_exporter.ShapefileExporter",
        "svg_exporter.SVGExporter"
      ],
      "complexity": 6,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {
          "get_exporter": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 1,
        "typed_functions": 0,
        "coverage": 0.0
      },
      "halstead": {
        "vocabulary": 36,
        "length": 59,
        "volume": 295,
        "difficulty": 3.0,
        "effort": 885.0
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 29,
        "i18n_score": 0.0
      },
      "keywords": [
        "extension",
        "settings",
        "file",
        "csvexporter",
        "imageexporter"
      ],
      "file_size_kb": 1.8876953125,
      "syntax_error": false
    },
    "exporters/base_exporter.py": {
      "path": "exporters/base_exporter.py",
      "lines": 111,
      "functions": [
        "__init__(2 args)",
        "export(3 args)",
        "validate_export_path(3 args)",
        "get_supported_extensions(1 args)",
        "validate_path(2 args)",
        "get_setting(3 args)"
      ],
      "classes": [
        "BaseExporter(ABC)"
      ],
      "imports": [
        "__future__.annotations",
        "abc.ABC",
        "abc.abstractmethod",
        "pathlib.Path",
        "typing.Any",
        "sec_interp.core.validation.validate_safe_output_path"
      ],
      "complexity": 1,
      "docstrings": {
        "module": true,
        "classes": {
          "BaseExporter": true
        },
        "functions": {
          "__init__": true,
          "export": true,
          "validate_export_path": true,
          "get_supported_extensions": true,
          "validate_path": true,
          "get_setting": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 6,
        "typed_functions": 5,
        "coverage": 83.33333333333334
      },
      "halstead": {
        "vocabulary": 40,
        "length": 67,
        "volume": 335,
        "difficulty": 4.94,
        "effort": 1655.29
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 19,
        "i18n_score": 0.0
      },
      "keywords": [
        "path",
        "export",
        "settings",
        "default",
        "args"
      ],
      "file_size_kb": 3.1318359375,
      "syntax_error": false
    },
    "exporters/csv_exporter.py": {
      "path": "exporters/csv_exporter.py",
      "lines": 52,
      "functions": [
        "get_supported_extensions(1 args)",
        "export(3 args)"
      ],
      "classes": [
        "CSVExporter(BaseExporter)"
      ],
      "imports": [
        "csv",
        "pathlib.Path",
        "typing.Any",
        "sec_interp.logger_config.get_logger",
        "base_exporter.BaseExporter"
      ],
      "complexity": 6,
      "docstrings": {
        "module": true,
        "classes": {
          "CSVExporter": true
        },
        "functions": {
          "get_supported_extensions": true,
          "export": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 2,
        "typed_functions": 2,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 36,
        "length": 56,
        "volume": 280,
        "difficulty": 5.43,
        "effort": 1520.69
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 16,
        "i18n_score": 0.0
      },
      "keywords": [
        "data",
        "headers",
        "rows",
        "export",
        "output_path"
      ],
      "file_size_kb": 1.333984375,
      "syntax_error": false
    },
    "exporters/image_exporter.py": {
      "path": "exporters/image_exporter.py",
      "lines": 68,
      "functions": [
        "get_supported_extensions(1 args)",
        "export(3 args)"
      ],
      "classes": [
        "ImageExporter(BaseExporter)"
      ],
      "imports": [
        "pathlib.Path",
        "qgis.core.QgsMapRendererCustomPainterJob",
        "qgis.core.QgsMapSettings",
        "qgis.PyQt.QtCore.QRectF",
        "qgis.PyQt.QtCore.QSize",
        "qgis.PyQt.QtGui.QColor",
        "qgis.PyQt.QtGui.QImage",
        "qgis.PyQt.QtGui.QPainter",
        "sec_interp.logger_config.get_logger",
        "base_exporter.BaseExporter"
      ],
      "complexity": 3,
      "docstrings": {
        "module": true,
        "classes": {
          "ImageExporter": true
        },
        "functions": {
          "get_supported_extensions": true,
          "export": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 2,
        "typed_functions": 2,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 43,
        "length": 78,
        "volume": 390,
        "difficulty": 3.74,
        "effort": 1460.0
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 15,
        "i18n_score": 0.0
      },
      "keywords": [
        "image",
        "painter",
        "output_path",
        "qpainter",
        "export"
      ],
      "file_size_kb": 2.0771484375,
      "syntax_error": false
    },
    "exporters/pdf_exporter.py": {
      "path": "exporters/pdf_exporter.py",
      "lines": 75,
      "functions": [
        "get_supported_extensions(1 args)",
        "export(3 args)"
      ],
      "classes": [
        "PDFExporter(BaseExporter)"
      ],
      "imports": [
        "pathlib.Path",
        "qgis.core.QgsMapRendererCustomPainterJob",
        "qgis.core.QgsMapSettings",
        "qgis.PyQt.QtCore.QMarginsF",
        "qgis.PyQt.QtCore.QRectF",
        "qgis.PyQt.QtCore.QSize",
        "qgis.PyQt.QtCore.QSizeF",
        "qgis.PyQt.QtGui.QPageSize",
        "qgis.PyQt.QtGui.QPainter",
        "qgis.PyQt.QtGui.QPdfWriter",
        "sec_interp.logger_config.get_logger",
        "base_exporter.BaseExporter"
      ],
      "complexity": 6,
      "docstrings": {
        "module": true,
        "classes": {
          "PDFExporter": true
        },
        "functions": {
          "get_supported_extensions": true,
          "export": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 2,
        "typed_functions": 2,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 46,
        "length": 90,
        "volume": 450,
        "difficulty": 5.0,
        "effort": 2250.0
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 13,
        "i18n_score": 0.0
      },
      "keywords": [
        "writer",
        "painter",
        "export",
        "output_path",
        "map_settings"
      ],
      "file_size_kb": 2.431640625,
      "syntax_error": false
    },
    "exporters/profile_exporters.py": {
      "path": "exporters/profile_exporters.py",
      "lines": 337,
      "functions": [
        "get_supported_extensions(1 args)",
        "export(3 args)",
        "get_supported_extensions(1 args)",
        "export(3 args)",
        "_write_geology_features(4 args)",
        "_create_geology_fields(2 args)",
        "_create_geology_feature(3 args)",
        "get_supported_extensions(1 args)",
        "export(3 args)",
        "_write_structure_features(5 args)",
        "_create_structure_fields(2 args)",
        "_create_structure_feature(4 args)",
        "_calculate_dip_geometry(3 args)",
        "get_supported_extensions(1 args)",
        "export(3 args)",
        "_write_axes_features(4 args)"
      ],
      "classes": [
        "ProfileLineShpExporter(BaseExporter)",
        "GeologyShpExporter(BaseExporter)",
        "StructureShpExporter(BaseExporter)",
        "AxesShpExporter(BaseExporter)"
      ],
      "imports": [
        "__future__.annotations",
        "math",
        "pathlib.Path",
        "typing.Any",
        "qgis.core.QgsFeature",
        "qgis.core.QgsField",
        "qgis.core.QgsFields",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsPointXY",
        "qgis.PyQt.QtCore.QMetaType",
        "sec_interp.core.utils",
        "sec_interp.logger_config.get_logger",
        "base_exporter.BaseExporter"
      ],
      "complexity": 48,
      "docstrings": {
        "module": true,
        "classes": {
          "ProfileLineShpExporter": true,
          "GeologyShpExporter": true,
          "StructureShpExporter": true,
          "AxesShpExporter": true
        },
        "functions": {
          "get_supported_extensions": true,
          "export": true,
          "_write_geology_features": true,
          "_create_geology_fields": true,
          "_create_geology_feature": true,
          "_write_structure_features": true,
          "_create_structure_fields": true,
          "_create_structure_feature": true,
          "_calculate_dip_geometry": true,
          "_write_axes_features": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 16,
        "typed_functions": 16,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 123,
        "length": 550,
        "volume": 3300,
        "difficulty": 32.57,
        "effort": 107479.17
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 80,
        "i18n_score": 0.0
      },
      "keywords": [
        "fields",
        "writer",
        "feat",
        "data",
        "list"
      ],
      "file_size_kb": 10.4736328125,
      "syntax_error": false
    },
    "exporters/shp_exporter.py": {
      "path": "exporters/shp_exporter.py",
      "lines": 127,
      "functions": [
        "get_supported_extensions(1 args)",
        "export(3 args)",
        "_write_features(4 args)",
        "_prepare_fields(2 args)",
        "_create_writer(5 args)"
      ],
      "classes": [
        "ShapefileExporter(BaseExporter)"
      ],
      "imports": [
        "pathlib.Path",
        "typing.Any",
        "qgis.core.QgsCoordinateReferenceSystem",
        "qgis.core.QgsFeature",
        "qgis.core.QgsField",
        "qgis.core.QgsFields",
        "qgis.core.QgsProject",
        "qgis.core.QgsVectorFileWriter",
        "qgis.core.QgsWkbTypes",
        "qgis.PyQt.QtCore.QMetaType",
        "sec_interp.logger_config.get_logger",
        "base_exporter.BaseExporter"
      ],
      "complexity": 16,
      "docstrings": {
        "module": true,
        "classes": {
          "ShapefileExporter": true
        },
        "functions": {
          "get_supported_extensions": true,
          "export": true,
          "_write_features": true,
          "_prepare_fields": true,
          "_create_writer": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 5,
        "typed_functions": 5,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 70,
        "length": 173,
        "volume": 1038,
        "difficulty": 12.5,
        "effort": 12975.0
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 32,
        "i18n_score": 0.0
      },
      "keywords": [
        "fields",
        "features_data",
        "writer",
        "data",
        "qgsvectorfilewriter"
      ],
      "file_size_kb": 4.0439453125,
      "syntax_error": false
    },
    "exporters/svg_exporter.py": {
      "path": "exporters/svg_exporter.py",
      "lines": 75,
      "functions": [
        "get_supported_extensions(1 args)",
        "export(3 args)"
      ],
      "classes": [
        "SVGExporter(BaseExporter)"
      ],
      "imports": [
        "pathlib.Path",
        "qgis.core.QgsMapRendererCustomPainterJob",
        "qgis.PyQt.QtCore.QRectF",
        "qgis.PyQt.QtCore.QSize",
        "qgis.PyQt.QtGui.QPainter",
        "qgis.PyQt.QtSvg.QSvgGenerator",
        "sec_interp.logger_config.get_logger",
        "base_exporter.BaseExporter"
      ],
      "complexity": 6,
      "docstrings": {
        "module": true,
        "classes": {
          "SVGExporter": true
        },
        "functions": {
          "get_supported_extensions": true,
          "export": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 2,
        "typed_functions": 1,
        "coverage": 50.0
      },
      "halstead": {
        "vocabulary": 43,
        "length": 87,
        "volume": 435,
        "difficulty": 5.2,
        "effort": 2260.86
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 16,
        "i18n_score": 0.0
      },
      "keywords": [
        "generator",
        "painter",
        "qgis",
        "width",
        "get_setting"
      ],
      "file_size_kb": 2.2724609375,
      "syntax_error": false
    },
    "gui/__init__.py": {
      "path": "gui/__init__.py",
      "lines": 13,
      "functions": [],
      "classes": [],
      "imports": [
        "main_dialog.SecInterpDialog",
        "preview_renderer.PreviewRenderer"
      ],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {}
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 0,
        "typed_functions": 0,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 4,
        "length": 4,
        "volume": 0,
        "difficulty": 0,
        "effort": 0
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 3,
        "i18n_score": 0.0
      },
      "keywords": [
        "secinterpdialog",
        "previewrenderer",
        "module",
        "secinterp",
        "plugin"
      ],
      "file_size_kb": 0.2373046875,
      "syntax_error": false
    },
    "gui/legend_widget.py": {
      "path": "gui/legend_widget.py",
      "lines": 55,
      "functions": [
        "__init__(2 args)",
        "eventFilter(3 args)",
        "update_legend(2 args)",
        "paintEvent(2 args)"
      ],
      "classes": [
        "LegendWidget(QWidget)"
      ],
      "imports": [
        "__future__.annotations",
        "typing.TYPE_CHECKING",
        "qgis.PyQt.QtCore",
        "qgis.PyQt.QtCore.QEvent",
        "qgis.PyQt.QtCore.QObject",
        "qgis.PyQt.QtCore.QRectF",
        "qgis.PyQt.QtCore.Qt",
        "qgis.PyQt.QtGui.QPainter",
        "qgis.PyQt.QtWidgets.QWidget",
        "sec_interp.gui.main_dialog.SecInterpDialog",
        "preview_legend_renderer.PreviewLegendRenderer"
      ],
      "complexity": 5,
      "docstrings": {
        "module": true,
        "classes": {
          "LegendWidget": true
        },
        "functions": {
          "__init__": false,
          "eventFilter": true,
          "update_legend": true,
          "paintEvent": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 4,
        "typed_functions": 4,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 33,
        "length": 72,
        "volume": 360,
        "difficulty": 9.12,
        "effort": 3283.2
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 9,
        "i18n_score": 0.0
      },
      "keywords": [
        "renderer",
        "dialog",
        "event",
        "legend",
        "qgis"
      ],
      "file_size_kb": 1.880859375,
      "syntax_error": false
    },
    "gui/main_dialog.py": {
      "path": "gui/main_dialog.py",
      "lines": 568,
      "functions": [
        "pushMessage(1 args)",
        "__init__(4 args)",
        "_init_managers(1 args)",
        "handle_error(3 args)",
        "wheelEvent(2 args)",
        "closeEvent(2 args)",
        "open_help(1 args)",
        "toggle_measure_tool(2 args)",
        "update_measurement_display(2 args)",
        "toggle_interpretation_tool(2 args)",
        "on_interpretation_finished(2 args)",
        "_apply_attribute_inheritance(3 args)",
        "update_preview_checkbox_states(1 args)",
        "update_button_state(1 args)",
        "get_selected_values(1 args)",
        "get_preview_options(1 args)",
        "update_preview_from_checkboxes(1 args)",
        "preview_profile_handler(1 args)",
        "export_preview(1 args)",
        "accept_handler(1 args)",
        "reject_handler(1 args)",
        "validate_inputs(1 args)",
        "clear_cache_handler(1 args)",
        "reset_defaults_handler(1 args)",
        "_populate_field_combobox(3 args)",
        "get_layer_names_by_type(2 args)",
        "get_layer_names_by_geometry(2 args)",
        "getThemeIcon(2 args)",
        "_load_user_settings(1 args)",
        "_save_user_settings(1 args)",
        "_save_interpretations(1 args)",
        "_load_interpretations(1 args)",
        "json_serial(1 args)"
      ],
      "classes": [
        "_NoOpMessageBar",
        "SecInterpDialog(SecInterpMainWindow)"
      ],
      "imports": [
        "json",
        "traceback",
        "pathlib.Path",
        "typing.Any",
        "qgis.core.Qgis",
        "qgis.core.QgsPointXY",
        "qgis.core.QgsProject",
        "qgis.PyQt.QtCore.QUrl",
        "qgis.PyQt.QtGui.QDesktopServices",
        "qgis.PyQt.QtWidgets.QDialog",
        "qgis.PyQt.QtWidgets.QDialogButtonBox",
        "qgis.PyQt.QtWidgets.QPushButton",
        "sec_interp.core.exceptions.SecInterpError",
        "sec_interp.core.types.InterpretationPolygon",
        "sec_interp.gui.utils.show_user_message",
        "sec_interp.logger_config.get_logger",
        "legend_widget.LegendWidget",
        "main_dialog_cache_handler.CacheHandler",
        "main_dialog_data.DialogDataAggregator",
        "main_dialog_export.ExportManager",
        "main_dialog_preview.PreviewManager",
        "main_dialog_settings.DialogSettingsManager",
        "main_dialog_signals.DialogSignalManager",
        "main_dialog_status.DialogStatusManager",
        "main_dialog_tools.DialogToolManager",
        "main_dialog_tools.NavigationManager",
        "main_dialog_utils.DialogEntityManager",
        "main_dialog_validation.DialogValidator",
        "preview_layer_factory.PreviewLayerFactory",
        "ui.main_window.SecInterpMainWindow",
        "sec_interp.core.services.preview_service.PreviewService",
        "sec_interp.logger_config.log_critical_operation",
        "dialogs.interpretation_properties_dialog.InterpretationPropertiesDialog",
        "qgis.core.QgsGeometry"
      ],
      "complexity": 59,
      "docstrings": {
        "module": true,
        "classes": {
          "_NoOpMessageBar": true,
          "SecInterpDialog": true
        },
        "functions": {
          "pushMessage": true,
          "__init__": true,
          "_init_managers": true,
          "handle_error": true,
          "wheelEvent": true,
          "closeEvent": true,
          "open_help": true,
          "toggle_measure_tool": true,
          "update_measurement_display": true,
          "toggle_interpretation_tool": true,
          "on_interpretation_finished": true,
          "_apply_attribute_inheritance": true,
          "update_preview_checkbox_states": true,
          "update_button_state": true,
          "get_selected_values": true,
          "get_preview_options": true,
          "update_preview_from_checkboxes": true,
          "preview_profile_handler": true,
          "export_preview": true,
          "accept_handler": true,
          "reject_handler": true,
          "validate_inputs": true,
          "clear_cache_handler": true,
          "reset_defaults_handler": true,
          "_populate_field_combobox": true,
          "get_layer_names_by_type": true,
          "get_layer_names_by_geometry": true,
          "getThemeIcon": true,
          "_load_user_settings": true,
          "_save_user_settings": true,
          "_save_interpretations": true,
          "_load_interpretations": true,
          "json_serial": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 33,
        "typed_functions": 9,
        "coverage": 27.27272727272727
      },
      "halstead": {
        "vocabulary": 226,
        "length": 709,
        "volume": 4963,
        "difficulty": 18.62,
        "effort": 92386.36
      },
      "i18n": {
        "tr_calls": 11,
        "total_strings_estimate": 178,
        "i18n_score": 6.179775280898876
      },
      "keywords": [
        "interpretation",
        "preview_widget",
        "qgis",
        "data",
        "dialog"
      ],
      "file_size_kb": 22.0478515625,
      "syntax_error": false
    },
    "gui/main_dialog_cache_handler.py": {
      "path": "gui/main_dialog_cache_handler.py",
      "lines": 18,
      "functions": [
        "__init__(2 args)"
      ],
      "classes": [
        "CacheHandler"
      ],
      "imports": [],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {
          "CacheHandler": true
        },
        "functions": {
          "__init__": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 1,
        "typed_functions": 0,
        "coverage": 0.0
      },
      "halstead": {
        "vocabulary": 8,
        "length": 8,
        "volume": 24,
        "difficulty": 1.0,
        "effort": 24.0
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 6,
        "i18n_score": 0.0
      },
      "keywords": [
        "dialog",
        "cache",
        "handler",
        "sec_interp",
        "main_dialog"
      ],
      "file_size_kb": 0.4150390625,
      "syntax_error": false
    },
    "gui/main_dialog_config.py": {
      "path": "gui/main_dialog_config.py",
      "lines": 145,
      "functions": [],
      "classes": [
        "DialogDefaults",
        "DialogConfig",
        "ValidationMessages",
        "UIConstants"
      ],
      "imports": [
        "__future__.annotations",
        "typing.Any",
        "typing.ClassVar",
        "qgis.PyQt.QtGui.QColor"
      ],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {
          "DialogDefaults": true,
          "DialogConfig": true,
          "ValidationMessages": true,
          "UIConstants": true
        },
        "functions": {}
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 0,
        "typed_functions": 0,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 136,
        "length": 179,
        "volume": 1253,
        "difficulty": 0.65,
        "effort": 812.13
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 47,
        "i18n_score": 0.0
      },
      "keywords": [
        "required",
        "layer",
        "field",
        "classvar",
        "qcolor"
      ],
      "file_size_kb": 3.935546875,
      "syntax_error": false
    },
    "gui/main_dialog_export.py": {
      "path": "gui/main_dialog_export.py",
      "lines": 219,
      "functions": [
        "__init__(2 args)",
        "export_preview(1 args)",
        "export_data(1 args)"
      ],
      "classes": [
        "ExportManager"
      ],
      "imports": [
        "__future__.annotations",
        "pathlib.Path",
        "typing.TYPE_CHECKING",
        "qgis.core.QgsSettings",
        "qgis.PyQt.QtCore.QSize",
        "qgis.PyQt.QtGui.QColor",
        "qgis.PyQt.QtWidgets.QFileDialog",
        "sec_interp.core.exceptions.ExportError",
        "sec_interp.core.exceptions.SecInterpError",
        "sec_interp.core.performance_metrics.MetricsCollector",
        "sec_interp.core.performance_metrics.PerformanceTimer",
        "sec_interp.core.services.export_service.ExportService",
        "sec_interp.exporters.get_exporter",
        "sec_interp.logger_config.get_logger",
        "main_dialog_config.DialogConfig"
      ],
      "complexity": 20,
      "docstrings": {
        "module": true,
        "classes": {
          "ExportManager": true
        },
        "functions": {
          "__init__": true,
          "export_preview": true,
          "export_data": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 3,
        "typed_functions": 2,
        "coverage": 66.66666666666666
      },
      "halstead": {
        "vocabulary": 113,
        "length": 265,
        "volume": 1590,
        "difficulty": 10.3,
        "effort": 16373.94
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 67,
        "i18n_score": 0.0
      },
      "keywords": [
        "dialog",
        "export",
        "preview",
        "data",
        "output_path"
      ],
      "file_size_kb": 7.8564453125,
      "syntax_error": false
    },
    "gui/main_dialog_preview.py": {
      "path": "gui/main_dialog_preview.py",
      "lines": 533,
      "functions": [
        "__init__(3 args)",
        "cleanup(1 args)",
        "generate_preview(1 args)",
        "_process_preview_data(2 args)",
        "_run_render_pipeline(2 args)",
        "update_from_checkboxes(1 args)",
        "_calculate_params_hash(2 args)",
        "_get_buffer_distance(1 args)",
        "_on_extents_changed(1 args)",
        "_update_lod_for_zoom(1 args)",
        "_start_async_geology(2 args)",
        "_on_geology_finished(2 args)",
        "_on_geology_progress(2 args)",
        "_on_geology_error(2 args)",
        "_handle_invalid_plugin_instance(1 args)",
        "_update_crs_label(2 args)",
        "get_id(1 args)"
      ],
      "classes": [
        "PreviewManager"
      ],
      "imports": [
        "__future__.annotations",
        "hashlib",
        "typing.TYPE_CHECKING",
        "typing.Any",
        "qgis.core.QgsApplication",
        "qgis.core.QgsVectorLayer",
        "qgis.PyQt.QtCore.QCoreApplication",
        "qgis.PyQt.QtCore.QTimer",
        "sec_interp.core.exceptions.ProcessingError",
        "sec_interp.core.exceptions.SecInterpError",
        "sec_interp.core.interfaces.preview_interface.IPreviewService",
        "sec_interp.core.performance_metrics.MetricsCollector",
        "sec_interp.core.performance_metrics.PerformanceTimer",
        "sec_interp.core.services.preview_service.PreviewService",
        "sec_interp.core.types.PreviewParams",
        "sec_interp.core.types.PreviewResult",
        "sec_interp.logger_config.get_logger",
        "main_dialog_config.DialogConfig",
        "preview_reporter.PreviewReporter",
        "tasks.geology_task.GeologyGenerationTask"
      ],
      "complexity": 58,
      "docstrings": {
        "module": true,
        "classes": {
          "PreviewManager": true
        },
        "functions": {
          "__init__": true,
          "cleanup": true,
          "generate_preview": true,
          "_process_preview_data": true,
          "_run_render_pipeline": true,
          "update_from_checkboxes": true,
          "_calculate_params_hash": true,
          "_get_buffer_distance": true,
          "_on_extents_changed": true,
          "_update_lod_for_zoom": true,
          "_start_async_geology": true,
          "_on_geology_finished": true,
          "_on_geology_progress": true,
          "_on_geology_error": true,
          "_handle_invalid_plugin_instance": true,
          "_update_crs_label": true,
          "get_id": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 17,
        "typed_functions": 11,
        "coverage": 64.70588235294117
      },
      "halstead": {
        "vocabulary": 162,
        "length": 615,
        "volume": 4305,
        "difficulty": 27.24,
        "effort": 117289.29
      },
      "i18n": {
        "tr_calls": 8,
        "total_strings_estimate": 113,
        "i18n_score": 7.079646017699115
      },
      "keywords": [
        "dialog",
        "params",
        "preview",
        "cached_data",
        "update"
      ],
      "file_size_kb": 19.720703125,
      "syntax_error": false
    },
    "gui/main_dialog_validation.py": {
      "path": "gui/main_dialog_validation.py",
      "lines": 57,
      "functions": [
        "__init__(2 args)",
        "validate_inputs(1 args)",
        "validate_preview_requirements(1 args)"
      ],
      "classes": [
        "DialogValidator"
      ],
      "imports": [
        "typing.TYPE_CHECKING",
        "sec_interp.core.exceptions.ValidationError",
        "sec_interp.core.validation.project_validator.ProjectValidator",
        "sec_interp.gui.main_dialog.SecInterpDialog"
      ],
      "complexity": 6,
      "docstrings": {
        "module": true,
        "classes": {
          "DialogValidator": true
        },
        "functions": {
          "__init__": true,
          "validate_inputs": true,
          "validate_preview_requirements": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 3,
        "typed_functions": 3,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 24,
        "length": 43,
        "volume": 172,
        "difficulty": 3.6,
        "effort": 619.2
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 12,
        "i18n_score": 0.0
      },
      "keywords": [
        "dialog",
        "core",
        "validation",
        "projectvalidator",
        "tuple"
      ],
      "file_size_kb": 1.681640625,
      "syntax_error": false
    },
    "gui/preview_renderer.py": {
      "path": "gui/preview_renderer.py",
      "lines": 287,
      "functions": [
        "__init__(2 args)",
        "active_units(1 args)",
        "render(11 args)",
        "draw_legend(3 args)",
        "export_to_image(7 args)",
        "_cleanup_layers(1 args)",
        "_render_interpretations(3 args)",
        "_calculate_extent(2 args)"
      ],
      "classes": [
        "PreviewRenderer"
      ],
      "imports": [
        "__future__.annotations",
        "contextlib",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsMapRendererCustomPainterJob",
        "qgis.core.QgsMapSettings",
        "qgis.core.QgsPointXY",
        "qgis.core.QgsProject",
        "qgis.core.QgsWkbTypes",
        "qgis.gui.QgsMapCanvas",
        "qgis.gui.QgsRubberBand",
        "qgis.PyQt.QtCore.QRectF",
        "qgis.PyQt.QtCore.QSize",
        "qgis.PyQt.QtGui.QColor",
        "qgis.PyQt.QtGui.QImage",
        "qgis.PyQt.QtGui.QPainter",
        "sec_interp.core.types.GeologyData",
        "sec_interp.core.types.InterpretationPolygon",
        "sec_interp.core.types.ProfileData",
        "sec_interp.core.types.StructureData",
        "sec_interp.logger_config.get_logger",
        "preview_axes_manager.PreviewAxesManager",
        "preview_layer_factory.PreviewLayerFactory",
        "preview_legend_renderer.PreviewLegendRenderer"
      ],
      "complexity": 38,
      "docstrings": {
        "module": true,
        "classes": {
          "PreviewRenderer": true
        },
        "functions": {
          "__init__": true,
          "active_units": true,
          "render": true,
          "draw_legend": true,
          "export_to_image": true,
          "_cleanup_layers": true,
          "_render_interpretations": true,
          "_calculate_extent": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 8,
        "typed_functions": 1,
        "coverage": 12.5
      },
      "halstead": {
        "vocabulary": 125,
        "length": 385,
        "volume": 2310,
        "difficulty": 24.29,
        "effort": 56118.17
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 24,
        "i18n_score": 0.0
      },
      "keywords": [
        "layers",
        "canvas",
        "extent",
        "layer",
        "vert_exag"
      ],
      "file_size_kb": 9.546875,
      "syntax_error": false
    },
    "gui/tools/measure_tool.py": {
      "path": "gui/tools/measure_tool.py",
      "lines": 343,
      "functions": [
        "__init__(2 args)",
        "snap(2 args)",
        "_cleanup_locators(2 args)",
        "_is_snappable(2 args)",
        "_get_locator(4 args)",
        "__init__(2 args)",
        "activate(1 args)",
        "deactivate(1 args)",
        "reset(1 args)",
        "canvasReleaseEvent(2 args)",
        "canvasMoveEvent(2 args)",
        "keyPressEvent(2 args)",
        "_add_point(2 args)",
        "finalize_measurement(1 args)",
        "_add_vertex_marker(2 args)",
        "_ensure_rubber_band(1 args)",
        "_update_rubber_band(2 args)",
        "_calculate_and_emit_preview(2 args)"
      ],
      "classes": [
        "ProfileSnapper",
        "ProfileMeasureTool(QgsMapToolEmitPoint)"
      ],
      "imports": [
        "__future__.annotations",
        "qgis.core.QgsMapLayer",
        "qgis.core.QgsPointLocator",
        "qgis.core.QgsPointXY",
        "qgis.core.QgsProject",
        "qgis.core.QgsVectorLayer",
        "qgis.core.QgsWkbTypes",
        "qgis.gui.QgsMapCanvas",
        "qgis.gui.QgsMapToolEmitPoint",
        "qgis.gui.QgsMapToolPan",
        "qgis.gui.QgsRubberBand",
        "qgis.gui.QgsVertexMarker",
        "qgis.PyQt.QtCore.QPoint",
        "qgis.PyQt.QtCore.Qt",
        "qgis.PyQt.QtCore.pyqtSignal",
        "qgis.PyQt.QtGui.QColor",
        "sec_interp.core.utils.geometry_utils.measurement.calculate_polyline_metrics",
        "sec_interp.logger_config.get_logger"
      ],
      "complexity": 43,
      "docstrings": {
        "module": true,
        "classes": {
          "ProfileSnapper": true,
          "ProfileMeasureTool": true
        },
        "functions": {
          "__init__": false,
          "snap": true,
          "_cleanup_locators": true,
          "_is_snappable": true,
          "_get_locator": true,
          "activate": true,
          "deactivate": true,
          "reset": true,
          "canvasReleaseEvent": true,
          "canvasMoveEvent": true,
          "keyPressEvent": true,
          "_add_point": true,
          "finalize_measurement": true,
          "_add_vertex_marker": true,
          "_ensure_rubber_band": true,
          "_update_rubber_band": true,
          "_calculate_and_emit_preview": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 18,
        "typed_functions": 7,
        "coverage": 38.88888888888889
      },
      "halstead": {
        "vocabulary": 127,
        "length": 447,
        "volume": 2682,
        "difficulty": 28.9,
        "effort": 77509.8
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 56,
        "i18n_score": 0.0
      },
      "keywords": [
        "points",
        "point",
        "measurement",
        "canvas",
        "finalized"
      ],
      "file_size_kb": 11.5126953125,
      "syntax_error": false
    },
    "gui/ui/main_window.py": {
      "path": "gui/ui/main_window.py",
      "lines": 143,
      "functions": [
        "__init__(3 args)",
        "_setup_ui(1 args)",
        "_connect_signals(1 args)"
      ],
      "classes": [
        "SecInterpMainWindow(QDialog)"
      ],
      "imports": [
        "qgis.gui.QgsFileWidget",
        "qgis.PyQt.QtCore.Qt",
        "qgis.PyQt.QtWidgets.QDialog",
        "qgis.PyQt.QtWidgets.QDialogButtonBox",
        "qgis.PyQt.QtWidgets.QHBoxLayout",
        "qgis.PyQt.QtWidgets.QLabel",
        "qgis.PyQt.QtWidgets.QSplitter",
        "qgis.PyQt.QtWidgets.QStackedWidget",
        "qgis.PyQt.QtWidgets.QVBoxLayout",
        "pages.dem_page.DemPage",
        "pages.drillhole_page.DrillholePage",
        "pages.geology_page.GeologyPage",
        "pages.interpretation_page.InterpretationPage",
        "pages.preview_page.PreviewWidget",
        "pages.section_page.SectionPage",
        "pages.settings_page.SettingsPage",
        "pages.structure_page.StructurePage",
        "sidebar.Sidebar"
      ],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {
          "SecInterpMainWindow": true
        },
        "functions": {
          "__init__": false,
          "_setup_ui": true,
          "_connect_signals": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 3,
        "typed_functions": 0,
        "coverage": 0.0
      },
      "halstead": {
        "vocabulary": 59,
        "length": 145,
        "volume": 725,
        "difficulty": 3.7,
        "effort": 2679.91
      },
      "i18n": {
        "tr_calls": 1,
        "total_strings_estimate": 25,
        "i18n_score": 4.0
      },
      "keywords": [
        "sidebar",
        "splitter",
        "addwidget",
        "pages",
        "stacked_widget"
      ],
      "file_size_kb": 4.8837890625,
      "syntax_error": false
    },
    "gui/ui/__init__.py": {
      "path": "gui/ui/__init__.py",
      "lines": 6,
      "functions": [],
      "classes": [],
      "imports": [],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {}
      },
      "has_main": false,
      "file_size_kb": 0.0673828125,
      "syntax_error": false
    },
    "gui/ui/pages/__init__.py": {
      "path": "gui/ui/pages/__init__.py",
      "lines": 6,
      "functions": [],
      "classes": [],
      "imports": [
        "settings_page.SettingsPage"
      ],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {}
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 0,
        "typed_functions": 0,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 4,
        "length": 4,
        "volume": 0,
        "difficulty": 0,
        "effort": 0
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 3,
        "i18n_score": 0.0
      },
      "keywords": [
        "settingspage",
        "configuration",
        "pages",
        "settings_page",
        "__all__"
      ],
      "file_size_kb": 0.1083984375,
      "syntax_error": false
    },
    "gui/ui/pages/base_page.py": {
      "path": "gui/ui/pages/base_page.py",
      "lines": 55,
      "functions": [
        "__init__(3 args)",
        "_setup_ui(1 args)",
        "get_data(1 args)",
        "validate(1 args)"
      ],
      "classes": [
        "BasePage(QWidget)"
      ],
      "imports": [
        "qgis.PyQt.QtWidgets.QGroupBox",
        "qgis.PyQt.QtWidgets.QVBoxLayout",
        "qgis.PyQt.QtWidgets.QWidget"
      ],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {
          "BasePage": true
        },
        "functions": {
          "__init__": true,
          "_setup_ui": true,
          "get_data": true,
          "validate": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 4,
        "typed_functions": 2,
        "coverage": 50.0
      },
      "halstead": {
        "vocabulary": 25,
        "length": 43,
        "volume": 172,
        "difficulty": 1.65,
        "effort": 284.17
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 13,
        "i18n_score": 0.0
      },
      "keywords": [
        "title",
        "configuration",
        "parent",
        "main_layout",
        "qwidget"
      ],
      "file_size_kb": 1.451171875,
      "syntax_error": false
    },
    "gui/ui/pages/dem_page.py": {
      "path": "gui/ui/pages/dem_page.py",
      "lines": 169,
      "functions": [
        "__init__(3 args)",
        "_setup_ui(1 args)",
        "_setup_raster_selection(1 args)",
        "_setup_band_and_resolution(1 args)",
        "_setup_profile_settings(1 args)",
        "_update_resolution(1 args)",
        "get_data(1 args)",
        "validate(1 args)",
        "is_complete(1 args)"
      ],
      "classes": [
        "DemPage(BasePage)"
      ],
      "imports": [
        "typing.Any",
        "qgis.core.Qgis",
        "qgis.core.QgsUnitTypes",
        "qgis.gui.QgsDoubleSpinBox",
        "qgis.gui.QgsMapLayerComboBox",
        "qgis.gui.QgsRasterBandComboBox",
        "qgis.PyQt.QtCore.QCoreApplication",
        "qgis.PyQt.QtWidgets.QGridLayout",
        "qgis.PyQt.QtWidgets.QGroupBox",
        "qgis.PyQt.QtWidgets.QHBoxLayout",
        "qgis.PyQt.QtWidgets.QLabel",
        "qgis.PyQt.QtWidgets.QLineEdit",
        "sec_interp.core.validation.project_validator.ProjectValidator",
        "sec_interp.core.validation.project_validator.ValidationParams",
        "sec_interp.gui.main_dialog_config.DialogDefaults",
        "base_page.BasePage"
      ],
      "complexity": 7,
      "docstrings": {
        "module": true,
        "classes": {
          "DemPage": true
        },
        "functions": {
          "__init__": true,
          "_setup_ui": false,
          "_setup_raster_selection": true,
          "_setup_band_and_resolution": true,
          "_setup_profile_settings": true,
          "_update_resolution": true,
          "get_data": true,
          "validate": true,
          "is_complete": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 9,
        "typed_functions": 5,
        "coverage": 55.55555555555556
      },
      "halstead": {
        "vocabulary": 92,
        "length": 258,
        "volume": 1548,
        "difficulty": 14.33,
        "effort": 22181.71
      },
      "i18n": {
        "tr_calls": 11,
        "total_strings_estimate": 38,
        "i18n_score": 28.947368421052634
      },
      "keywords": [
        "addwidget",
        "raster_combo",
        "layer",
        "scale",
        "group_layout"
      ],
      "file_size_kb": 5.98828125,
      "syntax_error": false
    },
    "gui/ui/pages/drill_page.py": {
      "path": "gui/ui/pages/drill_page.py",
      "lines": 192,
      "functions": [
        "__init__(2 args)",
        "_setup_ui(1 args)",
        "get_data(1 args)",
        "is_complete(1 args)"
      ],
      "classes": [
        "DrillPage(BasePage)"
      ],
      "imports": [
        "qgis.core.QgsMapLayerProxyModel",
        "qgis.core.QgsProject",
        "qgis.gui.QgsMapLayerComboBox",
        "qgis.gui.QgsFieldComboBox",
        "qgis.PyQt.QtWidgets.QGridLayout",
        "qgis.PyQt.QtWidgets.QLabel",
        "qgis.PyQt.QtWidgets.QGroupBox",
        "qgis.PyQt.QtWidgets.QVBoxLayout",
        "qgis.PyQt.QtCore.pyqtSignal",
        "base_page.BasePage"
      ],
      "complexity": 7,
      "docstrings": {
        "module": false,
        "classes": {
          "DrillPage": true
        },
        "functions": {
          "__init__": true,
          "_setup_ui": false,
          "get_data": true,
          "is_complete": true
        }
      },
      "has_main": false,
      "file_size_kb": 8.5205078125,
      "syntax_error": false
    },
    "gui/ui/pages/geology_page.py": {
      "path": "gui/ui/pages/geology_page.py",
      "lines": 77,
      "functions": [
        "__init__(2 args)",
        "_setup_ui(1 args)",
        "get_data(1 args)",
        "is_complete(1 args)"
      ],
      "classes": [
        "GeologyPage(BasePage)"
      ],
      "imports": [
        "qgis.core.QgsMapLayerProxyModel",
        "qgis.gui.QgsFieldComboBox",
        "qgis.gui.QgsMapLayerComboBox",
        "qgis.PyQt.QtCore.QCoreApplication",
        "qgis.PyQt.QtCore.pyqtSignal",
        "qgis.PyQt.QtWidgets.QGridLayout",
        "qgis.PyQt.QtWidgets.QLabel",
        "sec_interp.core.validation.project_validator.ProjectValidator",
        "sec_interp.core.validation.project_validator.ValidationParams",
        "base_page.BasePage",
        "qgis.core.Qgis"
      ],
      "complexity": 2,
      "docstrings": {
        "module": true,
        "classes": {
          "GeologyPage": true
        },
        "functions": {
          "__init__": false,
          "_setup_ui": false,
          "get_data": true,
          "is_complete": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 4,
        "typed_functions": 2,
        "coverage": 50.0
      },
      "halstead": {
        "vocabulary": 42,
        "length": 89,
        "volume": 445,
        "difficulty": 3.19,
        "effort": 1420.58
      },
      "i18n": {
        "tr_calls": 5,
        "total_strings_estimate": 17,
        "i18n_score": 29.411764705882355
      },
      "keywords": [
        "layer_combo",
        "qgis",
        "group_layout",
        "field_combo",
        "layer"
      ],
      "file_size_kb": 2.6845703125,
      "syntax_error": false
    },
    "gui/ui/pages/preview_page.py": {
      "path": "gui/ui/pages/preview_page.py",
      "lines": 170,
      "functions": [
        "__init__(2 args)",
        "_setup_ui(1 args)",
        "_setup_canvas_area(1 args)",
        "_setup_action_buttons(1 args)",
        "_setup_lod_controls(1 args)",
        "_setup_layer_checkboxes(1 args)",
        "_setup_results_area(1 args)",
        "_update_coords(2 args)",
        "_update_scale(2 args)",
        "_toggle_lod_spin(2 args)"
      ],
      "classes": [
        "PreviewWidget(QWidget)"
      ],
      "imports": [
        "typing.Any",
        "qgis.gui.QgsCollapsibleGroupBox",
        "qgis.gui.QgsMapCanvas",
        "qgis.PyQt.QtGui.QColor",
        "qgis.PyQt.QtWidgets.QCheckBox",
        "qgis.PyQt.QtWidgets.QFrame",
        "qgis.PyQt.QtWidgets.QHBoxLayout",
        "qgis.PyQt.QtWidgets.QLabel",
        "qgis.PyQt.QtWidgets.QPushButton",
        "qgis.PyQt.QtWidgets.QSpinBox",
        "qgis.PyQt.QtWidgets.QTextEdit",
        "qgis.PyQt.QtWidgets.QVBoxLayout",
        "qgis.PyQt.QtWidgets.QWidget"
      ],
      "complexity": 1,
      "docstrings": {
        "module": true,
        "classes": {
          "PreviewWidget": true
        },
        "functions": {
          "__init__": false,
          "_setup_ui": false,
          "_setup_canvas_area": true,
          "_setup_action_buttons": true,
          "_setup_lod_controls": true,
          "_setup_layer_checkboxes": true,
          "_setup_results_area": true,
          "_update_coords": true,
          "_update_scale": true,
          "_toggle_lod_spin": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 10,
        "typed_functions": 5,
        "coverage": 50.0
      },
      "halstead": {
        "vocabulary": 82,
        "length": 281,
        "volume": 1686,
        "difficulty": 6.87,
        "effort": 11585.85
      },
      "i18n": {
        "tr_calls": 25,
        "total_strings_estimate": 46,
        "i18n_score": 54.347826086956516
      },
      "keywords": [
        "addwidget",
        "preview",
        "qcheckbox",
        "status_layout",
        "frame_layout"
      ],
      "file_size_kb": 6.27734375,
      "syntax_error": false
    },
    "gui/ui/pages/section_page.py": {
      "path": "gui/ui/pages/section_page.py",
      "lines": 80,
      "functions": [
        "__init__(2 args)",
        "_setup_ui(1 args)",
        "get_data(1 args)",
        "validate(1 args)",
        "is_complete(1 args)"
      ],
      "classes": [
        "SectionPage(BasePage)"
      ],
      "imports": [
        "typing.Any",
        "qgis.core.QgsMapLayerProxyModel",
        "qgis.gui.QgsDoubleSpinBox",
        "qgis.gui.QgsMapLayerComboBox",
        "qgis.PyQt.QtCore.QCoreApplication",
        "qgis.PyQt.QtWidgets.QGridLayout",
        "qgis.PyQt.QtWidgets.QLabel",
        "base_page.BasePage",
        "qgis.core.Qgis"
      ],
      "complexity": 3,
      "docstrings": {
        "module": true,
        "classes": {
          "SectionPage": true
        },
        "functions": {
          "__init__": false,
          "_setup_ui": false,
          "get_data": true,
          "validate": true,
          "is_complete": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 5,
        "typed_functions": 5,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 51,
        "length": 108,
        "volume": 540,
        "difficulty": 5.38,
        "effort": 2905.43
      },
      "i18n": {
        "tr_calls": 7,
        "total_strings_estimate": 20,
        "i18n_score": 35.0
      },
      "keywords": [
        "line_combo",
        "section",
        "qgis",
        "group_layout",
        "buffer_spin"
      ],
      "file_size_kb": 2.7080078125,
      "syntax_error": false
    },
    "gui/ui/pages/structure_page.py": {
      "path": "gui/ui/pages/structure_page.py",
      "lines": 109,
      "functions": [
        "__init__(2 args)",
        "_setup_ui(1 args)",
        "_on_layer_changed(2 args)",
        "get_data(1 args)",
        "is_complete(1 args)"
      ],
      "classes": [
        "StructurePage(BasePage)"
      ],
      "imports": [
        "typing.Any",
        "qgis.core.QgsMapLayerProxyModel",
        "qgis.gui.QgsDoubleSpinBox",
        "qgis.gui.QgsFieldComboBox",
        "qgis.gui.QgsMapLayerComboBox",
        "qgis.PyQt.QtCore.QCoreApplication",
        "qgis.PyQt.QtCore.pyqtSignal",
        "qgis.PyQt.QtWidgets.QGridLayout",
        "qgis.PyQt.QtWidgets.QLabel",
        "sec_interp.core.validation.project_validator.ProjectValidator",
        "sec_interp.core.validation.project_validator.ValidationParams",
        "sec_interp.gui.main_dialog_config.DialogDefaults",
        "base_page.BasePage",
        "qgis.core.Qgis"
      ],
      "complexity": 2,
      "docstrings": {
        "module": true,
        "classes": {
          "StructurePage": true
        },
        "functions": {
          "__init__": false,
          "_setup_ui": false,
          "_on_layer_changed": true,
          "get_data": true,
          "is_complete": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 5,
        "typed_functions": 5,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 60,
        "length": 148,
        "volume": 740,
        "difficulty": 3.71,
        "effort": 2745.79
      },
      "i18n": {
        "tr_calls": 9,
        "total_strings_estimate": 26,
        "i18n_score": 34.61538461538461
      },
      "keywords": [
        "group_layout",
        "layer_combo",
        "qgis",
        "layer",
        "addwidget"
      ],
      "file_size_kb": 4.0146484375,
      "syntax_error": false
    },
    "gui/ui/sidebar.py": {
      "path": "gui/ui/sidebar.py",
      "lines": 58,
      "functions": [
        "__init__(2 args)",
        "add_item(3 args)"
      ],
      "classes": [
        "Sidebar(QListWidget)"
      ],
      "imports": [
        "typing.Any",
        "qgis.core.QgsApplication",
        "qgis.PyQt.QtCore.QSize",
        "qgis.PyQt.QtCore.Qt",
        "qgis.PyQt.QtWidgets.QListWidget",
        "qgis.PyQt.QtWidgets.QListWidgetItem"
      ],
      "complexity": 1,
      "docstrings": {
        "module": true,
        "classes": {
          "Sidebar": true
        },
        "functions": {
          "__init__": false,
          "add_item": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 2,
        "typed_functions": 2,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 24,
        "length": 42,
        "volume": 168,
        "difficulty": 3.6,
        "effort": 604.8
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 8,
        "i18n_score": 0.0
      },
      "keywords": [
        "item",
        "qlistwidget",
        "sidebar",
        "qgis",
        "text"
      ],
      "file_size_kb": 1.66015625,
      "syntax_error": false
    },
    "logger_config.py": {
      "path": "logger_config.py",
      "lines": 183,
      "functions": [
        "get_logger(1 args)",
        "log_critical_operation(2 args)",
        "emit(2 args)",
        "__init__(2 args)",
        "emit(2 args)"
      ],
      "classes": [
        "ImmediateFlushFileHandler(RotatingFileHandler)",
        "QgsLogHandler(logging.Handler)"
      ],
      "imports": [
        "logging",
        "os",
        "sys",
        "logging.handlers.RotatingFileHandler",
        "pathlib.Path",
        "typing.Any",
        "qgis.core.Qgis",
        "qgis.core.QgsMessageLog",
        "datetime",
        "qgis.PyQt.QtCore.QCoreApplication",
        "qgis.PyQt.QtCore.QThread"
      ],
      "complexity": 21,
      "docstrings": {
        "module": true,
        "classes": {
          "ImmediateFlushFileHandler": true,
          "QgsLogHandler": true
        },
        "functions": {
          "get_logger": true,
          "log_critical_operation": true,
          "emit": true,
          "__init__": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 5,
        "typed_functions": 5,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 88,
        "length": 202,
        "volume": 1212,
        "difficulty": 12.29,
        "effort": 14890.29
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 38,
        "i18n_score": 0.0
      },
      "keywords": [
        "logging",
        "logger",
        "qgis",
        "record",
        "stderr"
      ],
      "file_size_kb": 5.99609375,
      "syntax_error": false
    },
    "scripts/clean_imports.py": {
      "path": "scripts/clean_imports.py",
      "lines": 69,
      "functions": [],
      "classes": [],
      "imports": [
        "pathlib.Path",
        "re"
      ],
      "complexity": 9,
      "docstrings": {
        "module": false,
        "classes": {},
        "functions": {}
      },
      "has_main": false,
      "file_size_kb": 1.93359375,
      "syntax_error": false
    },
    "scripts/inspect_qgs_api.py": {
      "path": "scripts/inspect_qgs_api.py",
      "lines": 18,
      "functions": [],
      "classes": [],
      "imports": [
        "qgis.core.QgsPalLayerSettings"
      ],
      "complexity": 7,
      "docstrings": {
        "module": false,
        "classes": {},
        "functions": {}
      },
      "has_main": false,
      "file_size_kb": 0.4716796875,
      "syntax_error": false
    },
    "scripts/verify_refactor_mock.py": {
      "path": "scripts/verify_refactor_mock.py",
      "lines": 315,
      "functions": [
        "test_structure_service",
        "test_geology_service",
        "__init__(3 args)",
        "x(1 args)",
        "y(1 args)",
        "lineLocatePoint(2 args)",
        "interpolate(2 args)",
        "asPoint(1 args)",
        "intersects(2 args)",
        "isNull(1 args)",
        "length(1 args)",
        "isMultipart(1 args)",
        "asPolyline(1 args)",
        "wkbType(1 args)",
        "dataProvider(1 args)",
        "identify(3 args)",
        "rasterUnitsPerPixelX(1 args)",
        "__init__(3 args)",
        "geometry(1 args)",
        "attributes(1 args)",
        "fields(1 args)",
        "__getitem__(2 args)"
      ],
      "classes": [
        "MockQgsPointXY",
        "MockQgsGeometry",
        "MockQgsRasterLayer",
        "MockQgsFeature"
      ],
      "imports": [
        "sys",
        "os",
        "unittest.mock.MagicMock",
        "unittest.mock.Mock",
        "sec_interp.core.types.StructureMeasurement",
        "sec_interp.core.types.GeologySegment",
        "sec_interp.core.services.structure_service.StructureService",
        "sec_interp.core.services.geology_service.GeologyService",
        "traceback"
      ],
      "complexity": 17,
      "docstrings": {
        "module": false,
        "classes": {
          "MockQgsPointXY": false,
          "MockQgsGeometry": false,
          "MockQgsRasterLayer": false,
          "MockQgsFeature": false
        },
        "functions": {
          "test_structure_service": false,
          "test_geology_service": false,
          "__init__": false,
          "x": false,
          "y": false,
          "lineLocatePoint": false,
          "interpolate": false,
          "asPoint": false,
          "intersects": false,
          "isNull": false,
          "length": false,
          "isMultipart": false,
          "asPolyline": false,
          "wkbType": false,
          "dataProvider": false,
          "identify": false,
          "rasterUnitsPerPixelX": false,
          "geometry": false,
          "attributes": false,
          "fields": false,
          "__getitem__": false
        }
      },
      "has_main": true,
      "file_size_kb": 9.0732421875,
      "syntax_error": false
    },
    "core/utils/drillhole.py": {
      "path": "core/utils/drillhole.py",
      "lines": 225,
      "functions": [
        "calculate_drillhole_trajectory(6 args)",
        "project_trajectory_to_section(4 args)",
        "interpolate_intervals_on_trajectory(3 args)"
      ],
      "classes": [],
      "imports": [
        "math",
        "typing.Any",
        "qgis.core.QgsDistanceArea",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsPointXY"
      ],
      "complexity": 16,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {
          "calculate_drillhole_trajectory": true,
          "project_trajectory_to_section": true,
          "interpolate_intervals_on_trajectory": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 3,
        "typed_functions": 3,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 82,
        "length": 357,
        "volume": 2142,
        "difficulty": 25.03,
        "effort": 53611.2
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 7,
        "i18n_score": 0.0
      },
      "keywords": [
        "float",
        "depth",
        "interval",
        "trajectory",
        "list"
      ],
      "file_size_kb": 7.7275390625,
      "syntax_error": false
    },
    "exporters/drillhole_exporters.py": {
      "path": "exporters/drillhole_exporters.py",
      "lines": 187,
      "functions": [
        "get_supported_extensions(1 args)",
        "export(3 args)",
        "_write_traces(4 args)",
        "_prepare_fields(1 args)",
        "_create_feature(4 args)",
        "get_supported_extensions(1 args)",
        "export(3 args)",
        "_write_intervals(4 args)",
        "_prepare_fields(1 args)",
        "_create_feature(4 args)"
      ],
      "classes": [
        "DrillholeTraceShpExporter(BaseExporter)",
        "DrillholeIntervalShpExporter(BaseExporter)"
      ],
      "imports": [
        "typing.Any",
        "qgis.core.QgsFeature",
        "qgis.core.QgsField",
        "qgis.core.QgsFields",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsPointXY",
        "qgis.PyQt.QtCore.QMetaType",
        "sec_interp.core.utils",
        "sec_interp.logger_config.get_logger",
        "base_exporter.BaseExporter"
      ],
      "complexity": 28,
      "docstrings": {
        "module": true,
        "classes": {
          "DrillholeTraceShpExporter": true,
          "DrillholeIntervalShpExporter": true
        },
        "functions": {
          "get_supported_extensions": true,
          "export": true,
          "_write_traces": true,
          "_prepare_fields": true,
          "_create_feature": true,
          "_write_intervals": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 10,
        "typed_functions": 10,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 70,
        "length": 276,
        "volume": 1656,
        "difficulty": 17.04,
        "effort": 28219.87
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 49,
        "i18n_score": 0.0
      },
      "keywords": [
        "fields",
        "feat",
        "drillhole_data",
        "writer",
        "drillhole"
      ],
      "file_size_kb": 5.6572265625,
      "syntax_error": false
    },
    "gui/ui/pages/drillhole_page.py": {
      "path": "gui/ui/pages/drillhole_page.py",
      "lines": 323,
      "functions": [
        "__init__(2 args)",
        "_setup_ui(1 args)",
        "_setup_collar_tab(2 args)",
        "_add_collar_layer_widgets(2 args)",
        "_add_collar_coordinate_widgets(2 args)",
        "_add_collar_depth_widgets(2 args)",
        "_connect_collar_signals(1 args)",
        "_setup_survey_tab(2 args)",
        "_setup_interval_tab(2 args)",
        "_toggle_xy_fields(2 args)",
        "get_data(1 args)",
        "is_complete(1 args)"
      ],
      "classes": [
        "DrillholePage(BasePage)"
      ],
      "imports": [
        "typing.Any",
        "qgis.core.Qgis",
        "qgis.core.QgsMapLayerProxyModel",
        "qgis.gui.QgsFieldComboBox",
        "qgis.gui.QgsMapLayerComboBox",
        "qgis.PyQt.QtCore.QCoreApplication",
        "qgis.PyQt.QtCore.pyqtSignal",
        "qgis.PyQt.QtWidgets.QCheckBox",
        "qgis.PyQt.QtWidgets.QGridLayout",
        "qgis.PyQt.QtWidgets.QLabel",
        "qgis.PyQt.QtWidgets.QTabWidget",
        "qgis.PyQt.QtWidgets.QVBoxLayout",
        "qgis.PyQt.QtWidgets.QWidget",
        "sec_interp.core.validation.project_validator.ProjectValidator",
        "sec_interp.core.validation.project_validator.ValidationParams",
        "sec_interp.logger_config.get_logger",
        "base_page.BasePage"
      ],
      "complexity": 13,
      "docstrings": {
        "module": true,
        "classes": {
          "DrillholePage": true
        },
        "functions": {
          "__init__": false,
          "_setup_ui": false,
          "_setup_collar_tab": false,
          "_add_collar_layer_widgets": true,
          "_add_collar_coordinate_widgets": true,
          "_add_collar_depth_widgets": true,
          "_connect_collar_signals": true,
          "_setup_survey_tab": false,
          "_setup_interval_tab": false,
          "_toggle_xy_fields": true,
          "get_data": true,
          "is_complete": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 12,
        "typed_functions": 12,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 105,
        "length": 570,
        "volume": 3420,
        "difficulty": 21.98,
        "effort": 75169.48
      },
      "i18n": {
        "tr_calls": 22,
        "total_strings_estimate": 74,
        "i18n_score": 29.72972972972973
      },
      "keywords": [
        "layout",
        "addwidget",
        "connect",
        "data",
        "qlabel"
      ],
      "file_size_kb": 11.9375,
      "syntax_error": false
    },
    ".ai-context/ai_workflow.py": {
      "path": ".ai-context/ai_workflow.py",
      "lines": 1014,
      "functions": [
        "example_workflow",
        "__init__(2 args)",
        "_ensure_structure(1 args)",
        "start_session(3 args)",
        "generate_optimized_prompt(4 args)",
        "_load_relevant_context(3 args)",
        "_load_normal_context(2 args)",
        "_normalize(2 args)",
        "_add_if_relevant(6 args)",
        "_get_constraints(1 args)",
        "_select_template(3 args)",
        "_qwen_cli_template(1 args)",
        "_deepseek_template(1 args)",
        "_chatgpt_template(1 args)",
        "_claude_template(1 args)",
        "_gemini_3_pro_template(1 args)",
        "_claude_sonnet_45_template(1 args)",
        "_gpt_oss_120b_template(1 args)",
        "_gemini_template(1 args)",
        "_default_template(2 args)",
        "_truncate_to_tokens(3 args)",
        "process_ai_response(3 args)",
        "_parse_structured_response(2 args)",
        "_extract_actions(2 args)",
        "_update_project_brain(2 args)",
        "_log_action(3 args)",
        "end_session(3 args)",
        "_generate_session_summary(4 args)",
        "_default_brain_template(1 args)",
        "_default_tech_stack(1 args)",
        "_cheatsheet_template(1 args)",
        "_extract_keywords(2 args)",
        "_estimate_tokens(2 args)"
      ],
      "classes": [
        "AIWorkflowManager"
      ],
      "imports": [
        "datetime.datetime",
        "hashlib",
        "json",
        "os",
        "pathlib.Path",
        "sys",
        "time",
        "typing.Dict",
        "typing.List",
        "typing.Optional",
        "typing.Tuple",
        "unicodedata",
        "yaml",
        "argparse",
        "re"
      ],
      "complexity": 92,
      "docstrings": {
        "module": true,
        "classes": {
          "AIWorkflowManager": true
        },
        "functions": {
          "example_workflow": true,
          "__init__": false,
          "_ensure_structure": true,
          "start_session": true,
          "generate_optimized_prompt": true,
          "_load_relevant_context": true,
          "_load_normal_context": true,
          "_normalize": true,
          "_add_if_relevant": true,
          "_get_constraints": true,
          "_select_template": true,
          "_qwen_cli_template": true,
          "_deepseek_template": true,
          "_chatgpt_template": true,
          "_claude_template": true,
          "_gemini_3_pro_template": true,
          "_claude_sonnet_45_template": true,
          "_gpt_oss_120b_template": true,
          "_gemini_template": true,
          "_default_template": true,
          "_truncate_to_tokens": true,
          "process_ai_response": true,
          "_parse_structured_response": true,
          "_extract_actions": true,
          "_update_project_brain": true,
          "_log_action": true,
          "end_session": true,
          "_generate_session_summary": true,
          "_default_brain_template": true,
          "_default_tech_stack": true,
          "_cheatsheet_template": true,
          "_extract_keywords": true,
          "_estimate_tokens": true
        }
      },
      "has_main": true,
      "file_size_kb": 36.01953125,
      "syntax_error": false
    },
    ".ai-context/context_manager.py": {
      "path": ".ai-context/context_manager.py",
      "lines": 187,
      "functions": [
        "__init__(2 args)",
        "_load_contexts(1 args)",
        "create_optimized_prompt(4 args)",
        "_deepseek_template(1 args)",
        "_extract_relevant_context(2 args)",
        "_extract_keywords(2 args)",
        "_truncate_to_tokens(3 args)",
        "update_context(2 args)"
      ],
      "classes": [
        "AIContextManager"
      ],
      "imports": [
        "json",
        "pathlib.Path",
        "typing.Dict",
        "typing.List",
        "typing.Optional",
        "yaml",
        "sys"
      ],
      "complexity": 26,
      "docstrings": {
        "module": true,
        "classes": {
          "AIContextManager": true
        },
        "functions": {
          "__init__": false,
          "_load_contexts": true,
          "create_optimized_prompt": true,
          "_deepseek_template": true,
          "_extract_relevant_context": true,
          "_extract_keywords": true,
          "_truncate_to_tokens": true,
          "update_context": true
        }
      },
      "has_main": true,
      "file_size_kb": 6.1181640625,
      "syntax_error": false
    },
    "exporters/orchestrator.py": {
      "path": "exporters/orchestrator.py",
      "lines": 148,
      "functions": [
        "__init__(1 args)",
        "export_data(7 args)"
      ],
      "classes": [
        "DataExportOrchestrator"
      ],
      "imports": [
        "typing.Dict",
        "typing.List",
        "typing.Tuple",
        "typing.Optional",
        "typing.Any",
        "pathlib.Path",
        "sec_interp.logger_config.get_logger",
        "sec_interp.exporters.AxesShpExporter",
        "sec_interp.exporters.CSVExporter",
        "sec_interp.exporters.GeologyShpExporter",
        "sec_interp.exporters.ProfileLineShpExporter",
        "sec_interp.exporters.StructureShpExporter",
        "sec_interp.exporters.DrillholeTraceShpExporter",
        "sec_interp.exporters.DrillholeIntervalShpExporter"
      ],
      "complexity": 9,
      "docstrings": {
        "module": true,
        "classes": {
          "DataExportOrchestrator": true
        },
        "functions": {
          "__init__": true,
          "export_data": true
        }
      },
      "has_main": false,
      "file_size_kb": 5.2001953125,
      "syntax_error": false
    },
    "generate_ai_templates.py": {
      "path": "generate_ai_templates.py",
      "lines": 337,
      "functions": [
        "main"
      ],
      "classes": [],
      "imports": [
        "os",
        "pathlib.Path"
      ],
      "complexity": 3,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {
          "main": false
        }
      },
      "has_main": true,
      "file_size_kb": 11.3857421875,
      "syntax_error": false
    },
    "core/services/preview_service.py": {
      "path": "core/services/preview_service.py",
      "lines": 250,
      "functions": [
        "__init__(2 args)",
        "calculate_max_points(4 args)",
        "generate_all(3 args)",
        "_generate_drillholes(2 args)"
      ],
      "classes": [
        "PreviewService"
      ],
      "imports": [
        "__future__.annotations",
        "math",
        "typing.Any",
        "qgis.core.QgsDistanceArea",
        "sec_interp.core.utils",
        "sec_interp.core.exceptions.GeometryError",
        "sec_interp.core.exceptions.ProcessingError",
        "sec_interp.core.performance_metrics.PerformanceTimer",
        "sec_interp.core.types.PreviewParams",
        "sec_interp.core.types.PreviewResult",
        "sec_interp.logger_config.get_logger",
        "traceback"
      ],
      "complexity": 26,
      "docstrings": {
        "module": true,
        "classes": {
          "PreviewService": true
        },
        "functions": {
          "__init__": true,
          "calculate_max_points": true,
          "generate_all": true,
          "_generate_drillholes": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 4,
        "typed_functions": 3,
        "coverage": 75.0
      },
      "halstead": {
        "vocabulary": 100,
        "length": 291,
        "volume": 1746,
        "difficulty": 17.18,
        "effort": 29999.45
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 37,
        "i18n_score": 0.0
      },
      "keywords": [
        "params",
        "result",
        "drillhole",
        "line_geom",
        "points"
      ],
      "file_size_kb": 9.103515625,
      "syntax_error": false
    },
    "gui/parallel_geology.py": {
      "path": "gui/parallel_geology.py",
      "lines": 218,
      "functions": [
        "__init__(3 args)",
        "cancel(1 args)",
        "is_canceled(1 args)",
        "run(1 args)",
        "__init__(1 args)",
        "_get_optimal_thread_count(1 args)",
        "process_profiles_parallel(3 args)",
        "_on_chunk_finished(2 args)",
        "_cleanup_thread(2 args)",
        "cancel_processing(1 args)",
        "_on_chunk_canceled(1 args)",
        "_on_chunk_progress(3 args)",
        "_on_chunk_error(2 args)",
        "_process_profile_chunk(2 args)"
      ],
      "classes": [
        "GeologyProcessingThread(QThread)",
        "ParallelGeologyService(QObject)"
      ],
      "imports": [
        "__future__.annotations",
        "collections.abc.Callable",
        "concurrent.futures.ThreadPoolExecutor",
        "os",
        "threading",
        "typing.Any",
        "qgis.PyQt.QtCore.QObject",
        "qgis.PyQt.QtCore.QThread",
        "qgis.PyQt.QtCore.pyqtSignal",
        "sec_interp.logger_config.get_logger"
      ],
      "complexity": 25,
      "docstrings": {
        "module": true,
        "classes": {
          "GeologyProcessingThread": true,
          "ParallelGeologyService": true
        },
        "functions": {
          "__init__": false,
          "cancel": true,
          "is_canceled": true,
          "run": true,
          "_get_optimal_thread_count": true,
          "process_profiles_parallel": true,
          "_on_chunk_finished": true,
          "_cleanup_thread": true,
          "cancel_processing": true,
          "_on_chunk_canceled": true,
          "_on_chunk_progress": true,
          "_on_chunk_error": true,
          "_process_profile_chunk": true
        }
      },
      "has_main": false,
      "file_size_kb": 7.26953125,
      "syntax_error": false
    },
    "core/services/export_service.py": {
      "path": "core/services/export_service.py",
      "lines": 306,
      "functions": [
        "__init__(2 args)",
        "export_data(9 args)",
        "_export_topography(6 args)",
        "_export_geology(6 args)",
        "_export_structures(7 args)",
        "_export_drillholes(5 args)",
        "_export_interpretations(6 args)",
        "_export_axes(5 args)",
        "get_map_settings(5 args)"
      ],
      "classes": [
        "ExportService"
      ],
      "imports": [
        "__future__.annotations",
        "pathlib.Path",
        "typing.Any",
        "qgis.core.QgsMapSettings",
        "qgis.core.QgsRectangle",
        "sec_interp.core.exceptions.DataMissingError",
        "sec_interp.core.exceptions.ExportError",
        "sec_interp.core.services.access_control_service.AccessControlService",
        "sec_interp.core.types.PreviewParams",
        "sec_interp.logger_config.get_logger",
        "sec_interp.exporters.CSVExporter",
        "sec_interp.exporters.ProfileLineShpExporter",
        "sec_interp.exporters.GeologyShpExporter",
        "sec_interp.exporters.StructureShpExporter",
        "sec_interp.exporters.DrillholeIntervalShpExporter",
        "sec_interp.exporters.DrillholeTraceShpExporter",
        "sec_interp.exporters.Interpretation2DExporter",
        "sec_interp.exporters.AxesShpExporter",
        "sec_interp.exporters.Interpretation3DExporter"
      ],
      "complexity": 40,
      "docstrings": {
        "module": true,
        "classes": {
          "ExportService": true
        },
        "functions": {
          "__init__": true,
          "export_data": true,
          "_export_topography": true,
          "_export_geology": true,
          "_export_structures": true,
          "_export_drillholes": true,
          "_export_interpretations": true,
          "_export_axes": true,
          "get_map_settings": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 9,
        "typed_functions": 8,
        "coverage": 88.88888888888889
      },
      "halstead": {
        "vocabulary": 138,
        "length": 442,
        "volume": 3094,
        "difficulty": 14.8,
        "effort": 45805.7
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 105,
        "i18n_score": 0.0
      },
      "keywords": [
        "export",
        "data",
        "list",
        "folder",
        "sec_interp"
      ],
      "file_size_kb": 10.7333984375,
      "syntax_error": false
    },
    "gui/preview_axes_manager.py": {
      "path": "gui/preview_axes_manager.py",
      "lines": 201,
      "functions": [
        "get_nice_interval(1 args)",
        "create_axes_layer(3 args)",
        "create_axes_labels_layer(3 args)"
      ],
      "classes": [
        "PreviewAxesManager"
      ],
      "imports": [
        "__future__.annotations",
        "math",
        "qgis.core.QgsFeature",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsLineString",
        "qgis.core.QgsLineSymbol",
        "qgis.core.QgsMarkerSymbol",
        "qgis.core.QgsPalLayerSettings",
        "qgis.core.QgsPointXY",
        "qgis.core.QgsProject",
        "qgis.core.QgsProperty",
        "qgis.core.QgsPropertyCollection",
        "qgis.core.QgsSingleSymbolRenderer",
        "qgis.core.QgsTextFormat",
        "qgis.core.QgsVectorLayer",
        "qgis.core.QgsVectorLayerSimpleLabeling",
        "qgis.PyQt.QtGui.QColor",
        "sec_interp.logger_config.get_logger"
      ],
      "complexity": 15,
      "docstrings": {
        "module": true,
        "classes": {
          "PreviewAxesManager": true
        },
        "functions": {
          "get_nice_interval": true,
          "create_axes_layer": true,
          "create_axes_labels_layer": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 3,
        "typed_functions": 1,
        "coverage": 33.33333333333333
      },
      "halstead": {
        "vocabulary": 105,
        "length": 382,
        "volume": 2292,
        "difficulty": 20.45,
        "effort": 46875.1
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 34,
        "i18n_score": 0.0
      },
      "keywords": [
        "layer",
        "extent",
        "feat",
        "vert_exag",
        "y_interval"
      ],
      "file_size_kb": 6.22265625,
      "syntax_error": false
    },
    "gui/preview_layer_factory.py": {
      "path": "gui/preview_layer_factory.py",
      "lines": 474,
      "functions": [
        "__init__(1 args)",
        "get_color_for_unit(2 args)",
        "create_memory_layer(4 args)",
        "create_topo_layer(5 args)",
        "_style_topo_layer(2 args)",
        "create_topo_fill_layer(5 args)",
        "_style_topo_fill_layer(2 args)",
        "create_geol_layer(4 args)",
        "_style_geol_layer(3 args)",
        "create_struct_layer(5 args)",
        "_style_struct_layer(2 args)",
        "create_drillhole_trace_layer(3 args)",
        "_style_drillhole_trace_layer(2 args)",
        "create_drillhole_interval_layer(3 args)",
        "_style_drillhole_interval_layer(3 args)",
        "interpolate_elevation(3 args)"
      ],
      "classes": [
        "PreviewLayerFactory"
      ],
      "imports": [
        "__future__.annotations",
        "math",
        "typing.Any",
        "typing.ClassVar",
        "qgis.core.QgsCategorizedSymbolRenderer",
        "qgis.core.QgsClassificationFixedInterval",
        "qgis.core.QgsFeature",
        "qgis.core.QgsFillSymbol",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsGraduatedSymbolRenderer",
        "qgis.core.QgsLineSymbol",
        "qgis.core.QgsPalLayerSettings",
        "qgis.core.QgsPointXY",
        "qgis.core.QgsProject",
        "qgis.core.QgsRendererCategory",
        "qgis.core.QgsSingleSymbolRenderer",
        "qgis.core.QgsStyle",
        "qgis.core.QgsTextFormat",
        "qgis.core.QgsVectorLayer",
        "qgis.core.QgsVectorLayerSimpleLabeling",
        "qgis.PyQt.QtGui.QColor",
        "sec_interp.core.types.GeologyData",
        "sec_interp.core.types.ProfileData",
        "sec_interp.core.types.StructureData",
        "sec_interp.core.utils.geometry_utils.optimization.PreviewOptimizer",
        "sec_interp.logger_config.get_logger"
      ],
      "complexity": 69,
      "docstrings": {
        "module": true,
        "classes": {
          "PreviewLayerFactory": true
        },
        "functions": {
          "__init__": true,
          "get_color_for_unit": true,
          "create_memory_layer": true,
          "create_topo_layer": true,
          "_style_topo_layer": true,
          "create_topo_fill_layer": true,
          "_style_topo_fill_layer": true,
          "create_geol_layer": true,
          "_style_geol_layer": true,
          "create_struct_layer": true,
          "_style_struct_layer": true,
          "create_drillhole_trace_layer": true,
          "_style_drillhole_trace_layer": true,
          "create_drillhole_interval_layer": true,
          "_style_drillhole_interval_layer": true,
          "interpolate_elevation": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 16,
        "typed_functions": 9,
        "coverage": 56.25
      },
      "halstead": {
        "vocabulary": 255,
        "length": 957,
        "volume": 6699,
        "difficulty": 36.35,
        "effort": 243482.88
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 111,
        "i18n_score": 0.0
      },
      "keywords": [
        "layer",
        "qcolor",
        "feat",
        "color",
        "features"
      ],
      "file_size_kb": 16.130859375,
      "syntax_error": false
    },
    "gui/preview_legend_renderer.py": {
      "path": "gui/preview_legend_renderer.py",
      "lines": 175,
      "functions": [
        "draw_legend(5 args)",
        "_calculate_legend_size(5 args)",
        "_draw_legend_background(5 args)",
        "_draw_line_item(7 args)",
        "_draw_geology_items(6 args)"
      ],
      "classes": [
        "PreviewLegendRenderer"
      ],
      "imports": [
        "__future__.annotations",
        "typing.Any",
        "qgis.PyQt.QtCore.QCoreApplication",
        "qgis.PyQt.QtCore.QRectF",
        "qgis.PyQt.QtCore.Qt",
        "qgis.PyQt.QtGui.QColor",
        "qgis.PyQt.QtGui.QFont",
        "qgis.PyQt.QtGui.QPainter",
        "qgis.PyQt.QtGui.QPen",
        "sec_interp.logger_config.get_logger"
      ],
      "complexity": 11,
      "docstrings": {
        "module": true,
        "classes": {
          "PreviewLegendRenderer": true
        },
        "functions": {
          "draw_legend": true,
          "_calculate_legend_size": true,
          "_draw_legend_background": true,
          "_draw_line_item": true,
          "_draw_geology_items": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 5,
        "typed_functions": 5,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 89,
        "length": 365,
        "volume": 2190,
        "difficulty": 22.35,
        "effort": 48952.12
      },
      "i18n": {
        "tr_calls": 4,
        "total_strings_estimate": 43,
        "i18n_score": 9.30232558139535
      },
      "keywords": [
        "painter",
        "config",
        "qcolor",
        "float",
        "previewlegendrenderer"
      ],
      "file_size_kb": 5.3505859375,
      "syntax_error": false
    },
    "gui/preview_optimizer.py": {
      "path": "gui/preview_optimizer.py",
      "lines": 169,
      "functions": [
        "decimate(3 args)",
        "calculate_curvature(1 args)",
        "adaptive_sample(5 args)"
      ],
      "classes": [
        "PreviewOptimizer"
      ],
      "imports": [
        "__future__.annotations",
        "math",
        "typing.Optional",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsPointXY",
        "sec_interp.logger_config.get_logger"
      ],
      "complexity": 15,
      "docstrings": {
        "module": true,
        "classes": {
          "PreviewOptimizer": true
        },
        "functions": {
          "decimate": true,
          "calculate_curvature": true,
          "adaptive_sample": true
        }
      },
      "has_main": false,
      "file_size_kb": 5.6142578125,
      "syntax_error": false
    },
    "gui/utils.py": {
      "path": "gui/utils.py",
      "lines": 44,
      "functions": [
        "show_user_message(4 args)"
      ],
      "classes": [],
      "imports": [
        "qgis.PyQt.QtWidgets.QMessageBox",
        "sec_interp.logger_config.get_logger"
      ],
      "complexity": 7,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {
          "show_user_message": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 1,
        "typed_functions": 0,
        "coverage": 0.0
      },
      "halstead": {
        "vocabulary": 23,
        "length": 68,
        "volume": 272,
        "difficulty": 7.5,
        "effort": 2040.0
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 21,
        "i18n_score": 0.0
      },
      "keywords": [
        "message",
        "title",
        "level",
        "qmessagebox",
        "parent"
      ],
      "file_size_kb": 1.3125,
      "syntax_error": false
    },
    "gui/main_dialog_settings.py": {
      "path": "gui/main_dialog_settings.py",
      "lines": 459,
      "functions": [
        "__init__(2 args)",
        "load_settings(1 args)",
        "_load_section_settings(1 args)",
        "_load_dem_settings(1 args)",
        "_load_geology_settings(1 args)",
        "_load_structure_settings(1 args)",
        "_load_drillhole_settings(1 args)",
        "_load_output_settings(1 args)",
        "_load_interpretation_settings(1 args)",
        "_load_preview_settings(1 args)",
        "save_settings(1 args)",
        "_save_section_settings(1 args)",
        "_save_dem_settings(1 args)",
        "_save_geology_settings(1 args)",
        "_save_structure_settings(1 args)",
        "_save_drillhole_settings(1 args)",
        "_save_output_settings(1 args)",
        "_save_interpretation_settings(1 args)",
        "_save_preview_settings(1 args)",
        "reset_to_defaults(1 args)",
        "_parse_setting_value(2 args)",
        "_get_setting(3 args)",
        "_set_setting(3 args)",
        "_save_layer(3 args)",
        "_restore_layer(3 args)",
        "_save_field(3 args)",
        "_restore_field(3 args)",
        "_save_check(3 args)",
        "_restore_check(3 args)"
      ],
      "classes": [
        "DialogSettingsManager"
      ],
      "imports": [
        "typing.TYPE_CHECKING",
        "typing.Any",
        "sec_interp.logger_config.get_logger",
        "main_dialog_config.DialogDefaults",
        "json"
      ],
      "complexity": 69,
      "docstrings": {
        "module": true,
        "classes": {
          "DialogSettingsManager": true
        },
        "functions": {
          "__init__": true,
          "load_settings": true,
          "_load_section_settings": true,
          "_load_dem_settings": true,
          "_load_geology_settings": true,
          "_load_structure_settings": true,
          "_load_drillhole_settings": true,
          "_load_output_settings": true,
          "_load_interpretation_settings": true,
          "_load_preview_settings": true,
          "save_settings": true,
          "_save_section_settings": true,
          "_save_dem_settings": true,
          "_save_geology_settings": true,
          "_save_structure_settings": true,
          "_save_drillhole_settings": true,
          "_save_output_settings": true,
          "_save_interpretation_settings": true,
          "_save_preview_settings": true,
          "reset_to_defaults": true,
          "_parse_setting_value": true,
          "_get_setting": true,
          "_set_setting": true,
          "_save_layer": true,
          "_restore_layer": true,
          "_save_field": true,
          "_restore_field": true,
          "_save_check": true,
          "_restore_check": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 29,
        "typed_functions": 22,
        "coverage": 75.86206896551724
      },
      "halstead": {
        "vocabulary": 171,
        "length": 883,
        "volume": 6181,
        "difficulty": 37.26,
        "effort": 230301.68
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 203,
        "i18n_score": 0.0
      },
      "keywords": [
        "dpage",
        "dialog",
        "settings",
        "page",
        "_restore_field"
      ],
      "file_size_kb": 18.4794921875,
      "syntax_error": false
    },
    "gui/main_dialog_status.py": {
      "path": "gui/main_dialog_status.py",
      "lines": 115,
      "functions": [
        "__init__(2 args)",
        "update_all(1 args)",
        "update_preview_checkbox_states(1 args)",
        "update_button_state(1 args)",
        "setup_indicators(1 args)",
        "update_raster_status(1 args)",
        "update_section_status(1 args)"
      ],
      "classes": [
        "DialogStatusManager"
      ],
      "imports": [
        "typing.TYPE_CHECKING",
        "qgis.PyQt.QtWidgets.QDialogButtonBox",
        "sec_interp.core.validation.project_validator.ProjectValidator"
      ],
      "complexity": 11,
      "docstrings": {
        "module": true,
        "classes": {
          "DialogStatusManager": true
        },
        "functions": {
          "__init__": true,
          "update_all": true,
          "update_preview_checkbox_states": true,
          "update_button_state": true,
          "setup_indicators": true,
          "update_raster_status": true,
          "update_section_status": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 7,
        "typed_functions": 6,
        "coverage": 85.71428571428571
      },
      "halstead": {
        "vocabulary": 42,
        "length": 143,
        "volume": 715,
        "difficulty": 6.58,
        "effort": 4703.95
      },
      "i18n": {
        "tr_calls": 4,
        "total_strings_estimate": 26,
        "i18n_score": 15.384615384615385
      },
      "keywords": [
        "dialog",
        "label",
        "section",
        "line",
        "button"
      ],
      "file_size_kb": 4.572265625,
      "syntax_error": false
    },
    "gui/main_dialog_utils.py": {
      "path": "gui/main_dialog_utils.py",
      "lines": 46,
      "functions": [
        "populate_field_combobox(2 args)",
        "get_layer_names_by_type(1 args)",
        "get_layer_names_by_geometry(1 args)",
        "get_theme_icon(1 args)"
      ],
      "classes": [
        "DialogEntityManager"
      ],
      "imports": [
        "qgis.core.QgsApplication",
        "qgis.core.QgsMapLayer",
        "qgis.core.QgsProject",
        "qgis.core.QgsWkbTypes",
        "qgis.PyQt.QtGui.QIcon"
      ],
      "complexity": 5,
      "docstrings": {
        "module": true,
        "classes": {
          "DialogEntityManager": true
        },
        "functions": {
          "populate_field_combobox": true,
          "get_layer_names_by_type": true,
          "get_layer_names_by_geometry": true,
          "get_theme_icon": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 4,
        "typed_functions": 3,
        "coverage": 75.0
      },
      "halstead": {
        "vocabulary": 28,
        "length": 53,
        "volume": 212,
        "difficulty": 4.67,
        "effort": 990.87
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 11,
        "i18n_score": 0.0
      },
      "keywords": [
        "layer",
        "name",
        "field",
        "qgis",
        "staticmethod"
      ],
      "file_size_kb": 1.6025390625,
      "syntax_error": false
    },
    "core/validation/__init__.py": {
      "path": "core/validation/__init__.py",
      "lines": 46,
      "functions": [],
      "classes": [],
      "imports": [
        "field_validator.validate_angle_range",
        "field_validator.validate_field_exists",
        "field_validator.validate_field_type",
        "field_validator.validate_integer_input",
        "field_validator.validate_numeric_input",
        "layer_validator.validate_crs_compatibility",
        "layer_validator.validate_layer_exists",
        "layer_validator.validate_layer_geometry",
        "layer_validator.validate_layer_has_features",
        "layer_validator.validate_raster_band",
        "layer_validator.validate_structural_requirements",
        "path_validator.validate_output_path",
        "path_validator.validate_safe_output_path",
        "project_validator.ProjectValidator",
        "project_validator.ValidationParams",
        "project_validator.validate_reasonable_ranges"
      ],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {}
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 0,
        "typed_functions": 0,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 18,
        "length": 18,
        "volume": 0,
        "difficulty": 0,
        "effort": 0
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 17,
        "i18n_score": 0.0
      },
      "keywords": [
        "validate_angle_range",
        "validate_field_exists",
        "validate_field_type",
        "validate_integer_input",
        "validate_numeric_input"
      ],
      "file_size_kb": 1.10546875,
      "syntax_error": false
    },
    "core/validation/field_validator.py": {
      "path": "core/validation/field_validator.py",
      "lines": 206,
      "functions": [
        "validate_numeric_input(5 args)",
        "validate_integer_input(5 args)",
        "validate_angle_range(4 args)",
        "validate_field_exists(2 args)",
        "validate_field_type(3 args)"
      ],
      "classes": [],
      "imports": [
        "__future__.annotations",
        "qgis.core.QgsVectorLayer",
        "sec_interp.core.types.FieldType"
      ],
      "complexity": 36,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {
          "validate_numeric_input": true,
          "validate_integer_input": true,
          "validate_angle_range": true,
          "validate_field_exists": true,
          "validate_field_type": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 5,
        "typed_functions": 5,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 86,
        "length": 315,
        "volume": 1890,
        "difficulty": 20.59,
        "effort": 38923.78
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 65,
        "i18n_score": 0.0
      },
      "keywords": [
        "layer",
        "value",
        "field_name",
        "field",
        "name"
      ],
      "file_size_kb": 6.427734375,
      "syntax_error": false
    },
    "core/validation/layer_validator.py": {
      "path": "core/validation/layer_validator.py",
      "lines": 228,
      "functions": [
        "validate_layer_exists(1 args)",
        "validate_layer_has_features(1 args)",
        "validate_layer_geometry(2 args)",
        "validate_raster_band(2 args)",
        "validate_structural_requirements(4 args)",
        "validate_crs_compatibility(1 args)"
      ],
      "classes": [],
      "imports": [
        "__future__.annotations",
        "qgis.core.QgsMapLayer",
        "qgis.core.QgsProject",
        "qgis.core.QgsRasterLayer",
        "qgis.core.QgsVectorLayer",
        "qgis.core.QgsWkbTypes",
        "sec_interp.core.types.FieldType",
        "field_validator.validate_field_exists",
        "field_validator.validate_field_type"
      ],
      "complexity": 36,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {
          "validate_layer_exists": true,
          "validate_layer_has_features": true,
          "validate_layer_geometry": true,
          "validate_raster_band": true,
          "validate_structural_requirements": true,
          "validate_crs_compatibility": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 6,
        "typed_functions": 6,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 95,
        "length": 310,
        "volume": 1860,
        "difficulty": 17.93,
        "effort": 33345.54
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 58,
        "i18n_score": 0.0
      },
      "keywords": [
        "layer",
        "is_valid",
        "name",
        "qgswkbtypes",
        "tuple"
      ],
      "file_size_kb": 6.98046875,
      "syntax_error": false
    },
    "core/validation/project_validator.py": {
      "path": "core/validation/project_validator.py",
      "lines": 306,
      "functions": [
        "validate_reasonable_ranges(1 args)",
        "validate_all(1 args)",
        "_validate_dem(2 args)",
        "_validate_section(2 args)",
        "_validate_output(2 args)",
        "_validate_numeric_ranges(2 args)",
        "_validate_geology(2 args)",
        "_validate_structural(2 args)",
        "validate_preview_requirements(1 args)",
        "is_drillhole_complete(1 args)",
        "is_dem_complete(1 args)",
        "is_geology_complete(1 args)",
        "is_structure_complete(1 args)"
      ],
      "classes": [
        "ValidationParams",
        "ProjectValidator"
      ],
      "imports": [
        "__future__.annotations",
        "dataclasses.dataclass",
        "typing.Any",
        "qgis.core.QgsRasterLayer",
        "qgis.core.QgsVectorLayer",
        "qgis.core.QgsWkbTypes",
        "sec_interp.core.exceptions.ValidationError",
        "layer_validator.validate_field_exists",
        "layer_validator.validate_layer_geometry",
        "layer_validator.validate_layer_has_features",
        "layer_validator.validate_raster_band",
        "layer_validator.validate_structural_requirements",
        "path_validator.validate_output_path"
      ],
      "complexity": 56,
      "docstrings": {
        "module": true,
        "classes": {
          "ValidationParams": true,
          "ProjectValidator": true
        },
        "functions": {
          "validate_reasonable_ranges": true,
          "validate_all": true,
          "_validate_dem": true,
          "_validate_section": true,
          "_validate_output": true,
          "_validate_numeric_ranges": true,
          "_validate_geology": true,
          "_validate_structural": true,
          "validate_preview_requirements": true,
          "is_drillhole_complete": true,
          "is_dem_complete": true,
          "is_geology_complete": true,
          "is_structure_complete": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 13,
        "typed_functions": 13,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 126,
        "length": 519,
        "volume": 3114,
        "difficulty": 23.47,
        "effort": 73082.55
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 57,
        "i18n_score": 0.0
      },
      "keywords": [
        "params",
        "errors",
        "append",
        "is_valid",
        "error"
      ],
      "file_size_kb": 10.078125,
      "syntax_error": false
    },
    "core/validation/path_validator.py": {
      "path": "core/validation/path_validator.py",
      "lines": 112,
      "functions": [
        "validate_safe_output_path(4 args)",
        "_check_path_security(1 args)",
        "_check_base_restriction(2 args)",
        "_validate_path_state(3 args)",
        "validate_output_path(1 args)"
      ],
      "classes": [],
      "imports": [
        "__future__.annotations",
        "pathlib.Path"
      ],
      "complexity": 30,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {
          "validate_safe_output_path": true,
          "_check_path_security": true,
          "_check_base_restriction": true,
          "_validate_path_state": true,
          "validate_output_path": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 5,
        "typed_functions": 5,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 58,
        "length": 209,
        "volume": 1045,
        "difficulty": 15.61,
        "effort": 16314.8
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 31,
        "i18n_score": 0.0
      },
      "keywords": [
        "path",
        "directory",
        "bool",
        "path_obj",
        "resolved_path"
      ],
      "file_size_kb": 3.697265625,
      "syntax_error": false
    },
    "gui/main_dialog_data.py": {
      "path": "gui/main_dialog_data.py",
      "lines": 194,
      "functions": [
        "__init__(2 args)",
        "get_all_values(1 args)",
        "_get_dem_values(1 args)",
        "_get_section_values(1 args)",
        "_get_geology_values(1 args)",
        "_get_structure_values(1 args)",
        "_get_drillhole_values(1 args)",
        "_get_settings_values(1 args)",
        "get_validation_params(1 args)"
      ],
      "classes": [
        "DialogDataAggregator"
      ],
      "imports": [
        "typing.TYPE_CHECKING",
        "sec_interp.core.validation.project_validator.ValidationParams"
      ],
      "complexity": 2,
      "docstrings": {
        "module": true,
        "classes": {
          "DialogDataAggregator": true
        },
        "functions": {
          "__init__": true,
          "get_all_values": true,
          "_get_dem_values": true,
          "_get_section_values": true,
          "_get_geology_values": true,
          "_get_structure_values": true,
          "_get_drillhole_values": true,
          "_get_settings_values": true,
          "get_validation_params": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 9,
        "typed_functions": 8,
        "coverage": 88.88888888888889
      },
      "halstead": {
        "vocabulary": 79,
        "length": 210,
        "volume": 1260,
        "difficulty": 3.91,
        "effort": 4923.95
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 109,
        "i18n_score": 0.0
      },
      "keywords": [
        "dialog",
        "drillhole_data",
        "get_data",
        "dictionary",
        "values"
      ],
      "file_size_kb": 6.6474609375,
      "syntax_error": false
    },
    "gui/main_dialog_signals.py": {
      "path": "gui/main_dialog_signals.py",
      "lines": 148,
      "functions": [
        "__init__(2 args)",
        "connect_all(1 args)",
        "_connect_button_signals(1 args)",
        "_connect_preview_signals(1 args)",
        "_connect_page_signals(1 args)",
        "_connect_tool_signals(1 args)",
        "finalize_with_log"
      ],
      "classes": [
        "DialogSignalManager"
      ],
      "imports": [
        "typing.TYPE_CHECKING",
        "qgis.PyQt.QtWidgets.QDialogButtonBox",
        "sec_interp.logger_config.get_logger"
      ],
      "complexity": 5,
      "docstrings": {
        "module": true,
        "classes": {
          "DialogSignalManager": true
        },
        "functions": {
          "__init__": true,
          "connect_all": true,
          "_connect_button_signals": true,
          "_connect_preview_signals": true,
          "_connect_page_signals": true,
          "_connect_tool_signals": true,
          "finalize_with_log": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 7,
        "typed_functions": 6,
        "coverage": 85.71428571428571
      },
      "halstead": {
        "vocabulary": 26,
        "length": 109,
        "volume": 436,
        "difficulty": 6.33,
        "effort": 2758.17
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 20,
        "i18n_score": 0.0
      },
      "keywords": [
        "dialog",
        "connect",
        "preview_widget",
        "button",
        "clicked"
      ],
      "file_size_kb": 5.58984375,
      "syntax_error": false
    },
    "sec_interp_plugin.py": {
      "path": "sec_interp_plugin.py",
      "lines": 477,
      "functions": [
        "__init__(2 args)",
        "tr(2 args)",
        "add_action(10 args)",
        "initGui(1 args)",
        "unload(1 args)",
        "run(1 args)",
        "_resolve_layer_obj(3 args)",
        "_get_and_validate_inputs(1 args)",
        "process_data(2 args)",
        "save_profile_line(1 args)",
        "draw_preview(6 args)"
      ],
      "classes": [
        "SecInterp"
      ],
      "imports": [
        "__future__.annotations",
        "pathlib.Path",
        "typing.Any",
        "qgis.core.QgsMapLayer",
        "qgis.core.QgsProject",
        "qgis.PyQt.QtCore.QCoreApplication",
        "qgis.PyQt.QtCore.QSettings",
        "qgis.PyQt.QtCore.QTranslator",
        "qgis.PyQt.QtGui.QIcon",
        "qgis.PyQt.QtWidgets.QAction",
        "sec_interp.core.controller.ProfileController",
        "sec_interp.core.exceptions.SecInterpError",
        "sec_interp.core.services.export_service.ExportService",
        "sec_interp.core.types.PreviewParams",
        "sec_interp.gui.main_dialog.SecInterpDialog",
        "sec_interp.gui.preview_renderer.PreviewRenderer",
        "sec_interp.logger_config.get_logger"
      ],
      "complexity": 43,
      "docstrings": {
        "module": true,
        "classes": {
          "SecInterp": true
        },
        "functions": {
          "__init__": true,
          "tr": true,
          "add_action": true,
          "initGui": true,
          "unload": true,
          "run": true,
          "_resolve_layer_obj": true,
          "_get_and_validate_inputs": true,
          "process_data": true,
          "save_profile_line": true,
          "draw_preview": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 11,
        "typed_functions": 11,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 182,
        "length": 598,
        "volume": 4186,
        "difficulty": 20.46,
        "effort": 85652.0
      },
      "i18n": {
        "tr_calls": 9,
        "total_strings_estimate": 98,
        "i18n_score": 9.183673469387756
      },
      "keywords": [
        "values",
        "action",
        "logger",
        "toolbar",
        "dialog"
      ],
      "file_size_kb": 18.99609375,
      "syntax_error": false
    },
    "docs/source/conf.py": {
      "path": "docs/source/conf.py",
      "lines": 67,
      "functions": [],
      "classes": [],
      "imports": [
        "datetime.datetime",
        "os",
        "sys"
      ],
      "complexity": 0,
      "docstrings": {
        "module": false,
        "classes": {},
        "functions": {}
      },
      "has_main": false,
      "file_size_kb": 1.544921875,
      "syntax_error": false
    },
    "core/config.py": {
      "path": "core/config.py",
      "lines": 87,
      "functions": [
        "__init__(1 args)",
        "get(3 args)",
        "set(3 args)",
        "reset_defaults(1 args)"
      ],
      "classes": [
        "ConfigService"
      ],
      "imports": [
        "typing.Any",
        "qgis.core.QgsSettings",
        "sec_interp.logger_config.get_logger"
      ],
      "complexity": 3,
      "docstrings": {
        "module": true,
        "classes": {
          "ConfigService": true
        },
        "functions": {
          "__init__": true,
          "get": true,
          "set": true,
          "reset_defaults": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 4,
        "typed_functions": 3,
        "coverage": 75.0
      },
      "halstead": {
        "vocabulary": 63,
        "length": 108,
        "volume": 540,
        "difficulty": 5.0,
        "effort": 2700.0
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 34,
        "i18n_score": 0.0
      },
      "keywords": [
        "value",
        "settings",
        "default",
        "configuration",
        "qgssettings"
      ],
      "file_size_kb": 2.458984375,
      "syntax_error": false
    },
    "gui/main_dialog_tools.py": {
      "path": "gui/main_dialog_tools.py",
      "lines": 161,
      "functions": [
        "__init__(5 args)",
        "initialize_tools(1 args)",
        "toggle_measure_tool(2 args)",
        "activate_default_tool(1 args)",
        "toggle_interpretation_tool(2 args)",
        "update_measurement_display(2 args)",
        "__init__(2 args)",
        "handle_wheel_event(2 args)"
      ],
      "classes": [
        "DialogToolManager",
        "NavigationManager"
      ],
      "imports": [
        "__future__.annotations",
        "typing.TYPE_CHECKING",
        "typing.Any",
        "qgis.gui.QgsMapTool",
        "qgis.gui.QgsMapToolPan",
        "tools.interpretation_tool.ProfileInterpretationTool",
        "tools.measure_tool.ProfileMeasureTool",
        "main_dialog.SecInterpDialog"
      ],
      "complexity": 12,
      "docstrings": {
        "module": true,
        "classes": {
          "DialogToolManager": true,
          "NavigationManager": true
        },
        "functions": {
          "__init__": true,
          "initialize_tools": true,
          "toggle_measure_tool": true,
          "activate_default_tool": true,
          "toggle_interpretation_tool": true,
          "update_measurement_display": true,
          "handle_wheel_event": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 8,
        "typed_functions": 6,
        "coverage": 75.0
      },
      "halstead": {
        "vocabulary": 70,
        "length": 192,
        "volume": 1152,
        "difficulty": 9.22,
        "effort": 10624.0
      },
      "i18n": {
        "tr_calls": 7,
        "total_strings_estimate": 41,
        "i18n_score": 17.073170731707318
      },
      "keywords": [
        "dialog",
        "preview_widget",
        "canvas",
        "tool",
        "pan_tool"
      ],
      "file_size_kb": 5.9765625,
      "syntax_error": false
    },
    "core/utils/geometry_utils/extraction.py": {
      "path": "core/utils/geometry_utils/extraction.py",
      "lines": 48,
      "functions": [
        "extract_all_vertices(1 args)",
        "get_line_vertices(1 args)"
      ],
      "classes": [],
      "imports": [
        "__future__.annotations",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsPointXY",
        "qgis.core.QgsWkbTypes"
      ],
      "complexity": 8,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {
          "extract_all_vertices": true,
          "get_line_vertices": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 2,
        "typed_functions": 2,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 20,
        "length": 43,
        "volume": 172,
        "difficulty": 5.17,
        "effort": 888.67
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 8,
        "i18n_score": 0.0
      },
      "keywords": [
        "geometry",
        "vertices",
        "qgis",
        "qgspointxy",
        "list"
      ],
      "file_size_kb": 1.216796875,
      "syntax_error": false
    },
    "core/utils/geometry_utils/filtering.py": {
      "path": "core/utils/geometry_utils/filtering.py",
      "lines": 62,
      "functions": [
        "filter_features_by_buffer(3 args)"
      ],
      "classes": [],
      "imports": [
        "__future__.annotations",
        "qgis.core.QgsCoordinateReferenceSystem",
        "qgis.core.QgsCoordinateTransform",
        "qgis.core.QgsFeature",
        "qgis.core.QgsFeatureRequest",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsProject",
        "qgis.core.QgsVectorLayer",
        "sec_interp.logger_config.get_logger"
      ],
      "complexity": 10,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {
          "filter_features_by_buffer": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 1,
        "typed_functions": 1,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 36,
        "length": 68,
        "volume": 340,
        "difficulty": 7.57,
        "effort": 2574.29
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 7,
        "i18n_score": 0.0
      },
      "keywords": [
        "features_layer",
        "buffer",
        "geometry",
        "buffer_geometry",
        "buffer_crs"
      ],
      "file_size_kb": 1.9697265625,
      "syntax_error": false
    },
    "core/utils/geometry_utils/processing.py": {
      "path": "core/utils/geometry_utils/processing.py",
      "lines": 104,
      "functions": [
        "create_buffer_geometry(4 args)",
        "create_memory_layer(4 args)",
        "densify_line_by_interval(2 args)",
        "run_geometry_operation(1 args)"
      ],
      "classes": [],
      "imports": [
        "__future__.annotations",
        "typing.Any",
        "qgis.core.QgsCoordinateReferenceSystem",
        "qgis.core.QgsField",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsVectorLayer",
        "sec_interp.logger_config.get_logger"
      ],
      "complexity": 5,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {
          "create_buffer_geometry": true,
          "create_memory_layer": true,
          "densify_line_by_interval": true,
          "run_geometry_operation": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 4,
        "typed_functions": 4,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 41,
        "length": 73,
        "volume": 365,
        "difficulty": 3.3,
        "effort": 1203.51
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 16,
        "i18n_score": 0.0
      },
      "keywords": [
        "geometry",
        "layer",
        "operation",
        "qgsgeometry",
        "distance"
      ],
      "file_size_kb": 2.6142578125,
      "syntax_error": false
    },
    "core/exceptions.py": {
      "path": "core/exceptions.py",
      "lines": 60,
      "functions": [
        "__init__(3 args)"
      ],
      "classes": [
        "SecInterpError(Exception)",
        "ValidationError(SecInterpError)",
        "ProcessingError(SecInterpError)",
        "GeometryError(ProcessingError)",
        "DataMissingError(ProcessingError)",
        "ExportError(SecInterpError)",
        "ConfigurationError(SecInterpError)"
      ],
      "imports": [
        "__future__.annotations"
      ],
      "complexity": 1,
      "docstrings": {
        "module": true,
        "classes": {
          "SecInterpError": true,
          "ValidationError": true,
          "ProcessingError": true,
          "GeometryError": true,
          "DataMissingError": true,
          "ExportError": true,
          "ConfigurationError": true
        },
        "functions": {
          "__init__": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 1,
        "typed_functions": 0,
        "coverage": 0.0
      },
      "halstead": {
        "vocabulary": 23,
        "length": 36,
        "volume": 144,
        "difficulty": 2.74,
        "effort": 394.11
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 17,
        "i18n_score": 0.0
      },
      "keywords": [
        "message",
        "details",
        "raised",
        "secinterperror",
        "error"
      ],
      "file_size_kb": 1.3544921875,
      "syntax_error": false
    },
    "core/interfaces/cache_interface.py": {
      "path": "core/interfaces/cache_interface.py",
      "lines": 63,
      "functions": [
        "get(3 args)",
        "set(5 args)",
        "invalidate(3 args)",
        "clear(1 args)",
        "get_metadata(3 args)"
      ],
      "classes": [
        "ICacheService(Protocol)"
      ],
      "imports": [
        "__future__.annotations",
        "typing.Any",
        "typing.Protocol",
        "typing.runtime_checkable"
      ],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {
          "ICacheService": true
        },
        "functions": {
          "get": true,
          "set": true,
          "invalidate": true,
          "clear": true,
          "get_metadata": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 5,
        "typed_functions": 5,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 17,
        "length": 50,
        "volume": 200,
        "difficulty": 4.18,
        "effort": 835.71
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 15,
        "i18n_score": 0.0
      },
      "keywords": [
        "bucket",
        "cache",
        "data",
        "metadata",
        "args"
      ],
      "file_size_kb": 1.630859375,
      "syntax_error": false
    },
    "core/interfaces/drillhole_interface.py": {
      "path": "core/interfaces/drillhole_interface.py",
      "lines": 101,
      "functions": [
        "project_collars(14 args)",
        "process_intervals(16 args)"
      ],
      "classes": [
        "IDrillholeService(ABC)"
      ],
      "imports": [
        "abc.ABC",
        "abc.abstractmethod",
        "qgis.core.QgsCoordinateReferenceSystem",
        "qgis.core.QgsDistanceArea",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsPointXY",
        "qgis.core.QgsRasterLayer",
        "qgis.core.QgsVectorLayer"
      ],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {
          "IDrillholeService": true
        },
        "functions": {
          "project_collars": true,
          "process_intervals": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 2,
        "typed_functions": 2,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 22,
        "length": 53,
        "volume": 212,
        "difficulty": 3.79,
        "effort": 803.37
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 7,
        "i18n_score": 0.0
      },
      "keywords": [
        "field",
        "section",
        "collar",
        "layer",
        "name"
      ],
      "file_size_kb": 3.5751953125,
      "syntax_error": false
    },
    "core/interfaces/geology_interface.py": {
      "path": "core/interfaces/geology_interface.py",
      "lines": 35,
      "functions": [
        "generate_geological_profile(6 args)"
      ],
      "classes": [
        "IGeologyService(ABC)"
      ],
      "imports": [
        "abc.ABC",
        "abc.abstractmethod",
        "typing.Any",
        "qgis.core.QgsRasterLayer",
        "qgis.core.QgsVectorLayer"
      ],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {
          "IGeologyService": true
        },
        "functions": {
          "generate_geological_profile": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 1,
        "typed_functions": 1,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 13,
        "length": 14,
        "volume": 42,
        "difficulty": 1.09,
        "effort": 45.82
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 5,
        "i18n_score": 0.0
      },
      "keywords": [
        "geological",
        "qgsvectorlayer",
        "layer",
        "interface",
        "abstractmethod"
      ],
      "file_size_kb": 1.0390625,
      "syntax_error": false
    },
    "core/interfaces/preview_interface.py": {
      "path": "core/interfaces/preview_interface.py",
      "lines": 23,
      "functions": [
        "generate_all(3 args)"
      ],
      "classes": [
        "IPreviewService(ABC)"
      ],
      "imports": [
        "abc.ABC",
        "abc.abstractmethod",
        "typing.Any"
      ],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {
          "IPreviewService": true
        },
        "functions": {
          "generate_all": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 1,
        "typed_functions": 1,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 8,
        "length": 10,
        "volume": 30,
        "difficulty": 1.33,
        "effort": 40.0
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 5,
        "i18n_score": 0.0
      },
      "keywords": [
        "preview",
        "interface",
        "abstractmethod",
        "params",
        "transform_context"
      ],
      "file_size_kb": 0.611328125,
      "syntax_error": false
    },
    "core/interfaces/profile_interface.py": {
      "path": "core/interfaces/profile_interface.py",
      "lines": 33,
      "functions": [
        "generate_topographic_profile(5 args)"
      ],
      "classes": [
        "IProfileService(ABC)"
      ],
      "imports": [
        "abc.ABC",
        "abc.abstractmethod",
        "typing.Any",
        "qgis.core.QgsRasterLayer",
        "qgis.core.QgsVectorLayer"
      ],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {
          "IProfileService": true
        },
        "functions": {
          "generate_topographic_profile": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 1,
        "typed_functions": 1,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 15,
        "length": 16,
        "volume": 48,
        "difficulty": 1.62,
        "effort": 78.0
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 5,
        "i18n_score": 0.0
      },
      "keywords": [
        "profile",
        "interval",
        "elevation",
        "raster",
        "interface"
      ],
      "file_size_kb": 0.92578125,
      "syntax_error": false
    },
    "core/interfaces/structure_interface.py": {
      "path": "core/interfaces/structure_interface.py",
      "lines": 41,
      "functions": [
        "project_structures(9 args)"
      ],
      "classes": [
        "IStructureService(ABC)"
      ],
      "imports": [
        "abc.ABC",
        "abc.abstractmethod",
        "typing.Any",
        "qgis.core.QgsRasterLayer",
        "qgis.core.QgsVectorLayer"
      ],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {
          "IStructureService": true
        },
        "functions": {
          "project_structures": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 1,
        "typed_functions": 1,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 14,
        "length": 17,
        "volume": 51,
        "difficulty": 1.25,
        "effort": 63.75
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 5,
        "i18n_score": 0.0
      },
      "keywords": [
        "qgsvectorlayer",
        "structural",
        "section",
        "layer",
        "containing"
      ],
      "file_size_kb": 1.255859375,
      "syntax_error": false
    },
    "core/utils/resource_manager.py": {
      "path": "core/utils/resource_manager.py",
      "lines": 107,
      "functions": [
        "temporary_memory_layer(3 args)",
        "temporary_file(3 args)",
        "cleanup_layer(1 args)"
      ],
      "classes": [
        "ResourceManager"
      ],
      "imports": [
        "__future__.annotations",
        "contextlib",
        "os",
        "tempfile",
        "collections.abc.Generator",
        "qgis.core.QgsMapLayer",
        "qgis.core.QgsProject",
        "qgis.core.QgsVectorLayer",
        "sec_interp.logger_config.get_logger"
      ],
      "complexity": 14,
      "docstrings": {
        "module": true,
        "classes": {
          "ResourceManager": true
        },
        "functions": {
          "temporary_memory_layer": true,
          "temporary_file": true,
          "cleanup_layer": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 3,
        "typed_functions": 2,
        "coverage": 66.66666666666666
      },
      "halstead": {
        "vocabulary": 48,
        "length": 113,
        "volume": 565,
        "difficulty": 6.79,
        "effort": 3833.93
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 19,
        "i18n_score": 0.0
      },
      "keywords": [
        "layer",
        "temporary",
        "path",
        "file",
        "logger"
      ],
      "file_size_kb": 3.0185546875,
      "syntax_error": false
    },
    "core/interfaces/__init__.py": {
      "path": "core/interfaces/__init__.py",
      "lines": 2,
      "functions": [],
      "classes": [],
      "imports": [],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {}
      },
      "has_main": false,
      "file_size_kb": 0.064453125,
      "syntax_error": false
    },
    "core/utils/geometry_utils/__init__.py": {
      "path": "core/utils/geometry_utils/__init__.py",
      "lines": 2,
      "functions": [],
      "classes": [],
      "imports": [],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {}
      },
      "has_main": false,
      "file_size_kb": 0.06640625,
      "syntax_error": false
    },
    "gui/tools/__init__.py": {
      "path": "gui/tools/__init__.py",
      "lines": 2,
      "functions": [],
      "classes": [],
      "imports": [],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {}
      },
      "has_main": false,
      "file_size_kb": 0.0576171875,
      "syntax_error": false
    },
    "resources/__init__.py": {
      "path": "resources/__init__.py",
      "lines": 5,
      "functions": [],
      "classes": [],
      "imports": [],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {}
      },
      "has_main": false,
      "file_size_kb": 0.095703125,
      "syntax_error": false
    },
    "resources/resources.py": {
      "path": "resources/resources.py",
      "lines": 170,
      "functions": [
        "qInitResources",
        "qCleanupResources"
      ],
      "classes": [],
      "imports": [
        "PyQt5.QtCore"
      ],
      "complexity": 2,
      "docstrings": {
        "module": false,
        "classes": {},
        "functions": {
          "qInitResources": false,
          "qCleanupResources": false
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 2,
        "typed_functions": 0,
        "coverage": 0.0
      },
      "halstead": {
        "vocabulary": 24,
        "length": 41,
        "volume": 164,
        "difficulty": 2.64,
        "effort": 433.43
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 5,
        "i18n_score": 0.0
      },
      "keywords": [
        "qtcore",
        "rcc_version",
        "qt_resource_struct",
        "qt_resource_data",
        "qt_resource_name"
      ],
      "file_size_kb": 8.48046875,
      "syntax_error": false
    },
    "core/utils/geometry_utils/measurement.py": {
      "path": "core/utils/geometry_utils/measurement.py",
      "lines": 81,
      "functions": [
        "calculate_polyline_metrics(1 args)"
      ],
      "classes": [],
      "imports": [
        "__future__.annotations",
        "math",
        "typing.Any",
        "qgis.core.QgsPointXY"
      ],
      "complexity": 3,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {
          "calculate_polyline_metrics": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 1,
        "typed_functions": 1,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 44,
        "length": 120,
        "volume": 600,
        "difficulty": 15.0,
        "effort": 9000.0
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 22,
        "i18n_score": 0.0
      },
      "keywords": [
        "points",
        "segments",
        "elevation_change",
        "avg_slope",
        "total_dx"
      ],
      "file_size_kb": 2.2392578125,
      "syntax_error": false
    },
    "core/utils/geometry_utils/optimization.py": {
      "path": "core/utils/geometry_utils/optimization.py",
      "lines": 170,
      "functions": [
        "decimate(3 args)",
        "calculate_curvature(1 args)",
        "adaptive_sample(5 args)"
      ],
      "classes": [
        "PreviewOptimizer"
      ],
      "imports": [
        "__future__.annotations",
        "math",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsPointXY",
        "sec_interp.logger_config.get_logger"
      ],
      "complexity": 15,
      "docstrings": {
        "module": true,
        "classes": {
          "PreviewOptimizer": true
        },
        "functions": {
          "decimate": true,
          "calculate_curvature": true,
          "adaptive_sample": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 3,
        "typed_functions": 3,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 95,
        "length": 284,
        "volume": 1704,
        "difficulty": 27.12,
        "effort": 46207.17
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 14,
        "i18n_score": 0.0
      },
      "keywords": [
        "data",
        "tolerance",
        "float",
        "list",
        "max_points"
      ],
      "file_size_kb": 5.583984375,
      "syntax_error": false
    },
    "core/services/parallel_geology_service.py": {
      "path": "core/services/parallel_geology_service.py",
      "lines": 224,
      "functions": [
        "__init__(3 args)",
        "cancel(1 args)",
        "is_canceled(1 args)",
        "run(1 args)",
        "__init__(1 args)",
        "_get_optimal_thread_count(1 args)",
        "process_profiles_parallel(3 args)",
        "_on_chunk_finished(2 args)",
        "_cleanup_thread(2 args)",
        "cancel_processing(1 args)",
        "_on_chunk_canceled(1 args)",
        "_on_chunk_progress(3 args)",
        "_on_chunk_error(2 args)",
        "_process_profile_chunk(2 args)"
      ],
      "classes": [
        "GeologyProcessingThread(QThread)",
        "ParallelGeologyService(QObject)"
      ],
      "imports": [
        "__future__.annotations",
        "collections.abc.Callable",
        "concurrent.futures.ThreadPoolExecutor",
        "os",
        "threading",
        "typing.Any",
        "qgis.PyQt.QtCore.QObject",
        "qgis.PyQt.QtCore.QThread",
        "qgis.PyQt.QtCore.pyqtSignal",
        "sec_interp.logger_config.get_logger"
      ],
      "complexity": 25,
      "docstrings": {
        "module": true,
        "classes": {
          "GeologyProcessingThread": true,
          "ParallelGeologyService": true
        },
        "functions": {
          "__init__": false,
          "cancel": true,
          "is_canceled": true,
          "run": true,
          "_get_optimal_thread_count": true,
          "process_profiles_parallel": true,
          "_on_chunk_finished": true,
          "_cleanup_thread": true,
          "cancel_processing": true,
          "_on_chunk_canceled": true,
          "_on_chunk_progress": true,
          "_on_chunk_error": true,
          "_process_profile_chunk": true
        }
      },
      "has_main": false,
      "file_size_kb": 7.34375,
      "syntax_error": false
    },
    "gui/preview_reporter.py": {
      "path": "gui/preview_reporter.py",
      "lines": 144,
      "functions": [
        "format_results_message(2 args)",
        "format_geology_summary(1 args)",
        "format_structure_summary(2 args)",
        "format_drillhole_summary(1 args)",
        "format_result_metrics(1 args)",
        "format_performance_metrics(2 args)"
      ],
      "classes": [
        "PreviewReporter"
      ],
      "imports": [
        "__future__.annotations",
        "qgis.PyQt.QtCore.QCoreApplication",
        "sec_interp.core.performance_metrics.MetricsCollector",
        "sec_interp.core.performance_metrics.format_duration",
        "sec_interp.core.types.GeologyData",
        "sec_interp.core.types.PreviewResult",
        "sec_interp.core.types.StructureData",
        "main_dialog_config.DialogConfig"
      ],
      "complexity": 14,
      "docstrings": {
        "module": true,
        "classes": {
          "PreviewReporter": true
        },
        "functions": {
          "format_results_message": true,
          "format_geology_summary": true,
          "format_structure_summary": true,
          "format_drillhole_summary": true,
          "format_result_metrics": true,
          "format_performance_metrics": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 6,
        "typed_functions": 6,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 75,
        "length": 197,
        "volume": 1182,
        "difficulty": 11.32,
        "effort": 13378.09
      },
      "i18n": {
        "tr_calls": 14,
        "total_strings_estimate": 60,
        "i18n_score": 23.333333333333332
      },
      "keywords": [
        "previewreporter",
        "result",
        "qcoreapplication",
        "translate",
        "format"
      ],
      "file_size_kb": 5.2744140625,
      "syntax_error": false
    },
    "gui/services/parallel_geology_service.py": {
      "path": "gui/services/parallel_geology_service.py",
      "lines": 224,
      "functions": [
        "__init__(3 args)",
        "cancel(1 args)",
        "is_canceled(1 args)",
        "run(1 args)",
        "__init__(1 args)",
        "_get_optimal_thread_count(1 args)",
        "process_profiles_parallel(3 args)",
        "_on_chunk_finished(2 args)",
        "_cleanup_thread(2 args)",
        "cancel_processing(1 args)",
        "_on_chunk_canceled(1 args)",
        "_on_chunk_progress(3 args)",
        "_on_chunk_error(2 args)",
        "_process_profile_chunk(2 args)"
      ],
      "classes": [
        "GeologyProcessingThread(QThread)",
        "ParallelGeologyService(QObject)"
      ],
      "imports": [
        "__future__.annotations",
        "collections.abc.Callable",
        "concurrent.futures.ThreadPoolExecutor",
        "os",
        "threading",
        "typing.Any",
        "qgis.PyQt.QtCore.QObject",
        "qgis.PyQt.QtCore.QThread",
        "qgis.PyQt.QtCore.pyqtSignal",
        "sec_interp.logger_config.get_logger"
      ],
      "complexity": 25,
      "docstrings": {
        "module": true,
        "classes": {
          "GeologyProcessingThread": true,
          "ParallelGeologyService": true
        },
        "functions": {
          "__init__": false,
          "cancel": true,
          "is_canceled": true,
          "run": true,
          "_get_optimal_thread_count": true,
          "process_profiles_parallel": true,
          "_on_chunk_finished": true,
          "_cleanup_thread": true,
          "cancel_processing": true,
          "_on_chunk_canceled": true,
          "_on_chunk_progress": true,
          "_on_chunk_error": true,
          "_process_profile_chunk": true
        }
      },
      "has_main": false,
      "file_size_kb": 7.34375,
      "syntax_error": false
    },
    "gui/services/__init__.py": {
      "path": "gui/services/__init__.py",
      "lines": 6,
      "functions": [],
      "classes": [],
      "imports": [],
      "complexity": 0,
      "docstrings": {
        "module": true,
        "classes": {},
        "functions": {}
      },
      "has_main": false,
      "file_size_kb": 0.150390625,
      "syntax_error": false
    },
    "exporters/interpretation_exporters.py": {
      "path": "exporters/interpretation_exporters.py",
      "lines": 159,
      "functions": [
        "__init__(2 args)",
        "export(3 args)",
        "_prepare_fields(2 args)",
        "_create_feature(4 args)",
        "_write_to_file(3 args)",
        "get_supported_extensions(1 args)"
      ],
      "classes": [
        "Interpretation2DExporter(BaseExporter)"
      ],
      "imports": [
        "pathlib.Path",
        "typing.Any",
        "qgis.core.QgsFeature",
        "qgis.core.QgsField",
        "qgis.core.QgsFields",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsPointXY",
        "qgis.core.QgsProject",
        "qgis.core.QgsVectorFileWriter",
        "qgis.core.QgsVectorLayer",
        "qgis.PyQt.QtCore.QMetaType",
        "sec_interp.exporters.base_exporter.BaseExporter",
        "sec_interp.logger_config.get_logger"
      ],
      "complexity": 16,
      "docstrings": {
        "module": true,
        "classes": {
          "Interpretation2DExporter": true
        },
        "functions": {
          "__init__": true,
          "export": true,
          "_prepare_fields": true,
          "_create_feature": true,
          "_write_to_file": true,
          "get_supported_extensions": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 6,
        "typed_functions": 5,
        "coverage": 83.33333333333334
      },
      "halstead": {
        "vocabulary": 92,
        "length": 214,
        "volume": 1284,
        "difficulty": 11.71,
        "effort": 15032.2
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 32,
        "i18n_score": 0.0
      },
      "keywords": [
        "fields",
        "interpretations",
        "interp",
        "append",
        "layer"
      ],
      "file_size_kb": 4.84375,
      "syntax_error": false
    },
    "gui/tools/interpretation_tool.py": {
      "path": "gui/tools/interpretation_tool.py",
      "lines": 335,
      "functions": [
        "__init__(2 args)",
        "snap(2 args)",
        "_cleanup_locators(2 args)",
        "_is_snappable(2 args)",
        "_get_locator(4 args)",
        "__init__(2 args)",
        "activate(1 args)",
        "deactivate(1 args)",
        "reset(1 args)",
        "canvasReleaseEvent(2 args)",
        "canvasMoveEvent(2 args)",
        "canvasDoubleClickEvent(2 args)",
        "keyPressEvent(2 args)",
        "_add_point(2 args)",
        "_remove_last_point(1 args)",
        "_add_vertex_marker(2 args)",
        "_ensure_rubber_band(1 args)",
        "_update_rubber_band(2 args)",
        "finalize_polygon(1 args)"
      ],
      "classes": [
        "ProfileSnapper",
        "ProfileInterpretationTool(QgsMapToolEmitPoint)"
      ],
      "imports": [
        "__future__.annotations",
        "contextlib",
        "datetime",
        "random",
        "uuid",
        "qgis.core.QgsMapLayer",
        "qgis.core.QgsPointLocator",
        "qgis.core.QgsPointXY",
        "qgis.core.QgsProject",
        "qgis.core.QgsVectorLayer",
        "qgis.core.QgsWkbTypes",
        "qgis.gui.QgsMapCanvas",
        "qgis.gui.QgsMapToolEmitPoint",
        "qgis.gui.QgsRubberBand",
        "qgis.gui.QgsVertexMarker",
        "qgis.PyQt.QtCore.QCoreApplication",
        "qgis.PyQt.QtCore.QPoint",
        "qgis.PyQt.QtCore.Qt",
        "qgis.PyQt.QtCore.pyqtSignal",
        "qgis.PyQt.QtGui.QColor",
        "sec_interp.core.types.InterpretationPolygon",
        "sec_interp.logger_config.get_logger",
        "sec_interp.logger_config.log_critical_operation"
      ],
      "complexity": 50,
      "docstrings": {
        "module": true,
        "classes": {
          "ProfileSnapper": true,
          "ProfileInterpretationTool": true
        },
        "functions": {
          "__init__": false,
          "snap": true,
          "_cleanup_locators": true,
          "_is_snappable": true,
          "_get_locator": true,
          "activate": true,
          "deactivate": true,
          "reset": true,
          "canvasReleaseEvent": true,
          "canvasMoveEvent": true,
          "canvasDoubleClickEvent": true,
          "keyPressEvent": true,
          "_add_point": true,
          "_remove_last_point": true,
          "_add_vertex_marker": true,
          "_ensure_rubber_band": true,
          "_update_rubber_band": true,
          "finalize_polygon": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 19,
        "typed_functions": 8,
        "coverage": 42.10526315789473
      },
      "halstead": {
        "vocabulary": 149,
        "length": 486,
        "volume": 3402,
        "difficulty": 27.76,
        "effort": 94424.98
      },
      "i18n": {
        "tr_calls": 1,
        "total_strings_estimate": 60,
        "i18n_score": 1.6666666666666667
      },
      "keywords": [
        "points",
        "canvas",
        "rubber_band",
        "event",
        "layer"
      ],
      "file_size_kb": 11.443359375,
      "syntax_error": false
    },
    "core/services/access_control_service.py": {
      "path": "core/services/access_control_service.py",
      "lines": 35,
      "functions": [
        "__init__(1 args)",
        "can_export_3d(1 args)"
      ],
      "classes": [
        "AccessControlService"
      ],
      "imports": [
        "qgis.core.QgsSettings",
        "sec_interp.logger_config.get_logger"
      ],
      "complexity": 1,
      "docstrings": {
        "module": true,
        "classes": {
          "AccessControlService": true
        },
        "functions": {
          "__init__": true,
          "can_export_3d": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 2,
        "typed_functions": 1,
        "coverage": 50.0
      },
      "halstead": {
        "vocabulary": 18,
        "length": 24,
        "volume": 96,
        "difficulty": 2.71,
        "effort": 260.57
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 10,
        "i18n_score": 0.0
      },
      "keywords": [
        "access",
        "service",
        "restricted",
        "qgssettings",
        "settings"
      ],
      "file_size_kb": 0.9599609375,
      "syntax_error": false
    },
    "exporters/interpretation_3d_exporter.py": {
      "path": "exporters/interpretation_3d_exporter.py",
      "lines": 467,
      "functions": [
        "get_supported_extensions(1 args)",
        "export(3 args)",
        "_validate_export_input(3 args)",
        "_handle_post_export_styles(5 args)",
        "_generate_qml_style(5 args)",
        "_setup_2d_renderer(3 args)",
        "_project_to_3d_features(9 args)",
        "_create_3d_rings(6 args)",
        "_write_shapefile(6 args)",
        "_make_fields_obj(2 args)",
        "_make_fields(2 args)",
        "_prepare_fields(2 args)",
        "_calculate_section_geometry(2 args)",
        "_collect_projected_features(7 args)",
        "_prepare_2d_geometry(2 args)",
        "_get_unique_vertices(2 args)",
        "_ensure_closed_polygon(2 args)",
        "_configure_3d_renderer(2 args)",
        "_get_material_property_key(2 args)",
        "_check_property_in_class(3 args)"
      ],
      "classes": [
        "Interpretation3DExporter(BaseExporter)"
      ],
      "imports": [
        "__future__.annotations",
        "math",
        "pathlib.Path",
        "typing.Any",
        "qgis.core.QgsCoordinateReferenceSystem",
        "qgis.core.QgsFeature",
        "qgis.core.QgsField",
        "qgis.core.QgsGeometry",
        "qgis.core.QgsLineString",
        "qgis.core.QgsPoint",
        "qgis.core.QgsPointXY",
        "qgis.core.QgsPolygon",
        "qgis.core.QgsWkbTypes",
        "qgis.PyQt.QtCore.QMetaType",
        "qgis.PyQt.QtGui.QColor",
        "sec_interp.core.exceptions.ExportError",
        "sec_interp.core.types.InterpretationPolygon",
        "sec_interp.exporters.base_exporter.BaseExporter",
        "sec_interp.logger_config.get_logger",
        "qgis.core.QgsVectorLayer",
        "qgis.core.QgsCategorizedSymbolRenderer",
        "qgis.core.QgsFillSymbol",
        "qgis.core.QgsRendererCategory",
        "qgis.core.QgsVectorFileWriter",
        "qgis.core.QgsProject",
        "qgis.core.QgsFields",
        "qgis._3d.QgsPhongMaterialSettings",
        "qgis._3d.QgsPolygon3DSymbol",
        "qgis._3d.QgsVectorLayer3DRenderer",
        "qgis.core.QgsProperty",
        "qgis._3d",
        "qgis._3d.QgsAbstractMaterialSettings"
      ],
      "complexity": 63,
      "docstrings": {
        "module": true,
        "classes": {
          "Interpretation3DExporter": true
        },
        "functions": {
          "get_supported_extensions": true,
          "export": true,
          "_validate_export_input": true,
          "_handle_post_export_styles": true,
          "_generate_qml_style": true,
          "_setup_2d_renderer": true,
          "_project_to_3d_features": true,
          "_create_3d_rings": true,
          "_write_shapefile": true,
          "_make_fields_obj": false,
          "_make_fields": false,
          "_prepare_fields": false,
          "_calculate_section_geometry": true,
          "_collect_projected_features": false,
          "_prepare_2d_geometry": true,
          "_get_unique_vertices": true,
          "_ensure_closed_polygon": true,
          "_configure_3d_renderer": false,
          "_get_material_property_key": true,
          "_check_property_in_class": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 20,
        "typed_functions": 19,
        "coverage": 95.0
      },
      "halstead": {
        "vocabulary": 217,
        "length": 723,
        "volume": 5061,
        "difficulty": 28.4,
        "effort": 143742.57
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 79,
        "i18n_score": 0.0
      },
      "keywords": [
        "list",
        "interpretations",
        "fields",
        "polygon",
        "azimuth"
      ],
      "file_size_kb": 15.0810546875,
      "syntax_error": false
    },
    "gui/dialogs/interpretation_properties_dialog.py": {
      "path": "gui/dialogs/interpretation_properties_dialog.py",
      "lines": 135,
      "functions": [
        "__init__(4 args)",
        "_setup_ui(1 args)",
        "_set_preview_color(2 args)",
        "_pick_color(1 args)",
        "accept(1 args)",
        "reject(1 args)"
      ],
      "classes": [
        "InterpretationPropertiesDialog(QDialog)"
      ],
      "imports": [
        "__future__.annotations",
        "typing.TYPE_CHECKING",
        "typing.Any",
        "qgis.PyQt.QtGui.QColor",
        "qgis.PyQt.QtWidgets.QColorDialog",
        "qgis.PyQt.QtWidgets.QDialog",
        "qgis.PyQt.QtWidgets.QDialogButtonBox",
        "qgis.PyQt.QtWidgets.QFormLayout",
        "qgis.PyQt.QtWidgets.QHBoxLayout",
        "qgis.PyQt.QtWidgets.QLabel",
        "qgis.PyQt.QtWidgets.QLineEdit",
        "qgis.PyQt.QtWidgets.QPushButton",
        "qgis.PyQt.QtWidgets.QVBoxLayout",
        "qgis.PyQt.QtWidgets.QWidget",
        "sec_interp.core.types.InterpretationPolygon"
      ],
      "complexity": 6,
      "docstrings": {
        "module": true,
        "classes": {
          "InterpretationPropertiesDialog": true
        },
        "functions": {
          "__init__": true,
          "_setup_ui": true,
          "_set_preview_color": true,
          "_pick_color": true,
          "accept": true,
          "reject": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 6,
        "typed_functions": 6,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 65,
        "length": 173,
        "volume": 1038,
        "difficulty": 7.98,
        "effort": 8286.41
      },
      "i18n": {
        "tr_calls": 7,
        "total_strings_estimate": 30,
        "i18n_score": 23.333333333333332
      },
      "keywords": [
        "interpretation",
        "color",
        "name",
        "form_layout",
        "dialog"
      ],
      "file_size_kb": 4.3056640625,
      "syntax_error": false
    },
    "gui/tasks/geology_task.py": {
      "path": "gui/tasks/geology_task.py",
      "lines": 79,
      "functions": [
        "__init__(5 args)",
        "run(1 args)",
        "finished(2 args)"
      ],
      "classes": [
        "GeologyGenerationTask(QgsTask)"
      ],
      "imports": [
        "__future__.annotations",
        "collections.abc.Callable",
        "typing.TYPE_CHECKING",
        "qgis.core.Qgis",
        "qgis.core.QgsMessageLog",
        "qgis.core.QgsTask",
        "sec_interp.core.types.GeologyData",
        "sec_interp.core.types.GeologyTaskInput",
        "sec_interp.logger_config.get_logger",
        "sec_interp.core.services.geology_service.GeologyService"
      ],
      "complexity": 9,
      "docstrings": {
        "module": true,
        "classes": {
          "GeologyGenerationTask": true
        },
        "functions": {
          "__init__": true,
          "run": true,
          "finished": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 3,
        "typed_functions": 1,
        "coverage": 33.33333333333333
      },
      "halstead": {
        "vocabulary": 45,
        "length": 93,
        "volume": 465,
        "difficulty": 6.08,
        "effort": 2825.77
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 15,
        "i18n_score": 0.0
      },
      "keywords": [
        "result",
        "task",
        "exception",
        "thread",
        "service"
      ],
      "file_size_kb": 2.693359375,
      "syntax_error": false
    },
    "gui/ui/pages/interpretation_page.py": {
      "path": "gui/ui/pages/interpretation_page.py",
      "lines": 138,
      "functions": [
        "__init__(2 args)",
        "_setup_ui(1 args)",
        "_add_field_row(1 args)",
        "_remove_field_row(1 args)",
        "get_data(1 args)",
        "validate(1 args)"
      ],
      "classes": [
        "InterpretationPage(BasePage)"
      ],
      "imports": [
        "qgis.PyQt.QtCore.QCoreApplication",
        "qgis.PyQt.QtWidgets.QCheckBox",
        "qgis.PyQt.QtWidgets.QComboBox",
        "qgis.PyQt.QtWidgets.QHBoxLayout",
        "qgis.PyQt.QtWidgets.QHeaderView",
        "qgis.PyQt.QtWidgets.QLabel",
        "qgis.PyQt.QtWidgets.QPushButton",
        "qgis.PyQt.QtWidgets.QTableWidget",
        "qgis.PyQt.QtWidgets.QTableWidgetItem",
        "qgis.PyQt.QtWidgets.QVBoxLayout",
        "base_page.BasePage"
      ],
      "complexity": 10,
      "docstrings": {
        "module": true,
        "classes": {
          "InterpretationPage": true
        },
        "functions": {
          "__init__": true,
          "_setup_ui": true,
          "_add_field_row": false,
          "_remove_field_row": false,
          "get_data": true,
          "validate": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 6,
        "typed_functions": 2,
        "coverage": 33.33333333333333
      },
      "halstead": {
        "vocabulary": 82,
        "length": 210,
        "volume": 1260,
        "difficulty": 11.53,
        "effort": 14524.52
      },
      "i18n": {
        "tr_calls": 14,
        "total_strings_estimate": 44,
        "i18n_score": 31.818181818181817
      },
      "keywords": [
        "fields_table",
        "name",
        "group_layout",
        "fields",
        "addwidget"
      ],
      "file_size_kb": 4.7783203125,
      "syntax_error": false
    },
    "gui/ui/pages/settings_page.py": {
      "path": "gui/ui/pages/settings_page.py",
      "lines": 183,
      "functions": [
        "__init__(2 args)",
        "_setup_ui(1 args)",
        "_setup_default_tab(2 args)",
        "_setup_advanced_tab(2 args)",
        "_setup_info_tab(2 args)",
        "_load_settings(1 args)",
        "_on_settings_changed(1 args)",
        "get_data(1 args)",
        "validate(1 args)"
      ],
      "classes": [
        "SettingsPage(BasePage)"
      ],
      "imports": [
        "qgis.core.QgsSettings",
        "qgis.PyQt.QtCore.QCoreApplication",
        "qgis.PyQt.QtWidgets.QCheckBox",
        "qgis.PyQt.QtWidgets.QLabel",
        "qgis.PyQt.QtWidgets.QTabWidget",
        "qgis.PyQt.QtWidgets.QVBoxLayout",
        "qgis.PyQt.QtWidgets.QWidget",
        "base_page.BasePage"
      ],
      "complexity": 7,
      "docstrings": {
        "module": true,
        "classes": {
          "SettingsPage": true
        },
        "functions": {
          "__init__": true,
          "_setup_ui": true,
          "_setup_default_tab": true,
          "_setup_advanced_tab": true,
          "_setup_info_tab": true,
          "_load_settings": true,
          "_on_settings_changed": true,
          "get_data": true,
          "validate": true
        }
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 9,
        "typed_functions": 5,
        "coverage": 55.55555555555556
      },
      "halstead": {
        "vocabulary": 75,
        "length": 264,
        "volume": 1584,
        "difficulty": 6.99,
        "effort": 11065.69
      },
      "i18n": {
        "tr_calls": 15,
        "total_strings_estimate": 66,
        "i18n_score": 22.727272727272727
      },
      "keywords": [
        "settings",
        "layout",
        "sec_interp",
        "ischecked",
        "addwidget"
      ],
      "file_size_kb": 6.6220703125,
      "syntax_error": false
    },
    "update_metadata_rule.py": {
      "path": "update_metadata_rule.py",
      "lines": 35,
      "functions": [],
      "classes": [],
      "imports": [
        "os"
      ],
      "complexity": 5,
      "docstrings": {
        "module": false,
        "classes": {},
        "functions": {}
      },
      "has_main": false,
      "type_hints": {
        "total_functions": 0,
        "typed_functions": 0,
        "coverage": 100.0
      },
      "halstead": {
        "vocabulary": 35,
        "length": 58,
        "volume": 290,
        "difficulty": 6.0,
        "effort": 1740.0
      },
      "i18n": {
        "tr_calls": 0,
        "total_strings_estimate": 16,
        "i18n_score": 0.0
      },
      "keywords": [
        "metadata",
        "filepath",
        "content",
        "metadatos",
        "qgis"
      ],
      "file_size_kb": 1.52734375,
      "syntax_error": false
    }
  },
  "timestamps": {
    "__init__.py": 1767920612.9866846,
    "core/__init__.py": 1766358131.505223,
    "core/algorithms.py": 1766365090.0417657,
    "core/controller.py": 1768013058.3742754,
    "core/data_cache.py": 1768013058.3712757,
    "core/services/__init__.py": 1767453097.1304448,
    "core/performance_metrics.py": 1768013058.3712757,
    "core/services/drillhole_service.py": 1768013058.3722756,
    "core/services/geology_service.py": 1768013058.3742754,
    "core/services/parallel_geology.py": 1766344179.9308767,
    "core/services/profile_service.py": 1768013058.3732755,
    "core/services/structure_service.py": 1768013058.3732755,
    "core/types.py": 1768013058.3712757,
    "core/utils/__init__.py": 1767453097.1274447,
    "core/utils/geology.py": 1768013058.3712757,
    "core/utils/geometry.py": 1767453097.1274447,
    "core/utils/io.py": 1768013058.3702755,
    "core/utils/parsing.py": 1767453097.1294448,
    "core/utils/rendering.py": 1767920160.627511,
    "core/utils/sampling.py": 1767453097.1334448,
    "core/utils/spatial.py": 1766977575.159844,
    "core/validation.py": 1766357134.2645729,
    "drillsec/__init__.py": 1764723526.2293382,
    "drillsec/drillsec.py": 1765762135.2613769,
    "drillsec/drilsec_dialog.py": 1765742484.3590806,
    "drillsec/logger_config.py": 1765742484.3570805,
    "drillsec/preview_renderer.py": 1765742484.3610804,
    "drillsec/si_core_utils.py": 1765742484.3620803,
    "drillsec/validation_utils.py": 1765742484.3600805,
    "exporters/__init__.py": 1767453097.1264448,
    "exporters/base_exporter.py": 1767453097.1274447,
    "exporters/csv_exporter.py": 1767453097.1274447,
    "exporters/image_exporter.py": 1768013058.3722756,
    "exporters/pdf_exporter.py": 1768013058.3702755,
    "exporters/profile_exporters.py": 1768013058.3722756,
    "exporters/shp_exporter.py": 1767868535.033798,
    "exporters/svg_exporter.py": 1768013058.3732755,
    "gui/__init__.py": 1767453097.1364446,
    "gui/legend_widget.py": 1767453097.1384447,
    "gui/main_dialog.py": 1768013058.3722756,
    "gui/main_dialog_cache_handler.py": 1766977642.572121,
    "gui/main_dialog_config.py": 1767453097.1314447,
    "gui/main_dialog_export.py": 1768013058.3702755,
    "gui/main_dialog_preview.py": 1768013058.3712757,
    "gui/main_dialog_validation.py": 1767927484.2244825,
    "gui/preview_renderer.py": 1768013058.3742754,
    "gui/tools/measure_tool.py": 1768013058.3722756,
    "gui/ui/main_window.py": 1767453097.1374445,
    "gui/ui/__init__.py": 1765744356.2119467,
    "gui/ui/pages/__init__.py": 1767453097.1344447,
    "gui/ui/pages/base_page.py": 1766996671.817274,
    "gui/ui/pages/dem_page.py": 1768013058.3722756,
    "gui/ui/pages/drill_page.py": 1765735190.6255665,
    "gui/ui/pages/geology_page.py": 1768013058.3722756,
    "gui/ui/pages/preview_page.py": 1768013058.3732755,
    "gui/ui/pages/section_page.py": 1768013058.3702755,
    "gui/ui/pages/structure_page.py": 1768013058.3722756,
    "gui/ui/sidebar.py": 1767921810.4357,
    "logger_config.py": 1768013058.3732755,
    "scripts/clean_imports.py": 1765164461.1869125,
    "scripts/inspect_qgs_api.py": 1766669228.9126496,
    "scripts/verify_refactor_mock.py": 1766669229.1267166,
    "core/utils/drillhole.py": 1766977642.5585024,
    "exporters/drillhole_exporters.py": 1768013058.3732755,
    "gui/ui/pages/drillhole_page.py": 1768013058.3732755,
    ".ai-context/ai_workflow.py": 1766669229.202821,
    ".ai-context/context_manager.py": 1766669228.6165166,
    "exporters/orchestrator.py": 1765851598.492377,
    "generate_ai_templates.py": 1766669228.6816556,
    "core/services/preview_service.py": 1768013058.3732755,
    "gui/parallel_geology.py": 1766889884.0759943,
    "core/services/export_service.py": 1768013058.3732755,
    "gui/preview_axes_manager.py": 1768013058.3722756,
    "gui/preview_layer_factory.py": 1768013058.3722756,
    "gui/preview_legend_renderer.py": 1768013058.3732755,
    "gui/preview_optimizer.py": 1766672977.6390069,
    "gui/utils.py": 1768013058.3712757,
    "gui/main_dialog_settings.py": 1768013058.3742754,
    "gui/main_dialog_status.py": 1767453097.1344447,
    "gui/main_dialog_utils.py": 1768013058.3732755,
    "core/validation/__init__.py": 1767453097.1294448,
    "core/validation/field_validator.py": 1768013058.3722756,
    "core/validation/layer_validator.py": 1768013058.3712757,
    "core/validation/project_validator.py": 1768013058.3742754,
    "core/validation/path_validator.py": 1768013058.3702755,
    "gui/main_dialog_data.py": 1767932276.217416,
    "gui/main_dialog_signals.py": 1768013058.3712757,
    "sec_interp_plugin.py": 1768013058.3722756,
    "docs/source/conf.py": 1766669208.1222048,
    "core/config.py": 1767460053.0525646,
    "gui/main_dialog_tools.py": 1768013058.3732755,
    "core/utils/geometry_utils/extraction.py": 1766977642.5586627,
    "core/utils/geometry_utils/filtering.py": 1768013058.3732755,
    "core/utils/geometry_utils/processing.py": 1767453097.1304448,
    "core/exceptions.py": 1766977642.5579917,
    "core/interfaces/cache_interface.py": 1768013058.3702755,
    "core/interfaces/drillhole_interface.py": 1767453097.1294448,
    "core/interfaces/geology_interface.py": 1766977642.5581114,
    "core/interfaces/preview_interface.py": 1767453097.1264448,
    "core/interfaces/profile_interface.py": 1767453097.1274447,
    "core/interfaces/structure_interface.py": 1766977642.558232,
    "core/utils/resource_manager.py": 1767453097.1304448,
    "core/interfaces/__init__.py": 1766888977.7430928,
    "core/utils/geometry_utils/__init__.py": 1766888979.7669766,
    "gui/tools/__init__.py": 1766888981.8690383,
    "resources/__init__.py": 1765744356.2182853,
    "resources/resources.py": 1768018657.1692564,
    "core/utils/geometry_utils/measurement.py": 1766977642.558791,
    "core/utils/geometry_utils/optimization.py": 1767453097.1294448,
    "core/services/parallel_geology_service.py": 1766893394.0049183,
    "gui/preview_reporter.py": 1768013058.3702755,
    "gui/services/parallel_geology_service.py": 1766893394.0049183,
    "gui/services/__init__.py": 1766895896.7158453,
    "exporters/interpretation_exporters.py": 1768013058.3722756,
    "gui/tools/interpretation_tool.py": 1768013058.3712757,
    "core/services/access_control_service.py": 1767453097.124445,
    "exporters/interpretation_3d_exporter.py": 1768013058.3742754,
    "gui/dialogs/interpretation_properties_dialog.py": 1768013058.3712757,
    "gui/tasks/geology_task.py": 1768013058.3702755,
    "gui/ui/pages/interpretation_page.py": 1768013058.3712757,
    "gui/ui/pages/settings_page.py": 1768013058.3722756,
    "update_metadata_rule.py": 1768013058.3712757
  },
  "metadata": {
    "project_name": "sec_interp",
    "save_time": 1768152435.5741627,
    "version": "2.0",
    "total_modules": 122
  }
}