Blender 4.2 Exporter 2.3.1 : Complexe armature export issue

Blender 4.2 (also tested 3.6)
Exporter 2.3.1

Using multi exporter preset
Used to work with previous versions which @DA40CGDFQ had to correct.

Problem: When trying to export a complexe winglfex armature the export fails with the following error

Traceback (most recent call last):
  File "C:\Program Files\Blender Foundation\Blender 4.2\4.2\scripts\addons_core\io_scene_gltf2\io\exp\gltf2_io_user_extensions.py", line 14, in export_user_extensions
    hook(*args, export_settings)
  File "C:\Users\Theo\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\io_scene_gltf2_msfs_2024\io\exp\msfs_export.py", line 171, in gather_scene_hook
    AsoboGizmoObject.export(
  File "C:\Users\Theo\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\io_scene_gltf2_msfs_2024\io\com\extensions\object\asobo_gizmo_object.py", line 228, in export
    AsoboGizmoObject.export(node.children, blender_scene, export_settings)
  File "C:\Users\Theo\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\io_scene_gltf2_msfs_2024\io\com\extensions\object\asobo_gizmo_object.py", line 144, in export
    for child in list(node.children):
                 ^^^^^^^^^^^^^^^^^^^
TypeError: 'NoneType' object is not iterable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Program Files\Blender Foundation\Blender 4.2\4.2\scripts\addons_core\io_scene_gltf2\__init__.py", line 1287, in execute
    res = gltf2_blender_export.save(context, export_settings)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Blender Foundation\Blender 4.2\4.2\scripts\addons_core\io_scene_gltf2\blender\exp\gltf2_blender_export.py", line 37, in save
    json, buffer = __export(export_settings)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Blender Foundation\Blender 4.2\4.2\scripts\addons_core\io_scene_gltf2\blender\exp\gltf2_blender_export.py", line 55, in __export
    __gather_gltf(exporter, export_settings)
  File "C:\Program Files\Blender Foundation\Blender 4.2\4.2\scripts\addons_core\io_scene_gltf2\blender\exp\gltf2_blender_export.py", line 202, in __gather_gltf
    active_scene_idx, scenes, animations = gltf2_blender_gather.gather_gltf2(export_settings)
                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Blender Foundation\Blender 4.2\4.2\scripts\addons_core\io_scene_gltf2\blender\exp\gltf2_blender_gather.py", line 31, in gather_gltf2
    scenes.append(__gather_scene(blender_scene, export_settings))
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Blender Foundation\Blender 4.2\4.2\scripts\addons_core\io_scene_gltf2\blender\exp\gltf2_blender_gather_cache.py", line 37, in wrapper_cached
    result = func(*args, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Blender Foundation\Blender 4.2\4.2\scripts\addons_core\io_scene_gltf2\blender\exp\gltf2_blender_gather.py", line 125, in __gather_scene
    export_user_extensions('gather_scene_hook', export_settings, scene, blender_scene)
  File "C:\Program Files\Blender Foundation\Blender 4.2\4.2\scripts\addons_core\io_scene_gltf2\io\exp\gltf2_io_user_extensions.py", line 16, in export_user_extensions
    export_settings['log'].error("Extension hook " + hook_name + " fails on " + extension)
                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~
TypeError: can only concatenate str (not "glTF2ExportUserExtension") to str
Error: Python: Traceback (most recent call last):
  File "C:\Program Files\Blender Foundation\Blender 4.2\4.2\scripts\addons_core\io_scene_gltf2\io\exp\gltf2_io_user_extensions.py", line 14, in export_user_extensions
    hook(*args, export_settings)
  File "C:\Users\Theo\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\io_scene_gltf2_msfs_2024\io\exp\msfs_export.py", line 171, in gather_scene_hook
    AsoboGizmoObject.export(
  File "C:\Users\Theo\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\io_scene_gltf2_msfs_2024\io\com\extensions\object\asobo_gizmo_object.py", line 228, in export
    AsoboGizmoObject.export(node.children, blender_scene, export_settings)
  File "C:\Users\Theo\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\io_scene_gltf2_msfs_2024\io\com\extensions\object\asobo_gizmo_object.py", line 144, in export
    for child in list(node.children):
                 ^^^^^^^^^^^^^^^^^^^
TypeError: 'NoneType' object is not iterable

DurinTraceback (most recent call last):
  File "C:\Users\Theo\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\io_scene_gltf2_msfs_2024\io\exp\msfs_multi_export.py", line 741, in execute
    exported_paths = self.export_presets(context)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Theo\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\io_scene_gltf2_msfs_2024\io\exp\msfs_multi_export.py", line 634, in export_presets
    exported, exportpath = self.export_preset(context, preset)
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Theo\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\io_scene_gltf2_msfs_2024\io\exp\msfs_multi_export.py", line 617, in export_preset
    self.export(context, export_path)
  File "C:\Users\Theo\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\io_scene_gltf2_msfs_2024\io\exp\msfs_multi_export.py", line 297, in export
    gltf = self.export_blender_4_2(context, file_path, settings)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Theo\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\io_scene_gltf2_msfs_2024\io\exp\msfs_multi_export.py", line 208, in export_blender_4_2
    return bpy.ops.export_scene.gltf(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Blender Foundation\Blender 4.2\4.2\scripts\modules\bpy\ops.py", line 109, in __call__
    ret = _op_call(self.idname_py(), kw)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: Error: Python: Traceback (most recent call last):
  File "C:\Program Files\Blender Foundation\Blender 4.2\4.2\scripts\addons_core\io_scene_gltf2\io\exp\gltf2_io_user_extensions.py", line 14, in export_user_extensions
    hook(*args, export_settings)
  File "C:\Users\Theo\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\io_scene_gltf2_msfs_2024\io\exp\msfs_export.py", line 171, in gather_scene_hook
    AsoboGizmoObject.export(
  File "C:\Users\Theo\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\io_scene_gltf2_msfs_2024\io\com\extensions\object\asobo_gizmo_object.py", line 228, in export
    AsoboGizmoObject.export(node.children, blender_scene, export_settings)
  File "C:\Users\Theo\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\io_scene_gltf2_msfs_2024\io\com\extensions\object\asobo_gizmo_object.py", line 144, in export
    for child in list(node.children):
                 ^^^^^^^^^^^^^^^^^^^
TypeError: 'NoneType' object is not iterable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Program Files\Blender Foundation\Blender 4.2\4.2\scripts\addons_core\io_scene_gltf2\io\exp\gltf2_io_user_extensions.py", line 16, in export_user_extensions
    export_settings['log'].error("Extension hook " + hook_name + " fails on " + extension)
                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~
TypeError: can only concatenate str (not "glTF2ExportUserExtension") to str
Location: C:\Program Files\Blender Foundation\Blender 4.2\4.2\scripts\modules\bpy\ops.py:109

Error: Python: Traceback (most recent call last):
  File "C:\Users\Theo\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\io_scene_gltf2_msfs_2024\io\exp\msfs_multi_export.py", line 741, in execute
    exported_paths = self.export_presets(context)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Theo\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\io_scene_gltf2_msfs_2024\io\exp\msfs_multi_export.py", line 634, in export_presets
    exported, exportpath = self.export_preset(context, preset)
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Theo\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\io_scene_gltf2_msfs_2024\io\exp\msfs_multi_export.py", line 617, in export_preset
    self.export(context, export_path)
  File "C:\Users\Theo\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\io_scene_gltf2_msfs_2024\io\exp\msfs_multi_export.py", line 297, in export
    gltf = self.export_blender_4_2(context, file_path, settings)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Theo\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\io_scene_gltf2_msfs_2024\io\exp\msfs_multi_export.py", line 208, in export_blender_4_2
    return bpy.ops.export_scene.gltf(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Blender Foundation\Blender 4.2\4.2\scripts\modules\bpy\ops.py", line 109, in __call__
    ret = _op_call(self.idname_py(), kw)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: Error: Python: Traceback (most recent call last):
  File "C:\Program Files\Blender Foundation\Blender 4.2\4.2\scripts\addons_core\io_scene_gltf2\io\exp\gltf2_io_user_extensions.py", line 14, in export_user_extensions
    hook(*args, export_settings)
  File "C:\Users\Theo\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\io_scene_gltf2_msfs_2024\io\exp\msfs_export.py", line 171, in gather_scene_hook
    AsoboGizmoObject.export(
  File "C:\Users\Theo\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\io_scene_gltf2_msfs_2024\io\com\extensions\object\asobo_gizmo_object.py", line 228, in export
    AsoboGizmoObject.export(node.children, blender_scene, export_settings)
  File "C:\Users\Theo\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\io_scene_gltf2_msfs_2024\io\com\extensions\object\asobo_gizmo_object.py", line 144, in export
    for child in list(node.children):
                 ^^^^^^^^^^^^^^^^^^^
TypeError: 'NoneType' object is not iterable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Program Files\Blender Foundation\Blender 4.2\4.2\scripts\addons_core\io_scene_gltf2\io\exp\gltf2_io_user_extensions.py", line 16, in export_user_extensions
    export_settings['log'].error("Extension hook " + hook_name + " fails on " + extension)
                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~
TypeError: can only concatenate str (not "glTF2ExportUserExtension") to str
Location: C:\Program Files\Blender Foundation\Blender 4.2\4.2\scripts\modules\bpy\ops.py:109

Hello,

Can you test with the latest SDK Core (1.2.2) along with the Blender plugin version 2.3.2 to see if the issue is fixed ?

Please let us know if this resolves your problem.

Thank you

Regards,
Boris

Hi

The latest update changes the way that the plugin handles unique ID:

Before: With or without “Use ASOBO unique ID extension for nodes”, the objects names were set as unique ID. It was pretty convenient since unique ID is mandatory for submodel merging.

Now:

  • Unique ID exporter parameter OFF => no unique ID at all
  • Unique ID exporter parameter ON => search for each individual unique ID in the gltf. If there is at least one object without overridden unique ID in its properties, the builder raises an error.
GLTFValidator | Found in [PATH] - Node without Unique ID while using the unique_id extension, nodes[XXXX] : 'NAME'

Also: The khronos exporter creates, in some cases, a “neutral_bone” which is used (logically) as a neutral bone for skinned objects with no bone influence (total bone weight = 0). Enhancement request - What is the neutral bone for? Add a warning when neutral bone is being added. - Add hook to change neutral_bone · Issue #2303 · KhronosGroup/glTF-Blender-IO · GitHub

So when it comes to unique ID, this particular bone can’t have any ID, since it’s created by the exporter. If there is more than one created neutral_bone (in my case, two wingflex armature, one per wing) it will obviously lead to a build error

@DA40CGDFQ Rohn made a perfect combination with one of its custom plugin where :

  • Unique IDs are still set automatically (Unique ID = node ID)
  • Neutral_bones are renamed as [Armature_Name]_neutral_bone
  • Unique IDs are created for those neutral_bones using their new name

I do think that this particular behavior would be the best for us, users

At this point, I can only use his plugin.

Thank you

EDIT: Using blender 3.6

Hello @R-AzurPoly,

Can you confirm that the issue is fixed in the last available su1 flighting sdk 1.2.3 please ?

Thank you,

Regards,
Boris

Hi @Boris ,

It’s fixed:

  • no neutral_bone issues
  • Unique ID’s are correct

Thank you very much

1 Like