diff --git a/CHANGELOG.md b/CHANGELOG.md
index 66525eb5..68f53889 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -16,6 +16,8 @@ CHANGELOG for FlatCAM beta
- in Corners Plugin remade the GUI
- in Corners Markers Plugin added the beginning of the manual marker placement
- in Alignment Plugin updated the GUI
+- remade the Gerber Object Properties UI
+- fixed a small typo when creating a new Gerber empty App Object
4.09.2021
diff --git a/appGUI/ObjectUI.py b/appGUI/ObjectUI.py
index bd4e7111..cdb9da0a 100644
--- a/appGUI/ObjectUI.py
+++ b/appGUI/ObjectUI.py
@@ -86,23 +86,30 @@ class ObjectUI(QtWidgets.QWidget):
# ## Common to all objects ##
# ###########################
if common is True:
- self.common_grid = FCGridLayout(v_spacing=5, h_spacing=3)
- self.common_grid.setColumnStretch(0, 1)
- self.common_grid.setColumnStretch(1, 0)
- layout.addLayout(self.common_grid)
-
- # self.common_grid.addWidget(FCLabel(''), 1, 0, 1, 2)
- separator_line = QtWidgets.QFrame()
- separator_line.setFrameShape(QtWidgets.QFrame.Shape.HLine)
- separator_line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
- self.common_grid.addWidget(separator_line, 1, 0, 1, 2)
-
- self.transform_label = FCLabel('%s' % _('Transformations'))
+ # #############################################################################################################
+ # Transformations Frame
+ # #############################################################################################################
+ self.transform_label = FCLabel('%s' % _('Transformations'))
self.transform_label.setToolTip(
_("Geometrical transformations of the current object.")
)
- self.common_grid.addWidget(self.transform_label, 2, 0, 1, 2)
+ layout.addWidget(self.transform_label)
+
+ trans_frame = FCFrame()
+ trans_frame.setFrameStyle(QtWidgets.QFrame.Shape.StyledPanel | QtWidgets.QFrame.Shadow.Plain)
+ trans_frame.setStyleSheet(".FCFrame{border: 1px solid gray; border-radius: 5px;}")
+ layout.addWidget(trans_frame)
+
+ self.common_grid = FCGridLayout(v_spacing=5, h_spacing=3)
+ self.common_grid.setColumnStretch(0, 1)
+ self.common_grid.setColumnStretch(1, 0)
+ trans_frame.setLayout(self.common_grid)
+
+ # separator_line = QtWidgets.QFrame()
+ # separator_line.setFrameShape(QtWidgets.QFrame.Shape.HLine)
+ # separator_line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
+ # self.common_grid.addWidget(separator_line, 0, 0, 1, 2)
# ### Scale ####
self.scale_entry = NumericalEvalEntry(border_color='#0069A9')
@@ -119,8 +126,8 @@ class ObjectUI(QtWidgets.QWidget):
)
self.scale_button.setMinimumWidth(70)
- self.common_grid.addWidget(self.scale_entry, 3, 0)
- self.common_grid.addWidget(self.scale_button, 3, 1)
+ self.common_grid.addWidget(self.scale_entry, 2, 0)
+ self.common_grid.addWidget(self.scale_button, 2, 1)
# ### Offset ####
self.offsetvector_entry = NumericalEvalTupleEntry(border_color='#0069A9')
@@ -144,7 +151,7 @@ class ObjectUI(QtWidgets.QWidget):
self.transformations_button.setToolTip(
_("Geometrical transformations of the current object.")
)
- self.common_grid.addWidget(self.transformations_button, 5, 0, 1, 2)
+ self.common_grid.addWidget(self.transformations_button, 6, 0, 1, 2)
layout.addStretch(1)
@@ -177,12 +184,24 @@ class GerberObjectUI(ObjectUI):
ObjectUI.__init__(self, title=_('Gerber Object'), parent=parent, app=self.app)
+ self.general_label = FCLabel('%s' % _("General Information's"))
+ self.general_label.setToolTip(_("General data about the object."))
+ self.custom_box.addWidget(self.general_label)
+
+ # #############################################################################################################
+ # General Frame
+ # #############################################################################################################
+ gen_frame = FCFrame()
+ gen_frame.setFrameStyle(QtWidgets.QFrame.Shape.StyledPanel | QtWidgets.QFrame.Shadow.Plain)
+ gen_frame.setStyleSheet(".FCFrame{border: 1px solid gray; border-radius: 5px;}")
+ self.custom_box.addWidget(gen_frame)
+
# Plot options
grid0 = FCGridLayout(v_spacing=5, h_spacing=3)
grid0.setAlignment(QtCore.Qt.AlignmentFlag.AlignLeft | QtCore.Qt.AlignmentFlag.AlignVCenter)
- self.custom_box.addLayout(grid0)
grid0.setColumnStretch(0, 0)
grid0.setColumnStretch(1, 1)
+ gen_frame.setLayout(grid0)
self.plot_options_label = FCLabel("%s:" % _("Plot Options"))
@@ -239,7 +258,7 @@ class GerberObjectUI(ObjectUI):
font-weight: bold;
}
""")
- grid0.addWidget(self.editor_button, 4, 0, 1, 3)
+ self.custom_box.addWidget(self.editor_button)
# INFO CB
self.info_button = FCButton('%s' % _("INFO"), checkable=True)
@@ -251,12 +270,13 @@ class GerberObjectUI(ObjectUI):
font-weight: bold;
}
""")
- grid0.addWidget(self.info_button, 6, 0, 1, 3)
+ self.custom_box.addWidget(self.info_button)
# INFO Frame
self.info_frame = QtWidgets.QFrame()
self.info_frame.setContentsMargins(0, 0, 0, 0)
- grid0.addWidget(self.info_frame, 7, 0, 1, 3)
+ self.custom_box.addWidget(self.info_frame)
+
self.info_box = QtWidgets.QVBoxLayout()
self.info_box.setContentsMargins(0, 0, 0, 0)
self.info_frame.setLayout(self.info_box)
@@ -267,13 +287,32 @@ class GerberObjectUI(ObjectUI):
self.info_box.addWidget(self.treeWidget)
self.info_box.setStretch(0, 0)
+ # #############################################################################################################
+ # Gerber Tool Table Frame
+ # #############################################################################################################
+ self.tools_table_label = FCLabel('%s' % _('Tools Table'))
+ self.tools_table_label.setToolTip(_("Tools/apertures in the loaded object."))
+ self.custom_box.addWidget(self.tools_table_label)
+
+ self.tt_frame = FCFrame()
+ self.tt_frame.setFrameStyle(QtWidgets.QFrame.Shape.StyledPanel | QtWidgets.QFrame.Shadow.Plain)
+ # self.tt_frame.setContentsMargins(0, 0, 0, 0)
+ self.tt_frame.setStyleSheet(".FCFrame{border: 1px solid gray; border-radius: 5px;}")
+ self.custom_box.addWidget(self.tt_frame)
+
+ # Grid Layout
+ grid1 = FCGridLayout(v_spacing=5, h_spacing=3)
+ grid1.setColumnStretch(0, 0)
+ grid1.setColumnStretch(1, 1)
+ self.tt_frame.setLayout(grid1)
+
# ### Gerber Apertures ####
- self.apertures_table_label = FCLabel('%s:' % _('Apertures'))
+ self.apertures_table_label = FCLabel('%s' % _('Apertures'))
self.apertures_table_label.setToolTip(
_("Apertures Table for the Gerber Object.")
)
- grid0.addWidget(self.apertures_table_label, 8, 0)
+ grid1.addWidget(self.apertures_table_label, 0, 0)
# Aperture Table Visibility CB
self.aperture_table_visibility_cb = FCCheckBox()
@@ -281,10 +320,10 @@ class GerberObjectUI(ObjectUI):
_("Toggle the display of the Tools Table.")
)
# self.aperture_table_visibility_cb.setLayoutDirection(QtCore.Qt.LayoutDirection.RightToLeft)
- grid0.addWidget(self.aperture_table_visibility_cb, 8, 1)
+ grid1.addWidget(self.aperture_table_visibility_cb, 0, 1)
hlay_plot = QtWidgets.QHBoxLayout()
- grid0.addLayout(hlay_plot, 8, 2)
+ grid1.addLayout(hlay_plot, 0, 2)
# Aperture Mark all CB
self.mark_all_cb = FCCheckBox(_('Mark All'))
@@ -300,7 +339,7 @@ class GerberObjectUI(ObjectUI):
# Apertures Table
self.apertures_table = FCTable()
- grid0.addWidget(self.apertures_table, 10, 0, 1, 3)
+ grid1.addWidget(self.apertures_table, 2, 0, 1, 3)
self.apertures_table.setColumnCount(6)
self.apertures_table.setHorizontalHeaderLabels(['#', _('Code'), _('Type'), _('Size'), _('Dim'), 'M'])
@@ -333,15 +372,18 @@ class GerberObjectUI(ObjectUI):
"Clicking this will create the buffered geometry\n"
"required for isolation.")
)
- grid0.addWidget(self.create_buffer_button, 12, 0, 1, 3)
+ grid1.addWidget(self.create_buffer_button, 4, 0, 1, 3)
- separator_line1 = QtWidgets.QFrame()
- separator_line1.setFrameShape(QtWidgets.QFrame.Shape.HLine)
- separator_line1.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
- grid0.addWidget(separator_line1, 13, 0, 1, 3)
+ # separator_line1 = QtWidgets.QFrame()
+ # separator_line1.setFrameShape(QtWidgets.QFrame.Shape.HLine)
+ # separator_line1.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
+ # grid0.addWidget(separator_line1, 13, 0, 1, 3)
- self.tool_lbl = FCLabel('%s' % _("Plugins"))
- grid0.addWidget(self.tool_lbl, 14, 0, 1, 3)
+ # #############################################################################################################
+ # PLUGINS
+ # #############################################################################################################
+ self.tool_lbl = FCLabel('%s' % _("Plugins"))
+ self.custom_box.addWidget(self.tool_lbl)
# Isolation Tool - will create isolation paths around the copper features
self.iso_button = FCButton(_('Isolation Routing'))
@@ -356,22 +398,7 @@ class GerberObjectUI(ObjectUI):
font-weight: bold;
}
""")
- grid0.addWidget(self.iso_button, 16, 0, 1, 3)
-
- # ## Clear non-copper regions
- self.generate_ncc_button = FCButton(_('NCC'))
- self.generate_ncc_button.setIcon(QtGui.QIcon(self.app.resource_location + '/eraser26.png'))
- self.generate_ncc_button.setToolTip(
- _("Create the Geometry Object\n"
- "for non-copper routing.")
- )
- # self.generate_ncc_button.setStyleSheet("""
- # QPushButton
- # {
- # font-weight: bold;
- # }
- # """)
- grid0.addWidget(self.generate_ncc_button, 18, 0, 1, 3)
+ self.custom_box.addWidget(self.iso_button)
# ## Board cutout
self.generate_cutout_button = FCButton(_('Cutout'))
@@ -386,9 +413,38 @@ class GerberObjectUI(ObjectUI):
# font-weight: bold;
# }
# """)
- grid0.addWidget(self.generate_cutout_button, 20, 0, 1, 3)
+ self.custom_box.addWidget(self.generate_cutout_button)
- # Follow Tool
+ # ## Film Plugin
+ self.generate_film_button = FCButton(_("Film"))
+ self.generate_film_button.setIcon(QtGui.QIcon(self.app.resource_location + '/film32.png'))
+ self.generate_film_button.setToolTip(
+ _("Create a positive/negative film for UV exposure.")
+ )
+ # self.generate_film_button.setStyleSheet("""
+ # QPushButton
+ # {
+ # font-weight: bold;
+ # }
+ # """)
+ self.custom_box.addWidget(self.generate_film_button)
+
+ # ## Clear non-copper regions
+ self.generate_ncc_button = FCButton(_('NCC'))
+ self.generate_ncc_button.setIcon(QtGui.QIcon(self.app.resource_location + '/eraser26.png'))
+ self.generate_ncc_button.setToolTip(
+ _("Create the Geometry Object\n"
+ "for non-copper routing.")
+ )
+ # self.generate_ncc_button.setStyleSheet("""
+ # QPushButton
+ # {
+ # font-weight: bold;
+ # }
+ # """)
+ self.custom_box.addWidget(self.generate_ncc_button)
+
+ # Follow Plugin
self.generate_follow_button = FCButton(_('Follow'))
self.generate_follow_button.setIcon(QtGui.QIcon(self.app.resource_location + '/follow32.png'))
self.generate_follow_button.setToolTip(
@@ -397,12 +453,12 @@ class GerberObjectUI(ObjectUI):
"the middle of the trace."))
# self.generate_cutout_button.setStyleSheet("""
- grid0.addWidget(self.generate_follow_button, 22, 0, 1, 3)
+ self.custom_box.addWidget(self.generate_follow_button)
separator_line = QtWidgets.QFrame()
separator_line.setFrameShape(QtWidgets.QFrame.Shape.HLine)
separator_line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
- grid0.addWidget(separator_line, 24, 0, 1, 3)
+ self.custom_box.addWidget(separator_line)
# UTILITIES BUTTON
self.util_button = FCButton('%s' % _("Utilities").upper(), checkable=True)
@@ -414,22 +470,21 @@ class GerberObjectUI(ObjectUI):
font-weight: bold;
}
""")
- grid0.addWidget(self.util_button, 26, 0, 1, 3)
+ self.custom_box.addWidget(self.util_button)
# UTILITIES Frame
self.util_frame = QtWidgets.QFrame()
self.util_frame.setContentsMargins(0, 0, 0, 0)
- grid0.addWidget(self.util_frame, 28, 0, 1, 3)
+ self.custom_box.addWidget(self.util_frame)
+
self.util_box = QtWidgets.QVBoxLayout()
self.util_box.setContentsMargins(0, 0, 0, 0)
self.util_frame.setLayout(self.util_box)
self.util_frame.hide()
- util_grid = FCGridLayout(v_spacing=5, h_spacing=3)
- util_grid.setColumnStretch(0, 0)
- util_grid.setColumnStretch(1, 1)
- self.util_box.addLayout(util_grid)
-
+ # #############################################################################################################
+ # Non-Copper Regions Frame
+ # #############################################################################################################
# ## Non-copper regions
self.noncopper_label = FCLabel("%s" % _("Non-copper regions"))
self.noncopper_label.setToolTip(
@@ -439,8 +494,17 @@ class GerberObjectUI(ObjectUI):
"object. Can be used to remove all\n"
"copper from a specified region.")
)
+ self.util_box.addWidget(self.noncopper_label)
- util_grid.addWidget(self.noncopper_label, 0, 0, 1, 3)
+ ncc_frame = FCFrame()
+ ncc_frame.setFrameStyle(QtWidgets.QFrame.Shape.StyledPanel | QtWidgets.QFrame.Shadow.Plain)
+ ncc_frame.setStyleSheet(".FCFrame{border: 1px solid gray; border-radius: 5px;}")
+ self.util_box.addWidget(ncc_frame)
+
+ grid_ncc = FCGridLayout(v_spacing=5, h_spacing=3)
+ grid_ncc.setColumnStretch(0, 0)
+ grid_ncc.setColumnStretch(1, 1)
+ ncc_frame.setLayout(grid_ncc)
# Margin
bmlabel = FCLabel('%s:' % _('Boundary Margin'))
@@ -456,8 +520,8 @@ class GerberObjectUI(ObjectUI):
self.noncopper_margin_entry.set_precision(self.decimals)
self.noncopper_margin_entry.setSingleStep(0.1)
- util_grid.addWidget(bmlabel, 2, 0)
- util_grid.addWidget(self.noncopper_margin_entry, 2, 1, 1, 2)
+ grid_ncc.addWidget(bmlabel, 2, 0)
+ grid_ncc.addWidget(self.noncopper_margin_entry, 2, 1, 1, 2)
# Rounded corners
self.noncopper_rounded_cb = FCCheckBox(label=_("Rounded"))
@@ -467,14 +531,12 @@ class GerberObjectUI(ObjectUI):
self.generate_noncopper_button = FCButton(_('Generate Geometry'))
self.generate_noncopper_button.setIcon(QtGui.QIcon(self.app.resource_location + '/geometry32.png'))
- util_grid.addWidget(self.noncopper_rounded_cb, 4, 0)
- util_grid.addWidget(self.generate_noncopper_button, 4, 1, 1, 2)
-
- separator_line1 = QtWidgets.QFrame()
- separator_line1.setFrameShape(QtWidgets.QFrame.Shape.HLine)
- separator_line1.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
- util_grid.addWidget(separator_line1, 6, 0, 1, 3)
+ grid_ncc.addWidget(self.noncopper_rounded_cb, 4, 0)
+ grid_ncc.addWidget(self.generate_noncopper_button, 4, 1, 1, 2)
+ # #############################################################################################################
+ # Bounding Box Frame
+ # #############################################################################################################
# ## Bounding box
self.boundingbox_label = FCLabel('%s' % _('Bounding Box'))
self.boundingbox_label.setToolTip(
@@ -482,7 +544,19 @@ class GerberObjectUI(ObjectUI):
"Square shape.")
)
- util_grid.addWidget(self.boundingbox_label, 8, 0, 1, 3)
+ self.util_box.addWidget(self.boundingbox_label)
+
+ bb_frame = FCFrame()
+ bb_frame.setFrameStyle(QtWidgets.QFrame.Shape.StyledPanel | QtWidgets.QFrame.Shadow.Plain)
+ # units_frame.setContentsMargins(0, 0, 0, 0)
+ bb_frame.setStyleSheet(".FCFrame{border: 1px solid gray; border-radius: 5px;}")
+ self.util_box.addWidget(bb_frame)
+
+ # Grid Layout
+ grid_bb = FCGridLayout(v_spacing=5, h_spacing=3)
+ grid_bb.setColumnStretch(0, 0)
+ grid_bb.setColumnStretch(1, 1)
+ bb_frame.setLayout(grid_bb)
bbmargin = FCLabel('%s:' % _('Boundary Margin'))
bbmargin.setToolTip(
@@ -494,8 +568,8 @@ class GerberObjectUI(ObjectUI):
self.bbmargin_entry.set_precision(self.decimals)
self.bbmargin_entry.setSingleStep(0.1)
- util_grid.addWidget(bbmargin, 10, 0)
- util_grid.addWidget(self.bbmargin_entry, 10, 1, 1, 2)
+ grid_bb.addWidget(bbmargin, 0, 0)
+ grid_bb.addWidget(self.bbmargin_entry, 0, 1, 1, 2)
self.bbrounded_cb = FCCheckBox(label=_("Rounded"))
self.bbrounded_cb.setToolTip(
@@ -510,8 +584,8 @@ class GerberObjectUI(ObjectUI):
self.generate_bb_button.setToolTip(
_("Generate the Geometry object.")
)
- util_grid.addWidget(self.bbrounded_cb, 12, 0)
- util_grid.addWidget(self.generate_bb_button, 12, 1, 1, 2)
+ grid_bb.addWidget(self.bbrounded_cb, 2, 0)
+ grid_bb.addWidget(self.generate_bb_button, 2, 1, 1, 2)
class ExcellonObjectUI(ObjectUI):
diff --git a/appObjects/AppObject.py b/appObjects/AppObject.py
index b6168b68..0ca8f739 100644
--- a/appObjects/AppObject.py
+++ b/appObjects/AppObject.py
@@ -469,7 +469,7 @@ class AppObject(QtCore.QObject):
:return: None
"""
- outname = 'new_geo' if new_name is None else new_name
+ outname = 'new_grb' if new_name is None else new_name
def initialize(new_obj, app):
new_obj.multitool = False
diff --git a/appObjects/FlatCAMGerber.py b/appObjects/FlatCAMGerber.py
index 1b638c96..5e7b30ee 100644
--- a/appObjects/FlatCAMGerber.py
+++ b/appObjects/FlatCAMGerber.py
@@ -161,8 +161,9 @@ class GerberObject(FlatCAMObj, Gerber):
# Tools
self.ui.iso_button.clicked.connect(lambda: self.app.isolation_tool.run(toggle=True))
- self.ui.generate_ncc_button.clicked.connect(lambda: self.app.ncclear_tool.run(toggle=True))
self.ui.generate_cutout_button.clicked.connect(lambda: self.app.cutout_tool.run(toggle=True))
+ self.ui.generate_film_button.clicked.connect(lambda: self.app.film_tool.run(toggle=True))
+ self.ui.generate_ncc_button.clicked.connect(lambda: self.app.ncclear_tool.run(toggle=True))
self.ui.generate_follow_button.clicked.connect(lambda: self.app.follow_tool.run(toggle=True))
# Utilities
@@ -229,7 +230,8 @@ class GerberObject(FlatCAMObj, Gerber):
}
""")
- self.ui.apertures_table_label.hide()
+ self.ui.tools_table_label.hide()
+ self.ui.tt_frame.hide()
self.ui.aperture_table_visibility_cb.set_value(False)
self.ui.aperture_table_visibility_cb.hide()
@@ -243,7 +245,8 @@ class GerberObject(FlatCAMObj, Gerber):
}
""")
- self.ui.apertures_table_label.show()
+ self.ui.tools_table_label.show()
+ self.ui.tt_frame.show()
self.ui.aperture_table_visibility_cb.show()
self.ui.follow_cb.show()