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
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
/////////////////////////////////////////////////////////////////////////////// 
// 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 _ODDB_BASEDATABASE_INCLUDED_
#define _ODDB_BASEDATABASE_INCLUDED_
 
#include "RxObject.h"
#include "DbRootExport.h"
#include "OdFont.h"
#include "GiDefaultContext.h"
#include "Gs/Gs.h"
#include "Gi/GiLinetype.h"
#include "Ge/GeCurve2d.h"
#include "Ge/GeDoubleArray.h"
#include "Ge/GePoint2dArray.h"
#include "DbDate.h" // dgn dwf export
#include "OdUnitsFormatter.h"
#include "StringArray.h"
#include "DbHandle.h"
 
class OdDbBaseHostAppServices;
class OdGiAnnoScaleSet;
 
typedef OdRxObject OdDbBaseDatabase;
typedef OdRxObjectPtr OdDbBaseDatabasePtr;
 
/** \details
    This class is the base Protocol Extension class for database classes.
 
    \sa
    TD_DbRoot
    <group OdDbRoot_Classes> 
*/
class DBROOT_EXPORT OdDbBaseDatabasePE : public OdRxObject
{
public:
  ODRX_DECLARE_MEMBERS(OdDbBaseDatabasePE);
 
  enum ExtentsFlags
  {
    kZeroFlags      = 0,
    kExactExtents   = 1, //Zoom to extents exact to device/paper size w/o any margins if this flag is set
    kUseViewExtents = 2  //Use view extents instead of plot extents (default) for calculation of drawing extents if this flag is set
  };
 
  /** \details
      Returns the OdDbBaseHostAppServices object associated with this database object.
  */
  virtual OdDbBaseHostAppServices* appServices(OdDbBaseDatabase* pDb) const = 0;
 
  /** \details
      Returns the name of the file associated with this database object.
  */
  virtual OdString getFilename(OdDbBaseDatabase* pDb) const = 0;
 
  virtual void startTransaction(OdDbBaseDatabase* pDb) = 0;
  virtual void abortTransaction(OdDbBaseDatabase* pDb) = 0;
 
  virtual OdGiDefaultContextPtr createGiContext(OdDbBaseDatabase* pDb) const = 0;
 
  virtual void putNamedViewInfo(OdDbBaseDatabase* pDb, OdDbStub* layoutId, OdStringArray& names, OdGePoint3dArray& points) = 0;
  /** \details
  Creates a TextIterator object for the specified data.
 
  \param textString [in]  Text string to be parsed.
  \param length [in]  Length of string in bytes.
  \param raw [in]  If and only if true, character sequences in the form of %%c will be treated as raw text.
  \param codePageId [in]  Object ID of the Code Page of the text.
  \param pTextStyle [in]  Pointer to the TextStyle object associated with the specified text.
 
  \remarks
  Returns a SmartPointer to the new OdDbTextIterator object.
  */
  virtual OdBaseTextIteratorPtr createTextIterator(OdDbBaseDatabase* db, const OdChar* textString, int length, bool raw, const OdGiTextStyle* pTextStyle) const = 0;
  
  // setup Gs views in the device, according to the active database layout data
  virtual OdGsDevicePtr setupActiveLayoutViews(OdGsDevice* pDevice, OdGiDefaultContext* pGiCtx) = 0;
 
  // setup Gs views in the device, according to the specified database layout data
  virtual OdGsDevicePtr setupLayoutView(OdGsDevice* pDevice, OdGiDefaultContext* pGiCtx, OdDbStub* layoutId) = 0;
  
  // setup palette associated with the specified layout in the device.
  // palBg -- optionally specifies background color to write into palette
  // to overwrite default DB-palette color use non-zero value for alpha component of RGBA color
  virtual void setupPalette(OdGsDevice* device, OdGiDefaultContext* giContext, OdDbStub* layoutId = 0, ODCOLORREF palBg = ODRGBA(0,0,0,0)) = 0;
 
  // get next view according to the active layout
  virtual OdDbStub* getNextViewForActiveLayout(OdGiDefaultContext* pGiCtx, OdDbStub* /*objectId*/) = 0;
  
  // setup Gs device to display current layout using plot settings stored in it (paper rotation, scale etc.)
  // returns visible rectangle (measured in device units)
  virtual void applyLayoutSettings(OdGsDCRect& clipBox, OdGsDevice* pDevice, OdDbBaseDatabase* db, OdUInt32 extentsFlags = kZeroFlags) = 0;
  
