summaryrefslogtreecommitdiff
path: root/lib/extensions/simulator.py
blob: af793f03f1afe9d340ae5fe70cff7aeac595fcc4 (plain)
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
# Authors: see git history
#
# Copyright (c) 2010 Authors
# Licensed under the GNU GPL version 3.0 or later.  See the file LICENSE for details.

import wx

from ..gui.simulator import SimulatorWindow
from ..stitch_plan import stitch_groups_to_stitch_plan
from ..svg import convert_length
from ..utils.svg_data import get_pagecolor
from .base import InkstitchExtension


class Simulator(InkstitchExtension):
    def __init__(self):
        InkstitchExtension.__init__(self)

    def effect(self):
        if not self.get_elements():
            return

        metadata = self.get_inkstitch_metadata()
        collapse_len = metadata['collapse_len_mm']
        min_stitch_len = metadata['min_stitch_len_mm']
        stitch_groups = self.elements_to_stitch_groups(self.elements)
        stitch_plan = stitch_groups_to_stitch_plan(stitch_groups, collapse_len=collapse_len, min_stitch_len=min_stitch_len)
        background_color = get_pagecolor(self.svg.namedview)

        app = wx.App()
        current_screen = wx.Display.GetFromPoint(wx.GetMousePosition())
        display = wx.Display(current_screen)
        screen_rect = display.GetClientArea()
        width = int(screen_rect.width * 0.8)
        height = int(screen_rect.height * 0.8)
        simulator = SimulatorWindow(size=(width, height), background_color=background_color)
        wx.CallLater(100, simulator.Centre)
        app.SetTopWindow(simulator)
        simulator.Show()
        simulator.load(stitch_plan)
        simulator.set_page_specs(self.get_page_specs(stitch_plan))
        simulator.go()
        app.MainLoop()

    def get_page_specs(self, stitch_plan):
        svg = self.document.getroot()
        width = svg.get('width', 0)
        height = svg.get('height', 0)
        page_color = "white"
        desk_color = "white"
        border_color = "black"
        show_page_shadow = "true"

        named_view = svg.namedview
        if named_view is not None:
            page_color = named_view.get('pagecolor', page_color)
            desk_color = named_view.get('inkscape:deskcolor', desk_color)
            border_color = named_view.get('bordercolor', border_color)
            show_page_shadow = named_view.get('inkscape:showpageshadow', show_page_shadow) in ['true', 'yes', 'y', '1', '2']

        return {
            "width": convert_length(width),
            "height": convert_length(height),
            "x": stitch_plan.bounding_box[0],
            "y": stitch_plan.bounding_box[1],
            "page_color": page_color,
            "desk_color": desk_color,
            "border_color": border_color,
            "show_page_shadow": show_page_shadow
        }