#pragma once #include "visitor.h" #include "enums.h" #include "memory.h" #include "Geometry.h" #include #include #include #include class GeometryEvaluator : public Visitor { public: GeometryEvaluator(const class Tree &tree); virtual ~GeometryEvaluator() {} shared_ptr evaluateGeometry(const AbstractNode &node, bool allownef); virtual Response visit(State &state, const AbstractNode &node); virtual Response visit(State &state, const AbstractIntersectionNode &node); virtual Response visit(State &state, const AbstractPolyNode &node); virtual Response visit(State &state, const BendNode &node); virtual Response visit(State &state, const LinearExtrudeNode &node); virtual Response visit(State &state, const RotateExtrudeNode &node); virtual Response visit(State &state, const LeafNode &node); virtual Response visit(State &state, const TransformNode &node); virtual Response visit(State &state, const CsgNode &node); virtual Response visit(State &state, const CgaladvNode &node); virtual Response visit(State &state, const ProjectionNode &node); virtual Response visit(State &state, const RenderNode &node); virtual Response visit(State &state, const TextNode &node); virtual Response visit(State &state, const OffsetNode &node); const Tree &getTree() const { return this->tree; } private: class ResultObject { public: ResultObject() : is_const(true) {} ResultObject(const Geometry *g) : is_const(true), const_pointer(g) {} ResultObject(shared_ptr &g) : is_const(true), const_pointer(g) {} ResultObject(Geometry *g) : is_const(false), pointer(g) {} ResultObject(shared_ptr &g) : is_const(false), pointer(g) {} bool isConst() const { return is_const; } shared_ptr ptr() { assert(!is_const); return pointer; } shared_ptr constptr() const { return is_const ? const_pointer : static_pointer_cast(pointer); } private: bool is_const; shared_ptr pointer; shared_ptr const_pointer; }; void smartCacheInsert(const AbstractNode &node, const shared_ptr &geom); shared_ptr smartCacheGet(const AbstractNode &node, bool preferNef); bool isSmartCached(const AbstractNode &node); std::vector collectChildren2D(const AbstractNode &node); Geometry::ChildList collectChildren3D(const AbstractNode &node); Polygon2d *applyMinkowski2D(const AbstractNode &node); Polygon2d *applyHull2D(const AbstractNode &node); Geometry *applyHull3D(const AbstractNode &node); void applyResize3D(class CGAL_Nef_polyhedron &N, const Vector3d &newsize, const Eigen::Matrix &autosize); Polygon2d *applyToChildren2D(const AbstractNode &node, OpenSCADOperator op); ResultObject applyToChildren3D(const AbstractNode &node, OpenSCADOperator op); ResultObject applyToChildren(const AbstractNode &node, OpenSCADOperator op); void addToParent(const State &state, const AbstractNode &node, const shared_ptr &geom); std::map visitedchildren; const Tree &tree; shared_ptr root; public: };