New Addon: Import Autodesk .max #105013
156
io_scene_max/__init__.py
Normal file
156
io_scene_max/__init__.py
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2023 Sebastian Schrand
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
import bpy
|
||||||
|
from bpy_extras.io_utils import (
|
||||||
|
ImportHelper,
|
||||||
|
orientation_helper,
|
||||||
|
axis_conversion,
|
||||||
|
)
|
||||||
|
from bpy.props import (
|
||||||
|
BoolProperty,
|
||||||
|
FloatProperty,
|
||||||
|
StringProperty,
|
||||||
|
)
|
||||||
|
|
||||||
|
bl_info = {
|
||||||
|
"name": "Import Autodesk MAX (.max)",
|
||||||
|
"author": "Sebastian Sille, Philippe Lagadec, Jens M. Plonka",
|
||||||
|
"version": (1, 1, 2),
|
||||||
|
"blender": (3, 6, 0),
|
||||||
|
"location": "File > Import",
|
||||||
|
"description": "Import 3DSMAX meshes & materials",
|
||||||
|
"warning": "",
|
||||||
|
"filepath_url": "",
|
||||||
|
"category": "Import-Export"}
|
||||||
|
|
||||||
|
if "bpy" in locals():
|
||||||
|
import importlib
|
||||||
|
if "import_max" in locals():
|
||||||
|
importlib.reload(import_max)
|
||||||
|
|
||||||
|
|
||||||
|
@orientation_helper(axis_forward='Y', axis_up='Z')
|
||||||
|
class Import_max(bpy.types.Operator, ImportHelper):
|
||||||
|
"""Import Autodesk MAX"""
|
||||||
|
bl_idname = "import_autodesk.max"
|
||||||
|
bl_label = "Import MAX (.max)"
|
||||||
|
bl_options = {'PRESET', 'UNDO'}
|
||||||
|
|
||||||
|
filename_ext = ".max"
|
||||||
|
filter_glob: StringProperty(default="*.max", options={'HIDDEN'},)
|
||||||
|
|
||||||
|
scale_objects: FloatProperty(
|
||||||
|
name="Scale",
|
||||||
|
description="Scale factor for all objects",
|
||||||
|
min=0.0, max=10000.0,
|
||||||
|
soft_min=0.0, soft_max=10000.0,
|
||||||
|
default=1.0,
|
||||||
|
)
|
||||||
|
use_material: BoolProperty(
|
||||||
|
name="Materials",
|
||||||
|
description="Import the materials of the objects",
|
||||||
|
default=True,
|
||||||
|
)
|
||||||
|
use_uv_mesh: BoolProperty(
|
||||||
|
name="UV Mesh",
|
||||||
|
description="Import texture coordinates as mesh objects",
|
||||||
|
default=False,
|
||||||
|
)
|
||||||
|
use_apply_matrix: BoolProperty(
|
||||||
|
name="Apply Matrix",
|
||||||
|
description="Use matrix to transform the objects",
|
||||||
|
default=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
from . import import_max
|
||||||
|
keywords = self.as_keywords(ignore=("axis_forward", "axis_up", "filter_glob"))
|
||||||
|
global_matrix = axis_conversion(from_forward=self.axis_forward, from_up=self.axis_up,).to_4x4()
|
||||||
|
keywords["global_matrix"] = global_matrix
|
||||||
|
|
||||||
|
return import_max.load(self, context, **keywords)
|
||||||
|
|
||||||
|
def draw(self, context):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class MAX_PT_import_include(bpy.types.Panel):
|
||||||
|
bl_space_type = 'FILE_BROWSER'
|
||||||
|
bl_region_type = 'TOOL_PROPS'
|
||||||
|
bl_label = "Include"
|
||||||
|
bl_parent_id = "FILE_PT_operator"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context):
|
||||||
|
sfile = context.space_data
|
||||||
|
operator = sfile.active_operator
|
||||||
|
|
||||||
|
return operator.bl_idname == "IMPORT_AUTODESK_OT_max"
|
||||||
|
|
||||||
|
def draw(self, context):
|
||||||
|
layout = self.layout
|
||||||
|
layout.use_property_split = True
|
||||||
|
layout.use_property_decorate = False
|
||||||
|
|
||||||
|
sfile = context.space_data
|
||||||
|
operator = sfile.active_operator
|
||||||
|
|
||||||
|
layrow = layout.row(align=True)
|
||||||
|
layrow.prop(operator, "use_material")
|
||||||
|
layrow.label(text="", icon='MATERIAL' if operator.use_material else 'SHADING_TEXTURE')
|
||||||
|
layrow = layout.row(align=True)
|
||||||
|
layrow.prop(operator, "use_uv_mesh")
|
||||||
|
layrow.label(text="", icon='UV' if operator.use_uv_mesh else 'GROUP_UVS')
|
||||||
|
|
||||||
|
|
||||||
|
class MAX_PT_import_transform(bpy.types.Panel):
|
||||||
|
bl_space_type = 'FILE_BROWSER'
|
||||||
|
bl_region_type = 'TOOL_PROPS'
|
||||||
|
bl_label = "Transform"
|
||||||
|
bl_parent_id = "FILE_PT_operator"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context):
|
||||||
|
sfile = context.space_data
|
||||||
|
operator = sfile.active_operator
|
||||||
|
|
||||||
|
return operator.bl_idname == "IMPORT_AUTODESK_OT_max"
|
||||||
|
|
||||||
|
def draw(self, context):
|
||||||
|
layout = self.layout
|
||||||
|
layout.use_property_split = True
|
||||||
|
layout.use_property_decorate = False
|
||||||
|
|
||||||
|
sfile = context.space_data
|
||||||
|
operator = sfile.active_operator
|
||||||
|
|
||||||
|
layout.prop(operator, "scale_objects")
|
||||||
|
layrow = layout.row(align=True)
|
||||||
|
layrow.prop(operator, "use_apply_matrix")
|
||||||
|
layrow.label(text="", icon='VIEW_ORTHO' if operator.use_apply_matrix else 'MESH_GRID')
|
||||||
|
layout.prop(operator, "axis_forward")
|
||||||
|
layout.prop(operator, "axis_up")
|
||||||
|
|
||||||
|
|
||||||
|
def menu_func(self, context):
|
||||||
|
self.layout.operator(Import_max.bl_idname, text="Autodesk MAX (.max)")
|
||||||
|
|
||||||
|
|
||||||
|
def register():
|
||||||
|
bpy.utils.register_class(Import_max)
|
||||||
|
bpy.utils.register_class(MAX_PT_import_include)
|
||||||
|
bpy.utils.register_class(MAX_PT_import_transform)
|
||||||
|
bpy.types.TOPBAR_MT_file_import.append(menu_func)
|
||||||
|
|
||||||
|
|
||||||
|
def unregister():
|
||||||
|
bpy.types.TOPBAR_MT_file_import.remove(menu_func)
|
||||||
|
bpy.utils.unregister_class(MAX_PT_import_transform)
|
||||||
|
bpy.utils.unregister_class(MAX_PT_import_include)
|
||||||
|
bpy.utils.unregister_class(Import_max)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
register()
|
1422
io_scene_max/import_max.py
Normal file
1422
io_scene_max/import_max.py
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user