summaryrefslogtreecommitdiff
path: root/media-gfx/printrun
diff options
context:
space:
mode:
authorV3n3RiX <venerix@redcorelinux.org>2017-10-09 18:53:29 +0100
committerV3n3RiX <venerix@redcorelinux.org>2017-10-09 18:53:29 +0100
commit4f2d7949f03e1c198bc888f2d05f421d35c57e21 (patch)
treeba5f07bf3f9d22d82e54a462313f5d244036c768 /media-gfx/printrun
reinit the tree, so we can have metadata
Diffstat (limited to 'media-gfx/printrun')
-rw-r--r--media-gfx/printrun/Manifest9
-rw-r--r--media-gfx/printrun/files/printrun-gtk3.patch291
-rw-r--r--media-gfx/printrun/files/printrun-x11.patch39
-rw-r--r--media-gfx/printrun/metadata.xml20
-rw-r--r--media-gfx/printrun/printrun-20150310-r1.ebuild34
-rw-r--r--media-gfx/printrun/printrun-20150310-r2.ebuild39
-rw-r--r--media-gfx/printrun/printrun-99999999.ebuild34
7 files changed, 466 insertions, 0 deletions
diff --git a/media-gfx/printrun/Manifest b/media-gfx/printrun/Manifest
new file mode 100644
index 000000000000..5c6c68806504
--- /dev/null
+++ b/media-gfx/printrun/Manifest
@@ -0,0 +1,9 @@
+AUX printrun-gtk3.patch 21526 SHA256 f7455f1c1d164830cce9284748ed55349224ac56cf14eda02c0e2ce2ed8df093 SHA512 78b30b491891633da8efa5d515e7ec5d0f95fc369d1a707a421f72da9ab34de0b9ee188753a4baef1675f2bb278b0e2858f8feec1fc95ca835c7872550248cd5 WHIRLPOOL 33b59f53a096213dab6b6f8074e05a86b4e49ef2805a79676334917263e14de7307bb3bd42cc36854d2540f95e935825836bd6464005a6784a86f18fe0081631
+AUX printrun-x11.patch 1075 SHA256 422a242b18869655201956c4d35357883d6d1da931e97855e7f1a9072b7da316 SHA512 8e3924fe0b77e361bedc52cc91a827abb0f72c45df42d243e3762e0759b59715cf0687b4ea1991a8567b5bdcb5e12f3c3b218d1cec2dfc434f81a1c479689203 WHIRLPOOL 16d806a611963dff4a7a74d7a36e33b65457dc17c9d2e15b70acbbb03f0908f298f1a3ddbbce2a766f63b000dcef4aa2560a2ab8fc3ef83645bcbe4642017f90
+DIST printrun-20150310.tar.gz 906153 SHA256 6edaa533df5a590f55039b81e47f61881d2a47de07c3391d53bfb6d847f46d2e SHA512 359a4a6128b274a6709fb5c35a2d6c510bb57e010cfb12ddefa39cdb371f2141e2cab394be7d9d2f1dbc0175cc24deba61941d73b6c19fb299083afbf1141f1e WHIRLPOOL 38d3ead2be8fb7f802d73956bda5e83c99a902c2682f5c48f74d92e8c5e30b351b06821d6178d3b44722a10982d7a79c471fb3a27d2f313bfb647e9a241e92e1
+EBUILD printrun-20150310-r1.ebuild 756 SHA256 063b5d1df28956571b09c2895be32c6b84bc25d64ee483cf455dadc78b57f5b2 SHA512 c002e13d5d6ba4018135ccf0f50745246ea5e4e747d43b4a64a4b10c71551cee9ff263b89e68d87ae42349bb0ef71da7f27b89b823204f73c3da9f4d4a814626 WHIRLPOOL d95fc0e12677a85d6e45b56ff07ca3c2e6f73eb7c6dd13dc13af20b40a660eaf784101c3e02b55242f18e2cd8c7c0b8a384ef629093dcefd98d933400a9547b8
+EBUILD printrun-20150310-r2.ebuild 941 SHA256 4af5c47845e6c4ad65434d396117305bf8748c8e81ad2287eabcb520e52b151e SHA512 12c118df5c164b9c360589c174e3f4332104995becfa544e8639688bf64b8f9fc639a39145a448dd1238f821ee6bf7dea75a0c78c733c2e84a9ec6a161722035 WHIRLPOOL 22e71e0316a81428f13459be28e768105e45fff6eb9c35489200152ad77f19e372ef50d102473353e67e6bd59f3117f19caed0361ffb9e056de565de4d003401
+EBUILD printrun-99999999.ebuild 817 SHA256 73e67e90cbfb9b2da8973c63ec006f25ca4ffaf88ca5ffbf993e1d6baaccb749 SHA512 d8454c7f5b0431dfc6ff8cb79c6ecbea46b600f087bcc3f096c73f32b93cef0be5db092290ca5445ed920d54c235fcc0c22d00285cd815c4f4cf017f27dbd0df WHIRLPOOL b9a5582e6fe70470d670b27a67437cc6bf509390cb3807dbd7773d2622069d2fdf258ccdbfad540ae6414bf4b65358a0e4be691c06b5f22008ff4b14617279d0
+MISC ChangeLog 2480 SHA256 c7d8c9c2196f873ec15cf0115085deeafd64c8cc494ce020a132f0e3a28d51e4 SHA512 4bdb1bf643143824e227944cde1b744ae7394afec88807a95d373d6d2b7aace6daf1eb5df0f5eaad910e1c10460aa6f5612d17474ae1496dc61596fe730d6b57 WHIRLPOOL 7150a193a716c389e911c09925666fb5729201a32001c5b6979e169ac295b5f47c62f53b51fc087542052b19772aea344c8247a57ee9628efb54aebb651c03f6
+MISC ChangeLog-2015 898 SHA256 fc1eef3fee7aec70b788120a05b4e3b34bdf1b3a723694a1fbdd93327e23d6ea SHA512 3b6bec737409544bfc5401f4d80c65e08bed0095d093151a6f997edf6ff0909ccc1c3dd186add3e01a7331312dcec5256e56616c3eda79f3ceafd04c1987555c WHIRLPOOL 60101e3ad3ab8ee5ae14aa9f036a48f597119079701dbe833710a24531ca5f13e355d4d8a79e7227134b9522859380d4f29d4bfbf85c29502267b72fe1a30350
+MISC metadata.xml 728 SHA256 011165ec556783a7bae59e3c3b7081c9ee001746de182eb49bc5fc339c234226 SHA512 37128e13862a70950c89d42e8d7bdfdd7eee598890f9c80b7c60a903ac0466b2e177546d5a5cd23883aaef9128bdae5428172b39b6cb65f4132fe2f9d3880723 WHIRLPOOL 3dc8e99ccb77dbcf71dd7594b03181c9f28863d0f42507bdc37a9106694c5dc1a1fe3725f3fe1ad4d11886bff2111fde776b4eada456032045e2f7fba021cf70
diff --git a/media-gfx/printrun/files/printrun-gtk3.patch b/media-gfx/printrun/files/printrun-gtk3.patch
new file mode 100644
index 000000000000..a31bcd15580d
--- /dev/null
+++ b/media-gfx/printrun/files/printrun-gtk3.patch
@@ -0,0 +1,291 @@
+diff -up a/printrun/gui/controls.py.gtk3 a/printrun/gui/controls.py
+--- a/printrun/gui/controls.py.gtk3 2015-03-09 07:22:14.000000000 -0400
++++ a/printrun/gui/controls.py 2015-08-11 23:43:27.444624125 -0400
+@@ -136,7 +136,7 @@ def add_extra_controls(self, root, paren
+ if root.settings.last_temperature not in map(float, root.temps.values()):
+ htemp_choices = [str(root.settings.last_temperature)] + htemp_choices
+ root.htemp = wx.ComboBox(parentpanel, -1, choices = htemp_choices,
+- style = wx.CB_DROPDOWN, size = (80, -1))
++ style = wx.CB_DROPDOWN, size = (115, -1))
+ root.htemp.SetToolTip(wx.ToolTip(_("Select Temperature for Hotend")))
+ root.htemp.Bind(wx.EVT_COMBOBOX, root.htemp_change)
+
+@@ -156,7 +156,7 @@ def add_extra_controls(self, root, paren
+ if root.settings.last_bed_temperature not in map(float, root.bedtemps.values()):
+ btemp_choices = [str(root.settings.last_bed_temperature)] + btemp_choices
+ root.btemp = wx.ComboBox(parentpanel, -1, choices = btemp_choices,
+- style = wx.CB_DROPDOWN, size = (80, -1))
++ style = wx.CB_DROPDOWN, size = (115, -1))
+ root.btemp.SetToolTip(wx.ToolTip(_("Select Temperature for Heated Bed")))
+ root.btemp.Bind(wx.EVT_COMBOBOX, root.btemp_change)
+ add("btemp_val", root.btemp)
+@@ -192,7 +192,11 @@ def add_extra_controls(self, root, paren
+ root.speed_slider = wx.Slider(speedpanel, -1, 100, 1, 300)
+ speedsizer.Add(root.speed_slider, 1, flag = wx.EXPAND)
+
+- root.speed_spin = FloatSpin(speedpanel, -1, value = 100, min_val = 1, max_val = 300, digits = 0, style = wx.ALIGN_LEFT, size = (80, -1))
++ if wx.VERSION < (3, 0):
++ root.speed_spin = FloatSpin(speedpanel, -1, value = 100, min_val = 1, max_val = 300, digits = 0, style = wx.ALIGN_LEFT, size = (80, -1))
++ else:
++ root.speed_spin = wx.SpinCtrlDouble(speedpanel, -1, initial = 100, min = 1, max = 300, style = wx.ALIGN_LEFT, size = (115, -1))
++ root.speed_spin.SetDigits(0)
+ speedsizer.Add(root.speed_spin, 0, flag = wx.ALIGN_CENTER_VERTICAL)
+ root.speed_label = wx.StaticText(speedpanel, -1, _("%"))
+ speedsizer.Add(root.speed_label, flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
+@@ -210,7 +214,10 @@ def add_extra_controls(self, root, paren
+ value = root.speed_spin.GetValue()
+ root.speed_setbtn.SetBackgroundColour("red")
+ root.speed_slider.SetValue(value)
+- root.speed_spin.Bind(wx.EVT_SPINCTRL, speedslider_spin)
++ if wx.VERSION < (3, 0):
++ root.speed_spin.Bind(wx.EVT_SPINCTRL, speedslider_spin)
++ else:
++ root.speed_spin.Bind(wx.EVT_SPINCTRLDOUBLE, speedslider_spin)
+
+ def speedslider_scroll(event):
+ value = root.speed_slider.GetValue()
+@@ -269,10 +276,15 @@ def add_extra_controls(self, root, paren
+ esettingspanel = root.newPanel(parentpanel)
+ esettingssizer = wx.GridBagSizer()
+ esettingssizer.SetEmptyCellSize((0, 0))
+- root.edist = FloatSpin(esettingspanel, -1, value = root.settings.last_extrusion, min_val = 0, max_val = 1000, size = (90, -1), digits = 1)
++ if wx.VERSION < (3, 0):
++ root.edist = FloatSpin(esettingspanel, -1, value = root.settings.last_extrusion, min_val = 0, max_val = 1000, size = (90, -1), digits = 1)
++ root.edist.Bind(wx.EVT_SPINCTRL, root.setfeeds)
++ else:
++ root.edist = wx.SpinCtrlDouble(esettingspanel, -1, initial = root.settings.last_extrusion, min = 0, max = 1000, size = (135, -1))
++ root.edist.SetDigits(1)
++ root.edist.Bind(wx.EVT_SPINCTRLDOUBLE, root.setfeeds)
+ root.edist.SetBackgroundColour((225, 200, 200))
+ root.edist.SetForegroundColour("black")
+- root.edist.Bind(wx.EVT_SPINCTRL, root.setfeeds)
+ root.edist.Bind(wx.EVT_TEXT, root.setfeeds)
+ add("edist_label", wx.StaticText(esettingspanel, -1, _("Length:")), container = esettingssizer, flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT | wx.RIGHT | wx.LEFT, border = 5)
+ add("edist_val", root.edist, container = esettingssizer, flag = wx.ALIGN_CENTER | wx.RIGHT, border = 5)
+@@ -280,11 +292,16 @@ def add_extra_controls(self, root, paren
+ add("edist_unit", wx.StaticText(esettingspanel, -1, unit_label), container = esettingssizer, flag = wx.ALIGN_CENTER | wx.RIGHT, border = 5)
+ root.edist.SetToolTip(wx.ToolTip(_("Amount to Extrude or Retract (mm)")))
+ if not mini_mode:
+- root.efeedc = FloatSpin(esettingspanel, -1, value = root.settings.e_feedrate, min_val = 0, max_val = 50000, size = (90, -1), digits = 1)
++ if wx.VERSION < (3, 0):
++ root.efeedc = FloatSpin(esettingspanel, -1, value = root.settings.e_feedrate, min_val = 0, max_val = 50000, size = (90, -1), digits = 1)
++ root.efeedc.Bind(wx.EVT_SPINCTRL, root.setfeeds)
++ else:
++ root.efeedc = wx.SpinCtrlDouble(esettingspanel, -1, initial = root.settings.e_feedrate, min = 0, max = 50000, size = (145, -1))
++ root.efeedc.SetDigits(1)
++ root.efeedc.Bind(wx.EVT_SPINCTRLDOUBLE, root.setfeeds)
+ root.efeedc.SetToolTip(wx.ToolTip(_("Extrude / Retract speed (mm/min)")))
+ root.efeedc.SetBackgroundColour((225, 200, 200))
+ root.efeedc.SetForegroundColour("black")
+- root.efeedc.Bind(wx.EVT_SPINCTRL, root.setfeeds)
+ root.efeedc.Bind(wx.EVT_TEXT, root.setfeeds)
+ add("efeed_val", root.efeedc, container = esettingssizer, flag = wx.ALIGN_CENTER | wx.RIGHT, border = 5)
+ add("efeed_label", wx.StaticText(esettingspanel, -1, _("Speed:")), container = esettingssizer, flag = wx.ALIGN_LEFT)
+@@ -379,12 +396,12 @@ class ControlsSizer(wx.GridBagSizer):
+ else:
+ self.extra_buttons[key] = btn
+
+- root.xyfeedc = wx.SpinCtrl(lltspanel, -1, str(root.settings.xy_feedrate), min = 0, max = 50000, size = (97, -1))
++ root.xyfeedc = wx.SpinCtrl(lltspanel, -1, str(root.settings.xy_feedrate), min = 0, max = 50000, size = (130, -1))
+ root.xyfeedc.SetToolTip(wx.ToolTip(_("Set Maximum Speed for X & Y axes (mm/min)")))
+ llts.Add(wx.StaticText(lltspanel, -1, _("XY:")), flag = wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
+ llts.Add(root.xyfeedc)
+ llts.Add(wx.StaticText(lltspanel, -1, _("mm/min Z:")), flag = wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
+- root.zfeedc = wx.SpinCtrl(lltspanel, -1, str(root.settings.z_feedrate), min = 0, max = 50000, size = (90, -1))
++ root.zfeedc = wx.SpinCtrl(lltspanel, -1, str(root.settings.z_feedrate), min = 0, max = 50000, size = (130, -1))
+ root.zfeedc.SetToolTip(wx.ToolTip(_("Set Maximum Speed for Z axis (mm/min)")))
+ llts.Add(root.zfeedc,)
+
+diff -up a/printrun/gui/toolbar.py.gtk3 a/printrun/gui/toolbar.py
+--- a/printrun/gui/toolbar.py.gtk3 2015-03-09 07:22:14.000000000 -0400
++++ a/printrun/gui/toolbar.py 2015-06-29 23:43:30.700768952 -0400
+@@ -42,7 +42,7 @@ def MainToolbar(root, parentpanel = None
+ root.baud = wx.ComboBox(parentpanel, -1,
+ choices = ["2400", "9600", "19200", "38400",
+ "57600", "115200", "250000"],
+- style = wx.CB_DROPDOWN, size = (100, -1))
++ style = wx.CB_DROPDOWN, size = (110, -1))
+ root.baud.SetToolTip(wx.ToolTip(_("Select Baud rate for printer communication")))
+ try:
+ root.baud.SetValue("115200")
+diff -up a/printrun/projectlayer.py.gtk3 a/printrun/projectlayer.py
+--- a/printrun/projectlayer.py.gtk3 2015-03-09 07:22:14.000000000 -0400
++++ a/printrun/projectlayer.py 2015-08-11 23:24:05.729359412 -0400
+@@ -278,38 +278,48 @@ class SettingsFrame(wx.Frame):
+ # Left Column
+
+ fieldsizer.Add(wx.StaticText(self.panel, -1, "Layer (mm):"), pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+- self.thickness = wx.TextCtrl(self.panel, -1, str(self._get_setting("project_layer", "0.1")), size = (80, -1))
++ self.thickness = wx.TextCtrl(self.panel, -1, str(self._get_setting("project_layer", "0.1")), size = (125, -1))
+ self.thickness.Bind(wx.EVT_TEXT, self.update_thickness)
+ self.thickness.SetHelpText("The thickness of each slice. Should match the value used to slice the model. SVG files update this value automatically, 3dlp.zip files have to be manually entered.")
+ fieldsizer.Add(self.thickness, pos = (0, 1))
+
+ fieldsizer.Add(wx.StaticText(self.panel, -1, "Exposure (s):"), pos = (1, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+- self.interval = wx.TextCtrl(self.panel, -1, str(self._get_setting("project_interval", "0.5")), size = (80, -1))
++ self.interval = wx.TextCtrl(self.panel, -1, str(self._get_setting("project_interval", "0.5")), size = (125, -1))
+ self.interval.Bind(wx.EVT_TEXT, self.update_interval)
+ self.interval.SetHelpText("How long each slice should be displayed.")
+ fieldsizer.Add(self.interval, pos = (1, 1))
+
+ fieldsizer.Add(wx.StaticText(self.panel, -1, "Blank (s):"), pos = (2, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+- self.pause = wx.TextCtrl(self.panel, -1, str(self._get_setting("project_pause", "0.5")), size = (80, -1))
++ self.pause = wx.TextCtrl(self.panel, -1, str(self._get_setting("project_pause", "0.5")), size = (125, -1))
+ self.pause.Bind(wx.EVT_TEXT, self.update_pause)
+ self.pause.SetHelpText("The pause length between slices. This should take into account any movement of the Z axis, plus time to prepare the resin surface (sliding, tilting, sweeping, etc).")
+ fieldsizer.Add(self.pause, pos = (2, 1))
+
+ fieldsizer.Add(wx.StaticText(self.panel, -1, "Scale:"), pos = (3, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+- self.scale = floatspin.FloatSpin(self.panel, -1, value = self._get_setting('project_scale', 1.0), increment = 0.1, digits = 3, size = (80, -1))
+- self.scale.Bind(floatspin.EVT_FLOATSPIN, self.update_scale)
++ if wx.VERSION < (3, 0):
++ self.scale = floatspin.FloatSpin(self.panel, -1, value = self._get_setting('project_scale', 1.0), increment = 0.1, digits = 3, size = (80, -1))
++ self.scale.Bind(floatspin.EVT_FLOATSPIN, self.update_scale)
++ else:
++ self.scale = wx.SpinCtrlDouble(self.panel, -1, initial = self._get_setting('project_scale', 1.0), inc = 0.1, size = (125, -1))
++ self.scale.SetDigits(3)
++ self.scale.Bind(wx.EVT_SPINCTRLDOUBLE, self.update_scale)
+ self.scale.SetHelpText("The additional scaling of each slice.")
+ fieldsizer.Add(self.scale, pos = (3, 1))
+
+ fieldsizer.Add(wx.StaticText(self.panel, -1, "Direction:"), pos = (4, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+- self.direction = wx.ComboBox(self.panel, -1, choices = ["Top Down", "Bottom Up"], value = self._get_setting('project_direction', "Top Down"), size = (80, -1))
++ self.direction = wx.ComboBox(self.panel, -1, choices = ["Top Down", "Bottom Up"], value = self._get_setting('project_direction', "Top Down"), size = (125, -1))
+ self.direction.Bind(wx.EVT_COMBOBOX, self.update_direction)
+ self.direction.SetHelpText("The direction the Z axis should move. Top Down is where the projector is above the model, Bottom up is where the projector is below the model.")
+ fieldsizer.Add(self.direction, pos = (4, 1), flag = wx.ALIGN_CENTER_VERTICAL)
+
+ fieldsizer.Add(wx.StaticText(self.panel, -1, "Overshoot (mm):"), pos = (5, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+- self.overshoot = floatspin.FloatSpin(self.panel, -1, value = self._get_setting('project_overshoot', 3.0), increment = 0.1, digits = 1, min_val = 0, size = (80, -1))
+- self.overshoot.Bind(floatspin.EVT_FLOATSPIN, self.update_overshoot)
++ if wx.VERSION < (3, 0):
++ self.overshoot = floatspin.FloatSpin(self.panel, -1, value = self._get_setting('project_overshoot', 3.0), increment = 0.1, digits = 1, min_val = 0, size = (80, -1))
++ self.overshoot.Bind(floatspin.EVT_FLOATSPIN, self.update_overshoot)
++ else:
++ self.overshoot = wx.SpinCtrlDouble(self.panel, -1, initial = self._get_setting('project_overshoot', 3.0), inc = 0.1, min = 0, size = (125, -1))
++ self.overshoot.SetDigits(1)
++ self.overshoot.Bind(wx.EVT_SPINCTRLDOUBLE, self.update_overshoot)
+ self.overshoot.SetHelpText("How far the axis should move beyond the next slice position for each slice. For Top Down printers this would dunk the model under the resi and then return. For Bottom Up printers this would raise the base away from the vat and then return.")
+ fieldsizer.Add(self.overshoot, pos = (5, 1))
+
+@@ -329,38 +339,53 @@ class SettingsFrame(wx.Frame):
+
+ fieldsizer.Add(wx.StaticText(self.panel, -1, "X (px):"), pos = (0, 2), flag = wx.ALIGN_CENTER_VERTICAL)
+ projectX = int(math.floor(float(self._get_setting("project_x", 1920))))
+- self.X = wx.SpinCtrl(self.panel, -1, str(projectX), max = 999999, size = (80, -1))
++ self.X = wx.SpinCtrl(self.panel, -1, str(projectX), max = 999999, size = (125, -1))
+ self.X.Bind(wx.EVT_SPINCTRL, self.update_resolution)
+ self.X.SetHelpText("The projector resolution in the X axis.")
+ fieldsizer.Add(self.X, pos = (0, 3))
+
+ fieldsizer.Add(wx.StaticText(self.panel, -1, "Y (px):"), pos = (1, 2), flag = wx.ALIGN_CENTER_VERTICAL)
+ projectY = int(math.floor(float(self._get_setting("project_y", 1200))))
+- self.Y = wx.SpinCtrl(self.panel, -1, str(projectY), max = 999999, size = (80, -1))
++ self.Y = wx.SpinCtrl(self.panel, -1, str(projectY), max = 999999, size = (125, -1))
+ self.Y.Bind(wx.EVT_SPINCTRL, self.update_resolution)
+ self.Y.SetHelpText("The projector resolution in the Y axis.")
+ fieldsizer.Add(self.Y, pos = (1, 3))
+
+ fieldsizer.Add(wx.StaticText(self.panel, -1, "OffsetX (mm):"), pos = (2, 2), flag = wx.ALIGN_CENTER_VERTICAL)
+- self.offset_X = floatspin.FloatSpin(self.panel, -1, value = self._get_setting("project_offset_x", 0.0), increment = 1, digits = 1, size = (80, -1))
+- self.offset_X.Bind(floatspin.EVT_FLOATSPIN, self.update_offset)
++ if wx.VERSION < (3, 0):
++ self.offset_X = floatspin.FloatSpin(self.panel, -1, value = self._get_setting("project_offset_x", 0.0), increment = 1, digits = 1, size = (80, -1))
++ self.offset_X.Bind(floatspin.EVT_FLOATSPIN, self.update_offset)
++ else:
++ self.offset_X = wx.SpinCtrlDouble(self.panel, -1, initial = self._get_setting("project_offset_x", 0.0), inc = 1, size = (125, -1))
++ self.offset_X.SetDigits(1)
++ self.offset_X.Bind(wx.EVT_SPINCTRLDOUBLE, self.update_offset)
+ self.offset_X.SetHelpText("How far the slice should be offset from the edge in the X axis.")
+ fieldsizer.Add(self.offset_X, pos = (2, 3))
+
+ fieldsizer.Add(wx.StaticText(self.panel, -1, "OffsetY (mm):"), pos = (3, 2), flag = wx.ALIGN_CENTER_VERTICAL)
+- self.offset_Y = floatspin.FloatSpin(self.panel, -1, value = self._get_setting("project_offset_y", 0.0), increment = 1, digits = 1, size = (80, -1))
+- self.offset_Y.Bind(floatspin.EVT_FLOATSPIN, self.update_offset)
++ if wx.VERSION < (3, 0):
++ self.offset_Y = floatspin.FloatSpin(self.panel, -1, value = self._get_setting("project_offset_y", 0.0), increment = 1, digits = 1, size = (80, -1))
++ self.offset_Y.Bind(floatspin.EVT_FLOATSPIN, self.update_offset)
++ else:
++ self.offset_Y = wx.SpinCtrlDouble(self.panel, -1, initial = self._get_setting("project_offset_y", 0.0), inc = 1, size = (125, -1))
++ self.offset_Y.SetDigits(1)
++ self.offset_Y.Bind(wx.EVT_SPINCTRLDOUBLE, self.update_offset)
+ self.offset_Y.SetHelpText("How far the slice should be offset from the edge in the Y axis.")
+ fieldsizer.Add(self.offset_Y, pos = (3, 3))
+
+ fieldsizer.Add(wx.StaticText(self.panel, -1, "ProjectedX (mm):"), pos = (4, 2), flag = wx.ALIGN_CENTER_VERTICAL)
+- self.projected_X_mm = floatspin.FloatSpin(self.panel, -1, value = self._get_setting("project_projected_x", 505.0), increment = 1, digits = 1, size = (80, -1))
+- self.projected_X_mm.Bind(floatspin.EVT_FLOATSPIN, self.update_projected_Xmm)
++ if wx.VERSION < (3, 0):
++ self.projected_X_mm = floatspin.FloatSpin(self.panel, -1, value = self._get_setting("project_projected_x", 505.0), increment = 1, digits = 1, size = (80, -1))
++ self.projected_X_mm.Bind(floatspin.EVT_FLOATSPIN, self.update_projected_Xmm)
++ else:
++ self.projected_X_mm = wx.SpinCtrlDouble(self.panel, -1, initial = self._get_setting("project_projected_x", 505.0), inc = 1, size = (125, -1))
++ self.projected_X_mm.SetDigits(1)
++ self.projected_X_mm.Bind(wx.EVT_SPINCTRLDOUBLE, self.update_projected_Xmm)
+ self.projected_X_mm.SetHelpText("The actual width of the entire projected image. Use the Calibrate grid to show the full size of the projected image, and measure the width at the same level where the slice will be projected onto the resin.")
+ fieldsizer.Add(self.projected_X_mm, pos = (4, 3))
+
+ fieldsizer.Add(wx.StaticText(self.panel, -1, "Z Axis Speed (mm/min):"), pos = (5, 2), flag = wx.ALIGN_CENTER_VERTICAL)
+- self.z_axis_rate = wx.SpinCtrl(self.panel, -1, str(self._get_setting("project_z_axis_rate", 200)), max = 9999, size = (80, -1))
++ self.z_axis_rate = wx.SpinCtrl(self.panel, -1, str(self._get_setting("project_z_axis_rate", 200)), max = 9999, size = (125, -1))
+ self.z_axis_rate.Bind(wx.EVT_SPINCTRL, self.update_z_axis_rate)
+ self.z_axis_rate.SetHelpText("Speed of the Z axis in mm/minute. Take into account that slower rates may require a longer pause value.")
+ fieldsizer.Add(self.z_axis_rate, pos = (5, 3))
+@@ -394,7 +419,11 @@ class SettingsFrame(wx.Frame):
+ first_layer_boxer.Add(self.first_layer, flag = wx.ALIGN_CENTER_VERTICAL)
+
+ first_layer_boxer.Add(wx.StaticText(self.panel, -1, " (s):"), flag = wx.ALIGN_CENTER_VERTICAL)
+- self.show_first_layer_timer = floatspin.FloatSpin(self.panel, -1, value=-1, increment = 1, digits = 1, size = (55, -1))
++ if wx.VERSION < (3, 0):
++ self.show_first_layer_timer = floatspin.FloatSpin(self.panel, -1, value=-1, increment = 1, digits = 1, size = (55, -1))
++ else:
++ self.show_first_layer_timer = wx.SpinCtrlDouble(self.panel, -1, initial = -1, inc = 1, size = (125, -1))
++ self.show_first_layer_timer.SetDigits(1)
+ self.show_first_layer_timer.SetHelpText("How long to display the first layer for. -1 = unlimited.")
+ first_layer_boxer.Add(self.show_first_layer_timer, flag = wx.ALIGN_CENTER_VERTICAL)
+ displaysizer.Add(first_layer_boxer, pos = (0, 6), flag = wx.ALIGN_CENTER_VERTICAL)
+diff -up a/printrun/settings.py.gtk3 a/printrun/settings.py
+--- a/printrun/settings.py.gtk3 2015-06-19 05:47:24.000000000 -0400
++++ a/printrun/settings.py 2015-08-11 23:32:05.603437536 -0400
+@@ -145,7 +145,12 @@ class SpinSetting(wxSetting):
+
+ def get_specific_widget(self, parent):
+ from wx.lib.agw.floatspin import FloatSpin
+- self.widget = FloatSpin(parent, -1, min_val = self.min, max_val = self.max, digits = 0)
++ import wx
++ if wx.VERSION < (3, 0):
++ self.widget = FloatSpin(parent, -1, min_val = self.min, max_val = self.max, digits = 0)
++ else:
++ self.widget = wx.SpinCtrlDouble(parent, -1, min = self.min, max = self.max)
++ self.widget.SetDigits(0)
+ self.widget.SetValue(self.value)
+ orig = self.widget.GetValue
+ self.widget.GetValue = lambda: int(orig())
+@@ -155,7 +160,12 @@ class FloatSpinSetting(SpinSetting):
+
+ def get_specific_widget(self, parent):
+ from wx.lib.agw.floatspin import FloatSpin
+- self.widget = FloatSpin(parent, -1, value = self.value, min_val = self.min, max_val = self.max, increment = self.increment, digits = 2)
++ import wx
++ if wx.VERSION < (3, 0):
++ self.widget = FloatSpin(parent, -1, value = self.value, min_val = self.min, max_val = self.max, increment = self.increment, digits = 2)
++ else:
++ self.widget = wx.SpinCtrlDouble(parent, -1, initial = self.value, min = self.min, max = self.max, inc = self.increment)
++ self.widget.SetDigits(2)
+ return self.widget
+
+ class BooleanSetting(wxSetting):
+@@ -216,7 +226,12 @@ class BuildDimensionsSetting(wxSetting):
+ import wx
+ build_dimensions = parse_build_dimensions(self.value)
+ self.widgets = []
+- w = lambda val, m, M: self.widgets.append(FloatSpin(parent, -1, value = val, min_val = m, max_val = M, digits = 2))
++ def w(val, m, M):
++ if wx.VERSION < (3, 0):
++ self.widgets.append(FloatSpin(parent, -1, value = val, min_val = m, max_val = M, digits = 2))
++ else:
++ self.widgets.append(wx.SpinCtrlDouble(parent, -1, initial = val, min = m, max = M))
++ self.widgets[-1].SetDigits(2)
+ addlabel = lambda name, pos: self.widget.Add(wx.StaticText(parent, -1, name), pos = pos, flag = wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border = 5)
+ addwidget = lambda *pos: self.widget.Add(self.widgets[-1], pos = pos, flag = wx.RIGHT, border = 5)
+ self.widget = wx.GridBagSizer()
diff --git a/media-gfx/printrun/files/printrun-x11.patch b/media-gfx/printrun/files/printrun-x11.patch
new file mode 100644
index 000000000000..dd9597a126e1
--- /dev/null
+++ b/media-gfx/printrun/files/printrun-x11.patch
@@ -0,0 +1,39 @@
+diff --git a/plater.py b/plater.py
+index 469eeb2..bfcc975 100755
+--- a/plater.py
++++ b/plater.py
+@@ -15,12 +15,14 @@
+ # You should have received a copy of the GNU General Public License
+ # along with Printrun. If not, see <http://www.gnu.org/licenses/>.
+
++import os
+ import sys
+ import wx
+
+ from printrun.stlplater import StlPlater
+
+ if __name__ == '__main__':
++ os.environ['GDK_BACKEND'] = 'x11'
+ app = wx.App(False)
+ main = StlPlater(filenames = sys.argv[1:])
+ main.Show()
+diff --git a/pronterface.py b/pronterface.py
+index dbe295a..4152288 100755
+--- a/pronterface.py
++++ b/pronterface.py
+@@ -15,6 +15,7 @@
+ # You should have received a copy of the GNU General Public License
+ # along with Printrun. If not, see <http://www.gnu.org/licenses/>.
+
++import os
+ import sys
+
+ try:
+@@ -32,6 +33,7 @@ not yet available for python3. You should try running with python2 instead.""")
+ from printrun.pronterface import PronterApp
+
+ if __name__ == '__main__':
++ os.environ['GDK_BACKEND'] = 'x11'
+ app = PronterApp(False)
+ try:
+ app.MainLoop()
diff --git a/media-gfx/printrun/metadata.xml b/media-gfx/printrun/metadata.xml
new file mode 100644
index 000000000000..0611e6680367
--- /dev/null
+++ b/media-gfx/printrun/metadata.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+ <maintainer type="person">
+ <email>amynka@gentoo.org</email>
+ </maintainer>
+ <maintainer type="project">
+ <email>3dprint@gentoo.org</email>
+ <name>Gentoo 3D print</name>
+ </maintainer>
+ <longdescription lang="en">
+ Printrun is a set of G-code sending applications for RepRap.
+ It consists of printcore (dumb G-code sender), pronsole (featured command line
+ G-code sender), pronterface (featured G-code sender with graphical user
+ interface), and a small collection of helpful scripts.
+</longdescription>
+ <upstream>
+ <remote-id type="github">kliment/Printrun</remote-id>
+ </upstream>
+</pkgmetadata>
diff --git a/media-gfx/printrun/printrun-20150310-r1.ebuild b/media-gfx/printrun/printrun-20150310-r1.ebuild
new file mode 100644
index 000000000000..3185dcf2a6d7
--- /dev/null
+++ b/media-gfx/printrun/printrun-20150310-r1.ebuild
@@ -0,0 +1,34 @@
+# Copyright 1999-2017 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+PYTHON_COMPAT=( python2_7 )
+
+inherit distutils-r1
+
+DESCRIPTION="GUI interface for 3D printing on RepRap and other printers"
+HOMEPAGE="https://github.com/kliment/Printrun"
+SRC_URI="https://github.com/kliment/Printrun/archive/${P}.tar.gz"
+
+LICENSE="GPL-3"
+SLOT="0"
+KEYWORDS="~amd64 ~x86"
+IUSE=""
+
+DEPEND="dev-python/pyserial
+ dev-python/wxpython:*
+ dev-python/pyglet
+ dev-python/dbus-python
+ media-gfx/cairosvg"
+RDEPEND="${DEPEND}"
+
+S="${WORKDIR}/Printrun-${P}"
+
+PATCHES=(
+ # https://bugzilla.redhat.com/show_bug.cgi?id=1231518
+ "${FILESDIR}"/${PN}-gtk3.patch
+
+ # https://github.com/kliment/Printrun/pull/790
+ "${FILESDIR}"/${PN}-x11.patch
+)
diff --git a/media-gfx/printrun/printrun-20150310-r2.ebuild b/media-gfx/printrun/printrun-20150310-r2.ebuild
new file mode 100644
index 000000000000..72839c7ab4e8
--- /dev/null
+++ b/media-gfx/printrun/printrun-20150310-r2.ebuild
@@ -0,0 +1,39 @@
+# Copyright 1999-2017 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+PYTHON_COMPAT=( python2_7 )
+
+inherit distutils-r1
+
+DESCRIPTION="GUI interface for 3D printing on RepRap and other printers"
+HOMEPAGE="https://github.com/kliment/Printrun"
+SRC_URI="https://github.com/kliment/Printrun/archive/${P}.tar.gz"
+
+LICENSE="GPL-3"
+SLOT="0"
+KEYWORDS="~amd64 ~x86"
+IUSE=""
+
+DEPEND="
+ app-text/psutils
+ dev-python/dbus-python[${PYTHON_USEDEP}]
+ dev-python/numpy[${PYTHON_USEDEP}]
+ dev-python/pycairo[${PYTHON_USEDEP}]
+ dev-python/pyglet[${PYTHON_USEDEP}]
+ dev-python/pyserial[${PYTHON_USEDEP}]
+ dev-python/wxpython:*[${PYTHON_USEDEP}]
+ media-gfx/cairosvg[${PYTHON_USEDEP}]"
+
+RDEPEND="${DEPEND}"
+
+S="${WORKDIR}/Printrun-${P}"
+
+PATCHES=(
+ # https://bugzilla.redhat.com/show_bug.cgi?id=1231518
+ "${FILESDIR}"/${PN}-gtk3.patch
+
+ # https://github.com/kliment/Printrun/pull/790
+ "${FILESDIR}"/${PN}-x11.patch
+)
diff --git a/media-gfx/printrun/printrun-99999999.ebuild b/media-gfx/printrun/printrun-99999999.ebuild
new file mode 100644
index 000000000000..d12fe530c379
--- /dev/null
+++ b/media-gfx/printrun/printrun-99999999.ebuild
@@ -0,0 +1,34 @@
+# Copyright 1999-2017 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+PYTHON_COMPAT=( python2_7 )
+
+inherit distutils-r1 git-r3
+
+DESCRIPTION="GUI interface for 3D printing on RepRap and other printers"
+HOMEPAGE="https://github.com/kliment/Printrun"
+EGIT_REPO_URI="https://github.com/kliment/Printrun.git"
+
+LICENSE="GPL-3"
+SLOT="0"
+KEYWORDS=""
+IUSE=""
+
+DEPEND="
+ app-text/psutils
+ dev-python/dbus-python[${PYTHON_USEDEP}]
+ dev-python/numpy[${PYTHON_USEDEP}]
+ dev-python/pycairo[${PYTHON_USEDEP}]
+ dev-python/pyglet[${PYTHON_USEDEP}]
+ dev-python/pyserial[${PYTHON_USEDEP}]
+ dev-python/wxpython:*[${PYTHON_USEDEP}]
+ media-gfx/cairosvg[${PYTHON_USEDEP}]"
+
+RDEPEND="${DEPEND}"
+
+PATCHES=(
+ # https://bugzilla.redhat.com/show_bug.cgi?id=1231518
+ "${FILESDIR}"/${PN}-gtk3.patch
+)