В общем. есть аддон бля Блендер 3.3.0, пока посмотри код, я скажу что делать:

bl_info = {
    "name": "F1 Track Trigger Maker",
    "author": "AlonsoBeast",
    "version": (1, 0, 5),
    "blender": (3, 3, 0),
    "location": "View3D > Sidebar > F1 Track Builder Toolkit",
    "description": "Import and export DRS and PIT track trigger.",
    "category": "Import-Export",
}

import bpy
import xml.etree.ElementTree as ET
from bpy.props import StringProperty, PointerProperty
from bpy.types import Operator, Panel, PropertyGroup
from bpy_extras.io_utils import ImportHelper, ExportHelper

import os

class TriggerMakerSettings(PropertyGroup):
    file_path: StringProperty(name="File Path", default="")

def clear_existing_objects(trigger_name):
    if trigger_name in bpy.data.objects:
        parent_empty = bpy.data.objects[trigger_name]
        for child in parent_empty.children:
            bpy.data.objects.remove(child, do_unlink=True)
        bpy.data.objects.remove(parent_empty, do_unlink=True)

class ImportXML(Operator, ImportHelper):
    bl_idname = "import_scene.xml"
    bl_label = "Import Trigger File"
    filename_ext = ".xml"

    def execute(self, context):
        file_path = self.filepath
        context.scene.trigger_maker_settings.file_path = file_path

        tree = ET.parse(file_path)
        root = tree.getroot()

        for trigger in root.findall('.//trigger[@type="Vehicle2DSector"]'):
            base_params = trigger.find('base_params')
            name = base_params.get('name')
            id = base_params.get('id')
            trigger_name = f"ID {id} {name}"

            clear_existing_objects(trigger_name)

            parent_empty = bpy.data.objects.new(trigger_name, None)
            context.collection.objects.link(parent_empty)

            params = trigger.find('params')
            points = params.findall('point_2d')

            for idx, point in enumerate(points):
                x = float(point.get('x'))
                y = float(point.get('y'))

                point_name = f"point2d_{idx + 1}"

                point_empty = bpy.data.objects.new(point_name, None)
                point_empty.location = (x, y, 0)

                context.collection.objects.link(point_empty)
                point_empty.parent = parent_empty
        
        self.report({'INFO'}, f"Imported XML: {os.path.basename(file_path)}")
        return {'FINISHED'}

class ExportXML(Operator, ExportHelper):
    bl_idname = "export_scene.xml"
    bl_label = "Export Trigger File"
    filename_ext = ".xml"

    def execute(self, context):
        file_path = self.filepath

        tree = ET.parse(context.scene.trigger_maker_settings.file_path)
        root = tree.getroot()

        for trigger in root.findall('.//trigger[@type="Vehicle2DSector"]'):
            base_params = trigger.find('base_params')
            name = base_params.get('name')
            id = base_params.get('id')
            trigger_name = f"ID {id} {name}"

            parent_empty = bpy.data.objects.get(trigger_name)
            if not parent_empty:
                continue

            params = trigger.find('params')
            points = params.findall('point_2d')

            for idx, point in enumerate(points):
                point_name = f"point2d_{idx + 1}"

                point_empty = next((child for child in parent_empty.children if point_name in child.name), None)

                if point_empty:
                    x_pos = round(point_empty.location.x, 4)
                    y_pos = round(point_empty.location.y, 4)

                    point.set('x', f"{x_pos:.4f}")
                    point.set('y', f"{y_pos:.4f}")

        tree.write(file_path)

        self.report({'INFO'}, f"Exported XML: {os.path.basename(file_path)}")
        return {'FINISHED'}

class TriggerMakerPanel(Panel):
    bl_label = "F1 Track Trigger Maker"
    bl_idname = "VIEW3D_PT_trigger_maker"
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'UI'
    bl_category = 'F1 Track Builder Toolkit'

    def draw(self, context):
        layout = self.layout
        settings = context.scene.trigger_maker_settings

        layout.operator("import_scene.xml")
        layout.operator("export_scene.xml")
        layout.label(text=f"File triggers_pit.xml")

def register():
    bpy.utils.register_class(TriggerMakerSettings)
    bpy.utils.register_class(ImportXML)
    bpy.utils.register_class(ExportXML)
    bpy.utils.register_class(TriggerMakerPanel)
    
    bpy.types.Scene.trigger_maker_settings = PointerProperty(type=TriggerMakerSettings)

def unregister():
    bpy.utils.unregister_class(TriggerMakerSettings)
    bpy.utils.unregister_class(ImportXML)
    bpy.utils.unregister_class(ExportXML)
    bpy.utils.unregister_class(TriggerMakerPanel)

    del bpy.types.Scene.trigger_maker_settings
    
if __name__ == "__main__":
    register()