diff --git a/extensions/fablabchemnitz/laser_check/laser_check.inx b/extensions/fablabchemnitz/laser_check/laser_check.inx
index 49039fe2..79e4277a 100644
--- a/extensions/fablabchemnitz/laser_check/laser_check.inx
+++ b/extensions/fablabchemnitz/laser_check/laser_check.inx
@@ -59,9 +59,9 @@
- 500
- 150
- 0.60
+ 120
+ 500
+ 0.60
2.0
12.0
diff --git a/extensions/fablabchemnitz/laser_check/laser_check.py b/extensions/fablabchemnitz/laser_check/laser_check.py
index 7f26b5f9..df08d3f2 100644
--- a/extensions/fablabchemnitz/laser_check/laser_check.py
+++ b/extensions/fablabchemnitz/laser_check/laser_check.py
@@ -5,12 +5,15 @@ from inkex.bezier import csplength, csparea
from lxml import etree
import re
import math
+from math import log
import datetime
class LaserCheck(inkex.EffectExtension):
'''
ToDos:
+ - add some extra seconds for start, stop, removing parts, attaching material, ...
+ - maybe remove totalTravelLength and set manually ...
- Handlungsempfehlungen einbauen
- verweisen auf diverse plugins, die man nutzen kann:
- migrate ungrouper
@@ -561,22 +564,32 @@ class LaserCheck(inkex.EffectExtension):
have healthier stepper motor belts, etc.
'''
if so.checks == "check_all" or so.cutting_estimation is True:
- inkex.utils.debug("\n---------- Cutting time estimation")
+ inkex.utils.debug("\n---------- Cutting time estimation (Epilog Lasers)")
totalCuttingLength = 0
+ pathCount = 0
for element in shapes:
if isinstance(element, inkex.PathElement):
slengths, stotal = csplength(element.path.transform(element.composed_transform()).to_superpath())
totalCuttingLength += stotal
- extraTraveLength = (machineWidth / 3 + machineHeight / 3) * 2.0 #from top-left to the ~1/3 of the bed and back again
- totalTravelLength = totalCuttingLength * (1.0 - so.cut_travel_factor) + extraTraveLength
+ pathCount += 1 #each path has one start and one end (if open path) or start=end on closed path. For cutting the we calculate with 2 points because we enter and leave each path ALWAYS
+ totalTravelLength = totalCuttingLength * so.cut_travel_factor
totalLength = totalCuttingLength + totalTravelLength
+ inkex.utils.debug("total paths={}".format(pathCount))
inkex.utils.debug("(measured) cutting length (mm) = {:0.2f} mm".format(self.svg.uutounit(str(totalCuttingLength), "mm"), self.svg.uutounit(str(totalCuttingLength), "mm")))
inkex.utils.debug("(estimated) travel length (mm) = {:0.2f} mm".format(self.svg.uutounit(str(totalTravelLength), "mm"), self.svg.uutounit(str(totalTravelLength), "mm")))
inkex.utils.debug("(estimated) total length (mm) = {:0.2f} mm".format(self.svg.uutounit(str(totalLength), "mm"), self.svg.uutounit(str(totalLength), "mm")))
- for speedFactor in [100,90,80,70,60,50,40,30,20,10,5]:
- v_cut = so.max_cutting_speed * speedFactor/100.0
+ ''' from https://www.epiloglaser.com/assets/downloads/fusion-material-settings.pdf
+ Speed Settings: The speed setting scale of 1% to 100% is not linear –
+ i.e. 100% speed will not be twice as fast as 50% speed. This non-linear
+ scale is very useful in compensating for the different factors that affect engraving time.
+ '''
+ for speedFactor in [100,90,80,70,60,50,40,30,20,10,9,8,7,6,5,4,3,2,1]:
+ speedFactorR = speedFactor / 100.0
+ adjusted_speed = 482.4000 / so.max_cutting_speed #empiric - found out by trying for hours ...
+ empiric_scale = 1 + (speedFactorR**2) / 19.0 #empiric - found out by trying for hours ...
+ v_cut = so.max_cutting_speed * speedFactorR
v_travel = so.max_travel_speed #this is always at maximum
- tsec_cut = self.svg.uutounit(str(totalCuttingLength)) / v_cut
+ tsec_cut = (self.svg.uutounit(str(totalCuttingLength)) / (adjusted_speed * so.max_cutting_speed * speedFactorR)) * empiric_scale
tsec_travel = self.svg.uutounit(str(totalTravelLength)) / v_travel
tsec_total = tsec_cut + tsec_travel
minutes, seconds = divmod(tsec_total, 60) # split the seconds to minutes and seconds
@@ -584,6 +597,30 @@ class LaserCheck(inkex.EffectExtension):
inkex.utils.debug("@{:03.0f}% (cut={:06.2f}mm/s | travel={:06.2f}mm/s) > {:03.0f}min {:02.0f}sec | cost={:02.0f}€".format(speedFactor, v_cut, v_travel, minutes, seconds, so.price_per_minute_gross * (minutes + partial_minutes)))
+ ''' Measurements from Epilog Software Suite
+ We are using a huge SVG graphic with 100 meters (=100.000 mm) of lines.
+ The following speeds are getting precalculated (travel moves = 0mm):
+ @ 100% = 13:45 = 825s -> 121,21mm/s
+ @ 090% = 15:12 = 912s -> 109,65mm/s
+ @ 080% = 17:01 = 1021s -> 97,94mm/s
+ @ 070% = 19:21 = 1161s -> 86,13mm/s
+ @ 060% = 22:28 = 1348s -> 74,18mm/s
+ @ 050% = 26:49 = 1609s -> 62,15mm/s
+ @ 040% = 33:21 = 2001s -> 49,98mm/s
+ @ 030% = 44:13 = 2653s -> 37,69mm/s
+ @ 020% = 65:51 = 3951s -> 25,31mm/s
+ @ 010% = 130:52 = 7852s -> 12,74mm/s
+ @ 009% = 145:21 = 8721s -> 11,47mm/s
+ @ 008% = 163:27 = 9807s -> 10,20mm/s
+ @ 007% = 186:44 = 11204s -> 8,93mm/s
+ @ 006% = 217:48 = 13068s -> 7,65mm/s
+ @ 005% = 261:18 = 15678s -> 6,38mm/s
+ @ 004% = 326:34 = 19594s -> 5,10mm/s
+ @ 003% = 435:21 = 26121s -> 3,83mm/s
+ @ 002% = 652:57 = 39177s -> 2,55mm/s
+ @ 001% = 1305:49 = 78349s -> 1,28mm/s
+ '''
+
'''
Paths with a high amount of nodes will cause issues because each node means slowing down/speeding up the laser mechanics
'''