3D-Drucker/Slic3r/Python: Unterschied zwischen den Versionen
Hefee (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „das ganze ist über mehrere Python Module verteilt. getestest mit python 2.7.2: benötigt werden die dateien gcode/config.py und gcode/gcode.py und wie bei jedem…“) |
Hefee (Diskussion | Beiträge) KKeine Bearbeitungszusammenfassung |
||
| Zeile 8: | Zeile 8: | ||
===layer0.py:=== | ===layer0.py:=== | ||
<highlightSyntax language="python"> | <highlightSyntax language="python"> | ||
'''this script can create simple gcode and using config from | '''this script can create simple gcode and using config from slic3r''' | ||
from gcode.config import Config | from gcode.config import Config | ||
Aktuelle Version vom 23. Februar 2012, 21:36 Uhr
das ganze ist über mehrere Python Module verteilt. getestest mit python 2.7.2:
benötigt werden die dateien gcode/config.py und gcode/gcode.py und wie bei jedem python Module gcode.__init__.py (s.u.)
Layer 0[Bearbeiten]
es wird Probiert die besten werde zu finden damit die erste Lage gut haftet aber nicht zu stark, ...
layer0.py:[Bearbeiten]
<highlightSyntax language="python"> this script can create simple gcode and using config from slic3r
from gcode.config import Config from gcode.gcode import GCode
def gcode_layer0(config):
gcode = GCode(config) h = config.layer_height*config.first_layer_height_ratio e=config.extrutionMultiplyer(h)
z=h gcode.G1(z=z,f=config.travel_speed*60) gcode.G1(x=40.0,y=40.0) gcode.G1(x=180.0,f=270.0,e=140.0*e) gcode.G1(y=180.0,f=270.0,e=140.0*e) gcode.G1(x=20.0,f=270.0,e=140.0*e) gcode.G1(y=40.0,f=270.0,e=140.0*e) gcode.retract(x=50.0,y=50.0) gcode.G1(x=170.0,f=270.0,e=120.0*e) gcode.G1(y=170.0,f=270.0,e=120.0*e) gcode.G1(x=30.0,f=270.0,e=120.0*e) gcode.G1(y=50.0,f=270.0,e=120.0*e)
return gcode
if __name__ == "__main__":
config = Config('c.ini')
gcode = gcode_layer0(config)
print "writing 'layer_0_rect.gcode'."
with open('layer_0_rect.gcode','w') as f:
f.write(config.start_gcode)
f.write("\n\n")
f.write(gcode.begin())
f.write("\n\n")
f.write(str(gcode))
f.write("\n\n")
f.write(config.end_gcode)
f.write("\n")
</highlightSyntax>
Code[Bearbeiten]
gcode/__init__.py[Bearbeiten]
(leer)
gcode/config.py[Bearbeiten]
<highlightSyntax language="python"> from math import pi class Config:
gcode_dir = ["start_gcode", "end_gcode"] s_dir = ["fill_pattern", "solid_fill_pattern","extrusion_axis"] p_dir = ["print_center"]
def __init__(self, fname):
self.fname = fname
self._readFile()
self._createFlow()
def std(self):
- printer options
self.nozzle_diameter = 0.5
self.print_center = [100,100] # object will be centered around this point
self.use_relative_e_distances = 0
self.extrusion_axis = 'E'
self.z_offset = 0
self.gcode_arcs = 0
self.g0 = 0
self.gcode_comments = 0
- filament options
self.filament_diameter = 3 # mm
self.extrusion_multiplier = 1
self.temperature = 200
- speed options
self.travel_speed = 130 # mm/sec
self.perimeter_speed = 30 # mm/sec
self.small_perimeter_speed = 30 # mm/sec
self.infill_speed = 60 # mm/sec
self.solid_infill_speed = 60 # mm/sec
self.bridge_speed = 60 # mm/sec
self.bottom_layer_speed_ratio = 0.3
- acceleration options
self.acceleration = 0
self.perimeter_acceleration = 25 # mm/sec^2
self.infill_acceleration = 50 # mm/sec^2
- accuracy options
self.resolution = 0.00000001
self.small_perimeter_area = (5 / self.resolution) ** 2
self.layer_height = 0.4
self.first_layer_height_ratio = 1
self.infill_every_layers = 1
- flow options
self.extrusion_width_ratio = 0
self.bridge_flow_ratio = 1
self.overlap_factor = 0.5
- print options
self.perimeters = 3
self.solid_layers = 3
self.fill_pattern = 'rectilinear'
self.solid_fill_pattern = 'rectilinear'
self.fill_density = 0.4 # 1 = 100%
self.fill_angle = 45
self.start_gcode = "G28; home all axes"
self.end_gcode = """M104 S0 ; turn off temperature
G28 X0 ; home X axis M84 ; disable motors"""
- retraction options
self.retract_length = 1 # mm
self.retract_restart_extra = 0 # mm
self.retract_speed = 30 # mm/sec
self.retract_before_travel = 2 # mm
self.retract_lift = 0 # mm
- skirt options
self.skirts = 1
self.skirt_distance = 6 # mm
self.skirt_height = 1 # layers
- transform options
self.scale = 1
self.rotate = 0
self.duplicate_x = 1
self.duplicate_y = 1
self.duplicate_distance = 6 # mm
def _readFile(self):
self.std()
with open(self.fname,'r') as f:
for l in f.readlines():
s = l.index("=")
n = l[:s].strip()
v = l[s+1:].strip()
if n not in self.p_dir+self.s_dir+self.gcode_dir:
v = float(v)
elif n in self.gcode_dir:
v = v.replace("\\n","\n")
setattr(self, n , v)
def _createFlow(self):
if self.extrusion_width_ratio:
self.flow_width = self.layer_height * self.extrusion_width_ratio
else:
# here we calculate a sane default by matching the flow speed (at the nozzle)
# and the feed rate
volume = (self.nozzle_diameter**2) * pi/4
shape_threshold = self.nozzle_diameter * self.layer_height + (self.layer_height**2) * pi/4
if volume >= shape_threshold:
# rectangle with semicircles at the ends
self.flow_width = ((self.nozzle_diameter**2) * pi + (self.layer_height**2) * (4 - pi)) / (4 * self.layer_height)
else:
# rectangle with squished semicircles at the ends
self.flow_width = self.nozzle_diameter * (self.nozzle_diameter/self.layer_height - 4/pi + 1)
self.min_flow_width = self.nozzle_diameter * 1.05
self.max_flow_width = self.nozzle_diameter * 1.4
if self.flow_width > self.max_flow_width:
self.flow_width = self.max_flow_width
if self.flow_width < self.min_flow_width:
self.flow_width = self.min_flow_width
if self.flow_width >= (self.nozzle_diameter + self.layer_height):
# rectangle with semicircles at the ends
self.min_flow_spacing = self.flow_width - self.layer_height * (1 - pi/4)
else:
# rectangle with shrunk semicircles at the ends
self.min_flow_spacing = self.flow_width * (1 - pi/4) + self.nozzle_diameter * pi/4
self.flow_spacing = self.flow_width - self.overlap_factor * (self.flow_width - self.min_flow_spacing)
def area(self, height):
s = self.flow_spacing
h = height
w = (s - self.min_flow_spacing * self.overlap_factor) / (1 - self.overlap_factor)
if w >= (self.nozzle_diameter + h):
# rectangle with semicircles at the ends
area = w * h + (h**2) / 4 * (pi - 4)
else:
# rectangle with shrunk semicircles at the ends
area = self.nozzle_diameter * h * (1 - pi/4) + h * w * pi/4
return area
def extrutionMultiplyer(self, height):
return self.area(height) * self.extrusion_multiplier * (4 / (self.filament_diameter**2*pi))
if __name__ == "__main__":
config = Config('c.ini')
print "Flow width = %f"% config.flow_width
print "Flow spacing = %f"%config.flow_spacing
print "Min flow spacing = %f"%config.min_flow_spacing
print "area(%s) = %f"%(config.layer_height,config.area(config.layer_height)) print "extrutionMultiplyer(%s) = %f"%(config.layer_height,config.extrutionMultiplyer(config.layer_height))
</highlightSyntax>
gcode/gcode.py[Bearbeiten]
<highlightSyntax language="python"> class GCode:
def __init__(self, config):
self._gcode=[]
self.e=0.0
self.x = 0.0
self.y = 0.0
self.z = 0.0
self.config = config
self.G92(e=0.0)
def begin(self):
return """M109 S%s ; wait for temperature to be reached
G90 ; use absolute coordinates G21 ; set units to millimeters M82 ; use absolute distances for extrusion"""%int(self.config.temperature)
def __str__(self):
return "\n".join([" ".join(g) for g in self._gcode])
def _updatePos(self, **kwargs):
for k in kwargs:
setattr(self,k,kwargs[k])
def G1(self,**kwargs):
g1=["G1"]
if "e" in kwargs:
kwargs["e"] += self.e
for k in kwargs:
g1.append("%s%.5f"%(k.upper(),kwargs[k]))
self._gcode.append(g1)
self._updatePos(**kwargs)
def G92(self, **kwargs):
g92=["G92"]
for k in kwargs:
g92.append("%s%.5f"%(k.upper(),kwargs[k]))
self._gcode.append(g92)
self._updatePos(**kwargs)
def retract(self,**kwargs):
z=self.z
self.G1(e=-self.config.retract_length, f=self.config.retract_speed*60)
self.G1(z=z+self.config.retract_lift, f=self.config.travel_speed*60)
self.G92(e=0.0)
self.G1(**kwargs)
self.G1(z=z)
self.G1(e=self.config.retract_length,f=self.config.retract_speed*60)
</highlightSyntax>