import qualified Graphics.Svg as SVG
import Data.Text
import qualified Data.Configurator as C
import Data.Monoid
import Options.Applicative
import Render
import GCode
data Options = Options { _svgfile :: String
, _cfgfile :: Maybe String
, _outfile :: Maybe String
, _dpi :: Int
}
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 72
<> short 'd'
<> metavar "DPI"
<> help "Density of the SVG file (default is 72 DPI)" ))
runWithOptions :: Options -> IO ()
runWithOptions (Options svgFile mbCfg mbOut dpi) =
do
mbDoc <- SVG.loadSvgFile svgFile
flavor <- maybe (return defaultFlavor) readFlavor mbCfg
case mbDoc of
(Just doc) -> writer (toString flavor dpi $ renderDoc dpi doc)
Nothing -> putStrLn "juicy-gcode: error during opening the SVG file"
where
writer = maybe putStrLn (\fn -> writeFile fn) mbOut
toLines :: Text -> String
toLines t = unpack $ replace (pack ";") (pack "\n") t
readFlavor :: FilePath -> IO GCodeFlavor
readFlavor cfgFile = do
cfg <- C.load [C.Required cfgFile]
begin <- C.require cfg (pack "gcode.begin")
end <- C.require cfg (pack "gcode.end")
toolon <- C.require cfg (pack "gcode.toolon")
tooloff <- C.require cfg (pack "gcode.tooloff")
return $ GCodeFlavor (toLines begin) (toLines end) (toLines toolon) (toLines tooloff)
main :: IO ()
main = execParser opts >>= runWithOptions
where
opts = info (helper <*> options)
( fullDesc
<> progDesc "Convert SVGFILE to G-Code"
<> header "juicy-gcode - The SVG to G-Code converter" )