-
Notifications
You must be signed in to change notification settings - Fork 0
/
svg-to-gltf.py
138 lines (99 loc) · 4.92 KB
/
svg-to-gltf.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
bl_info = {
"name" : "Convert SVG to GLTF",
"blender": (2, 80, 0),
"category" : "Export",
}
import bpy
import math
import os
class ExportSVGtoGLTFPanel(bpy.types.Panel):
"""Creates a Panel in the Object properties window"""
bl_label = "Export SVG to GLTF"
bl_idname = "OBJECT_PT_export_svg_gltf"
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_category = "Convert SVG to GLTF"
def draw(self, context):
layout = self.layout
# Input directory path parameter
layout.prop(context.scene, "svg_input_dir", text="Input Directory")
# Output directory path parameter
layout.prop(context.scene, "gltf_output_dir", text="Output Directory")
# Export button
layout.operator("object.export_svg_to_gltf", text="Export")
class OBJECT_OT_export_svg_to_gltf(bpy.types.Operator):
"""Operator which exports all SVG files in the input directory to GLTF files in the output directory"""
bl_idname = "object.export_svg_to_gltf"
bl_label = "Export SVG to GLTF"
def execute(self, context):
# Delete all objects
for obj in bpy.context.scene.objects:
bpy.data.objects.remove(obj, do_unlink=True)
# Delete all collections except the default one
for coll in bpy.data.collections:
if coll.name != bpy.context.scene.collection.name:
bpy.data.collections.remove(coll, do_unlink=True)
input_dir = bpy.path.abspath(context.scene.svg_input_dir)
output_dir = bpy.path.abspath(context.scene.gltf_output_dir)
# Ensure output directory exists
os.makedirs(output_dir, exist_ok=True)
# Loop through each SVG file and import it
svg_files = [f for f in os.listdir(input_dir) if f.endswith(".svg")]
for svg_file in svg_files:
# Set the filepath to the SVG file
filepath = os.path.join(input_dir, svg_file)
# Import the SVG file
bpy.ops.import_curve.svg(filepath=filepath)
bpy.ops.object.select_all(action='DESELECT')
# Join all curves into one object in the same Collection
for Coll in bpy.data.collections:
for curve in Coll.objects:
# bpy.ops.object.select_all(action='DESELECT')
curve.select_set(True)
bpy.context.view_layer.objects.active = curve
bpy.ops.object.join()
bpy.ops.object.select_all(action='DESELECT')
for obj in bpy.context.scene.objects:
svg_object = obj
svg_object.select_set(True)
svg_object.scale = (40,40,40)
bpy.context.view_layer.objects.active = svg_object
# Select the object and set the pivot point to the center of mass
bpy.ops.object.origin_set(type='ORIGIN_CENTER_OF_MASS')
# Rotate object
svg_object.rotation_euler.x = math.radians(90)
# Set extrudion, bevel and resolution
svg_object.data.extrude = 0.01
svg_object.data.bevel_depth = 0.0015
svg_object.data.resolution_u = 24
svg_object.data.bevel_resolution = 8
# Set the location of the object to (0,0,0)
svg_object.location = (0,0,0)
bpy.ops.object.select_all(action='DESELECT')
svg_object.select_set(True)
# Convert curve to mesh
bpy.ops.object.convert(target='MESH')
# Reset all transforms
bpy.ops.object.transform_apply( location=True, rotation=True, scale=True )
# Create simple UV map
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.uv.smart_project()
bpy.ops.object.mode_set(mode='OBJECT')
#filename = svg_object.name
output_path = os.path.join(output_dir + svg_object.name )
svg_object.select_set(True)
# export to dir
bpy.ops.export_scene.gltf(filepath=output_path, use_selection=True, export_format = 'GLTF_EMBEDDED')
bpy.ops.object.select_all(action='DESELECT')
return {'FINISHED'}
def register():
bpy.utils.register_class(ExportSVGtoGLTFPanel)
bpy.utils.register_class(OBJECT_OT_export_svg_to_gltf)
bpy.types.Scene.svg_input_dir = bpy.props.StringProperty(subtype='DIR_PATH')
bpy.types.Scene.gltf_output_dir = bpy.props.StringProperty(subtype='DIR_PATH')
def unregister():
bpy.utils.unregister_class(ExportSVGtoGLTFPanel)
bpy.utils.unregister_class(OBJECT_OT_export_svg_to_gltf)
del bpy.types.Scene.svg_input_dir
del bpy.types.Scene.gltf_output_dir