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
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
/////////////////////////////////////////////////////////////////////////////// 
// 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 __ODGI_DGLINETYPE_H__
#define __ODGI_DGLINETYPE_H__
 
#include "Gi/GiNonEntityTraits.h"
#include "Gi/GiLinetype.h"
#include "Gi/GiExport.h"
 
#include "TD_PackPush.h"
 
/** \details
 
    <group OdGi_Classes>
*/
struct OdGiDgLinetypeDash
{
  struct DashInfo
  {
    enum StrokeWidthMode
    {
      kLsNoWidth    = 0,
      kLsWidthLeft  = 1,
      kLsWidthRight = 2,
      kLsWidthFull  = 3
    };
    enum StrokeCapsType
    {
      kLsCapsClosed   = 0,
      kLsCapsOpen     = 1,
      kLsCapsExtended = 2,
      kLsCapsHexagon  = 3,
      kLsCapsOctagon  = 4,
      kLsCapsDecagon  = 5,
      kLsCapsArc      = 30
    };
    enum Flags
    {
      kFlagDash                    = (1 << 0),
      kFlagPassCorner              = (1 << 1),
      kFlagCanBeScaled             = (1 << 2),
      kFlagInvertStrokeInFirstCode = (1 << 3),
      kFlagInvertStrokeInLastCode  = (1 << 4),
      kFlagIncreasingTaper         = (1 << 5),
      kFlagDecreasingTaper         = (1 << 6),
      kFlagBaseStrokeDash          = (1 << 7)
    };
 
    OdUInt32        m_uFlags;
    double          m_dLength;
    double          m_dStartWidth;
    double          m_dEndWidth;
    StrokeWidthMode m_lsWidthMode;
    StrokeCapsType  m_lsCapsType;
 
    DashInfo()
      : m_uFlags(0)
      , m_dLength(0.0)
      , m_dStartWidth(0.0)
      , m_dEndWidth(0.0)
      , m_lsWidthMode(kLsNoWidth)
      , m_lsCapsType(kLsCapsClosed)
    { }
 
    double getLength() const { return m_dLength; }
    void setLength(double dLength) { m_dLength = dLength; }
 
    double getStartWidth() const { return m_dStartWidth; }
    void setStartWidth(double dWidth) { m_dStartWidth = dWidth; }
 
    double getEndWidth() const { return m_dEndWidth; }
    void setEndWidth(double dWidth) { m_dEndWidth = dWidth; }
 
    bool getDashFlag() const { return GETBIT(m_uFlags, kFlagDash); }
    void setDashFlag(bool bSet) { SETBIT(m_uFlags, kFlagDash, bSet); }
 
    bool getByPassCornerFlag() const { return GETBIT(m_uFlags, kFlagPassCorner); }
    void setByPassCornerFlag(bool bSet) { SETBIT(m_uFlags, kFlagPassCorner, bSet); }
 
    bool getCanBeScaledFlag() const { return GETBIT(m_uFlags, kFlagCanBeScaled); }
    void setCanBeScaledFlag(bool bSet) { SETBIT(m_uFlags, kFlagCanBeScaled, bSet); }
 
    bool getInvertStrokeInFirstCodeFlag() const { return GETBIT(m_uFlags, kFlagInvertStrokeInFirstCode); }
    void setInvertStrokeInFirstCodeFlag(bool bSet) { SETBIT(m_uFlags, kFlagInvertStrokeInFirstCode, bSet); }
 
    bool getInvertStrokeInLastCodeFlag() const { return GETBIT(m_uFlags, kFlagInvertStrokeInLastCode); }
    void setInvertStrokeInLastCodeFlag(bool bSet) { SETBIT(m_uFlags, kFlagInvertStrokeInLastCode, bSet); }
 
    StrokeWidthMode getWidthMode() const { return m_lsWidthMode; }
    void setWidthMode(StrokeWidthMode iMode) { m_lsWidthMode = iMode; }
 
