Skip to content
Snippets Groups Projects
Commit fab62e93 authored by Folkert de Vries's avatar Folkert de Vries
Browse files

Freestyle SVG export: handle relative paths

Previously, relative paths were not handled well. The result was an
error in the console and no output at the expected location.

The path resolving order is as follows:

* use the given path (scene.render.frame_path()) when it is absolute
* otherwise, try to join with the current blendfile's location
* otherwise, try to join with the folder from which blender was called

Tested on linux, but not on Windows
parent ad111ff5
No related branches found
No related tags found
No related merge requests found
...@@ -151,12 +151,28 @@ def is_preview_render(scene): ...@@ -151,12 +151,28 @@ def is_preview_render(scene):
def create_path(scene): def create_path(scene):
"""Creates the output path for the svg file""" """Creates the output path for the svg file"""
dirname = os.path.dirname(scene.render.frame_path()) path = os.path.dirname(scene.render.frame_path())
file_dir_path = os.path.dirname(bpy.data.filepath)
# try to use the given path if it is absolute
if os.path.isabs(path):
dirname = path
# otherwise, use current file's location as a start for the relative path
elif file_dir_path:
dirname = os.path.normpath(os.path.join(file_dir_path, path))
# otherwise, use the folder from which blender was called as the start
else:
dirname = os.path.abspath(bpy.path.abspath(path))
basename = bpy.path.basename(scene.render.filepath) basename = bpy.path.basename(scene.render.filepath)
if scene.svg_export.mode == 'FRAME': if scene.svg_export.mode == 'FRAME':
frame = "{:04d}".format(scene.frame_current) frame = "{:04d}".format(scene.frame_current)
else: else:
frame = "{:04d}-{:04d}".format(scene.frame_start, scene.frame_end) frame = "{:04d}-{:04d}".format(scene.frame_start, scene.frame_end)
return os.path.join(dirname, basename + frame + ".svg") return os.path.join(dirname, basename + frame + ".svg")
...@@ -477,7 +493,7 @@ class SVGFillBuilder: ...@@ -477,7 +493,7 @@ class SVGFillBuilder:
break break
# if it isn't a hole, it is likely that there are two strokes belonging # if it isn't a hole, it is likely that there are two strokes belonging
# to the same object separated by another object. let's try to join them # to the same object separated by another object. let's try to join them
elif (get_object_name(base) == get_object_name(stroke) and elif (get_object_name(base) == get_object_name(stroke) and
diffuse_from_stroke(stroke) == diffuse_from_stroke(stroke)): diffuse_from_stroke(stroke) == diffuse_from_stroke(stroke)):
base = extend_stroke(base, (sv for sv in stroke)) base = extend_stroke(base, (sv for sv in stroke))
break break
...@@ -512,7 +528,7 @@ class SVGFillBuilder: ...@@ -512,7 +528,7 @@ class SVGFillBuilder:
fills = (self.stroke_to_fill(stroke).get("d") for stroke in v) fills = (self.stroke_to_fill(stroke).get("d") for stroke in v)
merged_points = " ".join(fills) merged_points = " ".join(fills)
base.attrib['d'] += merged_points base.attrib['d'] += merged_points
yield base yield base
def write(self, strokes): def write(self, strokes):
"""Write SVG data tree to file """ """Write SVG data tree to file """
...@@ -741,4 +757,3 @@ def unregister(): ...@@ -741,4 +757,3 @@ def unregister():
if __name__ == "__main__": if __name__ == "__main__":
register() register()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment