zjf
2023-03-06 392b76515f40376b6d36f40a114850ef63650384
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
/////////////////////////////////////////////////////////////////////////////// 
// Copyright (C) 2002-2016, Open Design Alliance (the "Alliance"). 
// All rights reserved. 
// 
// This software and its documentation and related materials are owned by 
// the Alliance. The software may only be incorporated into application 
// programs owned by members of the Alliance, subject to a signed 
// Membership Agreement and Supplemental Software License Agreement with the
// Alliance. The structure and organization of this software are the valuable  
// trade secrets of the Alliance and its suppliers. The software is also 
// protected by copyright law and international treaty provisions. Application  
// programs incorporating this software must include the following statement 
// with their copyright notices:
//   
//   This application incorporates Teigha(R) software pursuant to a license 
//   agreement with Open Design Alliance.
//   Teigha(R) Copyright (C) 2002-2016 by Open Design Alliance. 
//   All rights reserved.
//
// By use of this software, its documentation or related materials, you 
// acknowledge and accept the above terms.
///////////////////////////////////////////////////////////////////////////////
 
#ifndef _ODGIFASTEXTCALC_INCLUDED_
#define _ODGIFASTEXTCALC_INCLUDED_
 
#include "Gi/GiBaseVectorizer.h"
#include "Gi/GiTransformed.h"
#include "OdStack.h"
 
#include "TD_PackPush.h"
 
/** \details
    This class is an implementation of the subWorldDraw() framework to quickly calculate the WCS extents of an OdGiDrawable object.
    \remarks
    This class is the same as OdGiExtCalc, but calculates the extents with lower precision to improve speed.
    Library: TD_Gi
    <group OdGi_Classes>
*/
class ODGI_EXPORT ODRX_ABSTRACT OdGiFastExtCalc : public OdGiTransformed<OdGiWorldDrawImpl>
{
  typedef OdGeExtents3d Extents;
  OdGeExtents3d         m_worldExt;
  OdStack<Extents>      m_extStack;
  OdGeExtents3d*        m_pCurrExt;
 
  enum Flags
  {
    kSetExtentsCalledFlag     = 1,
    kDrawInvisiblesFlag       = 2,
    kDrawInvisiblesNestedFlag = 4,
    kDrawingInitiatedFlag     = 8
  };
  OdUInt8               m_flags;
 
  void setSetExtentsCalled(bool bSet);
  bool isSetExtentsCalled() const;
 
  void setDrawingInitiated(bool bSet);
  bool isDrawingInitiated() const;
 
  void addTextExtents(
    const OdGePoint3d& locExtMin,
    const OdGePoint3d& locExtMax,
    const OdGePoint3d& position,
    const OdGeVector3d& normal,
    const OdGeVector3d& direction);
protected:
  ODRX_USING_HEAP_OPERATORS(OdGiTransformed<OdGiWorldDrawImpl>);
 
  OdGiFastExtCalc();
public:
 
  /** \details
    Resets the accumulated extents for the OdGiDrawable object associated with this Vectorization object.
  */
  void resetExtents();
  
  /** \details
    Returns the accumulated extents for the OdGiDrawable object associated with this Vectorization object.
    \param extents [out]  Receives the extents.
  */
  void getExtents(OdGeExtents3d& extents) const;
 
  /** \details
    Sets whether invisible entities will be drawn.
    \param bSet [in]  true - to draw invisible entities, false - do not draw.
  */
  void setDrawInvisible(bool bSet);
 
  /** \details
    Returns whether invisible entities are to be drawn.
  */
  bool isDrawInvisible() const;
 
  /** \details
    Sets whether invisible nested entities will be drawn.
    \param bSet [in]  true - to draw invisible nested entities, false - do not draw.
  */
  void setDrawInvisibleNested(bool bSet);
 
  /** \details
    Returns whether invisible nested entities are to be drawn.
  */
  bool isDrawInvisibleNested() const;
 
  /** \details
    Resets flag which is set after first draw call. This flag informs extents calculator that nested
    entities draw.
  */
  void resetFirstDrawFlag();
 
  /////////////////////////////////////////////////////////////////////////////
  // OdGiCommonDraw Overrides
 
  bool regenAbort() const;
  double deviation(const OdGiDeviationType deviationType, const OdGePoint3d& pointOnCurve) const;
  OdGiRegenType regenType() const;
 
   /////////////////////////////////////////////////////////////////////////////
  // OdGiGeometry Overrides
 
  void circle(const OdGePoint3d& center, double radius, const OdGeVector3d& normal);
 
  void circle(const OdGePoint3d& firstPoint, const OdGePoint3d& secondPoint, const OdGePoint3d& thirdPoint);
 
  void circularArc(const OdGePoint3d& center,
    double radius,
    const OdGeVector3d& normal,
    const OdGeVector3d& startVector,
    double sweepAngle,
    OdGiArcType arcType = kOdGiArcSimple);
 
  void circularArc(const OdGePoint3d& firstPoint,
    const OdGePoint3d& secondPoint,
    const OdGePoint3d& thirdPoint,
    OdGiArcType arcType = kOdGiArcSimple);
 