    bool getIncreasingTaperFlag() const { return GETBIT(m_uFlags, kFlagIncreasingTaper); }
    void setIncreasingTaperFlag(bool bSet) { SETBIT(m_uFlags, kFlagIncreasingTaper, bSet); }
 
    bool getDecreasingTaperFlag() const { return GETBIT(m_uFlags, kFlagDecreasingTaper); }
    void setDecreasingTaperFlag(bool bSet) { SETBIT(m_uFlags, kFlagDecreasingTaper, bSet); }
 
    bool getBaseStrokeDashFlag() const { return GETBIT(m_uFlags, kFlagBaseStrokeDash); }
    void setBaseStrokeDashFlag(bool bSet) { SETBIT(m_uFlags, kFlagBaseStrokeDash, bSet); }
 
    bool isDashOrBaseStrokeDash() const { return GETBIT(m_uFlags, kFlagDash | kFlagBaseStrokeDash); }
 
    StrokeCapsType getCapsType() const { return m_lsCapsType; }
    void setCapsType(StrokeCapsType iType) { m_lsCapsType = iType; }
  } m_dash;
  struct ShapeInfo
  {
    enum SymbolPosOnStroke
    {
      kLsNoSymbol         = 0,
      kLsAtOriginOfStroke = 1,
      kLsAtEndOfStroke    = 2,
      kLsAtCenterOfStroke = 3
    };
    enum Flags
    {
      kFlagSymbolAtElementOrigin        = (1 << 0),
      kFlagSymbolAtElementEnd           = (1 << 1),
      kFlagSymbolAtEachVertex           = (1 << 2),
      kFlagMirrorSymbolForReversedLines = (1 << 3),
      kFlagAbsoluteRotationAngle        = (1 << 4),
      kFlagDoNotScaleElement            = (1 << 5),
      kFlagDoNotClipElement             = (1 << 6),
      kFlagNoPartialStrokes             = (1 << 7),
      kFlagPartialOriginBeyondEnd       = (1 << 8),
      kFlagUseSymbolColor               = (1 << 9),
      kFlagUseSymbolWeight              = (1 << 10)
    };
 
    OdUInt32                 m_uFlags;
    OdDbStub                *m_pSymbol;
    SymbolPosOnStroke        m_lsPos;
    OdGiLinetypeDash::offset m_offset;
    double                   m_dRotation;
    double                   m_dScale;
 
    ShapeInfo()
      : m_uFlags(0)
      , m_pSymbol(NULL)
      , m_lsPos(kLsNoSymbol)
      , m_dRotation(0.0)
      , m_dScale(0.0)
    {
      m_offset.x = m_offset.y = 0.0;
    }
 
    OdDbStub *getSymbolId() const { return m_pSymbol; }
    void setSymbolId(OdDbStub *pStub) { m_pSymbol = pStub; }
 
    SymbolPosOnStroke getSymbolPosOnStroke() const { return m_lsPos; }
    void setSymbolPosOnStroke(SymbolPosOnStroke iMode) { m_lsPos = iMode; }
 
    bool getSymbolAtElementOriginFlag() const { return GETBIT(m_uFlags, kFlagSymbolAtElementOrigin); }
    void setSymbolAtElementOriginFlag(bool bSet) { SETBIT(m_uFlags, kFlagSymbolAtElementOrigin, bSet); }
 
    bool getSymbolAtElementEndFlag() const { return GETBIT(m_uFlags, kFlagSymbolAtElementEnd); }
    void setSymbolAtElementEndFlag(bool bSet) { SETBIT(m_uFlags, kFlagSymbolAtElementEnd, bSet); }
 
    bool getSymbolAtEachVertexFlag() const { return GETBIT(m_uFlags, kFlagSymbolAtEachVertex); }
    void setSymbolAtEachVertexFlag(bool bSet) { SETBIT(m_uFlags, kFlagSymbolAtEachVertex, bSet); }
 