  // setup Gs device to draw current layout zoomed to extents
  // warning: this function may throw exception, if overall viewport is not found
  // outputRect is desired printable area (in device units)
  virtual void zoomToExtents(const OdGsDCRect& outputRect, OdGsDevice* pDevice, OdDbBaseDatabase* db,
                             OdUInt32 extentsFlags = kZeroFlags, OdDbStub* objectId = NULL) = 0;
  
  virtual void loadPlotstyleTableForActiveLayout(OdGiDefaultContext* pDwgContext, OdDbBaseDatabase* db) = 0;
 
  virtual OdRxIteratorPtr layers(OdDbBaseDatabase* db) const = 0;
  virtual OdRxIteratorPtr visualStyles(OdDbBaseDatabase* db) const = 0;
 
  // Layout here is an abstraction that corresponds to "sheet" in sheet set manager, 
  //   "page" in PDF and DWF, "layout"+"block table record" in DWG
  inline OdRxObjectPtr currentLayout(OdDbBaseDatabase* pDb)
  {
    return openObject(currentLayoutId(pDb));
  }
 
  virtual void setCurrentLayout(OdDbBaseDatabase* db, const OdString& name) = 0;
 
  virtual OdRxIteratorPtr layouts(OdDbBaseDatabase* db) const = 0;
 
  // TODO do it inline (is special for DGN now)
  virtual OdRxObjectPtr getLayout(OdDbBaseDatabase* pDb, const OdString& name)
  {
    return openObject(findLayoutNamed(pDb, name));
  }
 
  inline OdRxObjectPtr findLayoutByViewport(OdDbBaseDatabase* db, OdDbStub* pViewportId)
  {
    return openObject(findLayoutIdByViewport(db, pViewportId));
  }
  virtual OdDbStub* findLayoutIdByViewport(OdDbBaseDatabase* db, OdDbStub* pViewportId) = 0;
 
  virtual OdDbStub* findLayoutNamed(OdDbBaseDatabase* db, const OdString& name) = 0; // dgn dwf export
 
  inline OdRxObjectPtr getFirstLayout(OdDbBaseDatabase* db)
  {
    return openObject(getFirstLayoutId(db));
  }
  virtual OdDbStub* getFirstLayoutId(OdDbBaseDatabase* db) = 0; // dgn dwf export
 
  virtual OdTimeStamp getCreationTime(OdDbBaseDatabase* db) = 0; // dgn dwf export
  virtual OdTimeStamp getUpdateTime(OdDbBaseDatabase* db) = 0; // dgn dwf export
  virtual OdString getFingerPrintGuid(OdDbBaseDatabase* db) = 0; // dgn dwf export
  virtual OdString getVersionGuid(OdDbBaseDatabase* db) = 0; // dgn dwf export
 
  virtual int getUnits(OdDbBaseDatabase* db) = 0; // dgn dwf export
  virtual OdUnitsFormatter* baseFormatter(OdDbBaseDatabase* db) = 0; // dgn dwg common formatter base class
  virtual int getMeasurement(OdDbBaseDatabase* db) = 0;
 
  virtual bool getLineTypeById( OdDbBaseDatabase* db, OdDbStub* pLTypeId, OdGiLinetype& LType ) = 0;
  virtual bool getTextStyleById( OdDbBaseDatabase* db, OdDbStub* idStyle, OdGiTextStyle& shapeInfo ) = 0;   
 
  virtual OdDbStub* getObject(OdDbBaseDatabase* db, OdUInt64 handle) = 0;
  virtual OdDbHandle getHandle(OdDbStub* id);
  virtual OdDbBaseDatabase* getDatabase(OdDbStub *id);
  virtual OdDbStub* getOwner(OdDbStub *id);
 
  virtual OdCodePageId getCodePage(OdDbBaseDatabase* db) = 0;
 
  virtual OdDbStub* getModelBlockId(OdDbBaseDatabase* pDb) = 0;
  virtual OdDbStub* getPaperBlockId(OdDbBaseDatabase* pDb) = 0;
  virtual OdDbStub* currentLayoutId(OdDbBaseDatabase* pDb) = 0;
  virtual OdDbStub* xrefBlockId(OdDbBaseDatabase* pDb) = 0;
 
  virtual void setMultiThreadedRender(OdDbBaseDatabase* pDb, bool bOn) = 0;
 
  virtual bool isAProxy(OdRxObject* pDrw) = 0;
  virtual OdRxObjectPtr openObject(OdDbStub* pId) = 0;
  virtual bool getAnnoScaleSet(OdDbStub* drawableId, OdGiAnnoScaleSet& res) = 0;
  virtual OdDbStub *getCurrentLongTransation(const OdDbBaseDatabase *pDb) = 0;
 
