-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsvg_tab.py
More file actions
130 lines (106 loc) · 5.76 KB
/
svg_tab.py
File metadata and controls
130 lines (106 loc) · 5.76 KB
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
"""
SVG Export Tab - SVG layer export UI
"""
import os
import wx
import wx.lib.scrolledpanel as scrolled
from .svg import PCB_LAYERS, PAGE_SIZE_OPTIONS, DRILL_SHAPE_OPTIONS
def create_svg_tab(parent, dialog):
"""Create the SVG export tab."""
import time
t0 = time.time()
# OPTIMIZATION: Freeze updates during widget creation
parent.Freeze()
try:
from .svg_templates import load_svg_templates, SVGTemplateEditorDialog
from .tabs import (_refresh_svg_template_dropdown, _on_svg_template_selected,
_show_svg_manage_menu)
outer = wx.Panel(parent)
outer_sizer = wx.BoxSizer(wx.VERTICAL)
# Template selector at top
tmpl_sizer = wx.BoxSizer(wx.HORIZONTAL)
tmpl_sizer.Add(wx.StaticText(outer, label="Template:"), 0, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 5)
dialog.svg_template_choice = wx.Choice(outer, size=(180, -1))
dialog.svg_template_choice.Bind(wx.EVT_CHOICE, lambda e: _on_svg_template_selected(dialog))
tmpl_sizer.Add(dialog.svg_template_choice, 0, wx.RIGHT, 5)
manage_btn = wx.Button(outer, label="Manage", size=(85, -1))
manage_btn.Bind(wx.EVT_BUTTON, lambda e: _show_svg_manage_menu(dialog, manage_btn))
tmpl_sizer.Add(manage_btn, 0)
outer_sizer.Add(tmpl_sizer, 0, wx.ALL, 10)
# Defer template refresh
wx.CallAfter(_refresh_svg_template_dropdown, dialog)
scroll = scrolled.ScrolledPanel(outer, style=wx.VSCROLL)
sizer = wx.BoxSizer(wx.VERTICAL)
# Layers
layers_box = wx.StaticBox(scroll, label="Layers to Export")
layers_sizer = wx.StaticBoxSizer(layers_box, wx.VERTICAL)
dialog.svg_layer_checks = {}
layers_grid = wx.GridSizer(5, 3, 3, 10)
for layer_id, layer_name in PCB_LAYERS:
cb = wx.CheckBox(scroll, label=layer_name)
if layer_id in ["F.Cu", "B.Cu", "F.SilkS", "B.SilkS", "Edge.Cuts"]:
cb.SetValue(True)
dialog.svg_layer_checks[layer_id] = cb
layers_grid.Add(cb, 0)
layers_sizer.Add(layers_grid, 0, wx.ALL, 5)
sel_sizer = wx.BoxSizer(wx.HORIZONTAL)
sel_all = wx.Button(scroll, label="Select All")
sel_all.Bind(wx.EVT_BUTTON, dialog.on_svg_select_all)
sel_none = wx.Button(scroll, label="Select None")
sel_none.Bind(wx.EVT_BUTTON, dialog.on_svg_select_none)
sel_sizer.Add(sel_all, 0, wx.RIGHT, 5)
sel_sizer.Add(sel_none, 0)
layers_sizer.Add(sel_sizer, 0, wx.ALL, 5)
sizer.Add(layers_sizer, 0, wx.EXPAND | wx.ALL, 5)
# Options
opts_box = wx.StaticBox(scroll, label="SVG Options")
opts_sizer = wx.StaticBoxSizer(opts_box, wx.VERTICAL)
dialog.svg_bw = wx.CheckBox(scroll, label="Black and White")
dialog.svg_negative = wx.CheckBox(scroll, label="Negative")
dialog.svg_mirror = wx.CheckBox(scroll, label="Mirror")
dialog.svg_exclude_sheet = wx.CheckBox(scroll, label="Exclude Drawing Sheet")
dialog.svg_merge_all = wx.CheckBox(scroll, label="Merge all layers into single SVG file")
for cb in [dialog.svg_bw, dialog.svg_negative, dialog.svg_mirror, dialog.svg_exclude_sheet, dialog.svg_merge_all]:
opts_sizer.Add(cb, 0, wx.ALL, 3)
page_sizer = wx.BoxSizer(wx.HORIZONTAL)
page_sizer.Add(wx.StaticText(scroll, label="Page Size:"), 0, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 5)
dialog.svg_page_size = wx.Choice(scroll, choices=[opt[1] for opt in PAGE_SIZE_OPTIONS])
dialog.svg_page_size.SetSelection(2)
page_sizer.Add(dialog.svg_page_size, 1, wx.EXPAND)
opts_sizer.Add(page_sizer, 0, wx.EXPAND | wx.ALL, 5)
drill_sizer = wx.BoxSizer(wx.HORIZONTAL)
drill_sizer.Add(wx.StaticText(scroll, label="Drill Shape:"), 0, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 5)
dialog.svg_drill_shape = wx.Choice(scroll, choices=[opt[1] for opt in DRILL_SHAPE_OPTIONS])
dialog.svg_drill_shape.SetSelection(2)
drill_sizer.Add(dialog.svg_drill_shape, 1, wx.EXPAND)
opts_sizer.Add(drill_sizer, 0, wx.EXPAND | wx.ALL, 5)
sizer.Add(opts_sizer, 0, wx.EXPAND | wx.ALL, 5)
# Output
out_box = wx.StaticBox(scroll, label="Output Directory")
out_sizer = wx.StaticBoxSizer(out_box, wx.HORIZONTAL)
dialog.svg_output_dir = wx.TextCtrl(scroll, value=dialog.output_dirs['SVG'])
browse_btn = wx.Button(scroll, label="Browse...")
browse_btn.Bind(wx.EVT_BUTTON, dialog.on_browse_svg)
out_sizer.Add(dialog.svg_output_dir, 1, wx.EXPAND | wx.ALL, 5)
out_sizer.Add(browse_btn, 0, wx.ALL, 5)
sizer.Add(out_sizer, 0, wx.EXPAND | wx.ALL, 5)
# Setup scrolling AFTER populating sizer
scroll.SetSizer(sizer)
scroll.SetupScrolling(scroll_x=False)
outer_sizer.Add(scroll, 1, wx.EXPAND)
# Button row
btn_row = wx.BoxSizer(wx.HORIZONTAL)
export_btn = wx.Button(outer, label="Export SVG", size=(-1, 40))
export_btn.SetFont(wx.Font(11, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD))
export_btn.Bind(wx.EVT_BUTTON, dialog.on_export_svg)
dialog.svg_cancel_btn = wx.Button(outer, label="Cancel", size=(80, 40))
dialog.svg_cancel_btn.Enable(False)
dialog.svg_cancel_btn.Bind(wx.EVT_BUTTON, dialog.on_cancel)
btn_row.Add(export_btn, 1, wx.EXPAND | wx.RIGHT, 5)
btn_row.Add(dialog.svg_cancel_btn, 0)
outer_sizer.Add(btn_row, 0, wx.EXPAND | wx.ALL, 10)
outer.SetSizer(outer_sizer)
finally:
parent.Thaw()
dialog.log(f" [SVG] UI created in {(time.time()-t0)*1000:.0f}ms")
return outer