    bool getMirrorSymbolForReversedLinesFlag() const { return GETBIT(m_uFlags, kFlagMirrorSymbolForReversedLines); }
    void setMirrorSymbolForReversedLinesFlag(bool bSet) { SETBIT(m_uFlags, kFlagMirrorSymbolForReversedLines, bSet); }
 
    bool getAbsoluteRotationAngleFlag() const { return GETBIT(m_uFlags, kFlagAbsoluteRotationAngle); }
    void setAbsoluteRotationAngleFlag(bool bSet) { SETBIT(m_uFlags, kFlagAbsoluteRotationAngle, bSet); }
 
    bool getDoNotScaleElementFlag() const { return GETBIT(m_uFlags, kFlagDoNotScaleElement); }
    void setDoNotScaleElementFlag(bool bSet) { SETBIT(m_uFlags, kFlagDoNotScaleElement, bSet); }
 
    bool getDoNotClipElementFlag() const { return GETBIT(m_uFlags, kFlagDoNotClipElement); }
    void setDoNotClipElementFlag(bool bSet) { SETBIT(m_uFlags, kFlagDoNotClipElement, bSet); }
 
    bool getNoPartialStrokesFlag() const { return GETBIT(m_uFlags, kFlagNoPartialStrokes); }
    void setNoPartialStrokesFlag(bool bSet) { SETBIT(m_uFlags, kFlagNoPartialStrokes, bSet); }
 
    bool getPartialOriginBeyondEndFlag() const { return GETBIT(m_uFlags, kFlagPartialOriginBeyondEnd); }
    void setPartialOriginBeyondEndFlag(bool bSet) { SETBIT(m_uFlags, kFlagPartialOriginBeyondEnd, bSet); }
 
    bool getUseSymbolColorFlag() const { return GETBIT(m_uFlags, kFlagUseSymbolColor); }
    void setUseSymbolColorFlag(bool bSet) { SETBIT(m_uFlags, kFlagUseSymbolColor, bSet); }
 
    bool getUseSymbolWeightFlag() const { return GETBIT(m_uFlags, kFlagUseSymbolWeight); }
    void setUseSymbolWeightFlag(bool bSet) { SETBIT(m_uFlags, kFlagUseSymbolWeight, bSet); }
 
    void getOffset(double &x, double &y) const { x = m_offset.x; y = m_offset.y; }
    void setOffset(double x, double y) { m_offset.x = x; m_offset.y = y; }
 
    double getRotationAngle() const { return m_dRotation; }
    void setRotationAngle(double dRotAngle) { m_dRotation = dRotAngle; }
 
    double getSymbolScale() const { return m_dScale; }
    void setSymbolScale(double dScale) { m_dScale = dScale; }
  } m_shape;
 
  OdGiDgLinetypeDash()
    : m_dash()
    , m_shape()
  {
  }
};
 
typedef OdArray<OdGiDgLinetypeDash> OdGiDgLinetypeDashArray;
 
/** \details
 
    <group OdGi_Classes>
*/
struct OdGiDgLinetypeItem
{
  enum Flags
  {
    kFlagAutoPhase              = (1 << 0),
    kFlagUseIterationLimit      = (1 << 1),
    kFlagSingleSegmentMode      = (1 << 2),
    kFlagCenterStretchPhaseMode = (1 << 3),
    kFlagStandardLinetype       = (1 << 4),
    kFlagComputeStandardScale   = (1 << 5)
  };
 
  OdUInt32                m_uFlags;
  double                  m_dLength;
  double                  m_dPhase;
  OdUInt32                m_nMaxIterations;
  double                  m_dOffset;
  OdGiDgLinetypeDashArray m_dashes;
 
  OdGiDgLinetypeItem()
    : m_uFlags(0)
    , m_dLength(0.0)
    , m_dPhase(0.0)
    , m_nMaxIterations(1)
    , m_dOffset(0.0)
  {
  }
 