  class DatabaseUnloadReactor
  {
    public:
      virtual ~DatabaseUnloadReactor() { }
      virtual void goodbye(const OdDbBaseDatabase* pDb) = 0;
  };
  virtual OdRxObjectPtr addDatabaseUnloadReactor(OdDbBaseDatabase* pDb, OdRxObject *pPrevReactor, DatabaseUnloadReactor *pReactorRedirect) = 0;
  virtual void removeDatabaseUnloadReactor(OdDbBaseDatabase* pDb, OdRxObject *pReactor) = 0;
};
 
/** \details
    This template class is a specialization of the OdSmartPtr class for OdDbBaseDatabasePE object pointers.
*/
typedef OdSmartPtr<OdDbBaseDatabasePE> OdDbBaseDatabasePEPtr;
 
 
/** \details
  This class is the protocol extension to be used as a layer abstraction, 
  independent of the underlying database (OdDbDatabase or OdDgDatabase).
 
  \sa
  TD_DbRoot
 
  <group OdDbRoot_Classes> 
*/
class DBROOT_EXPORT OdDbBaseLayerPE : public OdRxObject
{
public:
  ODRX_DECLARE_MEMBERS(OdDbBaseLayerPE);
 
  /** \details
    Returns name of this Layer object.
 
    \param obj [in]  Layer object
  */
  virtual OdString name(const OdRxObject* obj) const = 0;
 
  /** \details
    Returns true if and only if this Layer is off.
    
    \param obj [in]  Layer object
  */
  virtual bool isOff(const OdRxObject* obj) const = 0;
  /** \details
    Returns true if and only if this Layer is frozen.
    
    \param obj [in]  Layer object
  */
  virtual bool isFrozen(const OdRxObject* obj) const = 0;
 
  /** \details
    Sets the on / off status of this Layer
 
    \param obj [in]  Layer object
    \param off [in]  True for off, false for on.
  */
  virtual void setIsOff(OdRxObject* obj, bool off) const = 0;
  /** \details
    Sets the frozen status of this Layer.
 
    \param obj [in]  Layer object
    \param frozen [in]  True to freeze, false to thaw.
  */
  virtual void setIsFrozen(OdRxObject* obj, bool frozen) const = 0;
 
  /** \details
  Return true if function set line type description of this Layer.
 
  \param obj [in]  Layer object
  \param LType [out]  Description of layer line type.
  */
  virtual bool getLineType(OdRxObject* obj, OdGiLinetype& LType) const = 0;
};
 
typedef OdSmartPtr<OdDbBaseLayerPE> OdDbBaseLayerPEPtr;
 
 
/** \details
  This class is the protocol extension to be used as a visual style abstraction, 
  independent of the underlying database (OdDbDatabase or OdDgDatabase).
 
  \sa
  TD_DbRoot
 
  <group OdDbRoot_Classes> 
*/
class DBROOT_EXPORT OdDbBaseVisualStylePE : public OdRxObject
{
public:
  ODRX_DECLARE_MEMBERS(OdDbBaseVisualStylePE);
 
  /** \details
    Returns name of this Visual Style.
 
    \param obj [in]  Visual Style object
  */
  virtual OdString name(const OdRxObject* obj) const = 0;
 
  /** \details
    Returns true if and only if this Visual Style was marked as internal.
    
    \param obj [in]  Visual Style object
  */
  virtual bool isInternal(const OdRxObject* obj) const = 0;
};
 
typedef OdSmartPtr<OdDbBaseVisualStylePE> OdDbBaseVisualStylePEPtr;
 
 
/** \details
  This class is the protocol extension to be used as a layout abstraction, 
  independent of the underlying database (OdDbDatabase or OdDgDatabase).
 
  \sa
  TD_DbRoot
 
  <group OdDbRoot_Classes> 
*/
class DBROOT_EXPORT OdDbBaseLayoutPE : public OdRxObject
{
public:
  ODRX_DECLARE_MEMBERS(OdDbBaseLayoutPE);
  enum PlotRotation
  {
    k0degrees       = 0,   // No rotation
    k90degrees      = 1,   // 90° CCW
    k180degrees     = 2,   // Inverted
    k270degrees     = 3    // 90° CW
  };
  virtual OdString name(const OdRxObject*) = 0;
  virtual bool isModelLayout(const OdRxObject*) = 0;
  virtual bool printLineweights(const OdRxObject*) = 0;
  virtual bool showPlotStyles(const OdRxObject*) = 0;
  virtual OdString paperName(const OdRxObject*) = 0;
  virtual void getPaperSize(const OdRxObject*, double& paperWidth, double& paperHeight) const = 0;
  virtual PlotRotation plotRotation(const OdRxObject*) = 0;
  virtual double getTopMargin(const OdRxObject*) = 0;
  virtual double getRightMargin(const OdRxObject*) = 0;
  virtual double getBottomMargin(const OdRxObject*) = 0;
  virtual double getLeftMargin(const OdRxObject*) = 0;
  virtual OdDbStub* getId(const OdRxObject*) = 0;
  virtual bool isOverallVPortErased(const OdRxObject*) = 0;
  virtual OdResult getGeomExtents(const OdRxObject*,OdGeExtents3d& ext) = 0;
 
