LCOV - code coverage report
Current view: top level - ogr/ogrsf_frmts/cad/libopencad - cadgeometry.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 9 25 36.0 %
Date: 2024-11-21 22:18:42 Functions: 16 42 38.1 %

          Line data    Source code
       1             : /*******************************************************************************
       2             :  *  Project: libopencad
       3             :  *  Purpose: OpenSource CAD formats support library
       4             :  *  Author: Alexandr Borzykh, mush3d at gmail.com
       5             :  *  Author: Dmitry Baryshnikov, bishop.dev@gmail.com
       6             :  *  Language: C++
       7             :  *******************************************************************************
       8             :  *  The MIT License (MIT)
       9             :  *
      10             :  *  Copyright (c) 2016 Alexandr Borzykh
      11             :  *  Copyright (c) 2016 NextGIS, <info@nextgis.com>
      12             :  *
      13             :   * SPDX-License-Identifier: MIT
      14             :  *******************************************************************************/
      15             : #ifndef CADGEOMETRIES_H
      16             : #define CADGEOMETRIES_H
      17             : 
      18             : #include "cadobjects.h"
      19             : #include "cadcolors.h"
      20             : 
      21             : #include <array>
      22             : 
      23             : class CADAttdef;
      24             : class CADAttrib;
      25             : 
      26             : /**
      27             :  * @brief The Matrix class
      28             :  */
      29             : class Matrix
      30             : {
      31             : public:
      32           0 :               Matrix() = default;
      33             :     void      translate( const CADVector& vector );
      34             :     void      rotate( double rotation );
      35             :     void      scale( const CADVector& vector );
      36             :     CADVector multiply( const CADVector& vector ) const;
      37             : protected:
      38             :     std::array<double, 9> matrix = {{1.0, 0.0, 0.0,
      39             :                                      0.0, 1.0, 0.0,
      40             :                                      0.0, 0.0, 1.0}};
      41             : };
      42             : 
      43             : /**
      44             :  * @brief Base CAD geometry class
      45             :  */
      46             : class OCAD_EXTERN CADGeometry
      47             : {
      48             : public:
      49             :     CADGeometry();
      50             :     virtual ~CADGeometry();
      51             :     /**
      52             :      * @brief The CAD geometry types enum
      53             :      */
      54             :     enum GeometryType
      55             :     {
      56             :         UNDEFINED = 0,
      57             :         POINT,
      58             :         CIRCLE,
      59             :         LWPOLYLINE,
      60             :         ELLIPSE,
      61             :         LINE,
      62             :         POLYLINE3D,
      63             :         TEXT,
      64             :         ARC,
      65             :         SPLINE,
      66             :         SOLID,
      67             :         RAY,
      68             :         HATCH, // NOT IMPLEMENTED
      69             :         IMAGE,
      70             :         MTEXT,
      71             :         MLINE,
      72             :         XLINE,
      73             :         FACE3D,
      74             :         POLYLINE_PFACE,
      75             :         ATTRIB,
      76             :         ATTDEF
      77             :     };
      78             : 
      79             :     enum GeometryType getType() const;
      80             :     double            getThickness() const;
      81             :     void              setThickness( double thickness );
      82             :     RGBColor          getColor() const;
      83             :     void              setColor( RGBColor color ); // TODO: In 2004+ ACI is not the only way to set the color.
      84             : 
      85             :     std::vector<CADAttrib> getBlockAttributes() const;
      86             :     void              setBlockAttributes( const std::vector<CADAttrib>& value );
      87             : 
      88             :     std::vector<std::string> getEED() const;
      89             :     void setEED( const std::vector<std::string>& eed );
      90             : 
      91             :     virtual void print() const                     = 0;
      92             :     virtual void transform( const Matrix& matrix ) = 0;
      93             : protected:
      94             :     std::vector<CADAttrib> blockAttributes; // Attributes of block reference this geometry is attached to.
      95             : 
      96             :     std::vector<std::string>    asEED;
      97             :     enum GeometryType geometryType;
      98             :     double            m_thickness;
      99             :     RGBColor          geometry_color;
     100             : };
     101             : 
     102             : /**
     103             :  * @brief Geometry class which represents Unhandled geometry (means that library can't read it yet)
     104             :  */
     105             : class CADUnknown : public CADGeometry
     106             : {
     107             : public:
     108             :     CADUnknown();
     109           0 :     virtual ~CADUnknown(){}
     110             : 
     111             :     virtual void print() const override;
     112             :     void         transform( const Matrix& matrix ) override;
     113             : };
     114             : 
     115             : /**
     116             :  * @brief Geometry class which a single Point
     117             :  */
     118             : class OCAD_EXTERN CADPoint3D : public CADGeometry
     119             : {
     120             : public:
     121             :     CADPoint3D();
     122             :     CADPoint3D( const CADVector& positionIn, double thicknessIn );
     123          27 :     virtual ~CADPoint3D(){}
     124             :     CADVector getPosition() const;
     125             :     void      setPosition( const CADVector& value );
     126             : 
     127             :     CADVector getExtrusion() const;
     128             :     void      setExtrusion( const CADVector& value );
     129             : 
     130             :     double getXAxisAng() const;
     131             :     void   setXAxisAng( double value );
     132             : 
     133             :     virtual void print() const override;
     134             :     virtual void transform( const Matrix& matrix ) override;
     135             : protected:
     136             :     CADVector position;
     137             :     CADVector extrusion;
     138             :     double    xAxisAng;
     139             : };
     140             : 
     141             : /**
     142             :  * @brief Geometry class which represents a simple Line
     143             :  */
     144             : class OCAD_EXTERN CADLine : public CADGeometry
     145             : {
     146             : public:
     147             :     CADLine();
     148             :     CADLine( const CADPoint3D& startIn, const CADPoint3D& endIn );
     149           2 :     virtual ~CADLine(){}
     150             :     CADPoint3D getStart() const;
     151             :     void       setStart( const CADPoint3D& value );
     152             : 
     153             :     CADPoint3D getEnd() const;
     154             :     void       setEnd( const CADPoint3D& value );
     155             : 
     156             :     virtual void print() const override;
     157             :     virtual void transform( const Matrix& matrix ) override;
     158             : protected:
     159             :     CADPoint3D start;
     160             :     CADPoint3D end;
     161             : };
     162             : 
     163             : /**
     164             :  * @brief Geometry class which represents Polyline 3D
     165             :  */
     166             : class OCAD_EXTERN CADPolyline3D : public CADGeometry
     167             : {
     168             : public:
     169             :     CADPolyline3D();
     170           0 :     virtual ~CADPolyline3D(){}
     171             :     void   addVertex( const CADVector& vertex );
     172             :     size_t getVertexCount() const;
     173             :     CADVector& getVertex( size_t index );
     174             : 
     175             :     virtual void print() const override;
     176             :     virtual void transform( const Matrix& matrix ) override;
     177             : protected:
     178             :     std::vector<CADVector> vertices;
     179             : };
     180             : 
     181             : /**
     182             :  * @brief Geometry class which represents LWPolyline
     183             :  */
     184             : 
     185             : class OCAD_EXTERN CADLWPolyline : public CADPolyline3D
     186             : {
     187             : public:
     188             :     CADLWPolyline();
     189           0 :     virtual ~CADLWPolyline(){}
     190             : 
     191             :     double getConstWidth() const;
     192             :     void   setConstWidth( double value );
     193             : 
     194             :     double getElevation() const;
     195             :     void   setElevation( double value );
     196             : 
     197             :     CADVector getVectExtrusion() const;
     198             :     void      setVectExtrusion( const CADVector& value );
     199             : 
     200             :     std::vector<std::pair<double, double> > getWidths() const;
     201             :     void  setWidths( const std::vector<std::pair<double, double> >& value );
     202             : 
     203             :     std::vector<double> getBulges() const;
     204             :     void           setBulges( const std::vector<double>& value );
     205             : 
     206             :     bool isClosed() const;
     207             :     void setClosed( bool state );
     208             : 
     209             :     virtual void print() const override;
     210             : protected:
     211             :     bool                          bClosed;
     212             :     double                        constWidth;
     213             :     double                        elevation;
     214             :     CADVector                     vectExtrusion;
     215             :     std::vector<double>                bulges;
     216             :     std::vector<std::pair<double, double> > widths; // Start & end.
     217             : };
     218             : 
     219             : /**
     220             :  * @brief Geometry class which represents Circle
     221             :  */
     222             : class OCAD_EXTERN CADCircle : public CADPoint3D
     223             : {
     224             : public:
     225             :     CADCircle();
     226           7 :     virtual ~CADCircle(){}
     227             : 
     228             :     double getRadius() const;
     229             :     void   setRadius( double value );
     230             : 
     231             :     virtual void print() const override;
     232             : protected:
     233             :     double radius;
     234             : };
     235             : 
     236             : /**
     237             :  * @brief Geometry class which represents Text
     238             :  */
     239             : class OCAD_EXTERN CADText : public CADPoint3D
     240             : {
     241             : public:
     242             :     CADText();
     243          15 :     virtual ~CADText(){}
     244             : 
     245             :     std::string getTextValue() const;
     246             :     void   setTextValue( const std::string& value );
     247             : 
     248             :     double getHeight() const;
     249             :     void   setHeight( double value );
     250             : 
     251             :     double getRotationAngle() const;
     252             :     void   setRotationAngle( double value );
     253             : 
     254             :     double getObliqueAngle() const;
     255             :     void   setObliqueAngle( double value );
     256             : 
     257             :     virtual void print() const override;
     258             : protected:
     259             :     double obliqueAngle;
     260             :     double rotationAngle;
     261             :     double height;
     262             :     std::string textValue;
     263             : };
     264             : 
     265             : /**
     266             :  * @brief Geometry class which represents Arc
     267             :  */
     268             : class OCAD_EXTERN CADArc : public CADCircle
     269             : {
     270             : public:
     271             :     CADArc();
     272           1 :     virtual ~CADArc(){}
     273             : 
     274             :     double getStartingAngle() const;
     275             :     void   setStartingAngle( double value );
     276             : 
     277             :     double getEndingAngle() const;
     278             :     void   setEndingAngle( double value );
     279             : 
     280             :     virtual void print() const override;
     281             : protected:
     282             :     double startingAngle;
     283             :     double endingAngle;
     284             : };
     285             : 
     286             : /**
     287             :  * @brief Geometry class which represents Ellipse
     288             :  */
     289             : class OCAD_EXTERN CADEllipse : public CADArc
     290             : {
     291             : public:
     292             :     CADEllipse();
     293           2 :     virtual ~CADEllipse(){}
     294             : 
     295             :     double getAxisRatio() const;
     296             :     void   setAxisRatio( double value );
     297             : 
     298             :     CADVector getSMAxis();
     299             :     void      setSMAxis( const CADVector& vectSMA );
     300             : 
     301             :     virtual void print() const override;
     302             : protected:
     303             :     CADVector vectSMAxis;
     304             :     double    axisRatio;
     305             : };
     306             : 
     307             : /**
     308             :  * @brief Geometry class which represents Spline
     309             :  */
     310             : class OCAD_EXTERN CADSpline : public CADGeometry
     311             : {
     312             : public:
     313             :     CADSpline();
     314           0 :     virtual ~CADSpline(){}
     315             : 
     316             :     long getScenario() const;
     317             :     void setScenario( long value );
     318             : 
     319             :     bool isRational() const;
     320             :     void setRational( bool value );
     321             : 
     322             :     bool isClosed() const;
     323             :     void setClosed( bool value );
     324             : 
     325             :     std::vector<CADVector>& getControlPoints();
     326             :     std::vector<CADVector>& getFitPoints();
     327             :     std::vector<double>   & getControlPointsWeights();
     328             : 
     329             :     void addControlPointsWeight( double p_weight );
     330             :     void addControlPoint( const CADVector& point );
     331             :     void addFitPoint( const CADVector& point );
     332             : 
     333             :     bool getWeight() const;
     334             :     void setWeight( bool value );
     335             : 
     336             :     double getFitTolerance() const;
     337             :     void   setFitTolerance( double value );
     338             : 
     339             :     long getDegree() const;
     340             :     void setDegree( long value );
     341             : 
     342             :     virtual void print() const override;
     343             :     virtual void transform( const Matrix& matrix ) override;
     344             : protected:
     345             :     long   scenario;
     346             :     bool   rational;
     347             :     bool   closed;
     348             :     bool   weight;
     349             :     double fitTolerance;
     350             :     long   degree;
     351             : 
     352             :     std::vector<double>    ctrlPointsWeight;
     353             :     std::vector<CADVector> avertCtrlPoints;
     354             :     std::vector<CADVector> averFitPoints;
     355             : };
     356             : 
     357             : /**
     358             :  * @brief Geometry class which represents Solid
     359             :  */
     360             : class OCAD_EXTERN CADSolid : public CADPoint3D
     361             : {
     362             : public:
     363             :     CADSolid();
     364           0 :     virtual ~CADSolid(){}
     365             : 
     366             :     double getElevation() const;
     367             :     void   setElevation( double value );
     368             :     void   addCorner( const CADVector& corner );
     369             :     std::vector<CADVector> getCorners();
     370             : 
     371             :     virtual void print() const override;
     372             :     virtual void transform( const Matrix& matrix ) override;
     373             : protected:
     374             :     double            elevation;
     375             :     std::vector<CADVector> avertCorners;
     376             : };
     377             : 
     378             : /**
     379             :  * @brief Geometry class which represents Ray
     380             :  */
     381             : class OCAD_EXTERN CADRay : public CADPoint3D
     382             : {
     383             : public:
     384             :     CADRay();
     385           0 :     virtual ~CADRay(){}
     386             : 
     387             :     CADVector getVectVector() const;
     388             :     void      setVectVector( const CADVector& value );
     389             : 
     390             :     virtual void print() const override;
     391             : };
     392             : 
     393             : /**
     394             :  * @brief Geometry class which represents Hatch
     395             :  */
     396             : class OCAD_EXTERN CADHatch : public CADGeometry
     397             : {
     398             : public:
     399             :     CADHatch();
     400             :     virtual ~CADHatch(){}
     401             : };
     402             : 
     403             : /**
     404             :  * @brief Geometry class which represents Image (Raster Image)
     405             :  */
     406             : class OCAD_EXTERN CADImage : public CADGeometry
     407             : {
     408             : public:
     409             :     /**
     410             :      * @brief enum which describes in which units Image resolutions is present
     411             :      */
     412             :     enum ResolutionUnit
     413             :     {
     414             :         NONE = 0, CENTIMETER = 2, INCH = 5
     415             :     };
     416             : 
     417           0 :     static bool IsValidResolutionUnit(int nVal)
     418             :     {
     419           0 :         return nVal == ResolutionUnit::NONE ||
     420           0 :                nVal == ResolutionUnit::CENTIMETER ||
     421           0 :                nVal == ResolutionUnit::INCH;
     422             :     }
     423             : 
     424             :     CADImage();
     425           0 :     virtual ~CADImage(){}
     426             : 
     427             :     CADVector getVertInsertionPoint() const;
     428             :     void      setVertInsertionPoint( const CADVector& value );
     429             : 
     430             :     CADVector getImageSize() const;
     431             :     void      setImageSize( const CADVector& value );
     432             : 
     433             :     CADVector getImageSizeInPx() const;
     434             :     void      setImageSizeInPx( const CADVector& value );
     435             : 
     436             :     CADVector getPixelSizeInACADUnits() const;
     437             :     void      setPixelSizeInACADUnits( const CADVector& value );
     438             : 
     439             :     short getClippingBoundaryType() const;
     440             :     void  setClippingBoundaryType( short value );
     441             : 
     442             :     enum ResolutionUnit getResolutionUnits() const;
     443             :     void                setResolutionUnits( enum ResolutionUnit value );
     444             : 
     445             :     std::string getFilePath() const;
     446             :     void   setFilePath( const std::string& value );
     447             : 
     448             :     void setOptions( bool transparency, bool clip, unsigned char brightness,
     449             :                      unsigned char contrast );
     450             : 
     451             :     void addClippingPoint( const CADVector& pt );
     452             : 
     453             :     virtual void print() const override;
     454             :     virtual void transform( const Matrix& matrix ) override;
     455             : protected:
     456             :     CADVector     vertInsertionPoint;
     457             :     //CADVector vectUDirection;
     458             :     //CADVector vectVDirection;
     459             :     CADVector     imageSize;
     460             :     //bool bShow;
     461             :     //bool bShowWhenNotAlignedWithScreen;
     462             :     //bool bUseClippingBoundary;
     463             :     bool          bTransparency;
     464             :     bool          bClipping;
     465             :     unsigned char dBrightness;
     466             :     unsigned char dContrast;
     467             :     //char dFade;
     468             : 
     469             :     CADVector           imageSizeInPx;
     470             :     std::string         filePath;
     471             :     //bool bIsLoaded;
     472             :     enum ResolutionUnit resolutionUnits;
     473             :     //unsigned char       resolutionUnit; // 0 == none, 2 == centimeters, 5 == inches;
     474             :     CADVector           pixelSizeInACADUnits;
     475             : 
     476             :     short clippingBoundaryType; // 1 == rect, 2 == polygon
     477             :     std::vector<CADVector> avertClippingPolygon;
     478             : };
     479             : 
     480             : /**
     481             :  * @brief Geometry class which represents MText
     482             :  */
     483             : class OCAD_EXTERN CADMText : public CADText
     484             : {
     485             : public:
     486             :     CADMText();
     487           4 :     virtual ~CADMText(){}
     488             : 
     489             :     double getRectWidth() const;
     490             :     void   setRectWidth( double value );
     491             : 
     492             :     double getExtents() const;
     493             :     void   setExtents( double value );
     494             : 
     495             :     double getExtentsWidth() const;
     496             :     void   setExtentsWidth( double value );
     497             : 
     498             :     virtual void print() const override;
     499             : protected:
     500             :     double rectWidth;
     501             :     double extents;
     502             :     double extentsWidth;
     503             :     // TODO: do we need this here?
     504             :     //short dDrawingDir;
     505             :     //short dLineSpacingStyle;
     506             :     //short dLineSpacingFactor;
     507             :     //long dBackgroundFlags; // R2004+
     508             :     //long dBackgroundScaleFactor;
     509             :     //short dBackgroundColor;
     510             :     //long dBackgroundTransparency;
     511             : };
     512             : 
     513             : /**
     514             :  * @brief Geometry class which represents 3DFace
     515             :  */
     516             : class OCAD_EXTERN CADFace3D : public CADGeometry
     517             : {
     518             : public:
     519             :     CADFace3D();
     520           0 :     virtual ~CADFace3D(){}
     521             : 
     522             :     void      addCorner( const CADVector& corner );
     523             :     CADVector getCorner( size_t index );
     524             : 
     525             :     short getInvisFlags() const;
     526             :     void  setInvisFlags( short value );
     527             : 
     528             :     virtual void print() const override;
     529             :     virtual void transform( const Matrix& matrix ) override;
     530             : protected:
     531             :     std::vector<CADVector> avertCorners;
     532             :     short             invisFlags;
     533             : };
     534             : 
     535             : /**
     536             :  * @brief Geometry class which represents Polyline (PFace)
     537             :  */
     538             : class OCAD_EXTERN CADPolylinePFace : public CADGeometry
     539             : {
     540             : public:
     541             :     CADPolylinePFace();
     542           0 :     virtual ~CADPolylinePFace(){}
     543             : 
     544             :     void addVertex( const CADVector& vertex );
     545             : 
     546             :     virtual void print() const override;
     547             :     virtual void transform( const Matrix& matrix ) override;
     548             : protected:
     549             :     std::vector<CADVector> vertices;
     550             : };
     551             : 
     552             : /**
     553             :  * @brief Geometry class which represents XLine
     554             :  */
     555             : class OCAD_EXTERN CADXLine : public CADRay
     556             : {
     557             : public:
     558             :     CADXLine();
     559           0 :     virtual ~CADXLine(){}
     560             : 
     561             :     virtual void print() const override;
     562             : };
     563             : 
     564             : /**
     565             :  * @brief Geometry class which represents MLine
     566             :  */
     567             : class OCAD_EXTERN CADMLine : public CADPoint3D
     568             : {
     569             : public:
     570             :     CADMLine();
     571           0 :     virtual ~CADMLine(){}
     572             : 
     573             :     double getScale() const;
     574             :     void   setScale( double value );
     575             : 
     576             :     bool isOpened() const;
     577             :     void setOpened( bool value );
     578             : 
     579             :     void addVertex( const CADVector& vertex );
     580             : 
     581             :     virtual void print() const override;
     582             :     virtual void transform( const Matrix& matrix ) override;
     583             : protected:
     584             :     double            scale;
     585             :     //char dJust;
     586             :     bool              opened; // 1 == open, 0 == close
     587             :     // TODO: do we need more properties here?
     588             :     std::vector<CADVector> avertVertices;
     589             : };
     590             : 
     591             : /**
     592             :  * @brief Geometry class which represents Attribute
     593             :  */
     594             : class OCAD_EXTERN CADAttrib : public CADText
     595             : {
     596             : public:
     597             :     CADAttrib();
     598           5 :     virtual ~CADAttrib(){}
     599             : 
     600             :     double getElevation() const;
     601             :     void   setElevation( double );
     602             : 
     603             :     std::string getTag() const;
     604             :     void   setTag( const std::string& );
     605             : 
     606             :     CADVector getAlignmentPoint() const;
     607             :     void      setAlignmentPoint( const CADVector& );
     608             : 
     609             :     bool isPositionLocked() const;
     610             :     void setPositionLocked( bool );
     611             : 
     612             :     virtual void print() const override;
     613             :     virtual void transform( const Matrix& matrix ) override;
     614             : protected:
     615             :     CADVector vertAlignmentPoint;
     616             :     double    dfElevation;
     617             :     std::string    sTag;
     618             :     bool      bLockPosition;
     619             : };
     620             : 
     621             : /**
     622             :  * @brief Geometry class which represents Attribute definition
     623             :  */
     624             : class OCAD_EXTERN CADAttdef : public CADAttrib
     625             : {
     626             : public:
     627             :     CADAttdef();
     628          10 :     virtual ~CADAttdef(){}
     629             : 
     630             :     std::string getPrompt() const;
     631             :     void   setPrompt( const std::string& );
     632             : 
     633             :     virtual void print() const override;
     634             : protected:
     635             :     std::string sPrompt;
     636             : };
     637             : 
     638             : //class EXTERN LineType
     639             : //{
     640             : //public:
     641             : //    std::string sEntryName;
     642             : //    std::string sDescription;
     643             : //    double dfPatternLen;
     644             : //    char dAlignment;
     645             : //    char nNumDashes;
     646             : //    struct Dash
     647             : //    {
     648             : //        double dfLength;
     649             : //        short dComplexShapecode;
     650             : //        double dfXOffset;
     651             : //        double dfYOffset;
     652             : //        double dfScale;
     653             : //        double dfRotation;
     654             : //        short dShapeflag;
     655             : //    };
     656             : //    std::vector < char > abyTextArea; // TODO: what is it?
     657             : //    std::vector < CADHandle > hShapefiles; // TODO: one for each dash?
     658             : //};
     659             : 
     660             : //class EXTERN Block
     661             : //{
     662             : //public:
     663             : //    Block(CADFile * pCADFile)
     664             : //    {
     665             : //        pstCADFile_m = pCADFile;
     666             : //    }
     667             : //
     668             : //    std::string sBlockName;
     669             : //
     670             : //    CADFile * pstCADFile_m;
     671             : //
     672             : //    std::vector < std::pair < long long, short > > astAttachedGeometries;
     673             : //};
     674             : 
     675             : 
     676             : #endif // CADGEOMETRIES_H

Generated by: LCOV version 1.14