  double getLength() const { return m_dLength; }
  void setLength(double dLen) { m_dLength = dLen; }
 
  double getPhase() const { return m_dPhase; }
  void setPhase(double dPhase) { m_dPhase = dPhase; }
 
  bool getAutoPhaseFlag() const { return GETBIT(m_uFlags, kFlagAutoPhase); }
  void setAutoPhaseFlag(bool bSet) { SETBIT(m_uFlags, kFlagAutoPhase, bSet); }
 
  bool getUseIterationLimitFlag() const { return GETBIT(m_uFlags, kFlagUseIterationLimit); }
  void setUseIterationLimitFlag(bool bSet) { SETBIT(m_uFlags, kFlagUseIterationLimit, bSet); }
 
  bool getSingleSegmentModeFlag() const { return GETBIT(m_uFlags, kFlagSingleSegmentMode); }
  void setSingleSegmentModeFlag(bool bSet) { SETBIT(m_uFlags, kFlagSingleSegmentMode, bSet); }
 
  bool getCenterStretchPhaseModeFlag() const { return GETBIT(m_uFlags, kFlagCenterStretchPhaseMode); }
  void setCenterStretchPhaseModeFlag(bool bSet) { SETBIT(m_uFlags, kFlagCenterStretchPhaseMode, bSet); }
 
  bool getStandardLinetypeFlag() const { return GETBIT(m_uFlags, kFlagStandardLinetype); }
  void setStandardLinetypeFlag(bool bSet) { SETBIT(m_uFlags, kFlagStandardLinetype, bSet); }
 
  bool getComputeStandardScaleFlag() const { return GETBIT(m_uFlags, kFlagComputeStandardScale); }
  void setComputeStandardScaleFlag(bool bSet) { SETBIT(m_uFlags, kFlagComputeStandardScale, bSet); }
 
  OdUInt32 getMaxIterations() const { return m_nMaxIterations; }
  void setMaxIterations(OdUInt32 iMaxNum) { m_nMaxIterations = iMaxNum; }
 
  double getYOffset() const { return m_dOffset; }
  void setYOffset(double dYOffset) { m_dOffset = dYOffset; }
 
  OdUInt32 numDashes() const { return m_dashes.size(); }
  void setNumDashes(OdUInt32 count) { m_dashes.resize(count); }
 
  void dashAt(OdUInt32 index, OdGiDgLinetypeDash& dash) const { dash = m_dashes.at(index); }
  const OdGiDgLinetypeDash& dashAt(OdUInt32 index) const { return m_dashes.at(index); }
 
  // void setDashAt(OdUInt32 /*index*/, double /*value*/) { throw OdError(eNotImplementedYet); }
  void setDashAt(OdUInt32 index, const OdGiDgLinetypeDash& dash) { m_dashes[index] = dash; }
 
  void dashes(OdGiDgLinetypeDashArray& dashes) const { dashes = m_dashes; }
  void setDashes(const OdGiDgLinetypeDashArray& dashes) { m_dashes = dashes; }
};
 
typedef OdArray<OdGiDgLinetypeItem> OdGiDgLinetypeItemArray;
 
/** \details
 
    <group OdGi_Classes> 
*/
class OdGiDgLinetype
{
  enum
  {
    kByBlock            = 1,
    kByLayer            = 2
  };
 
  OdUInt32                m_uFlags;
  OdGiDgLinetypeItemArray m_items;
  double                  m_dPatLength;
public:
  OdGiDgLinetype()
    : m_uFlags(0)
    , m_dPatLength(0.0)
  {
  }
 
  bool isContinuous() const { return m_items.empty(); }
 
  bool isByBlock() const { return GETBIT(m_uFlags, kByBlock); }
  void setByBlock(bool value) { SETBIT(m_uFlags, kByBlock, value); }
 
  bool isByLayer() const { return GETBIT(m_uFlags, kByLayer); }
  void setByLayer(bool value) { SETBIT(m_uFlags, kByLayer, value); }
 
