1 """
2 Preface creates the nested ring structure from the rotated layers, and adds optional start and end gcodes.
3
4 Credits:
5 Original Author: Enrique Perez (http://skeinforge.com)
6 Contributors: Please see the documentation in Skeinforge
7 Modifed as SFACT: Ahmet Cem Turan (github.com/ahmetcemturan/SFACT)
8
9 License:
10 GNU Affero General Public License http://www.gnu.org/licenses/agpl.html
11 """
12
13 from config import config
14 from entities import NestedRing, GcodeCommand, Layer, BoundaryPerimeter
15 from fabmetheus_utilities import euclidean, archive
16 from time import strftime
17 import gcodes
18 import logging
19 import os
20
21 name = __name__
22 logger = logging.getLogger(name)
23
27
29 "A class to preface a skein of extrusions."
31 self.slicedModel = slicedModel
32 self.setPositioningToAbsolute = config.getboolean(name, 'positioning.absolute')
33 self.setUnitsToMillimeters = config.getboolean(name, 'units.millimeters')
34 self.startAtHome = config.getboolean(name, 'startup.at.home')
35 self.resetExtruder = config.getboolean(name, 'startup.extruder.reset')
36 self.endFile = config.get(name, 'end.file')
37 self.startFile = config.get(name, 'start.file')
38
48
49
51 decimalPlaces = self.slicedModel.runtimeParameters.decimalPlaces
52 z = round(rotatedLoopLayer.z, 3)
53 layer = Layer(z, index, self.slicedModel.runtimeParameters)
54
55 if rotatedLoopLayer.rotation != None:
56 layer.bridgeRotation = complex(rotatedLoopLayer.rotation)
57
58 loops = rotatedLoopLayer.loops
59 internalLoops = self.createLoopHierarchy(loops)
60
61 nestRingPlaceholder = {}
62 for loop in loops:
63 nestedRing = NestedRing(z, self.slicedModel.runtimeParameters)
64 nestedRing.setBoundaryPerimeter(loop)
65 nestRingPlaceholder[str(loop)] = nestedRing
66
67 for internalLoop in internalLoops:
68 parent = internalLoops[internalLoop]
69 child = loops[internalLoop]
70 childNestedRing = nestRingPlaceholder[str(loops[internalLoop])]
71
72 if parent == None:
73 layer.addNestedRing(childNestedRing)
74 else:
75 parentNestedRing = nestRingPlaceholder[str(internalLoops[internalLoop])]
76 parentNestedRing.innerNestedRings.append(childNestedRing)
77
78 self.slicedModel.layers[z] = layer
79
81 internalLoops = {}
82
83 for (loopIndex, loop) in enumerate(loops):
84 internalLoops[loopIndex] = []
85 otherLoops = []
86 for beforeIndex in xrange(loopIndex):
87 otherLoops.append(loops[beforeIndex])
88 for afterIndex in xrange(loopIndex + 1, len(loops)):
89 otherLoops.append(loops[afterIndex])
90 internalLoops[loopIndex] = euclidean.getClosestEnclosingLoop(otherLoops, loop)
91 return internalLoops
92
94 if config.get(name, 'start.file') != None:
95 for line in archive.getLinesFromAlterationsFile(self.startFile):
96 self.slicedModel.startGcodeCommands.append(line)
97
98 if self.setPositioningToAbsolute:
99 self.slicedModel.startGcodeCommands.append(GcodeCommand(gcodes.ABSOLUTE_POSITIONING))
100 if self.setUnitsToMillimeters:
101 self.slicedModel.startGcodeCommands.append(GcodeCommand(gcodes.UNITS_IN_MILLIMETERS))
102 if self.startAtHome:
103 self.slicedModel.startGcodeCommands.append(GcodeCommand(gcodes.START_AT_HOME))
104 if self.resetExtruder:
105 self.slicedModel.startGcodeCommands.append(GcodeCommand(gcodes.RESET_EXTRUDER_DISTANCE, [('E', '0')]))
106
111