From 95bf80785601416796ac813dce4df1413a793541 Mon Sep 17 00:00:00 2001 From: Richard Marko Date: Sun, 18 Apr 2021 15:36:07 +0200 Subject: [PATCH 1/5] Add pipe termination, limit tracking pipes, haddocks --- src/Data/GCode/Pipes.hs | 209 +++++++++++++++++++++++++++++++++++----- 1 file changed, 184 insertions(+), 25 deletions(-) diff --git a/src/Data/GCode/Pipes.hs b/src/Data/GCode/Pipes.hs index 116a869..9420a2f 100644 --- a/src/Data/GCode/Pipes.hs +++ b/src/Data/GCode/Pipes.hs @@ -1,5 +1,32 @@ {-# LANGUAGE OverloadedStrings #-} -module Data.GCode.Pipes where +{-# LANGUAGE RankNTypes #-} +module Data.GCode.Pipes ( + runPipe + , gcodePipe + , pipeToList + + , evalP + , evalCanonP + , evalCanonStateP + , evalCanonLinesP + , totalizeP + + , gcodeToLines + , gcodeToCanonList + + , compactSink + , prettySink + , prettySinkWith + , wrapPrinter + + , gcodePipe' + , pipeToList' + , evalCanonLinesP' + , evalCanonStateP' + , trackAllLimits + , trackWorkLimits + + ) where import Control.Monad import Control.Monad.Trans.State.Strict @@ -17,6 +44,7 @@ import Data.GCode.Pretty import qualified Data.GCode.Canon.Convert import Pipes +import Pipes.Core import Pipes.Attoparsec (ParsingError) import Pipes.Safe (SafeT) @@ -28,62 +56,64 @@ import qualified Pipes.Prelude import qualified Pipes.Safe import qualified System.IO --- something fishy about this type -parseProducer :: Handle -> Producer Code (SafeT IO) (Either (ParsingError, Producer ByteString (SafeT IO) ()) ()) +-- | Parse GCodes from @Handle@ producing @Code@ stream +parseProducer + :: Handle + -> Producer Code (SafeT IO) (Either (ParsingError, Producer ByteString (SafeT IO) ()) ()) parseProducer = parseProducer' 1024 -parseProducer' :: MonadIO m - => Int - -> Handle - -> Producer Code m (Either (ParsingError, Producer ByteString m ()) ()) +-- | Generalized @parseProducer@ with buffer size parameter +parseProducer' + :: MonadIO m + => Int + -> Handle + -> Producer Code m (Either (ParsingError, Producer ByteString m ()) ()) parseProducer' bufSize handle = Pipes.Attoparsec.parsed parseGCodeLine (Pipes.ByteString.hGetSome bufSize handle) +-- | Run job with file handle in @SafeT IO@ withFile :: FilePath -> (Handle -> (SafeT IO) r) -> IO r withFile filepath job = System.IO.withFile filepath System.IO.ReadMode $ \handle -> Pipes.Safe.runSafeT $ job handle +-- | Run pipe to completion and collect results as list pipeToList :: FilePath -> Proxy () Code () a (SafeT IO) () -> IO [a] pipeToList filepath pipeTail = withFile filepath $ \h -> Pipes.Prelude.toListM $ (() <$ parseProducer h) >-> pipeTail +-- | Evaluate GCode file to list of @Canon@s gcodeToCanonList :: FilePath -> IO [Canon] gcodeToCanonList filepath = pipeToList filepath $ evalP >-> evalCanonP +-- | Evaluate GCode file to list of @Line@s gcodeToLines :: FilePath -> IO [Line] gcodeToLines filepath = pipeToList filepath $ evalP >-> evalCanonLinesP -gcodePipe :: FilePath -> (Consumer Code (SafeT IO) ()) -> IO () +-- | Run @Consumer Code@ with input file +gcodePipe :: FilePath -> Consumer Code (SafeT IO) () -> IO () gcodePipe filepath pipeTail = - System.IO.withFile filepath System.IO.ReadMode $ \handle -> - Pipes.Safe.runSafeT . runEffect $ + withFile filepath $ \handle -> + runEffect $ (() <$ parseProducer handle) >-> pipeTail --- needs better name -runPipe :: FilePath - -> Maybe FilePath - -> (Pipe Code ByteString (SafeT IO) ()) +-- | Run @Pipe Code ByteString (SafeT IO)@ with input file, optionally +-- writing contents to output file. +runPipe :: FilePath -- ^ Input file + -> Maybe FilePath -- ^ Nothing mean stdout, Just file output + -> Pipe Code ByteString (SafeT IO) () -> IO () runPipe input Nothing pipeMiddle = gcodePipe input (pipeMiddle >-> Pipes.ByteString.stdout) runPipe input (Just output) pipeMiddle = System.IO.withFile output System.IO.WriteMode $ \outhandle -> gcodePipe input (pipeMiddle >-> Pipes.ByteString.toHandle outhandle) - -foldedPipe :: FilePath - -> (Producer Code (Pipes.Safe.SafeT IO) () -> Effect (Pipes.Safe.SafeT IO) r) - -> IO r -foldedPipe filepath fold = - System.IO.withFile filepath System.IO.ReadMode $ \handle -> - Pipes.Safe.runSafeT . runEffect $ - fold (() <$ parseProducer handle) - -- evaluators +-- | Run stateful @Code@ evaluator, applying @totalize@ totalizeP :: Pipe Code Code (SafeT IO) () totalizeP = flip evalStateT Data.Map.Strict.empty $ forever $ do x <- lift await @@ -94,6 +124,7 @@ totalizeP = flip evalStateT Data.Map.Strict.empty $ forever $ do put updatedModals lift $ yield updatedCode +-- | Run stateful @Code@ evaluator. evalP :: Pipe Code Code (SafeT IO) () evalP = flip evalStateT newState $ forever $ do x <- lift await @@ -106,6 +137,7 @@ evalP = flip evalStateT newState $ forever $ do Just r -> lift $ yield r Nothing -> return () +-- | Stateful pipe evaluating `Code` to `Canon` evalCanonP :: Pipe Code Canon (SafeT IO) () evalCanonP = flip evalStateT initCanonState $ forever $ do x <- lift await @@ -116,6 +148,19 @@ evalCanonP = flip evalStateT initCanonState $ forever $ do put steppedState lift $ yield c +-- | Stateful pipe evaluating `Code` to `Canon` `CanonState` tuples +-- Similar to @evalCanonP@ but also forwards @CanonState@ downstream. +evalCanonStateP :: Pipe Code (Canon, CanonState) (SafeT IO) () +evalCanonStateP = flip evalStateT initCanonState $ forever $ do + x <- lift await + st <- get + + forM_ (Data.GCode.Canon.Convert.toCanon x) $ \c -> do + let steppedState = stepCanon st c + put steppedState + lift $ yield (c, steppedState) + +-- | Stateful pipe evaluating `Code` to `Line` evalCanonLinesP :: Pipe Code Line (SafeT IO) () evalCanonLinesP = flip evalStateT initCanonState $ forever $ do x <- lift await @@ -126,6 +171,121 @@ evalCanonLinesP = flip evalStateT initCanonState $ forever $ do put steppedState forM_ (toLines st steppedState c) $ lift . yield +-- * Pipes with termination including result values + +type Downstreamed a = + (Either + (Either + (ParsingError , Producer ByteString (SafeT IO) ()) + () + ) + a + ) + +-- | Similar to @gcodePipe@ but uses @Downstreamed@ +-- to indicate termination to downstream pipe with @Left@ +-- +-- Usage: +-- > gcodePipe' "./sample.gcode" +-- > $ (fmap Left evalCanonStateP') +-- > >-> (fmap Right trackAllLimits) +-- > >-> (fmap Left (prettySinkWith (wrapPrinter Prelude.show) +-- > >-> Pipes.ByteString.stdout)) +gcodePipe' + :: FilePath + -> Proxy () (Downstreamed Code) () X (Pipes.Safe.SafeT IO) r + -> IO (Either b r) +gcodePipe' filepath pipeTail = + System.IO.withFile filepath System.IO.ReadMode $ \handle -> + Pipes.Safe.runSafeT . runEffect $ + returnDownstream (parseProducer handle) + >-> fmap Right pipeTail + +-- | Similar to @pipeToList@ but uses @Downstreamed@ +-- to indicate termination to downstream pipe with @Left@ +-- +-- Usage: +-- > pipeToList' "./sample.gcode" +-- > $ (fmap Left evalCanonStateP' ) +-- > >-> (fmap Right trackWorkLimits) +pipeToList' + :: FilePath + -> Proxy () (Downstreamed Code) () a (Pipes.Safe.SafeT IO) r + -> IO ([a], Either b r) +pipeToList' filepath pipeTail = withFile filepath $ \h -> + Pipes.Prelude.toListM' + $ returnDownstream (parseProducer h) + >-> fmap Right pipeTail + +-- | Turn `Proxy` into another `Proxy` capturing its return value and sending it downstream +-- in form of `Either` +returnDownstream :: Monad m => Proxy a' a b' b m r -> Proxy a' a b' (Either r b) m r' +returnDownstream = (forever . respond . Left) <=< (respond . Right <\\) + +-- | Stateful pipe evaluating `Code` to `Canon` `CanonState` tuples. +-- Variant of @evalCanonState@ using @Downstreamed@, where Left +-- indicates time to stop evaluation. +evalCanonStateP' :: Pipe + (Downstreamed Code) (Either () (Canon, CanonState)) (SafeT IO) () +evalCanonStateP' = flip evalStateT initCanonState $ go + where + go = do + x' <- lift await + case x' of + Left _ -> lift $ yield $ Left () + Right x -> do + st <- get + forM_ (Data.GCode.Canon.Convert.toCanon x) $ \c -> do + let steppedState = stepCanon st c + put steppedState + lift $ yield $ Right (c, steppedState) + go + +-- | Wrapper for stateful evaluators where receiving +-- @Left _@ means query local state and use it as return value. +untilLeft + :: Functor m + => (t -> StateT b (Proxy () (Either a1 t) y' y m) a2) + -> StateT b (Proxy () (Either a1 t) y' y m) b +untilLeft p = do + x' <- lift await + case x' of + Left _ -> get + Right x -> p x >> untilLeft p + +-- | Track limits of working area, including travel moves +trackAllLimits:: (Monad m) => Pipe (Either () (Canon, CanonState)) (Canon, CanonState) m Limits +trackAllLimits = + flip evalStateT mempty + $ untilLeft + $ \(c,s) -> do + modify (`updateLimits` canonPosition s) + lift $ yield (c, s) + +-- | Track limits of working area, excluding travel moves +trackWorkLimits :: (Monad m) => Pipe (Either () (Canon, CanonState)) (Canon, CanonState) m Limits +trackWorkLimits = + flip evalStateT mempty + $ untilLeft + $ \(c,s) -> do + -- TODO: shouldn't ignore arcs + -- TODO: maybe flip the logic to ignore @StraightTraverse@ + case c of + StraightFeed _ -> modify (`updateLimits` canonPosition s) + _ -> return () + + lift $ yield (c, s) + +-- | Stateful pipe evaluating `Canon` to `Line` +evalCanonLinesP' :: Pipe Canon Line (SafeT IO) () +evalCanonLinesP' = flip evalStateT initCanonState $ forever $ do + x <- lift await + st <- get + + let steppedState = stepCanon st x + put steppedState + forM_ (toLines st steppedState x) $ lift . yield + -- mmaped experiment, requires pipes-bytestring-mmap --import qualified Pipes.ByteString.MMap --main' = do @@ -137,8 +297,7 @@ evalCanonLinesP = flip evalStateT initCanonState $ forever $ do -- pretty print prettySinkWith :: (a -> ByteString) -> Pipe a ByteString (SafeT IO) () -prettySinkWith fn = - Pipes.Prelude.map fn +prettySinkWith = Pipes.Prelude.map prettySink :: Pipe Code ByteString (SafeT IO) () prettySink = From 599d54dd75985cc7b570485cd2357f1bd353762d Mon Sep 17 00:00:00 2001 From: Richard Marko Date: Sun, 18 Apr 2021 17:01:19 +0200 Subject: [PATCH 2/5] wip: init viewer --- app/Viewer.hs | 149 ++++++++++++++++++++++++++++++++++++++++++++++++++ gcodehs.cabal | 16 ++++++ 2 files changed, 165 insertions(+) create mode 100644 app/Viewer.hs diff --git a/app/Viewer.hs b/app/Viewer.hs new file mode 100644 index 0000000..aeb17ad --- /dev/null +++ b/app/Viewer.hs @@ -0,0 +1,149 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE PackageImports #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE TypeFamilies #-} +module Main where + +import Control.Monad + +import Graphics.GPipe hiding (Line, (^-^)) +--import Graphics.UI.GLFW (WindowHint(..)) +import Graphics.GPipe.Context.GLFW as GLFW + +import GHC.Float (double2Float) + +import Data.GCode +import Data.GCode.Line (Line (..), LineType (..)) +import qualified Data.GCode.Pipes + +import qualified Data.Map +import qualified Data.Maybe +import qualified Data.Set + +import Pipes ((>->)) +import qualified Pipes.Prelude + +loadFile :: FilePath -> IO (Maybe ([Line], Limits)) +loadFile f = do + res <- pipeToList' f + $ (fmap Left evalCanonStateP' ) + >-> (fmap Right trackWorkLimits) + >-> (fmap Left (Pipes.Prelude.map fst >-> evalCanonLinesP')) + + case res of + (ls, Right (Right limits)) -> return $ pure (ls, limits) + _ -> return Nothing + +demoLines :: IO [Line] +demoLines = + Data.GCode.Pipes.gcodeToLines + "./CubeInCube.gcode" + +remap :: Line -> (V3 Float, V3 Float) +remap = toV3 . boring + where + -- only XYZ coords + boring (Line typ from to) = Line typ (filterXYZ from) (filterXYZ to) + + filterXYZ = flip Data.Map.restrictKeys (Data.Set.fromList [X, Y, Z]) + + -- this is safe since we always have all axes and only filter boring ones + xyzToV3 as = + let [x, y, z] = map (\a -> double2Float . Data.Maybe.fromJust $ Data.Map.lookup a as) [X, Y, Z] + in V3 x y z + + toV3 (Line typ _from to) = (xyzToV3 to, case typ of + LineDrawing -> V3 1 0 0 + LineTraverse -> V3 0 1 0 + LineJump -> V3 0 0 1) + +main :: IO () +main = do + rawLines <- demoLines + --error $ show $ map remap lines + runContextT GLFW.defaultHandleConfig $ do + lineBuf :: Buffer os (B3 Float, B3 Float) <- newBuffer $ length rawLines + uniform :: Buffer os (Uniform (V4 (B4 Float), V3 (B3 Float))) <- newBuffer 1 + + writeBuffer lineBuf 0 $ map remap rawLines + + win <- newWindow + (WindowFormatColorDepth SRGB8 Depth16) + ((GLFW.defaultWindowConfig "GPipe gcodehs viewer") + { GLFW.configHints = [ WindowHint'Samples $ Just 16 ] } + ) + + shader <- compileShader $ do + primitiveStream <- toPrimitiveStream id + + (modelViewProj, normMat) <- getUniform (const (uniform, 0)) + let + projected = proj modelViewProj normMat <$> primitiveStream + + fragmentStream <- rasterize + (const + (FrontAndBack + , PolygonFill + , ViewPort (V2 0 0) (V2 (1920 `div` 1) 1080) + , DepthRange 0 1) + ) + projected + + drawWindowColor (const (win, ContextColorOption NoBlending (V3 True True True))) + fragmentStream + + loop win shader lineBuf uniform 0 0.02 + +proj + :: (Functor m, Num a) + => m (V4 a) + -> p + -> (V3 a, b) + -> (m a, b) +proj modelViewProj _normMat (V3 px py pz, color) = + (modelViewProj !* V4 px py pz 1, color) + +loop + :: forall os + . Window os RGBFloat Depth + -> (PrimitiveArray Lines (B3 Float, B3 Float) -> Render os ()) + -> Buffer os (B3 Float, B3 Float) + -> Buffer os (Uniform (V4 (B4 Float), V3 (B3 Float))) + -> Float + -> Float + -> ContextT GLFW.Handle os IO () +loop win shader vertexBuffer uniform angleRot objectScale = do + (V2 w h) <- getFrameBufferSize win + let + modelRot = fromQuaternion (axisAngle (V3 0 0 1) angleRot) + modelMat = + mkTransformationMat modelRot (pure 0) + !*! mkScaleTransform objectScale + + projMat = perspective (pi/2) (fromIntegral w / fromIntegral h) 1 100 + --cameraMatrix :: Float -> L.M44 Float + --cameraMatrix t = lookAt eye (V3 0 0 0) (V3 0 1 0) + -- where eye = L.rotate (axisAngle (V3 0 1 0) (t / 10)) (V3 1 1 1) + --viewMat = cameraMatrix 0 + viewMat = mkTransformationMat identity (- V3 0 0 5) + viewProjMat = projMat !*! viewMat !*! modelMat + writeBuffer uniform 0 [(viewProjMat, identity)] + + render $ do + clearWindowColor win (V3 0 0 0) + vertexArray <- newVertexArray vertexBuffer + let primitiveArray = toPrimitiveArray LineStrip vertexArray + shader primitiveArray + swapWindowBuffers win + + closeRequested <- GLFW.windowShouldClose win + unless (closeRequested == Just True) $ + loop win shader vertexBuffer uniform ((angleRot + 0.005) `mod''` (2*pi)) objectScale + +mkScaleTransform :: Float -> M44 Float +mkScaleTransform s = + (V4 (V4 s 0 0 0) + (V4 0 s 0 0) + (V4 0 0 s 0) + (V4 0 0 0 1) + ) diff --git a/gcodehs.cabal b/gcodehs.cabal index 037dcee..76533aa 100644 --- a/gcodehs.cabal +++ b/gcodehs.cabal @@ -73,6 +73,22 @@ executable gcodehs , optparse-applicative default-language: Haskell2010 +executable gcodehs-viewer + hs-source-dirs: app + main-is: Viewer.hs + build-depends: + base + , bytestring + , containers + , GPipe-Core >= 0.2.3 + , GPipe-GLFW4 >= 2.0 + , GLFW-b + , gcodehs + , pipes + , linear + ghc-options: -Wall -threaded + default-language: Haskell2010 + test-suite gcodehs-test type: exitcode-stdio-1.0 hs-source-dirs: test From 169239a6883882d600a7fda886676ace20f8d6df Mon Sep 17 00:00:00 2001 From: Richard Marko Date: Sun, 18 Apr 2021 17:03:03 +0200 Subject: [PATCH 3/5] Drop unused packages, -Wall for testsuite --- gcodehs.cabal | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/gcodehs.cabal b/gcodehs.cabal index 76533aa..2e62975 100644 --- a/gcodehs.cabal +++ b/gcodehs.cabal @@ -60,15 +60,10 @@ executable gcodehs main-is: Main.hs ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N build-depends: base - , attoparsec , bytestring - , containers - , double-conversion , gcodehs , pipes , pipes-safe - , text - , transformers , optparse-applicative , optparse-applicative default-language: Haskell2010 @@ -99,13 +94,11 @@ test-suite gcodehs-test SpecHelper build-depends: base , attoparsec - , ansi-wl-pprint , bytestring , gcodehs , hspec , hspec-discover - , text - ghc-options: -threaded -rtsopts -with-rtsopts=-N + ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall default-language: Haskell2010 source-repository head From bbb43ebc4797a806b87fb5c9c85b0b49012f9c29 Mon Sep 17 00:00:00 2001 From: Richard Marko Date: Sun, 18 Apr 2021 17:03:22 +0200 Subject: [PATCH 4/5] xxx: wip canon mess --- src/Data/GCode/Canon.hs | 67 +++++++++++++++++++++++++++++++++++------ 1 file changed, 58 insertions(+), 9 deletions(-) diff --git a/src/Data/GCode/Canon.hs b/src/Data/GCode/Canon.hs index bffdd75..bd5b3de 100644 --- a/src/Data/GCode/Canon.hs +++ b/src/Data/GCode/Canon.hs @@ -8,6 +8,7 @@ module Data.GCode.Canon where import Data.ByteString (ByteString) import Data.GCode.Types (Axes, zeroAxes) +import Data.Map (Map) import qualified Data.Map @@ -92,6 +93,7 @@ data Canon = | CancelWaitTemperature -- ^ Cancel all temperature waits | LevelBed -- ^ Perform automated bed leveling -- Misc + | Yield -- or Await? or? for blocking cmd | DisableMotors Axes -- ^ Disable power to motors | DisplayMessage ByteString -- ^ Display a message, typically on LCD | Comment ByteString -- ^ Just a comment @@ -99,29 +101,76 @@ data Canon = -- | State of the Canon interpreter data CanonState = CanonState { - canonPosition :: Axes -- ^ Position - , canonTraverseRate :: Speed -- ^ Speed for travel moves - , canonFeedRate :: Speed -- ^ Speed for machining moves - , canonPlane :: Plane -- ^ Selected plane + canonPosition :: Axes -- ^ Position + , canonTraverseRate :: Speed -- ^ Speed for travel moves + , canonFeedRate :: Speed -- ^ Speed for machining moves + , canonTraversing :: Bool -- ^ True if we are performing a travel move + , canonPlane :: Plane -- ^ Selected plane + , canonLastComment :: ByteString -- ^ Last comment we saw + -- XXX: needs indexes and power + , canonFans :: Bool -- + , canonHeaters :: Map Heater Double +-- XXX: needs indexes and power?? +, canonCooling :: Bool -- + , canonFinished :: Bool -- True if we are done } deriving (Show, Eq, Ord) +data WaitingFor = WaitingHeaters | WaitingSpindle -- | WaitingEverything + deriving (Show, Eq, Ord) + +--cancelWaits :: WaitingFor -> CanonState -> CanonState +--cancelWaits for s = case (canonWaiting s) of +-- (Just w) | w == for -> s { canonWaiting = Nothing } + -- | Initial state of the Canon interpreter initCanonState :: CanonState initCanonState = CanonState { canonPosition = zeroAxes + , canonTraversing = True , canonTraverseRate = 0 , canonFeedRate = 0 , canonPlane = XY + , canonLastComment = mempty + , canonFans = False + , canonHeaters = mempty + , canonCooling = False + , canonFinished = False } -- | Step Canon interpreter, returning new state stepCanon :: CanonState -> Canon -> CanonState -stepCanon s (StraightTraverse a) = s { canonPosition = Data.Map.union a (canonPosition s) } -stepCanon s (StraightFeed a) = s { canonPosition = Data.Map.union a (canonPosition s) } -stepCanon s (SetFeedRate r) = s { canonFeedRate = r } +stepCanon s (StraightTraverse a) = s { + canonPosition = Data.Map.union a (canonPosition s) + , canonTraversing = True + } +stepCanon s (StraightFeed a) = s { + canonPosition = Data.Map.union a (canonPosition s) + , canonTraversing = False + } +stepCanon s (SetFeedRate r) = s { canonFeedRate = r } stepCanon s (SetTraverseRate r) = s { canonTraverseRate = r } -stepCanon s (SetCoords a) = s { canonPosition = Data.Map.union a (canonPosition s) } -stepCanon s (PlaneSelect p) = s { canonPlane = p } +stepCanon s (SetCoords a) = s { canonPosition = Data.Map.union a (canonPosition s) } +stepCanon s (PlaneSelect p) = s { canonPlane = p } +stepCanon s (Comment c) = s { canonLastComment = c } +stepCanon s (PauseSeconds x) = s +stepCanon s ProgramEnd = s { canonFinished = True } + +stepCanon s (SetTemperature heater value) = s { canonHeaters = Data.Map.insert heater value (canonHeaters s) } +--stepCanon s CancelWaitTemperature = cancelWaits WaitingHeaters s +stepCanon s _ = s +-- TODO +--stepCanon _s e@(StraightProbe _) = error $ "Don't know how to step " ++ show e +--stepCanon _s e@(ArcFeed _) = error $ "Don't know how to step " ++ show e +--stepCanon _s e@(SpindleStart _ _) = error $ "Don't know how to step " ++ show e +--stepCanon _s e@(SpindleStop) = error $ "Don't know how to step " ++ show e +--stepCanon _s e@(SpindleSpeed _) = error $ "Don't know how to step " ++ show e +--stepCanon _s e@(ToolChange) = error $ "Don't know how to step " ++ show e +--stepCanon _s e@(ToolSelect _) = error $ "Don't know how to step " ++ show e +--stepCanon _s e@(ToolLengthCompensation _) = error $ "Don't know how to step " ++ show e +--stepCanon _s e@(CoolantMist) = error $ "Don't know how to step " ++ show e +--stepCanon _s e@(CoolantFlood) = error $ "Don't know how to step " ++ show e +--stepCanon _s e@(CoolantStop) = error $ "Don't know how to step " ++ show e +--stepCanon s e = error $ "Don't know how to step " ++ show e -- | Fully eval list of `Canon` commands. -- From 6842f22a311a0494097b1593708a7510cc336943 Mon Sep 17 00:00:00 2001 From: Richard Marko Date: Sun, 18 Apr 2021 17:03:41 +0200 Subject: [PATCH 5/5] xxx: add CubeInCube.gcode --- CubeInCube.gcode | 1279 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1279 insertions(+) create mode 100644 CubeInCube.gcode diff --git a/CubeInCube.gcode b/CubeInCube.gcode new file mode 100644 index 0000000..854fb0b --- /dev/null +++ b/CubeInCube.gcode @@ -0,0 +1,1279 @@ +;FLAVOR:Marlin +G21 ;metric values +G90 ;absolute positioning +M82 ;set extruder to absolute mode +M106 ;start with the fan on +G28 X0 Y0 ;move X/Y to min endstops +G28 Z0 ;move Z to min endstops +G29 ;Run the auto bed leveling +G1 Z15.0 F4200 ;move the platform down 15mm +G92 E0 ;zero the extruded length +G1 F200 E3 ;extrude 3mm of feed stock +G92 E0 ;zero the extruded length again +G1 F4200 ;default speed +;Put printing message on LCD screen +M117 +;LAYER_COUNT:20 +;LAYER:0 +G0 X95.525 Y95.525 Z0.5 +;TYPE:WALL-INNER +G1 X104.475 E0.34986 +G1 Y104.475 E0.69972 +G1 X95.525 E1.04958 +G1 Y95.525 E1.39945 +G0 X95.175 Y95.175 +;TYPE:WALL-OUTER +G1 X104.825 E1.77667 +G1 Y104.825 E2.1539 +G1 X95.175 E2.53112 +G1 Y95.175 E2.90835 +G0 X95.525 Y95.525 +G0 F60 X96 Y104.125 +;TYPE:FILL +G1 Y95.875 E3.23085 +G0 X96.6 +G1 Y104.125 E3.55334 +G0 X97.2 +G1 Y95.875 E3.87584 +G0 X97.8 +G1 Y104.125 E4.19834 +G0 X98.4 +G1 Y95.875 E4.52084 +G0 X99 +G1 Y104.125 E4.84334 +G0 X99.6 +G1 Y95.875 E5.16583 +G0 X100.2 +G1 Y104.125 E5.48833 +G0 X100.8 +G1 Y95.875 E5.81083 +G0 X101.4 +G1 Y104.125 E6.13333 +G0 X102 +G1 Y95.875 E6.45583 +G0 X102.6 +G1 Y104.125 E6.77833 +G0 X103.2 +G1 Y95.875 E7.10082 +G0 X103.8 +G1 Y104.125 E7.42332 +G0 X95.175 Y95.175 +;LAYER:1 +G0 X95.525 Y95.525 Z1 +;TYPE:WALL-INNER +G1 X104.475 E7.77318 +G1 Y104.475 E8.12304 +G1 X95.525 E8.47291 +G1 Y95.525 E8.82277 +G0 X95.175 Y95.175 +;TYPE:WALL-OUTER +G1 X104.825 E9.19999 +G1 Y104.825 E9.57722 +G1 X95.175 E9.95444 +G1 Y95.175 E10.33167 +G0 X95.525 Y95.525 +G0 F60 X104.125 Y96 +;TYPE:FILL +G1 X95.875 E10.65417 +G0 Y96.6 +G1 X104.125 E10.97667 +G0 Y97.2 +G1 X95.875 E11.29916 +G0 Y97.8 +G1 X104.125 E11.62166 +G0 Y98.4 +G1 X95.875 E11.94416 +G0 Y99 +G1 X104.125 E12.26666 +G0 Y99.6 +G1 X95.875 E12.58916 +G0 Y100.2 +G1 X104.125 E12.91165 +G0 Y100.8 +G1 X95.875 E13.23415 +G0 Y101.4 +G1 X104.125 E13.55665 +G0 Y102 +G1 X95.875 E13.87915 +G0 Y102.6 +G1 X104.125 E14.20165 +G0 Y103.2 +G1 X95.875 E14.52415 +G0 Y103.8 +G1 X104.125 E14.84664 +G0 X95.175 Y95.175 +;LAYER:2 +G0 X95.525 Y95.525 Z1.5 +;TYPE:WALL-INNER +G1 X104.475 E15.1965 +G1 Y104.475 E15.54637 +G1 X95.525 E15.89623 +G1 Y95.525 E16.24609 +G0 X95.175 Y95.175 +;TYPE:WALL-OUTER +G1 X104.825 E16.62331 +G1 Y104.825 E17.00054 +G1 X95.175 E17.37777 +G1 Y95.175 E17.75499 +G0 X95.525 Y95.525 +G0 F60 X96 Y104.125 +;TYPE:FILL +G1 Y95.875 E18.07749 +G0 X96.6 +G1 Y104.125 E18.39999 +G0 X97.2 +G1 Y95.875 E18.72248 +G0 X97.8 +G1 Y104.125 E19.04498 +G0 X98.4 +G1 Y95.875 E19.36748 +G0 X99 +G1 Y104.125 E19.68998 +G0 X99.6 +G1 Y95.875 E20.01248 +G0 X100.2 +G1 Y104.125 E20.33498 +G0 X100.8 +G1 Y95.875 E20.65747 +G0 X101.4 +G1 Y104.125 E20.97997 +G0 X102 +G1 Y95.875 E21.30247 +G0 X102.6 +G1 Y104.125 E21.62497 +G0 X103.2 +G1 Y95.875 E21.94747 +G0 X103.8 +G1 Y104.125 E22.26996 +G0 X95.175 Y95.175 +;LAYER:3 +G0 X95.525 Y95.525 Z2 +;TYPE:WALL-INNER +G1 X104.475 E22.61983 +G1 Y104.475 E22.96969 +G1 X95.525 E23.31955 +G1 Y95.525 E23.66941 +G0 X95.175 Y95.175 +;TYPE:WALL-OUTER +G1 X104.825 E24.04664 +G1 Y104.825 E24.42386 +G1 X95.175 E24.80109 +G1 Y95.175 E25.17831 +G0 X95.525 Y95.525 +G0 F60 X104.125 Y96 +;TYPE:FILL +G1 X95.875 E25.50081 +G0 Y96.6 +G1 X104.125 E25.82331 +G0 Y97.2 +G1 X95.875 E26.14581 +G0 Y97.8 +G1 X104.125 E26.4683 +G0 Y98.4 +G1 X95.875 E26.7908 +G0 Y99 +G1 X104.125 E27.1133 +G0 Y99.6 +G1 X95.875 E27.4358 +G0 Y100.2 +G1 X104.125 E27.7583 +G0 Y100.8 +G1 X95.875 E28.0808 +G0 Y101.4 +G1 X104.125 E28.40329 +G0 Y102 +G1 X95.875 E28.72579 +G0 Y102.6 +G1 X104.125 E29.04829 +G0 Y103.2 +G1 X95.875 E29.37079 +G0 Y103.8 +G1 X104.125 E29.69329 +G0 X95.175 Y95.175 +;LAYER:4 +G0 X95.525 Y95.525 Z2.5 +;TYPE:WALL-INNER +G1 X104.475 E30.04315 +G1 Y104.475 E30.39301 +G1 X95.525 E30.74287 +G1 Y95.525 E31.09273 +G0 X96.975 Y96.975 +;TYPE:WALL-INNER +G1 X103.025 E31.32923 +G1 Y103.025 E31.56573 +G1 X96.975 E31.80223 +G1 Y96.975 E32.03873 +G0 X95.175 Y95.175 +;TYPE:WALL-OUTER +G1 X104.825 E32.41595 +G1 Y104.825 E32.79318 +G1 X95.175 E33.1704 +G1 Y95.175 E33.54763 +G0 X97.325 Y97.325 +;TYPE:WALL-OUTER +G1 X102.675 E33.75676 +G1 Y102.675 E33.9659 +G1 X97.325 E34.17503 +G1 Y97.325 E34.38417 +G0 X95.525 Y95.525 +G0 F60 X96 Y104.125 +;TYPE:FILL +G1 Y95.875 E34.70667 +G0 X96.6 +G1 Y104.125 E35.02917 +G0 X97.2 +G1 Y103.375 E35.05848 +G0 Y96.625 +G1 Y95.875 E35.0878 +G0 X97.8 +G1 Y96.625 E35.11712 +G0 Y103.375 +G1 Y104.125 E35.14644 +G0 X98.4 +G1 Y103.375 E35.17576 +G0 Y96.625 +G1 Y95.875 E35.20507 +G0 X99 +G1 Y96.625 E35.23439 +G0 Y103.375 +G1 Y104.125 E35.26371 +G0 X99.6 +G1 Y103.375 E35.29303 +G0 Y96.625 +G1 Y95.875 E35.32235 +G0 X100.2 +G1 Y96.625 E35.35166 +G0 Y103.375 +G1 Y104.125 E35.38098 +G0 X100.8 +G1 Y103.375 E35.4103 +G0 Y96.625 +G1 Y95.875 E35.43962 +G0 X101.4 +G1 Y96.625 E35.46894 +G0 Y103.375 +G1 Y104.125 E35.49825 +G0 X102 +G1 Y103.375 E35.52757 +G0 Y96.625 +G1 Y95.875 E35.55689 +G0 X102.6 +G1 Y96.625 E35.58621 +G0 Y103.375 +G1 Y104.125 E35.61553 +G0 X103.2 +G1 Y103.375 E35.64484 +G0 Y96.625 +G1 Y95.875 E35.67416 +G0 X103.8 +G1 Y104.125 E35.99666 +G0 X95.175 Y95.175 +;LAYER:5 +G0 X95.525 Y95.525 Z3 +;TYPE:WALL-INNER +G1 X104.475 E36.34652 +G1 Y104.475 E36.69638 +G1 X95.525 E37.04624 +G1 Y95.525 E37.39611 +G0 X96.975 Y96.975 +;TYPE:WALL-INNER +G1 X103.025 E37.63261 +G1 Y103.025 E37.8691 +G1 X96.975 E38.1056 +G1 Y96.975 E38.3421 +G0 X95.175 Y95.175 +;TYPE:WALL-OUTER +G1 X104.825 E38.71933 +G1 Y104.825 E39.09655 +G1 X95.175 E39.47378 +G1 Y95.175 E39.851 +G0 X97.325 Y97.325 +;TYPE:WALL-OUTER +G1 X102.675 E40.06014 +G1 Y102.675 E40.26927 +G1 X97.325 E40.47841 +G1 Y97.325 E40.68754 +G0 X95.525 Y95.525 +G0 F60 X104.125 Y96 +;TYPE:FILL +G1 X95.875 E41.01004 +G0 Y96.6 +G1 X104.125 E41.33254 +G0 Y97.2 +G1 X103.375 E41.36186 +G0 X96.625 +G1 X95.875 E41.39117 +G0 Y97.8 +G1 X96.625 E41.42049 +G0 X103.375 +G1 X104.125 E41.44981 +G0 Y98.4 +G1 X103.375 E41.47913 +G0 X96.625 +G1 X95.875 E41.50845 +G0 Y99 +G1 X96.625 E41.53776 +G0 X103.375 +G1 X104.125 E41.56708 +G0 Y99.6 +G1 X103.375 E41.5964 +G0 X96.625 +G1 X95.875 E41.62572 +G0 Y100.2 +G1 X96.625 E41.65504 +G0 X103.375 +G1 X104.125 E41.68435 +G0 Y100.8 +G1 X103.375 E41.71367 +G0 X96.625 +G1 X95.875 E41.74299 +G0 Y101.4 +G1 X96.625 E41.77231 +G0 X103.375 +G1 X104.125 E41.80163 +G0 Y102 +G1 X103.375 E41.83094 +G0 X96.625 +G1 X95.875 E41.86026 +G0 Y102.6 +G1 X96.625 E41.88958 +G0 X103.375 +G1 X104.125 E41.9189 +G0 Y103.2 +G1 X103.375 E41.94822 +G0 X96.625 +G1 X95.875 E41.97754 +G0 Y103.8 +G1 X104.125 E42.30003 +G0 X95.175 Y95.175 +;LAYER:6 +G0 X95.525 Y95.525 Z3.5 +;TYPE:WALL-INNER +G1 X104.475 E42.64989 +G1 Y104.475 E42.99976 +G1 X95.525 E43.34962 +G1 Y95.525 E43.69948 +G0 X96.975 Y96.975 +;TYPE:WALL-INNER +G1 X103.025 E43.93598 +G1 Y103.025 E44.17248 +G1 X96.975 E44.40898 +G1 Y96.975 E44.64547 +G0 X95.175 Y95.175 +;TYPE:WALL-OUTER +G1 X104.825 E45.0227 +G1 Y104.825 E45.39992 +G1 X95.175 E45.77715 +G1 Y95.175 E46.15438 +G0 X97.325 Y97.325 +;TYPE:WALL-OUTER +G1 X102.675 E46.36351 +G1 Y102.675 E46.57265 +G1 X97.325 E46.78178 +G1 Y97.325 E46.99092 +G0 X95.525 Y95.525 +G0 F60 X96 Y104.125 +;TYPE:FILL +G1 Y95.875 E47.31341 +G0 X96.6 +G1 Y104.125 E47.63591 +G0 X97.2 +G1 Y103.375 E47.66523 +G0 Y96.625 +G1 Y95.875 E47.69455 +G0 X97.8 +G1 Y96.625 E47.72387 +G0 Y103.375 +G1 Y104.125 E47.75318 +G0 X98.4 +G1 Y103.375 E47.7825 +G0 Y96.625 +G1 Y95.875 E47.81182 +G0 X99 +G1 Y96.625 E47.84114 +G0 Y103.375 +G1 Y104.125 E47.87046 +G0 X99.6 +G1 Y103.375 E47.89977 +G0 Y96.625 +G1 Y95.875 E47.92909 +G0 X100.2 +G1 Y96.625 E47.95841 +G0 Y103.375 +G1 Y104.125 E47.98773 +G0 X100.8 +G1 Y103.375 E48.01705 +G0 Y96.625 +G1 Y95.875 E48.04636 +G0 X101.4 +G1 Y96.625 E48.07568 +G0 Y103.375 +G1 Y104.125 E48.105 +G0 X102 +G1 Y103.375 E48.13432 +G0 Y96.625 +G1 Y95.875 E48.16364 +G0 X102.6 +G1 Y96.625 E48.19295 +G0 Y103.375 +G1 Y104.125 E48.22227 +G0 X103.2 +G1 Y103.375 E48.25159 +G0 Y96.625 +G1 Y95.875 E48.28091 +G0 X103.8 +G1 Y104.125 E48.60341 +G0 X95.175 Y95.175 +;LAYER:7 +G0 X95.525 Y95.525 Z4 +;TYPE:WALL-INNER +G1 X104.475 E48.95327 +G1 Y104.475 E49.30313 +G1 X95.525 E49.65299 +G1 Y95.525 E50.00285 +G0 X96.975 Y96.975 +;TYPE:WALL-INNER +G1 X103.025 E50.23935 +G1 Y103.025 E50.47585 +G1 X96.975 E50.71235 +G1 Y96.975 E50.94885 +G0 X95.175 Y95.175 +;TYPE:WALL-OUTER +G1 X104.825 E51.32607 +G1 Y104.825 E51.7033 +G1 X95.175 E52.08052 +G1 Y95.175 E52.45775 +G0 X97.325 Y97.325 +;TYPE:WALL-OUTER +G1 X102.675 E52.66688 +G1 Y102.675 E52.87602 +G1 X97.325 E53.08515 +G1 Y97.325 E53.29429 +G0 X95.525 Y95.525 +G0 F60 X104.125 Y96 +;TYPE:FILL +G1 X95.875 E53.61679 +G0 Y96.6 +G1 X104.125 E53.93929 +G0 Y97.2 +G1 X103.375 E53.9686 +G0 X96.625 +G1 X95.875 E53.99792 +G0 Y97.8 +G1 X96.625 E54.02724 +G0 X103.375 +G1 X104.125 E54.05656 +G0 Y98.4 +G1 X103.375 E54.08588 +G0 X96.625 +G1 X95.875 E54.11519 +G0 Y99 +G1 X96.625 E54.14451 +G0 X103.375 +G1 X104.125 E54.17383 +G0 Y99.6 +G1 X103.375 E54.20315 +G0 X96.625 +G1 X95.875 E54.23247 +G0 Y100.2 +G1 X96.625 E54.26178 +G0 X103.375 +G1 X104.125 E54.2911 +G0 Y100.8 +G1 X103.375 E54.32042 +G0 X96.625 +G1 X95.875 E54.34974 +G0 Y101.4 +G1 X96.625 E54.37906 +G0 X103.375 +G1 X104.125 E54.40837 +G0 Y102 +G1 X103.375 E54.43769 +G0 X96.625 +G1 X95.875 E54.46701 +G0 Y102.6 +G1 X96.625 E54.49633 +G0 X103.375 +G1 X104.125 E54.52565 +G0 Y103.2 +G1 X103.375 E54.55496 +G0 X96.625 +G1 X95.875 E54.58428 +G0 Y103.8 +G1 X104.125 E54.90678 +G0 X95.175 Y95.175 +;LAYER:8 +G0 X95.525 Y95.525 Z4.5 +;TYPE:WALL-INNER +G1 X104.475 E55.25664 +G1 Y104.475 E55.6065 +G1 X95.525 E55.95637 +G1 Y95.525 E56.30623 +G0 X96.975 Y96.975 +;TYPE:WALL-INNER +G1 X103.025 E56.54273 +G1 Y103.025 E56.77922 +G1 X96.975 E57.01572 +G1 Y96.975 E57.25222 +G0 X95.175 Y95.175 +;TYPE:WALL-OUTER +G1 X104.825 E57.62945 +G1 Y104.825 E58.00667 +G1 X95.175 E58.3839 +G1 Y95.175 E58.76112 +G0 X97.325 Y97.325 +;TYPE:WALL-OUTER +G1 X102.675 E58.97026 +G1 Y102.675 E59.17939 +G1 X97.325 E59.38853 +G1 Y97.325 E59.59766 +G0 X95.525 Y95.525 +G0 F60 X96 Y104.125 +;TYPE:FILL +G1 Y95.875 E59.92016 +G0 X96.6 +G1 Y104.125 E60.24266 +G0 X97.2 +G1 Y103.375 E60.27198 +G0 Y96.625 +G1 Y95.875 E60.30129 +G0 X97.8 +G1 Y96.625 E60.33061 +G0 Y103.375 +G1 Y104.125 E60.35993 +G0 X98.4 +G1 Y103.375 E60.38925 +G0 Y96.625 +G1 Y95.875 E60.41857 +G0 X99 +G1 Y96.625 E60.44789 +G0 Y103.375 +G1 Y104.125 E60.4772 +G0 X99.6 +G1 Y103.375 E60.50652 +G0 Y96.625 +G1 Y95.875 E60.53584 +G0 X100.2 +G1 Y96.625 E60.56516 +G0 Y103.375 +G1 Y104.125 E60.59448 +G0 X100.8 +G1 Y103.375 E60.62379 +G0 Y96.625 +G1 Y95.875 E60.65311 +G0 X101.4 +G1 Y96.625 E60.68243 +G0 Y103.375 +G1 Y104.125 E60.71175 +G0 X102 +G1 Y103.375 E60.74107 +G0 Y96.625 +G1 Y95.875 E60.77038 +G0 X102.6 +G1 Y96.625 E60.7997 +G0 Y103.375 +G1 Y104.125 E60.82902 +G0 X103.2 +G1 Y103.375 E60.85834 +G0 Y96.625 +G1 Y95.875 E60.88766 +G0 X103.8 +G1 Y104.125 E61.21015 +G0 X95.175 Y95.175 +;LAYER:9 +G0 X95.525 Y95.525 Z5 +;TYPE:WALL-INNER +G1 X104.475 E61.56002 +G1 Y104.475 E61.90988 +G1 X95.525 E62.25974 +G1 Y95.525 E62.6096 +G0 X96.975 Y96.975 +;TYPE:WALL-INNER +G1 X103.025 E62.8461 +G1 Y103.025 E63.0826 +G1 X96.975 E63.3191 +G1 Y96.975 E63.55559 +G0 X95.175 Y95.175 +;TYPE:WALL-OUTER +G1 X104.825 E63.93282 +G1 Y104.825 E64.31004 +G1 X95.175 E64.68727 +G1 Y95.175 E65.0645 +G0 X97.325 Y97.325 +;TYPE:WALL-OUTER +G1 X102.675 E65.27363 +G1 Y102.675 E65.48277 +G1 X97.325 E65.6919 +G1 Y97.325 E65.90104 +G0 X95.525 Y95.525 +G0 F60 X104.125 Y96 +;TYPE:FILL +G1 X95.875 E66.22353 +G0 Y96.6 +G1 X104.125 E66.54603 +G0 Y97.2 +G1 X103.375 E66.57535 +G0 X96.625 +G1 X95.875 E66.60467 +G0 Y97.8 +G1 X96.625 E66.63399 +G0 X103.375 +G1 X104.125 E66.6633 +G0 Y98.4 +G1 X103.375 E66.69262 +G0 X96.625 +G1 X95.875 E66.72194 +G0 Y99 +G1 X96.625 E66.75126 +G0 X103.375 +G1 X104.125 E66.78058 +G0 Y99.6 +G1 X103.375 E66.80989 +G0 X96.625 +G1 X95.875 E66.83921 +G0 Y100.2 +G1 X96.625 E66.86853 +G0 X103.375 +G1 X104.125 E66.89785 +G0 Y100.8 +G1 X103.375 E66.92717 +G0 X96.625 +G1 X95.875 E66.95648 +G0 Y101.4 +G1 X96.625 E66.9858 +G0 X103.375 +G1 X104.125 E67.01512 +G0 Y102 +G1 X103.375 E67.04444 +G0 X96.625 +G1 X95.875 E67.07376 +G0 Y102.6 +G1 X96.625 E67.10307 +G0 X103.375 +G1 X104.125 E67.13239 +G0 Y103.2 +G1 X103.375 E67.16171 +G0 X96.625 +G1 X95.875 E67.19103 +G0 Y103.8 +G1 X104.125 E67.51353 +G0 X95.175 Y95.175 +;LAYER:10 +G0 X95.525 Y95.525 Z5.5 +;TYPE:WALL-INNER +G1 X104.475 E67.86339 +G1 Y104.475 E68.21325 +G1 X95.525 E68.56311 +G1 Y95.525 E68.91297 +G0 X96.975 Y96.975 +;TYPE:WALL-INNER +G1 X103.025 E69.14947 +G1 Y103.025 E69.38597 +G1 X96.975 E69.62247 +G1 Y96.975 E69.85897 +G0 X95.175 Y95.175 +;TYPE:WALL-OUTER +G1 X104.825 E70.23619 +G1 Y104.825 E70.61342 +G1 X95.175 E70.99064 +G1 Y95.175 E71.36787 +G0 X97.325 Y97.325 +;TYPE:WALL-OUTER +G1 X102.675 E71.577 +G1 Y102.675 E71.78614 +G1 X97.325 E71.99527 +G1 Y97.325 E72.20441 +G0 X95.525 Y95.525 +G0 F60 X96 Y104.125 +;TYPE:FILL +G1 Y95.875 E72.52691 +G0 X96.6 +G1 Y104.125 E72.84941 +G0 X97.2 +G1 Y103.375 E72.87872 +G0 Y96.625 +G1 Y95.875 E72.90804 +G0 X97.8 +G1 Y96.625 E72.93736 +G0 Y103.375 +G1 Y104.125 E72.96668 +G0 X98.4 +G1 Y103.375 E72.996 +G0 Y96.625 +G1 Y95.875 E73.02531 +G0 X99 +G1 Y96.625 E73.05463 +G0 Y103.375 +G1 Y104.125 E73.08395 +G0 X99.6 +G1 Y103.375 E73.11327 +G0 Y96.625 +G1 Y95.875 E73.14259 +G0 X100.2 +G1 Y96.625 E73.1719 +G0 Y103.375 +G1 Y104.125 E73.20122 +G0 X100.8 +G1 Y103.375 E73.23054 +G0 Y96.625 +G1 Y95.875 E73.25986 +G0 X101.4 +G1 Y96.625 E73.28918 +G0 Y103.375 +G1 Y104.125 E73.31849 +G0 X102 +G1 Y103.375 E73.34781 +G0 Y96.625 +G1 Y95.875 E73.37713 +G0 X102.6 +G1 Y96.625 E73.40645 +G0 Y103.375 +G1 Y104.125 E73.43577 +G0 X103.2 +G1 Y103.375 E73.46508 +G0 Y96.625 +G1 Y95.875 E73.4944 +G0 X103.8 +G1 Y104.125 E73.8169 +G0 X95.175 Y95.175 +;LAYER:11 +G0 X95.525 Y95.525 Z6 +;TYPE:WALL-INNER +G1 X104.475 E74.16676 +G1 Y104.475 E74.51662 +G1 X95.525 E74.86649 +G1 Y95.525 E75.21635 +G0 X96.975 Y96.975 +;TYPE:WALL-INNER +G1 X103.025 E75.45285 +G1 Y103.025 E75.68934 +G1 X96.975 E75.92584 +G1 Y96.975 E76.16234 +G0 X95.175 Y95.175 +;TYPE:WALL-OUTER +G1 X104.825 E76.53957 +G1 Y104.825 E76.91679 +G1 X95.175 E77.29402 +G1 Y95.175 E77.67124 +G0 X97.325 Y97.325 +;TYPE:WALL-OUTER +G1 X102.675 E77.88038 +G1 Y102.675 E78.08951 +G1 X97.325 E78.29865 +G1 Y97.325 E78.50778 +G0 X95.525 Y95.525 +G0 F60 X104.125 Y96 +;TYPE:FILL +G1 X95.875 E78.83028 +G0 Y96.6 +G1 X104.125 E79.15278 +G0 Y97.2 +G1 X103.375 E79.1821 +G0 X96.625 +G1 X95.875 E79.21142 +G0 Y97.8 +G1 X96.625 E79.24073 +G0 X103.375 +G1 X104.125 E79.27005 +G0 Y98.4 +G1 X103.375 E79.29937 +G0 X96.625 +G1 X95.875 E79.32869 +G0 Y99 +G1 X96.625 E79.35801 +G0 X103.375 +G1 X104.125 E79.38732 +G0 Y99.6 +G1 X103.375 E79.41664 +G0 X96.625 +G1 X95.875 E79.44596 +G0 Y100.2 +G1 X96.625 E79.47528 +G0 X103.375 +G1 X104.125 E79.5046 +G0 Y100.8 +G1 X103.375 E79.53391 +G0 X96.625 +G1 X95.875 E79.56323 +G0 Y101.4 +G1 X96.625 E79.59255 +G0 X103.375 +G1 X104.125 E79.62187 +G0 Y102 +G1 X103.375 E79.65119 +G0 X96.625 +G1 X95.875 E79.6805 +G0 Y102.6 +G1 X96.625 E79.70982 +G0 X103.375 +G1 X104.125 E79.73914 +G0 Y103.2 +G1 X103.375 E79.76846 +G0 X96.625 +G1 X95.875 E79.79778 +G0 Y103.8 +G1 X104.125 E80.12027 +G0 X95.175 Y95.175 +;LAYER:12 +G0 X95.525 Y95.525 Z6.5 +;TYPE:WALL-INNER +G1 X104.475 E80.47014 +G1 Y104.475 E80.82 +G1 X95.525 E81.16986 +G1 Y95.525 E81.51972 +G0 X96.975 Y96.975 +;TYPE:WALL-INNER +G1 X103.025 E81.75622 +G1 Y103.025 E81.99272 +G1 X96.975 E82.22922 +G1 Y96.975 E82.46571 +G0 X95.175 Y95.175 +;TYPE:WALL-OUTER +G1 X104.825 E82.84294 +G1 Y104.825 E83.22017 +G1 X95.175 E83.59739 +G1 Y95.175 E83.97462 +G0 X97.325 Y97.325 +;TYPE:WALL-OUTER +G1 X102.675 E84.18375 +G1 Y102.675 E84.39289 +G1 X97.325 E84.60202 +G1 Y97.325 E84.81116 +G0 X95.525 Y95.525 +G0 F60 X96 Y104.125 +;TYPE:FILL +G1 Y95.875 E85.13365 +G0 X96.6 +G1 Y104.125 E85.45615 +G0 X97.2 +G1 Y103.375 E85.48547 +G0 Y96.625 +G1 Y95.875 E85.51479 +G0 X97.8 +G1 Y96.625 E85.54411 +G0 Y103.375 +G1 Y104.125 E85.57342 +G0 X98.4 +G1 Y103.375 E85.60274 +G0 Y96.625 +G1 Y95.875 E85.63206 +G0 X99 +G1 Y96.625 E85.66138 +G0 Y103.375 +G1 Y104.125 E85.6907 +G0 X99.6 +G1 Y103.375 E85.72001 +G0 Y96.625 +G1 Y95.875 E85.74933 +G0 X100.2 +G1 Y96.625 E85.77865 +G0 Y103.375 +G1 Y104.125 E85.80797 +G0 X100.8 +G1 Y103.375 E85.83729 +G0 Y96.625 +G1 Y95.875 E85.8666 +G0 X101.4 +G1 Y96.625 E85.89592 +G0 Y103.375 +G1 Y104.125 E85.92524 +G0 X102 +G1 Y103.375 E85.95456 +G0 Y96.625 +G1 Y95.875 E85.98388 +G0 X102.6 +G1 Y96.625 E86.01319 +G0 Y103.375 +G1 Y104.125 E86.04251 +G0 X103.2 +G1 Y103.375 E86.07183 +G0 Y96.625 +G1 Y95.875 E86.10115 +G0 X103.8 +G1 Y104.125 E86.42365 +G0 X95.175 Y95.175 +;LAYER:13 +G0 X95.525 Y95.525 Z7 +;TYPE:WALL-INNER +G1 X104.475 E86.77351 +G1 Y104.475 E87.12337 +G1 X95.525 E87.47323 +G1 Y95.525 E87.82309 +G0 X96.975 Y96.975 +;TYPE:WALL-INNER +G1 X103.025 E88.05959 +G1 Y103.025 E88.29609 +G1 X96.975 E88.53259 +G1 Y96.975 E88.76909 +G0 X95.175 Y95.175 +;TYPE:WALL-OUTER +G1 X104.825 E89.14631 +G1 Y104.825 E89.52354 +G1 X95.175 E89.90076 +G1 Y95.175 E90.27799 +G0 X97.325 Y97.325 +;TYPE:WALL-OUTER +G1 X102.675 E90.48712 +G1 Y102.675 E90.69626 +G1 X97.325 E90.90539 +G1 Y97.325 E91.11453 +G0 X95.525 Y95.525 +G0 F60 X104.125 Y96 +;TYPE:FILL +G1 X95.875 E91.43703 +G0 Y96.6 +G1 X104.125 E91.75953 +G0 Y97.2 +G1 X103.375 E91.78884 +G0 X96.625 +G1 X95.875 E91.81816 +G0 Y97.8 +G1 X96.625 E91.84748 +G0 X103.375 +G1 X104.125 E91.8768 +G0 Y98.4 +G1 X103.375 E91.90612 +G0 X96.625 +G1 X95.875 E91.93543 +G0 Y99 +G1 X96.625 E91.96475 +G0 X103.375 +G1 X104.125 E91.99407 +G0 Y99.6 +G1 X103.375 E92.02339 +G0 X96.625 +G1 X95.875 E92.05271 +G0 Y100.2 +G1 X96.625 E92.08202 +G0 X103.375 +G1 X104.125 E92.11134 +G0 Y100.8 +G1 X103.375 E92.14066 +G0 X96.625 +G1 X95.875 E92.16998 +G0 Y101.4 +G1 X96.625 E92.1993 +G0 X103.375 +G1 X104.125 E92.22861 +G0 Y102 +G1 X103.375 E92.25793 +G0 X96.625 +G1 X95.875 E92.28725 +G0 Y102.6 +G1 X96.625 E92.31657 +G0 X103.375 +G1 X104.125 E92.34589 +G0 Y103.2 +G1 X103.375 E92.3752 +G0 X96.625 +G1 X95.875 E92.40452 +G0 Y103.8 +G1 X104.125 E92.72702 +G0 X95.175 Y95.175 +;LAYER:14 +G0 X95.525 Y95.525 Z7.5 +;TYPE:WALL-INNER +G1 X104.475 E93.07688 +G1 Y104.475 E93.42674 +G1 X95.525 E93.77661 +G1 Y95.525 E94.12647 +G0 X96.975 Y96.975 +;TYPE:WALL-INNER +G1 X103.025 E94.36297 +G1 Y103.025 E94.59946 +G1 X96.975 E94.83596 +G1 Y96.975 E95.07246 +G0 X95.175 Y95.175 +;TYPE:WALL-OUTER +G1 X104.825 E95.44969 +G1 Y104.825 E95.82691 +G1 X95.175 E96.20414 +G1 Y95.175 E96.58136 +G0 X97.325 Y97.325 +;TYPE:WALL-OUTER +G1 X102.675 E96.7905 +G1 Y102.675 E96.99963 +G1 X97.325 E97.20877 +G1 Y97.325 E97.4179 +G0 X95.525 Y95.525 +G0 F60 X96 Y104.125 +;TYPE:FILL +G1 Y95.875 E97.7404 +G0 X96.6 +G1 Y104.125 E98.0629 +G0 X97.2 +G1 Y103.375 E98.09222 +G0 Y96.625 +G1 Y95.875 E98.12154 +G0 X97.8 +G1 Y96.625 E98.15085 +G0 Y103.375 +G1 Y104.125 E98.18017 +G0 X98.4 +G1 Y103.375 E98.20949 +G0 Y96.625 +G1 Y95.875 E98.23881 +G0 X99 +G1 Y96.625 E98.26813 +G0 Y103.375 +G1 Y104.125 E98.29744 +G0 X99.6 +G1 Y103.375 E98.32676 +G0 Y96.625 +G1 Y95.875 E98.35608 +G0 X100.2 +G1 Y96.625 E98.3854 +G0 Y103.375 +G1 Y104.125 E98.41472 +G0 X100.8 +G1 Y103.375 E98.44403 +G0 Y96.625 +G1 Y95.875 E98.47335 +G0 X101.4 +G1 Y96.625 E98.50267 +G0 Y103.375 +G1 Y104.125 E98.53199 +G0 X102 +G1 Y103.375 E98.56131 +G0 Y96.625 +G1 Y95.875 E98.59062 +G0 X102.6 +G1 Y96.625 E98.61994 +G0 Y103.375 +G1 Y104.125 E98.64926 +G0 X103.2 +G1 Y103.375 E98.67858 +G0 Y96.625 +G1 Y95.875 E98.7079 +G0 X103.8 +G1 Y104.125 E99.03039 +G0 X95.175 Y95.175 +;LAYER:15 +G0 X95.525 Y95.525 Z8 +;TYPE:WALL-INNER +G1 X104.475 E99.38026 +G1 Y104.475 E99.73012 +G1 X95.525 E100.07998 +G1 Y95.525 E100.42984 +G0 X95.175 Y95.175 +;TYPE:WALL-OUTER +G1 X104.825 E100.80707 +G1 Y104.825 E101.18429 +G1 X95.175 E101.56152 +G1 Y95.175 E101.93874 +G0 X95.525 Y95.525 +G0 F60 X104.125 Y96 +;TYPE:FILL +G1 X95.875 E102.26124 +G0 Y96.6 +G1 X104.125 E102.58374 +G0 Y97.2 +G1 X95.875 E102.90624 +G0 Y97.8 +G1 X104.125 E103.22873 +G0 Y98.4 +G1 X95.875 E103.55123 +G0 Y99 +G1 X104.125 E103.87373 +G0 Y99.6 +G1 X95.875 E104.19623 +G0 Y100.2 +G1 X104.125 E104.51873 +G0 Y100.8 +G1 X95.875 E104.84122 +G0 Y101.4 +G1 X104.125 E105.16372 +G0 Y102 +G1 X95.875 E105.48622 +G0 Y102.6 +G1 X104.125 E105.80872 +G0 Y103.2 +G1 X95.875 E106.13122 +G0 Y103.8 +G1 X104.125 E106.45372 +G0 X95.175 Y95.175 +;LAYER:16 +G0 X95.525 Y95.525 Z8.5 +;TYPE:WALL-INNER +G1 X104.475 E106.80358 +G1 Y104.475 E107.15344 +G1 X95.525 E107.5033 +G1 Y95.525 E107.85316 +G0 X95.175 Y95.175 +;TYPE:WALL-OUTER +G1 X104.825 E108.23039 +G1 Y104.825 E108.60761 +G1 X95.175 E108.98484 +G1 Y95.175 E109.36206 +G0 X95.525 Y95.525 +G0 F60 X96 Y104.125 +;TYPE:FILL +G1 Y95.875 E109.68456 +G0 X96.6 +G1 Y104.125 E110.00706 +G0 X97.2 +G1 Y95.875 E110.32956 +G0 X97.8 +G1 Y104.125 E110.65206 +G0 X98.4 +G1 Y95.875 E110.97455 +G0 X99 +G1 Y104.125 E111.29705 +G0 X99.6 +G1 Y95.875 E111.61955 +G0 X100.2 +G1 Y104.125 E111.94205 +G0 X100.8 +G1 Y95.875 E112.26455 +G0 X101.4 +G1 Y104.125 E112.58704 +G0 X102 +G1 Y95.875 E112.90954 +G0 X102.6 +G1 Y104.125 E113.23204 +G0 X103.2 +G1 Y95.875 E113.55454 +G0 X103.8 +G1 Y104.125 E113.87704 +G0 X95.175 Y95.175 +;LAYER:17 +G0 X95.525 Y95.525 Z9 +;TYPE:WALL-INNER +G1 X104.475 E114.2269 +G1 Y104.475 E114.57676 +G1 X95.525 E114.92662 +G1 Y95.525 E115.27648 +G0 X95.175 Y95.175 +;TYPE:WALL-OUTER +G1 X104.825 E115.65371 +G1 Y104.825 E116.03093 +G1 X95.175 E116.40816 +G1 Y95.175 E116.78538 +G0 X95.525 Y95.525 +G0 F60 X104.125 Y96 +;TYPE:FILL +G1 X95.875 E117.10788 +G0 Y96.6 +G1 X104.125 E117.43038 +G0 Y97.2 +G1 X95.875 E117.75288 +G0 Y97.8 +G1 X104.125 E118.07538 +G0 Y98.4 +G1 X95.875 E118.39788 +G0 Y99 +G1 X104.125 E118.72037 +G0 Y99.6 +G1 X95.875 E119.04287 +G0 Y100.2 +G1 X104.125 E119.36537 +G0 Y100.8 +G1 X95.875 E119.68787 +G0 Y101.4 +G1 X104.125 E120.01037 +G0 Y102 +G1 X95.875 E120.33286 +G0 Y102.6 +G1 X104.125 E120.65536 +G0 Y103.2 +G1 X95.875 E120.97786 +G0 Y103.8 +G1 X104.125 E121.30036 +G0 X95.175 Y95.175 +;LAYER:18 +G0 X95.525 Y95.525 Z9.5 +;TYPE:WALL-INNER +G1 X104.475 E121.65022 +G1 Y104.475 E122.00008 +G1 X95.525 E122.34994 +G1 Y95.525 E122.69981 +G0 X95.175 Y95.175 +;TYPE:WALL-OUTER +G1 X104.825 E123.07703 +G1 Y104.825 E123.45426 +G1 X95.175 E123.83148 +G1 Y95.175 E124.20871 +G0 X95.525 Y95.525 +G0 F60 X96 Y104.125 +;TYPE:FILL +G1 Y95.875 E124.5312 +G0 X96.6 +G1 Y104.125 E124.8537 +G0 X97.2 +G1 Y95.875 E125.1762 +G0 X97.8 +G1 Y104.125 E125.4987 +G0 X98.4 +G1 Y95.875 E125.8212 +G0 X99 +G1 Y104.125 E126.14369 +G0 X99.6 +G1 Y95.875 E126.46619 +G0 X100.2 +G1 Y104.125 E126.78869 +G0 X100.8 +G1 Y95.875 E127.11119 +G0 X101.4 +G1 Y104.125 E127.43369 +G0 X102 +G1 Y95.875 E127.75619 +G0 X102.6 +G1 Y104.125 E128.07868 +G0 X103.2 +G1 Y95.875 E128.40118 +G0 X103.8 +G1 Y104.125 E128.72368 +G0 X95.175 Y95.175 +;LAYER:19 +G0 X95.525 Y95.525 Z10 +;TYPE:WALL-INNER +G1 X104.475 E129.07354 +G1 Y104.475 E129.4234 +G1 X95.525 E129.77327 +G1 Y95.525 E130.12313 +G0 X95.175 Y95.175 +;TYPE:WALL-OUTER +G1 X104.825 E130.50035 +G1 Y104.825 E130.87758 +G1 X95.175 E131.2548 +G1 Y95.175 E131.63203 +G0 X95.525 Y95.525 +G0 F60 X104.125 Y96 +;TYPE:FILL +G1 X95.875 E131.95453 +G0 Y96.6 +G1 X104.125 E132.27702 +G0 Y97.2 +G1 X95.875 E132.59952 +G0 Y97.8 +G1 X104.125 E132.92202 +G0 Y98.4 +G1 X95.875 E133.24452 +G0 Y99 +G1 X104.125 E133.56702 +G0 Y99.6 +G1 X95.875 E133.88951 +G0 Y100.2 +G1 X104.125 E134.21201 +G0 Y100.8 +G1 X95.875 E134.53451 +G0 Y101.4 +G1 X104.125 E134.85701 +G0 Y102 +G1 X95.875 E135.17951 +G0 Y102.6 +G1 X104.125 E135.50201 +G0 Y103.2 +G1 X95.875 E135.8245 +G0 Y103.8 +G1 X104.125 E136.147 +;End GCode +M104 S0 ;extruder heater off +M140 S0 ;heated bed heater off (if you have it) +G91 ;relative positioning +G1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure +G1 Z+0.5 E-5 X-20 Y-20 F300 ;move Z up a bit and retract filament even more +G28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way +M107 ;fan off +M84 ;steppers off +G90 ;absolute positioning