  double patternLength() const { return m_dPatLength; }
  void setPatternLength(double dPatLen) { m_dPatLength = dPatLen; }
 
  OdUInt32 numItems() const { return m_items.size(); }
  void setNumItems(OdUInt32 count) { m_items.resize(count); }
 
  void itemAt(OdUInt32 index, OdGiDgLinetypeItem& item) const { item = m_items.at(index); }
  const OdGiDgLinetypeItem& itemAt(OdUInt32 index) const { return m_items.at(index); }
 
  void setItemAt(OdUInt32 index, const OdGiDgLinetypeItem& item) { m_items[index] = item; }
 
  void items(OdGiDgLinetypeItemArray& items) const { items = m_items; }
  void setItems(const OdGiDgLinetypeItemArray& items) { m_items = items; }
};
 
/** \details
 
    <group OdGi_Classes>
*/
struct OdGiDgLinetypeModifiers
{
  enum Flags
  {
    kFlagUseDashScale              = (1 << 0),
    kFlagUseGapScale               = (1 << 1),
    kFlagUseWidth                  = (1 << 2),
    kFlagUseEndWidth               = (1 << 3),
    kFlagUseShift                  = (1 << 4),
    kFlagUseFractionShift          = (1 << 5),
    kFlagUseCenteredShift          = (1 << 6),
    kFlagTrueWidth                 = (1 << 7),
    kFlagOverrideBreakAtCorners    = (1 << 8),
    kFlagOverrideRunThroughCorners = (1 << 9),
 
    kFlagsWidthMask                = (kFlagUseWidth | kFlagUseEndWidth),
    kFlagsShiftMask                = (kFlagUseShift | kFlagUseFractionShift | kFlagUseCenteredShift),
    kFlagsCornersMask              = (kFlagOverrideBreakAtCorners | kFlagOverrideRunThroughCorners)
  };
 
  enum WidthMode
  {
    kLsNoWidth = 0,
    kLsWidthConstant,
    kLsWidthTapered
  };
  enum ShiftMode
  {
    kLsNoShift = 0,
    kLsShiftDistance,
    kLsShiftFraction,
    kLsShiftCentered
  };
  enum CornersMode
  {
    kLsCornersFromLS = 0,
    kLsBreakAtCorners,
    kLsRunThroughCorners
  };
 
  OdUInt32 m_uFlags;
  double m_dDashScale;
  double m_dGapScale;
  double m_dWidth;
  double m_dEndWidth;
  double m_dPhase;
 
  OdGiDgLinetypeModifiers()
    : m_uFlags(0)
    , m_dDashScale(1.0)
    , m_dGapScale(1.0)
    , m_dWidth(0.0)
    , m_dEndWidth(0.0)
    , m_dPhase(0.0)
  {
  }
 
  bool getDashScaleFlag() const { return GETBIT(m_uFlags, kFlagUseDashScale); }
  void setDashScaleFlag(bool bSet) { SETBIT(m_uFlags, kFlagUseDashScale, bSet); }
 
  double getDashScale() const { return m_dDashScale; }
  void setDashScale(double dScale) { m_dDashScale = dScale; }
 
  bool getGapScaleFlag() const { return GETBIT(m_uFlags, kFlagUseGapScale); }
  void setGapScaleFlag(bool bSet) { SETBIT(m_uFlags, kFlagUseGapScale, bSet); }
 
  double getGapScale() const { return m_dGapScale; }
  void setGapScale(double dScale) { m_dGapScale = dScale; }
 
  bool getWidthFlag() const { return GETBIT(m_uFlags, kFlagUseWidth); }
  void setWidthFlag(bool bSet) { SETBIT(m_uFlags, kFlagUseWidth, bSet); }
 
  double getWidth() const { return m_dWidth; }
  void setWidth(double dWidth) { m_dWidth = dWidth; }
 