  // methods inherited by OdDbLayoutImpl class // dgn dwf export
  virtual bool useStandardScale(const OdRxObject*) = 0;
  virtual void getStdScale(const OdRxObject*, double& scale) = 0;
  virtual void getCustomPrintScale(const OdRxObject*, double& numerator, double& denominator) = 0;
  virtual int plotType(const OdRxObject*) = 0;
  virtual OdString getPlotViewName(const OdRxObject*) = 0;
  virtual void getPlotWindowArea(const OdRxObject*, double& xmin, double& ymin, double& xmax, double& ymax) = 0;
  virtual void getPlotOrigin(const OdRxObject*, double& x, double& y) = 0;
  virtual void getPlotPaperSize(const OdRxObject*, double& paperWidth, double& paperHeight) = 0;
  virtual int plotPaperUnits(const OdRxObject*) = 0;
 
  // for Gs
  virtual OdDbStub* getBlockId(const OdRxObject*) const = 0;
  virtual bool scalePSLinetypes(const OdRxObject*) const = 0;
  virtual bool getApproxExtents(const OdRxObject*, OdGePoint3d& extMin, OdGePoint3d& extMax) const = 0;
};
 
typedef OdSmartPtr<OdDbBaseLayoutPE> OdDbBaseLayoutPEPtr;
 
 
/** \details
  This class is the protocol extension to be used as a block table record abstraction,
  independent of the underlying database (OdDbDatabase or OdDgDatabase).
 
  \sa
  TD_DbRoot
 
  <group OdDbRoot_Classes>
*/
class DBROOT_EXPORT OdDbBaseBlockPE : public OdRxObject
{
public:
  ODRX_DECLARE_MEMBERS(OdDbBaseBlockPE);
 
  virtual bool isBlockReferenceAdded(OdRxObject *pBlock) const = 0;
 
  virtual bool isFromExternalReference(const OdRxObject *pBlock) const = 0;
  virtual OdDbBaseDatabase *xrefDatabase(const OdRxObject *pBlock) const = 0;
 
  virtual bool isLayout(const OdRxObject *pBlock) const = 0;
};
 
typedef OdSmartPtr<OdDbBaseBlockPE> OdDbBaseBlockPEPtr;
 
 
/** \details
  This class is the protocol extension to be used as a block reference abstraction,
  independent of the underlying database (OdDbDatabase or OdDgDatabase).
 
  \sa
  TD_DbRoot
 
  <group OdDbRoot_Classes>
*/
class DBROOT_EXPORT OdDbBaseBlockRefPE : public OdRxObject
{
public:
  ODRX_DECLARE_MEMBERS(OdDbBaseBlockRefPE);
 
  virtual OdDbStub *blockId(const OdRxObject *pBlockRef) const = 0;
  virtual OdGeMatrix3d blockTransform(const OdRxObject *pBlockRef) const = 0;
 
  virtual OdRxIteratorPtr newAttribIterator(const OdRxObject *pBlockRef, bool bSkipErased = true) const = 0;
  virtual bool isAttribute(const OdRxObject *pAttrib) const = 0;
  virtual OdDbStub *getId(const OdRxObject *pObj) const = 0;
 
  // is generic BlockRef (Gs willn't treat drawable as block reference if this method return false)
  // this method can be useful to filter out incompatible entities inherited from BlockRef.
  virtual bool isGeneric(const OdRxObject *pBlockRef) const = 0;
  // is MInsert block
  virtual bool isMInsert(const OdRxObject *pBlockRef) const = 0;
  // is basic BlockRef
  virtual bool isBasic(const OdRxObject *pBlockRef) const = 0;
};
 
