/////////////////////////////////////////////////////////////////////////////// // 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 */ 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 OdGiDgLinetypeDashArray; /** \details */ 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 OdGiDgLinetypeItemArray; /** \details */ 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 */ 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 */ 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 OdGiDgLinetypeTraitsPtr; #include "TD_PackPop.h" #endif // __ODGI_DGLINETYPE_H__