blob: 949b58bf3ad4b8799d7eb7918af000ee4203a3ac [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef _DXFENTRD_HXX
#define _DXFENTRD_HXX
#include <dxfgrprd.hxx>
#include <dxfvec.hxx>
#include <deque>
typedef std::deque< Point > DXFPointArray;
//------------------------------------------------------------------------------
//------------------------- Art eines Entity -----------------------------------
//------------------------------------------------------------------------------
enum DXFEntityType {
DXF_LINE,
DXF_POINT,
DXF_CIRCLE,
DXF_ARC,
DXF_TRACE,
DXF_SOLID,
DXF_TEXT,
DXF_SHAPE,
DXF_INSERT,
DXF_ATTDEF,
DXF_ATTRIB,
DXF_POLYLINE,
DXF_VERTEX,
DXF_SEQEND,
DXF_3DFACE,
DXF_DIMENSION,
DXF_LWPOLYLINE,
DXF_HATCH
};
//------------------------------------------------------------------------------
//---------------------- Basisklasse fuer ein Entity ---------------------------
//------------------------------------------------------------------------------
class DXFBasicEntity {
public:
DXFBasicEntity * pSucc;
// Zeiger auf naechstes Entity (in der Liste DXFEntities.pFirst)
DXFEntityType eType;
// Art des Entitys (Linie oder Kreis oder was)
// Eigenschaftenm, die alle Entities besitzen, jeweils
// durch den Gruppencode kommentiert:
char sLayer[DXF_MAX_STRING_LEN+1]; // 8
char sLineType[DXF_MAX_STRING_LEN+1]; // 6
double fElevation; // 38
double fThickness; // 39
long nColor; // 62
long nSpace; // 67
DXFVector aExtrusion; // 210,220,230
protected:
DXFBasicEntity(DXFEntityType eThisType);
// Konstruktoren der Entities initialiseren immer mit Defaultwerten.
public:
virtual ~DXFBasicEntity();
virtual void Read(DXFGroupReader & rDGR);
// Liest die Prameter ein, bis zur naechten 0-Gruppe
protected:
virtual void EvaluateGroup(DXFGroupReader & rDGR);
// Diese Methode wird durch Read() fuer jeden Parameter (bzw. fuer jede
// Gruppe) aufgerufen.
// Sofern der Gruppencode dem Entity bekannt ist, wird der entsprechende
// Parameter geholt.
};
//------------------------------------------------------------------------------
//---------------- die verschiedenen Arten von Entyties ------------------------
//------------------------------------------------------------------------------
//--------------------------Line------------------------------------------------
class DXFLineEntity : public DXFBasicEntity {
public:
DXFVector aP0; // 10,20,30
DXFVector aP1; // 11,21,31
DXFLineEntity();
protected:
virtual void EvaluateGroup(DXFGroupReader & rDGR);
};
//--------------------------Point-----------------------------------------------
class DXFPointEntity : public DXFBasicEntity {
public:
DXFVector aP0; // 10,20,30
DXFPointEntity();
protected:
virtual void EvaluateGroup(DXFGroupReader & rDGR);
};
//--------------------------Circle----------------------------------------------
class DXFCircleEntity : public DXFBasicEntity {
public:
DXFVector aP0; // 10,20,30
double fRadius; // 40
DXFCircleEntity();
protected:
virtual void EvaluateGroup(DXFGroupReader & rDGR);
};
//--------------------------Arc-------------------------------------------------
class DXFArcEntity : public DXFBasicEntity {
public:
DXFVector aP0; // 10,20,30
double fRadius; // 40
double fStart; // 50
double fEnd; // 51
DXFArcEntity();
protected:
virtual void EvaluateGroup(DXFGroupReader & rDGR);
};
//--------------------------Trace-----------------------------------------------
class DXFTraceEntity : public DXFBasicEntity {
public:
DXFVector aP0; // 10,20,30
DXFVector aP1; // 11,21,31
DXFVector aP2; // 12,22,32
DXFVector aP3; // 13,23,33
DXFTraceEntity();
protected:
virtual void EvaluateGroup(DXFGroupReader & rDGR);
};
//--------------------------Solid-----------------------------------------------
class DXFSolidEntity : public DXFBasicEntity {
public:
DXFVector aP0; // 10,20,30
DXFVector aP1; // 11,21,31
DXFVector aP2; // 12,22,32
DXFVector aP3; // 13,23,33
DXFSolidEntity();
protected:
virtual void EvaluateGroup(DXFGroupReader & rDGR);
};
//--------------------------Text------------------------------------------------
class DXFTextEntity : public DXFBasicEntity {
public:
DXFVector aP0; // 10,20,30
double fHeight; // 40
char sText[DXF_MAX_STRING_LEN+1]; // 1
double fRotAngle; // 50
double fXScale; // 41
double fOblAngle; // 42
char sStyle[DXF_MAX_STRING_LEN+1]; // 7
long nGenFlags; // 71
long nHorzJust; // 72
long nVertJust; // 73
DXFVector aAlign; // 11,21,31
DXFTextEntity();
protected:
virtual void EvaluateGroup(DXFGroupReader & rDGR);
};
//--------------------------Shape-----------------------------------------------
class DXFShapeEntity : public DXFBasicEntity {
public:
DXFVector aP0; // 10,20,30
double fSize; // 40
char sName[DXF_MAX_STRING_LEN+1]; // 2
double fRotAngle; // 50
double fXScale; // 41
double fOblAngle; // 51
DXFShapeEntity();
protected:
virtual void EvaluateGroup(DXFGroupReader & rDGR);
};
//--------------------------Insert----------------------------------------------
class DXFInsertEntity : public DXFBasicEntity {
public:
long nAttrFlag; // 66
char sName[DXF_MAX_STRING_LEN+1]; // 2
DXFVector aP0; // 10,20,30
double fXScale; // 41
double fYScale; // 42
double fZScale; // 43
double fRotAngle; // 50
long nColCount; // 70
long nRowCount; // 71
double fColSpace; // 44
double fRowSpace; // 45
DXFInsertEntity();
protected:
virtual void EvaluateGroup(DXFGroupReader & rDGR);
};
//--------------------------AttDef----------------------------------------------
class DXFAttDefEntity : public DXFBasicEntity {
public:
DXFVector aP0; // 10,20,30
double fHeight; // 40
char sDefVal[DXF_MAX_STRING_LEN+1]; // 1
char sPrompt[DXF_MAX_STRING_LEN+1]; // 3
char sTagStr[DXF_MAX_STRING_LEN+1]; // 2
long nAttrFlags; // 70
long nFieldLen; // 73
double fRotAngle; // 50
double fXScale; // 41
double fOblAngle; // 51
char sStyle[DXF_MAX_STRING_LEN+1]; // 7
long nGenFlags; // 71
long nHorzJust; // 72
long nVertJust; // 74
DXFVector aAlign; // 11,21,31
DXFAttDefEntity();
protected:
virtual void EvaluateGroup(DXFGroupReader & rDGR);
};
//--------------------------Attrib----------------------------------------------
class DXFAttribEntity : public DXFBasicEntity {
public:
DXFVector aP0; // 10,20,30
double fHeight; // 40
char sText[DXF_MAX_STRING_LEN+1]; // 1
char sTagStr[DXF_MAX_STRING_LEN+1]; // 2
long nAttrFlags; // 70
long nFieldLen; // 73
double fRotAngle; // 50
double fXScale; // 41
double fOblAngle; // 51
char sStyle[DXF_MAX_STRING_LEN+1]; // 7
long nGenFlags; // 71
long nHorzJust; // 72
long nVertJust; // 74
DXFVector aAlign; // 11,21,31
DXFAttribEntity();
protected:
virtual void EvaluateGroup(DXFGroupReader & rDGR);
};
//--------------------------PolyLine--------------------------------------------
class DXFPolyLineEntity : public DXFBasicEntity {
public:
double fElevation; // 30
long nFlags; // 70
double fSWidth; // 40
double fEWidth; // 41
long nMeshMCount; // 71
long nMeshNCount; // 72
long nMDensity; // 73
long nNDensity; // 74
long nCSSType; // 75
DXFPolyLineEntity();
protected:
virtual void EvaluateGroup(DXFGroupReader & rDGR);
};
class DXFLWPolyLineEntity : public DXFBasicEntity
{
sal_Int32 nIndex;
public :
sal_Int32 nCount; // 90
sal_Int32 nFlags; // 70 1 = closed, 128 = plinegen
double fConstantWidth; // 43 (optional - default: 0, not used if fStartWidth and/or fEndWidth is used)
double fStartWidth; // 40
double fEndWidth; // 41
DXFVector* pP;
DXFLWPolyLineEntity();
~DXFLWPolyLineEntity();
protected :
virtual void EvaluateGroup( DXFGroupReader & rDGR );
};
//-------------------------- Hatch ---------------------------------------------
struct DXFEdgeType
{
sal_Int32 nEdgeType;
virtual ~DXFEdgeType(){};
virtual sal_Bool EvaluateGroup( DXFGroupReader & /*rDGR*/ ){ return sal_True; };
protected :
DXFEdgeType( sal_Int32 EdgeType ):nEdgeType(EdgeType){};
};
struct DXFEdgeTypeLine : public DXFEdgeType
{
DXFVector aStartPoint; // 10,20
DXFVector aEndPoint; // 11,21
DXFEdgeTypeLine();
virtual ~DXFEdgeTypeLine();
virtual sal_Bool EvaluateGroup( DXFGroupReader & rDGR );
};
struct DXFEdgeTypeCircularArc : public DXFEdgeType
{
DXFVector aCenter; // 10,20
double fRadius; // 40
double fStartAngle; // 50
double fEndAngle; // 51
sal_Int32 nIsCounterClockwiseFlag; // 73
DXFEdgeTypeCircularArc();
virtual ~DXFEdgeTypeCircularArc();
virtual sal_Bool EvaluateGroup( DXFGroupReader & rDGR );
};
struct DXFEdgeTypeEllipticalArc : public DXFEdgeType
{
DXFVector aCenter; // 10,20
DXFVector aEndPoint; // 11,21
double fLength; // 40
double fStartAngle; // 50
double fEndAngle; // 51
sal_Int32 nIsCounterClockwiseFlag; // 73
DXFEdgeTypeEllipticalArc();
virtual ~DXFEdgeTypeEllipticalArc();
virtual sal_Bool EvaluateGroup( DXFGroupReader & rDGR );
};
struct DXFEdgeTypeSpline : public DXFEdgeType
{
sal_Int32 nDegree; // 94
sal_Int32 nRational; // 73
sal_Int32 nPeriodic; // 74
sal_Int32 nKnotCount; // 75
sal_Int32 nControlCount; // 76
DXFEdgeTypeSpline();
virtual ~DXFEdgeTypeSpline();
virtual sal_Bool EvaluateGroup( DXFGroupReader & rDGR );
};
typedef std::deque< DXFEdgeType* > DXFEdgeTypeArray;
struct DXFBoundaryPathData
{
sal_Int32 nFlags; // 92
sal_Int32 nHasBulgeFlag; // 72
sal_Int32 nIsClosedFlag; // 73
sal_Int32 nPointCount; // 93
double fBulge; // 42
sal_Int32 nSourceBoundaryObjects; // 97
sal_Int32 nEdgeCount; // 93
sal_Bool bIsPolyLine;
sal_Int32 nPointIndex;
DXFVector* pP;
DXFEdgeTypeArray aEdges;
DXFBoundaryPathData();
~DXFBoundaryPathData();
sal_Bool EvaluateGroup( DXFGroupReader & rDGR );
};
class DXFHatchEntity : public DXFBasicEntity
{
sal_Bool bIsInBoundaryPathContext;
sal_Int32 nCurrentBoundaryPathIndex;
public :
DXFVector aElevationPoint;
sal_Int32 nFlags; // 70 (solid fill = 1, pattern fill = 0)
sal_Int32 nAssociativityFlag; // 71 (assoiciative = 1, non-associative = 0)
sal_Int32 nBoundaryPathCount; // 91
sal_Int32 nHatchStyle; // 75 (odd parity = 0, outmost area = 1, entire area = 2 )
sal_Int32 nHatchPatternType; // 76 (user defined = 0, predefined = 1, custom = 2)
double fHatchPatternAngle; // 52 (pattern fill only)
double fHatchPatternScale; // 41 (pattern fill only:scale or spacing)
sal_Int32 nHatchDoubleFlag; // 77 (pattern fill only:double = 1, not double = 0)
sal_Int32 nHatchPatternDefinitionLines; // 78
double fPixelSize; // 47
sal_Int32 nNumberOfSeedPoints; // 98
DXFBoundaryPathData* pBoundaryPathData;
DXFHatchEntity();
~DXFHatchEntity();
protected :
virtual void EvaluateGroup( DXFGroupReader & rDGR );
};
//--------------------------Vertex----------------------------------------------
class DXFVertexEntity : public DXFBasicEntity {
public:
DXFVector aP0; // 10,20,30
double fSWidth; // 40 (Wenn <0.0, dann gilt DXFPolyLine::fSWidth)
double fEWidth; // 41 (Wenn <0.0, dann gilt DXFPolyLine::fEWidth)
double fBulge; // 42
long nFlags; // 70
double fCFTDir; // 50
DXFVertexEntity();
protected:
virtual void EvaluateGroup(DXFGroupReader & rDGR);
};
//--------------------------SeqEnd----------------------------------------------
class DXFSeqEndEntity : public DXFBasicEntity {
public:
DXFSeqEndEntity();
};
//--------------------------3DFace----------------------------------------------
class DXF3DFaceEntity : public DXFBasicEntity {
public:
DXFVector aP0; // 10,20,30
DXFVector aP1; // 11,21,31
DXFVector aP2; // 12,22,32
DXFVector aP3; // 13,23,33
long nIEFlags; // 70
DXF3DFaceEntity();
protected:
virtual void EvaluateGroup(DXFGroupReader & rDGR);
};
//--------------------------Dimension-------------------------------------------
class DXFDimensionEntity : public DXFBasicEntity {
public:
char sPseudoBlock[DXF_MAX_STRING_LEN+1]; // 2
DXFDimensionEntity();
protected:
virtual void EvaluateGroup(DXFGroupReader & rDGR);
};
//------------------------------------------------------------------------------
//----------- Eine Menge von Entities lesen und repraesentieren ----------------
//------------------------------------------------------------------------------
class DXFEntities {
public:
DXFEntities();
~DXFEntities();
DXFBasicEntity * pFirst; // Liste von Entities, READ ONLY!
void Read(DXFGroupReader & rDGR);
// Liest Entitis per rGDR aus einer DXF-Datei bis zu
// einem ENDBLK, ENDSEC oder EOF (der Gruppe 0).
// (Alle unbekannten Dinge werden uebersprungen)
void Clear();
// Loescht alle Entities
};
//------------------------------------------------------------------------------
//--------------------------------- inlines ------------------------------------
//------------------------------------------------------------------------------
inline DXFEntities::DXFEntities()
{
pFirst=NULL;
}
inline DXFEntities::~DXFEntities()
{
Clear();
}
#endif