Source code for timelinelib.plugin.plugins.exporters
# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 Rickard Lindberg, Roger Lindberg
#
# This file is part of Timeline.
#
# Timeline is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Timeline is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Timeline. If not, see <http://www.gnu.org/licenses/>.
"""
"""
import os
import wx
from timelinelib.wxgui.utils import _ask_question
from timelinelib.wxgui.utils import WildcardHelper
from timelinelib.wxgui.utils import display_warning_message
from timelinelib.proxies.drawingarea import DrawingAreaProxy
EXPORTER = "exporter"
[docs]def export_to_image(main_frame):
path = _get_image_path(main_frame)
if path is not None and _overwrite_existing_path(main_frame, path):
main_frame.main_panel.timeline_panel.timeline_canvas.SaveAsPng(path)
[docs]def export_to_images(main_frame):
path = _get_image_path(main_frame)
if path is not None:
try:
p = main_frame.main_panel.get_export_periods(*main_frame.controller.get_start_and_end_for_all_visible_events())
if p:
periods, current_period = p
else:
display_warning_message(_("No events found!"))
return
except ValueError:
msg = _("The first image contains a Julian day < 0\n\nNavigate to first event or\nUse the feature 'Accept negative Julian days'")
display_warning_message(msg)
return
view_properties = DrawingAreaProxy(main_frame).view_properties
view_properties.set_use_fixed_event_vertical_pos(True)
path_without_extension, extension = path.rsplit(".", 1)
view_properties.set_use_fixed_event_vertical_pos(True)
view_properties.periods = periods
count = 1
paths = []
for period in periods:
path = "%s_%d.%s" % (path_without_extension, count, extension)
if _overwrite_existing_path(main_frame, path):
main_frame.main_panel.timeline_panel.timeline_canvas.Navigate(lambda tp: period)
main_frame.main_panel.timeline_panel.timeline_canvas.SaveAsPng(path)
count += 1
paths.append(path)
view_properties.set_use_fixed_event_vertical_pos(False)
main_frame.main_panel.timeline_panel.timeline_canvas.Navigate(lambda tp: current_period)
merged_image_path = "%s_merged.%s" % (path_without_extension, extension)
merge_images(paths, merged_image_path)
def _get_image_path(main_frame):
path = None
file_info = _("Image files")
file_types = [("png", wx.BITMAP_TYPE_PNG)]
images_wildcard_helper = WildcardHelper(file_info, file_types)
wildcard = images_wildcard_helper.wildcard_string()
dialog = wx.FileDialog(main_frame, message=_("Export to Image"), wildcard=wildcard, style=wx.FD_SAVE)
if dialog.ShowModal() == wx.ID_OK:
path = images_wildcard_helper.get_path(dialog)
dialog.Destroy()
return path
def _overwrite_existing_path(main_frame, path):
if os.path.exists(path):
overwrite_question = _("File '%s' exists. Overwrite?") % path
return _ask_question(overwrite_question, main_frame) == wx.YES
return True
[docs]def merge_images(images_paths, merged_image_path):
from PIL import Image
images = list(map(Image.open, images_paths))
widths, heights = list(zip(*(i.size for i in images)))
total_width = sum(widths)
max_height = max(heights)
new_image = Image.new('RGB', (total_width, max_height))
x_offset = 0
for image in images:
new_image.paste(image, (x_offset, 0))
x_offset += image.size[0]
new_image.save(merged_image_path)