IO: Add FileHandler for importing SVG as curves

This enables drag-n-drop support for the `import_curve.svg` operator.
Since the existing `Import SVG as Grease Pencil` operator handles the
same file type, when dropping `.svg` files this will prompt to choose
between theses 2 operators.

See PR for examples and notes on eventually changing the operator
description.

Pull Request: https://projects.blender.org/blender/blender/pulls/140603
This commit is contained in:
Guillermo Venegas
2025-07-03 19:35:53 +02:00
committed by Jesse Yurkovich
parent bb895e13e2
commit 1adf9ce9dc

View File

@@ -29,7 +29,10 @@ from bpy.props import (
StringProperty,
CollectionProperty
)
from bpy_extras.io_utils import ImportHelper
from bpy_extras.io_utils import (
ImportHelper,
poll_file_object_drop,
)
class ImportSVG(bpy.types.Operator, ImportHelper):
@@ -41,20 +44,25 @@ class ImportSVG(bpy.types.Operator, ImportHelper):
filename_ext = ".svg"
filter_glob: StringProperty(default="*.svg", options={'HIDDEN'})
directory: StringProperty(subtype='DIR_PATH', options={'SKIP_SAVE', 'HIDDEN'})
files: CollectionProperty(
name="File Path",
type=bpy.types.OperatorFileListElement,
)
def invoke(self, context, event):
if self.properties.is_property_set("filepath"):
return self.execute(context)
context.window_manager.fileselect_add(self)
return {'RUNNING_MODAL'}
def execute(self, context):
from . import import_svg
if self.files:
ret = {'CANCELLED'}
dirname = os.path.dirname(self.filepath)
for file in self.files:
path = os.path.join(dirname, file.name)
path = os.path.join(self.directory, file.name)
if import_svg.load(self, context, filepath=path) == {'FINISHED'}:
ret = {'FINISHED'}
return ret
@@ -62,20 +70,38 @@ class ImportSVG(bpy.types.Operator, ImportHelper):
return import_svg.load(self, context, filepath=self.filepath)
class IO_FH_svg_as_curves(bpy.types.FileHandler):
bl_idname = "IO_FH_svg_as_curves"
bl_label = "SVG as Curves"
bl_import_operator = "import_curve.svg"
bl_file_extensions = ".svg"
@classmethod
def poll_drop(cls, context):
return poll_file_object_drop(context)
def menu_func_import(self, context):
self.layout.operator(ImportSVG.bl_idname,
text="Scalable Vector Graphics (.svg)")
classes = [
ImportSVG,
IO_FH_svg_as_curves,
]
def register():
bpy.utils.register_class(ImportSVG)
for cls in classes:
bpy.utils.register_class(cls)
bpy.types.TOPBAR_MT_file_import.append(menu_func_import)
def unregister():
bpy.utils.unregister_class(ImportSVG)
for cls in classes:
bpy.utils.unregister_class(cls)
bpy.types.TOPBAR_MT_file_import.remove(menu_func_import)