{-# LANGUAGE TemplateHaskell #-} {-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} {-# HLINT ignore "Use lambda-case" #-} {-# HLINT ignore "Use tuple-section" #-} import qualified Graphics.Svg as SVG import Options.Applicative import Paths_juicy_gcode (version) import Data.Version (showVersion) import Development.GitRev (gitHash) import Data.Maybe (fromMaybe) import qualified Data.Yaml as Y import Render import GCode data Options = Options { _svgfile :: String , _cfgfile :: Maybe String , _outfile :: Maybe String , _dpi :: Int , _resolution :: Double , _approximation :: Maybe Approximation } options :: Parser Options options = Options <$> argument str ( metavar "SVGFILE" <> help "The SVG file to be converted" ) <*> optional (strOption ( long "flavor" <> short 'f' <> metavar "CONFIGFILE" <> help "Configuration of G-Code flavor" )) <*> optional (strOption ( long "output" <> short 'o' <> metavar "OUTPUTFILE" <> help "The output G-Code file (default is standard output)" )) <*> option auto ( long "dpi" <> value 96 <> short 'd' <> metavar "DPI" <> help "Used to determine the size of the SVG when it does not contain any units; dot per inch (default is 96)" ) <*> option auto ( long "tolerance" <> value 0.1 <> short 't' <> metavar "TOLERANCE" <> help "Maximum derivation of the approximation curve" ) <*> optional (option parseApproximation ( long "curve-fitting" <> short 'c' <> metavar "TYPE" <> help "Bezier curve approximation algorithm. TYPE can be linear, biarc (default) or cubic-bezier" )) parseApproximation :: ReadM Approximation parseApproximation = str >>= \s -> case s of "biarc" -> return BiArc "linear" -> return Linear "cubic-bezier" -> return CubicBezier _ -> readerError "Accepted bezier approximation types are 'biarc', 'linear', and 'cubic-bezier'." runWithOptions :: Options -> IO () runWithOptions (Options svgFile mbCfg mbOut dpi resolution mbApproximation) = do mbDoc <- SVG.loadSvgFile svgFile mbConfig <- maybe (return Nothing) (fmap Just . Y.decodeFileThrow) mbCfg case mbDoc of (Just doc) -> writer (toString mbConfig dpi $ renderDoc (fromMaybe BiArc mbApproximation) dpi resolution doc) Nothing -> putStrLn "juicy-gcode: error during opening the SVG file" where writer = maybe putStr writeFile mbOut versionOption :: Parser (a -> a) versionOption = infoOption (concat ["juicy-gcode ", showVersion version, ", git revision ", $(gitHash)]) (long "version" <> short 'v' <> help "Show version") main :: IO () main = execParser opts >>= runWithOptions where opts = info (helper <*> versionOption <*> options) ( fullDesc <> progDesc "Convert SVGFILE to G-Code" <> header "juicy-gcode - The SVG to G-Code converter" )