Files
create/src/Mod/Sketcher/Gui/EditModeGeometryCoinConverter.h
2022-12-12 02:52:33 +01:00

171 lines
6.1 KiB
C++

/***************************************************************************
* Copyright (c) 2021 Abdullah Tahiri <abdullah.tahiri.yo@gmail.com> *
* *
* This file is part of the FreeCAD CAx development system. *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 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 Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; see the file COPYING.LIB. If not, *
* write to the Free Software Foundation, Inc., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
***************************************************************************/
#ifndef SKETCHERGUI_GeometryCoinConverter_H
#define SKETCHERGUI_GeometryCoinConverter_H
#include <vector>
#include "ViewProviderSketch.h"
namespace Base {
template< typename T >
class Vector3;
class Vector2d;
}
namespace Sketcher {
enum ConstraintType : int;
enum class PointPos : int;
}
namespace Part {
class Geometry;
}
namespace SketcherGui {
class ViewProviderSketch;
struct GeometryLayerNodes;
struct DrawingParameters;
class GeometryLayerParameters;
struct CoinMapping;
/** @brief Class for creating the Geometry layer into coin nodes
* @details
* Responsibility:
* To create and update GeometryLayer nodes provided as constructor parameter
* for the provided geometry, taking into account the drawing parameters provided as
* constructor parameters.
*
* Interface:
* A single entry point convert(), performing the following flow:
*
* [Geometry] => Analysis => construct drawing elements => Create mappings GeoId coin => populate coin nodes
*
* Analysis performs analysis such as maximum boundingbox magnitude of all geometries and maximum curvature of BSplines
*/
class EditModeGeometryCoinConverter {
// These internal private classes are used to parametrize the conversion of geometry into points and line sets (see template method convert)
private:
enum class PointsMode {
InsertSingle,
InsertStartEnd,
InsertStartEndMid,
InsertMidOnly
};
enum class CurveMode {
NoCurve,
StartEndPointsOnly,
ClosedCurve,
OpenCurve
};
enum class AnalyseMode {
BoundingBoxMagnitude,
BoundingBoxMagnitudeAndBSplineCurvature
};
public:
/** Constructs an GeometryCoinConverter responsible for
* generating the points and line sets for drawing the geometry
* defined by a GeometryLayer into the coin nodes provided by
* GeometryLayerNodes.
*
* @param geometrylayernodes: The coin nodes to be populated with
* the geometry
*
* @param drawingparameters: Parameters for drawing the overlay information
*/
EditModeGeometryCoinConverter( ViewProviderSketch & vp,
GeometryLayerNodes & geometrylayernodes,
DrawingParameters & drawingparameters,
GeometryLayerParameters& geometryLayerParams,
CoinMapping & coinMap );
/**
* converts the geometry defined by GeometryLayer into the coin nodes.
*
* @param geometry: the geometry to be processed
*/
void convert(const Sketcher::GeoListFacade & geolistfacade);
/**
* returns the maximum of the vertical and horizontal magnitudes of the
* coordinates of the points and lines added to coin by this layer (local responsibility).
*/
float getBoundingBoxMaxMagnitude();
/**
* returns the Comb representation scale that should be used to represent
* the B-Splines of this layer (local responsibility).
*/
double getCombRepresentationScale();
/**
* returns the GeoIds of BSpline geometries
*/
auto getBSplineGeoIds(){ return std::move(bsplineGeoIds);}
private:
template < typename GeoType, PointsMode pointmode, CurveMode curvemode, AnalyseMode analysemode >
void convert(const Sketcher::GeometryFacade * geometryfacade, [[maybe_unused]] int geoId);
private:
/// Reference to ViewProviderSketch in order to access the public and the Attorney Interface
ViewProviderSketch & viewProvider;
GeometryLayerNodes & geometryLayerNodes;
std::vector<std::vector<Base::Vector3d>> Coords;
std::vector<std::vector<Base::Vector3d>> Points;
std::vector<std::vector<unsigned int>> Index;
// temporal counters, one per layer
std::vector<int> pointCounter;
std::vector<int> curveCounter;
// temporal global vertex counter
int vertexCounter = 0;
// Parameters
DrawingParameters & drawingParameters;
GeometryLayerParameters& geometryLayerParameters;
// Mappings coin geoId
CoinMapping & coinMapping;
// measurements
float boundingBoxMaxMagnitude = 100;
double combrepscale = 0; // the repscale that would correspond to this comb based only on this calculation.
std::vector<int> bsplineGeoIds;
};
} // namespace SketcherGui
#endif // SKETCHERGUI_GeometryCoinConverter_H