Quellcode durchsuchen

I haven't had time to do any testing myself, but looked at the code and seems fine.

jpcgt vor 10 Jahren
Ursprung
Commit
d7fd72ec00
4 geänderte Dateien mit 87 neuen und 18 gelöschten Zeilen
  1. 40 6
      FlatCAMApp.py
  2. 6 0
      FlatCAMGUI.py
  3. 33 12
      FlatCAMObj.py
  4. 8 0
      ObjectUI.py

+ 40 - 6
FlatCAMApp.py

@@ -181,6 +181,7 @@ class App(QtCore.QObject):
             "gerber_isotooldia": self.defaults_form.gerber_group.iso_tool_dia_entry,
             "gerber_isopasses": self.defaults_form.gerber_group.iso_width_entry,
             "gerber_isooverlap": self.defaults_form.gerber_group.iso_overlap_entry,
+            "gerber_combine_passes": self.defaults_form.gerber_group.combine_passes_cb,
             "gerber_cutouttooldia": self.defaults_form.gerber_group.cutout_tooldia_entry,
             "gerber_cutoutmargin": self.defaults_form.gerber_group.cutout_margin_entry,
             "gerber_cutoutgapsize": self.defaults_form.gerber_group.cutout_gap_entry,
@@ -296,6 +297,7 @@ class App(QtCore.QObject):
             "gerber_isotooldia": self.options_form.gerber_group.iso_tool_dia_entry,
             "gerber_isopasses": self.options_form.gerber_group.iso_width_entry,
             "gerber_isooverlap": self.options_form.gerber_group.iso_overlap_entry,
+            "gerber_combine_passes": self.options_form.gerber_group.combine_passes_cb,
             "gerber_cutouttooldia": self.options_form.gerber_group.cutout_tooldia_entry,
             "gerber_cutoutmargin": self.options_form.gerber_group.cutout_margin_entry,
             "gerber_cutoutgapsize": self.options_form.gerber_group.cutout_gap_entry,
@@ -332,6 +334,7 @@ class App(QtCore.QObject):
             "gerber_isotooldia": 0.016,
             "gerber_isopasses": 1,
             "gerber_isooverlap": 0.15,
+            "gerber_combine_passes": True,
             "gerber_cutouttooldia": 0.07,
             "gerber_cutoutmargin": 0.1,
             "gerber_cutoutgapsize": 0.15,
@@ -1186,9 +1189,10 @@ class App(QtCore.QObject):
 
         # self.options2form()
 
+
     def on_delete(self):
         """
-        Delete the currently selected FlatCAMObj.
+        Delete the currently selected FlatCAMObjs.
 
         :return: None
         """
@@ -1196,10 +1200,13 @@ class App(QtCore.QObject):
         self.log.debug("on_delete()")
         self.report_usage("on_delete")
 
+        while (self.collection.get_active()):
+            self.delete_first_selected()
+ 
+
+    def delete_first_selected(self):
         # Keep this for later
         try:
-            #name = copy(self.collection.get_active().options["name"])
-            # Shouldn't need to copy. String are immutable.
             name = self.collection.get_active().options["name"]
         except AttributeError:
             self.log.debug("Nothing selected for deletion")
@@ -2094,7 +2101,8 @@ class App(QtCore.QObject):
             types = {'dia': float,
                      'passes': int,
                      'overlap': float,
-                     'outname': str}
+                     'outname': str, 
+                     'combine': int}
 
             for key in kwa:
                 if key not in types:
@@ -2215,6 +2223,23 @@ class App(QtCore.QObject):
                 return "Object not found: %s" % obj_name
 
             obj.union()
+            
+
+
+        def join_geometries (obj_name, *obj_names):
+            objs = []
+            for obj_n in obj_names:
+                obj = self.collection.get_by_name(str(obj_n))
+                if obj is None:
+                    return "Object not found: %s" % obj_n
+                else:
+                    objs.append (obj)
+
+            def initialize(obj, app):
+                FlatCAMGeometry.merge(objs, obj)
+
+            if objs is not None:
+                self.new_object("geometry", obj_name, initialize)
 
         def make_docs():
             output = ''
@@ -2373,10 +2398,11 @@ class App(QtCore.QObject):
             'isolate': {
                 'fcn': isolate,
                 'help': "Creates isolation routing geometry for the given Gerber.\n" +
-                        "> isolate <name> [-dia <d>] [-passes <p>] [-overlap <o>]\n" +
+                        "> isolate <name> [-dia <d>] [-passes <p>] [-overlap <o>] [-combine 0|1]\n" +
                         "   name: Name of the object\n"
                         "   dia: Tool diameter\n   passes: # of tool width\n" +
-                        "   overlap: Fraction of tool diameter to overlap passes"
+                        "   overlap: Fraction of tool diameter to overlap passes" +
+                        "   combine: combine all passes into one geometry"
             },
             'cutout': {
                 'fcn': cutout,
@@ -2480,6 +2506,14 @@ class App(QtCore.QObject):
                         '> geo_union <name>\n' +
                         '   name: Name of the geometry object.'
             },
