-- Implicit CAD. Copyright (C) 2011, Christopher Olah (chris@colah.ca) -- Released under the GNU GPL, see LICENSE -- We'd like to parse openscad code, with some improvements, for backwards compatability. module Graphics.Implicit.ExtOpenScad (runOpenscad, OVal (..) ) where import Graphics.Implicit.Definitions import Graphics.Implicit.ExtOpenScad.Definitions import Graphics.Implicit.ExtOpenScad.Parser.Statement import Graphics.Implicit.ExtOpenScad.Eval.Statement import Graphics.Implicit.ExtOpenScad.Default (defaultObjects) import Graphics.Implicit.ExtOpenScad.Util.OVal import qualified Data.Maybe as Maybe import qualified Data.List as List import qualified Data.Map as Map import Data.Map (Map) import qualified Control.Monad as Monad import qualified Control.Monad.State as State import Control.Monad.State (State,StateT, get, put, modify, liftIO) import qualified System.Directory as Dir -- Small wrapper to handle parse errors, etc runOpenscad s = let initial = defaultObjects rearrange (_, (varlookup, ovals, _ , _ , _)) = (varlookup, obj2s, obj3s) where (obj2s, obj3s, others) = divideObjs ovals in case parseProgram "" s of Left e -> Left e Right sts -> Right $ fmap rearrange $ (\sts -> do path <- Dir.getCurrentDirectory State.runStateT sts (initial, [], path, (), () ) ) $ Monad.mapM_ runStatementI sts