Skip to content
41 changes: 4 additions & 37 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,37 +1,4 @@
# MMD Tools
MMD Tools is a Blender add-on for importing MMD (MikuMikuDance) model data (.pmd, .pmx), motion data (.vmd), and pose data (.vpd).
Exporting model data (.pmx), motion data (.vmd), and pose data (.vpd) are supported as well.

MMD ToolsはMMD(MikuMikuDance)のモデルデータ(.pmd, .pmx)、モーションデータ(.vmd)、ポーズデータ(.vpd)を
インポートするためのBlenderアドオンです。
モデルデータ(.pmx)、モーションデータ(.vmd)、ポーズデータ(.vpd)のエクスポートにも対応しています。

## Version Compatibility
| Blender Version | MMD Tools Version | Branch |
|-----------------|-------------------|-------------|
| Blender 4.2 LTS | MMD Tools v4.x | [main](https://github.com/MMD-Blender/blender_mmd_tools) |
| Blender 3.6 LTS | MMD Tools v2.x | [blender-v3](https://github.com/MMD-Blender/blender_mmd_tools/tree/blender-v3) |

Use the MMD Tools version that matches your Blender LTS version.

## Installation & Usage
- Check [the MMD Tools Wiki](https://mmd-blender.fandom.com/wiki/MMD_Tools) for details.
- 詳細は [MMD ToolsのWiki (日本語)](https://mmd-blender.fandom.com/ja/wiki/MMD_Tools) を確認してください。

## Contributing
MMD Tools needs contributions such as:

- Document writing / translation
- Video creation / translation
- Bug reports
- Feature requests
- Pull requests

If you are interested in supporting this project, please reach out via the following channels:
- [MMD Tools Issues](https://github.com/UuuNyaa/blender_mmd_tools/issues)
- [MMD & Blender Discord Server](https://discord.gg/zRgUkuaPWw)

For developers looking to contribute code or translations, please check the [Developer Guide](DEVELOPER_GUIDE.md) for project guidelines and detailed workflows.

## License
Distributed under the [GPLv3](LICENSE).
Some Extension on MMD Tools
- Drag in MMD file to import
- Export curve directly
- Create same mesh for rigid body
61 changes: 60 additions & 1 deletion mmd_tools/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,49 @@


from . import auto_load
from . import auto_export


auto_load.init(PACKAGE_NAME)

# Store keymap items to remove them when unregistering
addon_keymaps = []

import bpy

class MMD_PMX_FileHandler(bpy.types.FileHandler):
bl_idname = "mmd_tools.pmx_file_handler"
bl_label = "MMD PMX Model"
bl_import_operator = "mmd_tools.import_model" # Change to your actual import operator id
bl_file_extensions = ".pmx"
bl_file_filter = "*.pmx"
bl_description = "Import MMD PMX Model by dropping into Blender"

@classmethod
def poll_drop(cls, context):
# Allow drop in 3D View and File Browser
print(f" poll_drop")
return context.area and context.area.type in {"VIEW_3D", "FILE_BROWSER"}

def import_drop(self, context, filepath=None, files=None, **kwargs):
print("[MMD_PMX_FileHandler] import_drop called")
print(f" filepath: {filepath}")
print(f" files: {files}")
# Call the import operator for each dropped file
if files:
for f in files:
print(f" Importing file: {f['name']}")
bpy.ops.mmd_tools.import_model(filepath=f["name"])
elif filepath:
print(f" Importing file: {filepath}")
bpy.ops.mmd_tools.import_model(filepath=filepath)
return {'FINISHED'}

def register():
import bpy

from . import handlers

bpy.utils.register_class(MMD_PMX_FileHandler)
auto_load.register()

# pylint: disable=import-outside-toplevel
Expand All @@ -44,19 +78,44 @@ def register():
bpy.app.translations.register(PACKAGE_NAME, translations_dict)

handlers.MMDHanders.register()

auto_export.register()


# Register keymap
wm = bpy.context.window_manager
kc = wm.keyconfigs.addon
if kc:
km = kc.keymaps.new(name='Object Mode', space_type='EMPTY')
kmi = km.keymap_items.new("mmd_tools.export_pmx_quick", 'E', 'PRESS', ctrl=True, alt=False)
addon_keymaps.append((km, kmi))
km1 = kc.keymaps.new(name='Curve', space_type='EMPTY')
kmi1 = km1.keymap_items.new("mmd_tools.export_pmx_quick", 'E', 'PRESS', ctrl=True, alt=False)
addon_keymaps.append((km1, kmi1))



def unregister():
import bpy

from . import handlers

auto_export.unregister()


# Unregister keymap
for km, kmi in addon_keymaps:
km.keymap_items.remove(kmi)
addon_keymaps.clear()

handlers.MMDHanders.unregister()

bpy.app.translations.unregister(PACKAGE_NAME)

auto_load.unregister()

bpy.utils.unregister_class(MMD_PMX_FileHandler)


if __name__ == "__main__":
register()
Loading