summaryrefslogtreecommitdiff
path: root/obj_neokclcreate_import.py
diff options
context:
space:
mode:
authorIsaac <isaclien9752@gmail.com>2025-08-08 15:03:57 -0400
committerIsaac <isaclien9752@gmail.com>2025-08-08 15:03:57 -0400
commitdc612a18b60341b233fcac00f99405d98b61c01a (patch)
tree0a914f90bb69ed665287ca8701d000aa8c470da8 /obj_neokclcreate_import.py
parent46fb63ea8d3c33d5cb5914a05998c8f6ff74abea (diff)
downloadblenxy-dc612a18b60341b233fcac00f99405d98b61c01a.tar.gz
blenxy-dc612a18b60341b233fcac00f99405d98b61c01a.zip
small stuff on collada / OBJ exporter for KCL / importer for NeoKCLCreate OBJs
Diffstat (limited to 'obj_neokclcreate_import.py')
-rw-r--r--obj_neokclcreate_import.py87
1 files changed, 87 insertions, 0 deletions
diff --git a/obj_neokclcreate_import.py b/obj_neokclcreate_import.py
new file mode 100644
index 0000000..1b63633
--- /dev/null
+++ b/obj_neokclcreate_import.py
@@ -0,0 +1,87 @@
+import bpy, re
+from . import blender_funcs
+
+# simple OBJ importer specific for NeoKCLCreate
+
+# import_obj_neokclcreate() function
+# read superbmd/blenxy collada file
+# used to import the collada file into Blender
+def import_obj_neokclcreate(context, filepath):
+
+ # scene variable is always needed for something
+ scene = bpy.context.scene
+
+ # load the OBJ file into blender
+ bpy.ops.import_scene.obj(filepath = filepath, axis_forward = '-Z', axis_up = 'Y')
+
+ # select the single OBJ mesh and reduce its size to match blenxy's coordinate system
+ obj = None
+ for o in bpy.data.objects:
+ # selection in blender api is confusing
+ if (o.select == True):
+ obj = o
+ break
+ blender_funcs.select_obj(scene, obj, False)
+ obj.scale = obj.scale / 100
+ bpy.ops.object.transform_apply(location = True, rotation = True, scale = True)
+
+ # deal with the infinite materials (merge those that are similar)
+ # slow as a turtle, but works like a charm
+ for i in range(len(obj.material_slots)):
+ # i will not be bound to len(obj.material_slots) once a material is deleted
+ if (i >= len(obj.material_slots)):
+ break
+ mat = obj.material_slots[i]
+ cur_mat_name = re.sub("^(.*?)\| ", "", mat.name)
+ # iterate over all the mesh faces
+ for face in obj.data.polygons:
+ face_mat = obj.material_slots[face.material_index]
+ face_mat_name = re.sub("^(.*?)\| ", "", face_mat.name)
+ # material with the same name found
+ if (cur_mat_name == face_mat_name and i != face.material_index):
+ bpy.data.materials.remove(face_mat.material) # remove the material data and the slot
+ obj.active_material_index = face.material_index
+ bpy.ops.object.material_slot_remove()
+ face.material_index = i # change the index to be the material of the current loop
+
+ # put the OBJ inside an armature object
+ bpy.ops.object.armature_add()
+ obj.parent = scene.objects.active
+
+ # done!
+ blender_funcs.disp_msg("NeoKCLCreate OBJ file imported!")
+ return {'FINISHED'}
+
+
+#################################################
+# Stuff down is for the menu appending
+# of the importer to work plus some setting stuff
+# comes from a Blender importer template
+
+# ExportHelper is a helper class, defines filename and
+# invoke() function which calls the file selector.
+from bpy_extras.io_utils import ExportHelper
+from bpy.props import StringProperty, BoolProperty, EnumProperty
+from bpy.types import Operator
+
+class import_neokclcreate_obj(Operator, ExportHelper):
+ """Import a Collada file from SuperBMD (SuperBMD only)"""
+ bl_idname = "import_scene.neokclcreate_obj"
+ bl_label = "Import NeoKCLCreate OBJ (.OBJ)"
+
+ # ExportHelper mixin class uses this
+ filename_ext = ".obj"
+ filter_glob = StringProperty(default = "*.obj", options = {'HIDDEN'}, maxlen = 255)
+ # execute function
+ def execute(self, context):
+ return import_obj_neokclcreate(context, self.filepath)
+
+# Only needed if you want to add into a dynamic menu
+def menu_import_neokclcreate_obj(self, context):
+ self.layout.operator(import_neokclcreate_obj.bl_idname, text="NeoKCLCreate OBJ (.obj)")
+
+bpy.utils.register_class(import_neokclcreate_obj)
+bpy.types.INFO_MT_file_import.append(menu_import_neokclcreate_obj)
+
+# test call
+bpy.ops.import_scene.neokclcreate_obj('INVOKE_DEFAULT')