  void polyline(OdInt32 numVertices,
    const OdGePoint3d* vertexList,
    const OdGeVector3d* pNormal = 0,
    OdGsMarker baseSubEntMarker = -1);
 
  void polygon(OdInt32 numVertices, const OdGePoint3d* vertexList);
 
  void pline(const OdGiPolyline& polyline, OdUInt32 fromIndex = 0, OdUInt32 numSegs = 0);
 
 
  /** \details
    Introduces a shape into this vectorization context.
    
    \param position [in]  Position of the shape.
    \param shapeNumber [in]  Shape number.
    \param pTextStyle [in]  Pointer to the TextStyle for the shape.
    \param direction [in]  Baseline direction for the shape.
    \param normal [in]  Normal vector.
  */
  void shape(const OdGePoint3d& position,
    const OdGeVector3d& normal, const OdGeVector3d& direction,
    int shapeNumber, const OdGiTextStyle* pTextStyle);
 
  void text(const OdGePoint3d& position,
    const OdGeVector3d& normal, const OdGeVector3d& direction,
    double height, double width, double oblique, const OdString& msg);
 
  void text(const OdGePoint3d& position,
    const OdGeVector3d& normal, const OdGeVector3d& direction,
    const OdChar* msg, OdInt32 length, bool raw, const OdGiTextStyle* pTextStyle);
 
 
  void xline(const OdGePoint3d& firstPoint, const OdGePoint3d& secondPoint);
 
  void ray(const OdGePoint3d& basePoint, const OdGePoint3d& throughPoint );
 
  void nurbs(const OdGeNurbCurve3d& nurbsCurve);
 
  void ellipArc(const OdGeEllipArc3d& ellipArc,
    const OdGePoint3d* endPointsOverrides = 0,
    OdGiArcType arcType = kOdGiArcSimple);
 
  void mesh(OdInt32 numRows,
    OdInt32 numColumns,
    const OdGePoint3d* vertexList,
    const OdGiEdgeData* pEdgeData = 0,
    const OdGiFaceData* pFaceData = 0,
    const OdGiVertexData* pVertexData = 0);
 
  void shell(OdInt32 numVertices,
    const OdGePoint3d* vertexList,
    OdInt32 faceListSize,
    const OdInt32* faceList,
    const OdGiEdgeData* pEdgeData = 0,
    const OdGiFaceData* pFaceData = 0,
    const OdGiVertexData* pVertexData = 0);
 
  void worldLine(const OdGePoint3d points[2]);
 
  void image(const OdGiImageBGRA32& img,
    const OdGePoint3d& origin,
    const OdGeVector3d& uVec,
    const OdGeVector3d& vVec,
    OdGiRasterImage::TransparencyMode trpMode = OdGiRasterImage::kTransparency8Bit);
 
  void edge(const OdGiEdge2dArray& edges);
 
  void polypoint(OdInt32 numPoints, const OdGePoint3d* vertexList, const OdCmEntityColor* pColors, const OdCmTransparency* pTransparency,
                 const OdGeVector3d* pNormals, const OdGsMarker* pSubEntMarkers, OdInt32 nPointSize);
 
  void rowOfDots(OdInt32 numPoints, const OdGePoint3d& startPoint, const OdGeVector3d& dirToNextPoint);
 
  void setExtents(const OdGePoint3d *newExtents);
 
  void pushClipBoundary(OdGiClipBoundary* pBoundary);
  void popClipBoundary();
 
  void pushModelTransform(const OdGeMatrix3d& xfm);
  void popModelTransform();
 
  void draw(const OdGiDrawable* pDrawable);
};
 
inline void OdGiFastExtCalc::setSetExtentsCalled(bool bSet)
{
  SETBIT(m_flags, kSetExtentsCalledFlag, bSet);
}
 
inline bool OdGiFastExtCalc::isSetExtentsCalled() const
{
  return GETBIT(m_flags, kSetExtentsCalledFlag);
}
 
inline void OdGiFastExtCalc::setDrawingInitiated(bool bSet)
{
  SETBIT(m_flags, kDrawingInitiatedFlag, bSet);
}
 
inline bool OdGiFastExtCalc::isDrawingInitiated() const
{
  return GETBIT(m_flags, kDrawingInitiatedFlag);
}
 
inline void OdGiFastExtCalc::setDrawInvisible(bool bSet)
{
  SETBIT(m_flags, kDrawInvisiblesFlag, bSet);
}
 
inline bool OdGiFastExtCalc::isDrawInvisible() const
{
  return GETBIT(m_flags, kDrawInvisiblesFlag);
}
 
inline void OdGiFastExtCalc::setDrawInvisibleNested(bool bSet)
{
  SETBIT(m_flags, kDrawInvisiblesNestedFlag, bSet);
}
 
inline bool OdGiFastExtCalc::isDrawInvisibleNested() const
{
  return GETBIT(m_flags, kDrawInvisiblesNestedFlag);
}
 
inline void OdGiFastExtCalc::resetFirstDrawFlag()
{
  m_flags &= ~kDrawingInitiatedFlag;
}
 
#include "TD_PackPop.h"
 
#endif // #ifndef _ODGIFASTEXTCALC_INCLUDED_