  bool getEndWidthFlag() const { return GETBIT(m_uFlags, kFlagUseEndWidth); }
  void setEndWidthFlag(bool bSet) { SETBIT(m_uFlags, kFlagUseEndWidth, bSet); }
 
  double getEndWidth() const { return m_dEndWidth; }
  void setEndWidth(double dEndWidth) { m_dEndWidth = dEndWidth; }
  
  WidthMode getWidthMode() const;
  void setWidthMode(WidthMode mode);
 
  bool getShiftFlag() const { return GETBIT(m_uFlags, kFlagUseShift); }
  void setShiftFlag(bool bSet) { SETBIT(m_uFlags, kFlagUseShift, bSet); }
 
  bool getFractionShiftFlag() const { return GETBIT(m_uFlags, kFlagUseFractionShift); }
  void setFractionShiftFlag(bool bSet) { SETBIT(m_uFlags, kFlagUseFractionShift, bSet); }
 
  bool getCenteredShiftFlag() const { return GETBIT(m_uFlags, kFlagUseCenteredShift); }
  void setCenteredShiftFlag(bool bSet) { SETBIT(m_uFlags, kFlagUseCenteredShift, bSet); }
 
  double getPhase() const { return m_dPhase; }
  void setPhase(double dPhase) { m_dPhase = dPhase; }
 
  ShiftMode getShiftMode() const;
  void setShiftMode(ShiftMode mode);
 
  bool getTrueWidthFlag() const { return GETBIT(m_uFlags, kFlagTrueWidth); }
  void setTrueWidthFlag(bool bSet) { SETBIT(m_uFlags, kFlagTrueWidth, bSet); }
 
  bool getBreakAtCornersFlag() const { return GETBIT(m_uFlags, kFlagOverrideBreakAtCorners); }
  void setBreakAtCornersFlag(bool bSet) { SETBIT(m_uFlags, kFlagOverrideBreakAtCorners, bSet); }
 
  bool getRunThroughCornersFlag() const { return GETBIT(m_uFlags, kFlagOverrideRunThroughCorners); }
  void setRunThroughCornersFlag(bool bSet) { SETBIT(m_uFlags, kFlagOverrideRunThroughCorners, bSet); }
 
  CornersMode getCornersMode() const;
  void setCornersMode(CornersMode mode);
 
  bool operator==(const OdGiDgLinetypeModifiers& lsMod) const;
  bool operator!=(const OdGiDgLinetypeModifiers& lsMod) const;
};
 
inline OdGiDgLinetypeModifiers::WidthMode OdGiDgLinetypeModifiers::getWidthMode() const
{
  switch (m_uFlags & kFlagsWidthMask)
  {
    case kFlagUseWidth:   return kLsWidthConstant;
    case kFlagsWidthMask: return kLsWidthTapered;
    default:              return kLsNoWidth;
  }
}
 
inline void OdGiDgLinetypeModifiers::setWidthMode(OdGiDgLinetypeModifiers::WidthMode mode)
{
  switch (mode)
  {
    case kLsWidthConstant: SETBIT_1(m_uFlags, kFlagUseWidth); SETBIT_0(m_uFlags, kFlagUseEndWidth); break;
    case kLsWidthTapered:  SETBIT_1(m_uFlags, kFlagsWidthMask); break;
    default: SETBIT_0(m_uFlags, kFlagsWidthMask);
  };
}
 
inline OdGiDgLinetypeModifiers::ShiftMode OdGiDgLinetypeModifiers::getShiftMode() const
{
  switch (m_uFlags & kFlagsShiftMask)
  {
    case kFlagUseShift:                         return kLsShiftDistance;
    case kFlagUseShift | kFlagUseFractionShift: return kLsShiftFraction;
    case kFlagUseShift | kFlagUseCenteredShift: return kLsShiftCentered;
    default:                                    return kLsNoShift;
  }
}
 
