diff --git a/modules/img/base/src/mask_info_convert.cc b/modules/img/base/src/mask_info_convert.cc new file mode 100644 index 0000000000000000000000000000000000000000..de40f80a4733b605be1543f61dee6fec88d0ad56 --- /dev/null +++ b/modules/img/base/src/mask_info_convert.cc @@ -0,0 +1,227 @@ +//------------------------------------------------------------------------------ +// This file is part of the OpenStructure project <www.openstructure.org> +// +// Copyright (C) 2008-2010 by the OpenStructure authors +// Copyright (C) 2003-2010 by the IPLT authors +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License as published by the Free +// Software Foundation; either version 3.0 of the License, or (at your option) +// any later version. +// This library is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +// details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this library; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +//------------------------------------------------------------------------------ + +/* + Authors: Andreas Schenk, Ansgar Philippsen +*/ + +#include <stack> + +#include <ost/info/info_visitor.hh> +#include <ost/info/info.hh> +#include "mask_info_convert.hh" +#include "polygon_mask.hh" +#include "circle_mask.hh" +#include "extent_mask.hh" +#include "composite_mask.hh" +#include "inverted_mask.hh" +#include "spherical_mask.hh" +#include "mask_visitor.hh" + +namespace ost{ namespace img { + +namespace { + + + +class PolygonInfoVisitor: public info::InfoConstVisitor +{ +public: + PolygonInfoVisitor(): + p_() + {} + + Polygon2 GetPolygon() const {return p_;} + + virtual bool VisitGroup(const info::InfoGroup& group) + { + if(group.GetName()=="Polygon"){ + return true; + } else if(group.GetName()=="Node"){ + p_.AddNode(geom::Vec2(group.GetItem("x").AsFloat(), + group.GetItem("y").AsFloat())); + return false; + } + return true; + } + + virtual void VisitGroupFinish(const info::InfoGroup& group) + {} + +private: + Polygon2 p_; +}; + +// this is used recursively +class MaskInfoVisitor: public info::InfoConstVisitor +{ +public: + MaskInfoVisitor(): + mask_list_() + {} + + std::vector<MaskPtr> GetMaskList() const {return mask_list_;} + + virtual bool VisitGroup(const info::InfoGroup& group) + { + String name=group.GetName(); + if(name=="Composite"){ + String opname=group.GetItem("Operator").GetValue(); + MaskInfoVisitor miv; + group.Apply(miv,false); // subgroups + std::vector<MaskPtr> mpl = miv.GetMaskList(); + mask_list_.push_back(MaskPtr(new CompositeMask(mpl[0],mpl[1],opname))); + return false; + }else if(name=="Invert"){ + MaskInfoVisitor miv; + group.Apply(miv,false); // subgroups + std::vector<MaskPtr> mpl = miv.GetMaskList(); + mask_list_.push_back(MaskPtr(new InvertedMask(mpl[0]))); + return false; + }else if(name=="Circle"){ + Circle2 c; + c.SetRadius(group.GetItem("Radius").AsFloat()); + c.SetCenter(geom::Vec2(group.GetItem("Center/x").AsFloat(), + group.GetItem("Center/y").AsFloat())); + mask_list_.push_back(MaskPtr(new CircleMask(c))); + return false; + }else if(name=="Polygon"){ + PolygonInfoVisitor pvis; + group.Apply(pvis); + mask_list_.push_back(MaskPtr(new PolygonMask(pvis.GetPolygon()))); + return false; + }else if(name=="Extent"){ + Extent e(Point(group.GetItem("Start/x").AsInt(), + group.GetItem("Start/y").AsInt()), + Point(group.GetItem("End/x").AsInt(), + group.GetItem("End/y").AsInt())); + mask_list_.push_back(MaskPtr(new ExtentMask(e))); + return false; + }else if(name=="Sphere"){ + Sphere s; + s.SetRadius(group.GetItem("Radius").AsFloat()); + s.SetOrigin(geom::Vec3(group.GetItem("Origin/x").AsFloat(), + group.GetItem("Origin/y").AsFloat(), + group.GetItem("Origin/z").AsFloat())); + mask_list_.push_back(MaskPtr(new SphericalMask(s))); + return false; + } + return true; + } + + virtual void VisitGroupFinish(const info::InfoGroup& group) + { + } + +private: + std::vector<MaskPtr> mask_list_; +}; + + +// mask visitor for mask->info conversion +class MaskToInfoVisitor: public MaskVisitor +{ + typedef std::stack<info::InfoGroup> InfoGroupStack; +public: + MaskToInfoVisitor(info::InfoGroup& g): + igs_() + { + igs_.push(g); + } + virtual void VisitCircleMask(CircleMask& m) + { + info::InfoGroup cg=igs_.top().CreateGroup("Circle"); + info::InfoGroup centerg=cg.CreateGroup("Center"); + centerg.CreateItem("x","").SetFloat(m.GetCenter()[0]); + centerg.CreateItem("y","").SetFloat(m.GetCenter()[1]); + cg.CreateItem("Radius","").SetFloat(m.GetRadius()); + } + virtual void VisitCompositeMask(CompositeMask& m) + { + info::InfoGroup compg=igs_.top().CreateGroup("Composite"); + compg.CreateItem("Operator",m.GetOperatorName()); + igs_.push(compg); + } + virtual void VisitCompositeMaskFinish(CompositeMask& m) + { + igs_.pop(); + } + virtual void VisitExtentMask(ExtentMask& m) + { + info::InfoGroup extg=igs_.top().CreateGroup("Extent"); + info::InfoGroup startg=extg.CreateGroup("Start"); + startg.CreateItem("x","").SetInt(m.GetStart()[0]); + startg.CreateItem("y","").SetInt(m.GetStart()[1]); + info::InfoGroup endg=extg.CreateGroup("End"); + endg.CreateItem("x","").SetInt(m.GetEnd()[0]); + endg.CreateItem("y","").SetInt(m.GetEnd()[1]); + } + virtual void VisitInvertedMask(InvertedMask& m) + { + info::InfoGroup invertg=igs_.top().CreateGroup("Invert"); + igs_.push(invertg); + } + virtual void VisitInvertedMaskFinish(InvertedMask& m) + { + igs_.pop(); + } + virtual void VisitPolygonMask(PolygonMask& m) + { + info::InfoGroup polyg=igs_.top().CreateGroup("Polygon"); + for(unsigned int nn=0;nn<m.GetNodeCount();++nn) { + info::InfoGroup nodeg=polyg.CreateGroup("Node"); + geom::Vec2 node=m.GetNode(nn); + nodeg.CreateItem("x","").SetFloat(node[0]); + nodeg.CreateItem("y","").SetFloat(node[1]); + } + } + virtual void VisitSphericalMask(SphericalMask& m) + { + info::InfoGroup cg=igs_.top().CreateGroup("Sphere"); + info::InfoGroup centerg=cg.CreateGroup("Origin"); + centerg.CreateItem("x","").SetFloat(m.GetOrigin()[0]); + centerg.CreateItem("y","").SetFloat(m.GetOrigin()[1]); + centerg.CreateItem("z","").SetFloat(m.GetOrigin()[2]); + cg.CreateItem("Radius","").SetFloat(m.GetRadius()); + } +private: + InfoGroupStack igs_; +}; + +} // anon ns + +MaskPtr DLLEXPORT InfoToMask(const info::InfoGroup& g) +{ + MaskInfoVisitor vis; + g.Apply(vis); + std::vector<MaskPtr> mlist = vis.GetMaskList(); + if(!mlist.empty()) { + return mlist[0]; + } + return MaskPtr(); +} + +void MaskToInfo(const MaskPtr& mptr ,info::InfoGroup& g) +{ + MaskToInfoVisitor vis(g); + mptr->Apply(vis); +} + +}} //ns diff --git a/modules/img/base/src/mask_info_convert.hh b/modules/img/base/src/mask_info_convert.hh new file mode 100644 index 0000000000000000000000000000000000000000..04a01eac42e211c08a18bc2f28c6897fce371bfb --- /dev/null +++ b/modules/img/base/src/mask_info_convert.hh @@ -0,0 +1,38 @@ +//------------------------------------------------------------------------------ +// This file is part of the OpenStructure project <www.openstructure.org> +// +// Copyright (C) 2008-2010 by the OpenStructure authors +// Copyright (C) 2003-2010 by the IPLT authors +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License as published by the Free +// Software Foundation; either version 3.0 of the License, or (at your option) +// any later version. +// This library is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +// details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this library; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +//------------------------------------------------------------------------------ + +/* + Authors: Andreas Schenk, Ansgar Philippsen +*/ + +#ifndef MASK_INFO_CONVERT_HH_ +#define MASK_INFO_CONVERT_HH_ + +#include <ost/info/info_group.hh> +#include "mask_base_fw.hh" + +namespace ost { namespace img { + +MaskPtr DLLEXPORT InfoToMask(const info::InfoGroup& g); +void DLLEXPORT MaskToInfo(const MaskPtr& mptr, info::InfoGroup& g); + +}} //ns + +#endif /*MASK_INFO_CONVERT_HH_*/