typedef OdSmartPtr<OdDbBaseBlockRefPE> OdDbBaseBlockRefPEPtr;
 
 
/** \details
  This class is the protocol extension to be used as a entities sorting object abstraction,
  independent of the underlying database (OdDbDatabase or OdDgDatabase).
 
  \sa
  TD_DbRoot
 
  <group OdDbRoot_Classes>
*/
class DBROOT_EXPORT OdDbBaseSortEntsPE : public OdRxObject
{
public:
  ODRX_DECLARE_MEMBERS(OdDbBaseSortEntsPE);
 
  virtual OdDbStub *blockId(const OdRxObject *pSortents) const = 0;
};
 
typedef OdSmartPtr<OdDbBaseSortEntsPE> OdDbBaseSortEntsPEPtr;
 
 
/** \details
  This class is the protocol extension to be used as a long transaction abstraction,
  independent of the underlying database (OdDbDatabase or OdDgDatabase).
 
  \sa
  TD_DbRoot
 
  <group OdDbRoot_Classes>
*/
class DBROOT_EXPORT OdDbBaseLongTransactionPE : public OdRxObject
{
public:
  ODRX_DECLARE_MEMBERS(OdDbBaseLongTransactionPE);
 
  virtual OdDbStub *destinationBlock(const OdRxObject *pLT) const = 0;
 
  virtual bool workSetHas(const OdRxObject *pLT, OdDbStub *pId) const = 0;
  virtual OdRxIteratorPtr newWorkSetIterator(const OdRxObject *pLT, bool incRemoved = false, bool incSecondary = false) const = 0;
 
  virtual OdDbStub *getOwner(OdDbStub *pId) const = 0;
  virtual OdDbStub *getId(const OdRxObject *pObj) const = 0;
};
 
typedef OdSmartPtr<OdDbBaseLongTransactionPE> OdDbBaseLongTransactionPEPtr;
 
/** \details
This class defines the interface for the Hatch Protocol Extension classes.
<group OdDbRoot_Classes>
*/
class DBROOT_EXPORT OdDbBaseHatchPE : public OdRxObject
{
public:
  ODRX_DECLARE_MEMBERS(OdDbBaseHatchPE);
  enum HatchStyle
  {
    kNormal = 0, // Hatch toggles on each boundary.
    kOuter  = 1, // Hatch turns off after first inner loop.
    kIgnore = 2  // Hatch ignores inner loop
  };
 
  enum HatchLoopType
  {
    kDefault = 0,        // Not yet specified.
    kExternal = 1,        // Defined by external entities.
    kPolyline = 2,        // Defined by OdGe polyline.
    kDerived = 4,        // Derived from a picked point.
    kTextbox = 8,        // Defined by text.
    kOutermost = 0x10,     // Outermost loop.
    kNotClosed = 0x20,     // Open loop.
    kSelfIntersecting = 0x40,     // Self-intersecting loop.
    kTextIsland = 0x80,     // Text loop surrounded by an even number of loops.
    kDuplicate = 0x100,    // Duplicate loop.
    kIsAnnotative = 0x200,    // The bounding area is an annotative block.
    kDoesNotSupportScale = 0x400,    // The bounding type does not support scaling
    kForceAnnoAllVisible = 0x800,    // Forces all annotatives to be visible
    kOrientToPaper = 0x1000,   // Orients hatch loop to paper
    kIsAnnotativeBlock = 0x2000    // Describes if the hatch is an annotative block.
  };
 
  virtual int numLoops(const OdRxObject* pHatch) const = 0;
  virtual OdInt32 loopTypeAt(const OdRxObject* pHatch, int loopIndex) const = 0;
  virtual void getLoopAt(const OdRxObject* pHatch, int loopIndex, OdArray<OdGeCurve2d*>& edgePtrs) const = 0;
  virtual void getLoopAt(const OdRxObject* pHatch, int loopIndex, OdGePoint2dArray& vertices, OdGeDoubleArray& bulges) const = 0;
  virtual HatchStyle hatchStyle(const OdRxObject* pHatch) const = 0;
  virtual bool isGradient(const OdRxObject* pHatch) const = 0;
  virtual bool isSolidFill(const OdRxObject* pHatch) const = 0;
 
  //In TD hatch is always hatchPE, but in TG hatchPE can be added to any entity
  virtual bool isReallyHatch(const OdRxObject* pHatch) const = 0;
};
 
/** \details
This template class is a specialization of the OdSmartPtr class for OdDbHatchPE object pointers.
*/
typedef OdSmartPtr<OdDbBaseHatchPE> OdDbBaseHatchPEPtr;
 
 
#endif // _ODDB_BASEDATABASE_INCLUDED_