+            'join_geometries': {
+                'fcn': join_geometries,
+                'help': 'Runs a merge operation (join) on the geometry ' +
+                        'objects.' +
+                        '> join_geometries <out_name> <obj_name_0>....\n' +
+                        '   out_name: Name of the new geometry object.' +
+                        '   obj_name_0... names of the objects to join'
+            },
             'add_rect': {
                 'fcn': add_rectangle,
                 'help': 'Creates a rectange in the given Geometry object.\n' +

+ 6 - 0
FlatCAMGUI.py

@@ -405,6 +405,12 @@ class GerberOptionsGroupUI(OptionsGroupUI):
         grid1.addWidget(overlabel, 2, 0)
         self.iso_overlap_entry = FloatEntry()
         grid1.addWidget(self.iso_overlap_entry, 2, 1)
+        
+        self.combine_passes_cb = FCCheckBox(label='Combine Passes')
+        self.combine_passes_cb.setToolTip(
+            "Combine all passes into one object"
+        )
+        grid1.addWidget(self.combine_passes_cb, 3, 0)
 
         ## Board cuttout
         self.board_cutout_label = QtGui.QLabel("<b>Board cutout:</b>")

+ 33 - 12
FlatCAMObj.py

@@ -262,6 +262,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
             "isotooldia": 0.016,
             "isopasses": 1,
             "isooverlap": 0.15,
+            "combine_passes": True,
             "cutouttooldia": 0.07,
             "cutoutmargin": 0.2,
             "cutoutgapsize": 0.15,
@@ -298,6 +299,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
             "isotooldia": self.ui.iso_tool_dia_entry,
             "isopasses": self.ui.iso_width_entry,
             "isooverlap": self.ui.iso_overlap_entry,
+            "combine_passes":self.ui.combine_passes_cb,
             "cutouttooldia": self.ui.cutout_tooldia_entry,
             "cutoutmargin": self.ui.cutout_margin_entry,
             "cutoutgapsize": self.ui.cutout_gap_entry,
@@ -415,7 +417,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
         # TODO: Do something if this is None. Offer changing name?
         self.app.new_object("geometry", follow_name, follow_init)
 
-    def isolate(self, dia=None, passes=None, overlap=None, outname=None):
+    def isolate(self, dia=None, passes=None, overlap=None, outname=None, combine=None):
         """
         Creates an isolation routing geometry object in the project.
 
@@ -425,36 +427,55 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
         :param outname: Base name of the output object
         :return: None
         """
-
         if dia is None:
             dia = self.options["isotooldia"]
         if passes is None:
             passes = int(self.options["isopasses"])
         if overlap is None:
-            overlap = self.options["isooverlap"] * dia
+            overlap = self.options["isooverlap"]
+        if combine is None:
+            combine = self.options["combine_passes"]
+        else:
+            combine = bool(combine)
 
         base_name = self.options["name"] + "_iso"
         base_name = outname or base_name
 
-        for i in range(passes):
-
-            offset = (2 * i + 1) / 2.0 * dia - i * overlap
-            if passes > 1:
-                iso_name = base_name + str(i + 1)
-            else:
-                iso_name = base_name
+        if (combine):
+            iso_name = base_name
 
             # TODO: This is ugly. Create way to pass data into init function.
             def iso_init(geo_obj, app_obj):
                 # Propagate options
                 geo_obj.options["cnctooldia"] = self.options["isotooldia"]
-
-                geo_obj.solid_geometry = self.isolation_geometry(offset)
+                geo_obj.solid_geometry = []
+                for i in range(passes):
+                    offset = (2 * i + 1) / 2.0 * dia - i * overlap * dia
+                    geo_obj.solid_geometry.append(self.isolation_geometry(offset))
                 app_obj.info("Isolation geometry created: %s" % geo_obj.options["name"])
 
             # TODO: Do something if this is None. Offer changing name?
             self.app.new_object("geometry", iso_name, iso_init)
 
+        else:
+            for i in range(passes):
+
+                offset = (2 * i + 1) / 2.0 * dia - i * overlap  * dia
+                if passes > 1:
+                    iso_name = base_name + str(i + 1)
+                else:
+                    iso_name = base_name
+
+                # TODO: This is ugly. Create way to pass data into init function.
+                def iso_init(geo_obj, app_obj):
+                    # Propagate options
+                    geo_obj.options["cnctooldia"] = self.options["isotooldia"]
+                    geo_obj.solid_geometry = self.isolation_geometry(offset)
+                    app_obj.info("Isolation geometry created: %s" % geo_obj.options["name"])
+
+                # TODO: Do something if this is None. Offer changing name?
+                self.app.new_object("geometry", iso_name, iso_init)
+
     def on_plot_cb_click(self, *args):
         if self.muted_ui:
             return

+ 8 - 0
ObjectUI.py

@@ -560,6 +560,14 @@ class GerberObjectUI(ObjectUI):
         self.iso_overlap_entry = FloatEntry()
         grid1.addWidget(self.iso_overlap_entry, 2, 1)
 
+        # combine all passes CB
+        self.combine_passes_cb = FCCheckBox(label='Combine Passes')
+        self.combine_passes_cb.setToolTip(
+            "Combine all passes into one object"
+        )
+        grid1.addWidget(self.combine_passes_cb, 3, 0)
+
+
         self.generate_iso_button = QtGui.QPushButton('Generate Geometry')
         self.generate_iso_button.setToolTip(
             "Create the Geometry Object\n"