inline void OdGiDgLinetypeModifiers::setShiftMode(OdGiDgLinetypeModifiers::ShiftMode mode)
{
  switch (mode)
  {
    case kLsShiftDistance: SETBIT_1(m_uFlags, kFlagUseShift); SETBIT_0(m_uFlags, kFlagUseFractionShift | kFlagUseCenteredShift); break;
    case kLsShiftFraction: SETBIT_1(m_uFlags, kFlagUseShift | kFlagUseFractionShift); SETBIT_0(m_uFlags, kFlagUseCenteredShift); break;
    case kLsShiftCentered: SETBIT_1(m_uFlags, kFlagUseShift | kFlagUseCenteredShift); SETBIT_0(m_uFlags, kFlagUseFractionShift); break;
    default: SETBIT_0(m_uFlags, kFlagsShiftMask);
  }
}
 
inline OdGiDgLinetypeModifiers::CornersMode OdGiDgLinetypeModifiers::getCornersMode() const
{
  switch (m_uFlags & kFlagsCornersMask)
  {
    case kFlagOverrideBreakAtCorners:    return kLsBreakAtCorners;
    case kFlagOverrideRunThroughCorners: return kLsRunThroughCorners;
    default:                             return kLsCornersFromLS;
  }
}
 
inline void OdGiDgLinetypeModifiers::setCornersMode(OdGiDgLinetypeModifiers::CornersMode mode)
{
  switch (mode)
  {
    case kLsBreakAtCorners:    SETBIT_1(m_uFlags, kFlagOverrideBreakAtCorners); SETBIT_0(m_uFlags, kFlagOverrideRunThroughCorners); break;
    case kLsRunThroughCorners: SETBIT_0(m_uFlags, kFlagOverrideBreakAtCorners); SETBIT_1(m_uFlags, kFlagOverrideRunThroughCorners); break;
    default:                   SETBIT_0(m_uFlags, kFlagsCornersMask);
  }
}
 
inline bool OdGiDgLinetypeModifiers::operator ==(const OdGiDgLinetypeModifiers& lsMod) const
{
  return (m_uFlags == lsMod.m_uFlags) &&
         (m_dDashScale == lsMod.m_dDashScale) && (m_dGapScale == lsMod.m_dGapScale) &&
         (m_dWidth == lsMod.m_dWidth) && (m_dEndWidth == lsMod.m_dEndWidth) &&
         (m_dPhase == lsMod.m_dPhase);
}
 
inline bool OdGiDgLinetypeModifiers::operator !=(const OdGiDgLinetypeModifiers& lsMod) const
{
  return (m_uFlags != lsMod.m_uFlags) ||
         (m_dDashScale != lsMod.m_dDashScale) || (m_dGapScale != lsMod.m_dGapScale) ||
         (m_dWidth != lsMod.m_dWidth) || (m_dEndWidth != lsMod.m_dEndWidth) ||
         (m_dPhase != lsMod.m_dPhase);
}
 
/** \details
 
    <group OdGi_Classes> 
*/
class ODGI_EXPORT OdGiDgLinetypeTraits : public OdGiDrawableTraits
{
  public:
    ODRX_DECLARE_MEMBERS(OdGiDgLinetypeTraits);
 
    virtual void items(OdGiDgLinetypeItemArray& items) const = 0;
    virtual void setItems(const OdGiDgLinetypeItemArray& items) const = 0;
 
    virtual double patternLength() const = 0;
    virtual void setPatternLength(double dPatLen) = 0;
 
    virtual double scale() const = 0;
    virtual void setScale(double dScale) = 0;
};
 
/** \details
    This template class is a specialization of the OdSmartPtr class for OdGiDgLinetypeTraits object pointers.
*/
typedef OdSmartPtr<OdGiDgLinetypeTraits> OdGiDgLinetypeTraitsPtr;
 
#include "TD_PackPop.h"
 
#endif // __ODGI_DGLINETYPE_H__