def execute(self, obj): # backwards compatibility for PathArrays created before support for multiple bases if isinstance(obj.Base, list): base = obj.Base else: base = [obj.Base] if len(base) == 0: return obj.ToolController = toolController(base[0]) # Do not generate paths and clear current Path data if operation not if not obj.Active: if obj.Path: obj.Path = Path.Path() return # use seed if specified, otherwise default to object name for consistency during recomputes seed = obj.JitterSeed or obj.Name pa = PathArray( obj.Base, obj.Type, obj.Copies, obj.Offset, obj.CopiesX, obj.CopiesY, obj.Angle, obj.Centre, obj.SwapDirection, obj.JitterMagnitude, obj.JitterPercent, seed, ) obj.Path = pa.getPath()
def getPath(self): """getPath() ... Call this method on an instance of the class to generate and return path data for the requested path array.""" if len(self.baseList) == 0: PathLog.error(translate("PathArray", "No base objects for PathArray.")) return None base = self.baseList for b in base: if not b.isDerivedFrom("Path::Feature"): return if not b.Path: return b_tool_controller = toolController(b) if not b_tool_controller: return if b_tool_controller != toolController(base[0]): # this may be important if Job output is split by tool controller PathLog.warning( translate( "PathArray", "Arrays of paths having different tool controllers are handled according to the tool controller of the first path.", ) ) # build copies output = "" random.seed(self.seed) if self.arrayType == "Linear1D": for i in range(self.copies): pos = FreeCAD.Vector( self.offsetVector.x * (i + 1), self.offsetVector.y * (i + 1), self.offsetVector.z * (i + 1), ) pos = self._calculateJitter(pos) for b in base: pl = FreeCAD.Placement() pl.move(pos) np = Path.Path([cm.transform(pl) for cm in b.Path.Commands]) output += np.toGCode() elif self.arrayType == "Linear2D": if self.swapDirection: for i in range(self.copiesY + 1): for j in range(self.copiesX + 1): if (i % 2) == 0: pos = FreeCAD.Vector( self.offsetVector.x * j, self.offsetVector.y * i, self.offsetVector.z * i, ) else: pos = FreeCAD.Vector( self.offsetVector.x * (self.copiesX - j), self.offsetVector.y * i, self.offsetVector.z * i, ) pos = self._calculateJitter(pos) for b in base: pl = FreeCAD.Placement() # do not process the index 0,0. It will be processed by the base Paths themselves if not (i == 0 and j == 0): pl.move(pos) np = Path.Path( [cm.transform(pl) for cm in b.Path.Commands] ) output += np.toGCode() else: for i in range(self.copiesX + 1): for j in range(self.copiesY + 1): if (i % 2) == 0: pos = FreeCAD.Vector( self.offsetVector.x * i, self.offsetVector.y * j, self.offsetVector.z * i, ) else: pos = FreeCAD.Vector( self.offsetVector.x * i, self.offsetVector.y * (self.copiesY - j), self.offsetVector.z * i, ) pos = self._calculateJitter(pos) for b in base: pl = FreeCAD.Placement() # do not process the index 0,0. It will be processed by the base Paths themselves if not (i == 0 and j == 0): pl.move(pos) np = Path.Path( [cm.transform(pl) for cm in b.Path.Commands] ) output += np.toGCode() # Eif else: for i in range(self.copies): for b in base: ang = 360 if self.copies > 0: ang = self.angle / self.copies * (1 + i) np = self.rotatePath(b.Path.Commands, ang, self.centre) output += np.toGCode() # return output return Path.Path(output)