{-- TerraHS - Interface between TerraLib and Haskell (c) Sergio Costa (INPE) - Setembro, 2005 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License 2.1 as published by the Free Software Foundation (http://www.opensource.org/licenses/gpl-license.php) --} {-- --} module TerraHS.TerraLib.TeGeometry ( -- * The @TeGeometry@ type TeGeometry (..), -- ** Operations on @TeGeometry@ pointset2geometryset, lineset2geometryset, polygonset2geometryset, cellset2geometryset ) where import Foreign import Foreign.C.String import qualified Foreign.Ptr (Ptr) import qualified System.IO.Unsafe (unsafePerformIO) import TerraHS.Misc.Generic -- funções genericas import TerraHS.Misc.Object import TerraHS.TerraLib.TePoint import TerraHS.TerraLib.TeLine2D import TerraHS.TerraLib.TeCell import TerraHS.TerraLib.TeBox import TerraHS.TerraLib.TePolygon data TeGeometry = GPt TePoint | GPg TePolygon | GLn TeLine2D | GCl TeCell deriving (Show,Eq) type TeGeometryPtr = Foreign.Ptr.Ptr TeGeometry --class (Array a b) => ToTeGeometry a b where -- toTeGeometry :: (Foreign.Ptr.Ptr a) -> Int32 -> Prelude.IO TeGeometry --instance ToTeGeometry TePointSet TePoint where -- toTeGeometry ptr i = ((getElement ptr i)) >>= \phs -> return (GPt phs) pointset2geometryset :: TePointSetPtr -> Int32 -> Int32 -> Prelude.IO [TeGeometry] pointset2geometryset gs i size = do if i >= size then return [] else (getElement gs i) >>= \x -> pointset2geometryset gs (i+1) size >>= \xs -> return ((GPt x) : xs) lineset2geometryset :: TeLineSetPtr -> Int32 -> Int32 -> Prelude.IO [TeGeometry] lineset2geometryset gs i size = do if i >= size then return [] else (getElement gs i) >>= \x -> lineset2geometryset gs (i+1) size >>= \xs -> return ((GLn x) : xs) polygonset2geometryset :: TePolygonSetPtr -> Int32 -> Int32 -> Prelude.IO [TeGeometry] polygonset2geometryset gs i size = do if i >= size then return [] else (getElement gs i) >>= \x -> polygonset2geometryset gs (i+1) size >>= \xs -> return ((GPg x) : xs) cellset2geometryset :: TeCellSetPtr -> Int32 -> Int32 -> Prelude.IO [TeGeometry] cellset2geometryset gs i size = do if i >= size then return [] else (getElement gs i) >>= \x -> cellset2geometryset gs (i+1) size >>= \xs -> return ((GCl x) : xs)