00001
00027 #ifndef INC_RVC_AUTOLABL_H
00028 #define INC_RVC_AUTOLABL_H
00029
00030 #ifndef INC_RVC_VECTOR_H
00031 #include <rvc/vector.h>
00032 #endif
00033
00034 #ifndef INC_MI32_TRANS2DAFFINE_H
00035 #include <mi32/trans2daffine.h>
00036 #endif
00037
00038
00039 #ifndef GENERATING_DOXYGEN_OUTPUT
00040 namespace {
00041 struct SPANINFO;
00042 class SPANDEVICE;
00043 }
00044 namespace MGD {
00045 struct GLYPHINFO;
00046 }
00047 #endif
00048
00049
00050 namespace RVC {
00051
00052 class AUTOLABEL {
00053 public:
00054
00055 enum LINECURVE {
00056 LINECURVE_Straight,
00057 LINECURVE_Exact,
00058 LINECURVE_Spline
00059 };
00060
00061 enum LABELORIENT {
00062 LABELORIENT_TopLtoR,
00063 LABELORIENT_TopRtoL
00064 };
00065
00066 enum POSNMODE_POLYGON {
00067 POSNMODE_POLYGON_PolygonInsideIfFitElseOutsideWithLeader = 0,
00068 POSNMODE_POLYGON_PolygonInsideAlways = 1,
00069 POSNMODE_POLYGON_PolygonInsideIfFitElseNone = 2,
00070 POSNMODE_POLYGON_PolygonInsideIfFitElseOutsideNoLeader = 3
00071 };
00072
00073 #ifndef GENERATING_DOXYGEN_OUTPUT
00074 class FILTER;
00075 #endif // GENERATING_DOXYGEN_OUTPUT
00076
00078 AUTOLABEL (
00079 );
00080
00082 ~AUTOLABEL (
00083 );
00084
00088 ERRVALUE GenerateConglomerateLineLabel (
00089 INT32 StartLineNum,
00090 const MISTRING& string,
00091 double height,
00092 const RVC::OBJECTNAME& StyleName,
00093 const TEXTSTYLE& TextStyle,
00094 MILIST<RVC::VECTOR::LABEL>& LabelList,
00095 FILTER& LineFilter
00096 );
00097
00099 ERRVALUE GenerateLabel (
00100 ELEMTYPE ElemType,
00101 INT32 ElemNum,
00102 const MISTRING& string,
00103 double height,
00104 const RVC::OBJECTNAME& StyleName,
00105 const TEXTSTYLE& TextStyle,
00106 MILIST<RVC::VECTOR::LABEL>& LabelList,
00107 bool bOverrideAngle = false,
00108 double OverrideAngle = 0.0
00109 );
00110
00112 ERRVALUE GenerateLineLabel (
00113 INT32 LineNum,
00114 const MISTRING& string,
00115 double height,
00116 const RVC::OBJECTNAME& StyleName,
00117 const TEXTSTYLE& TextStyle,
00118 MILIST<RVC::VECTOR::LABEL>& LabelList,
00119 bool bOverrideAngle = false,
00120 double OverrideAngle = 0.0
00121 );
00122
00124 ERRVALUE GeneratePointLabel (
00125 INT32 PointNum,
00126 const MISTRING& string,
00127 double height,
00128 const RVC::OBJECTNAME& StyleName,
00129 const TEXTSTYLE& TextStyle,
00130 MILIST<RVC::VECTOR::LABEL>& LabelList,
00131 bool bOverrideAngle = false,
00132 double OverrideAngle = 0.0
00133 );
00134
00136 ERRVALUE GeneratePolygonLabel (
00137 INT32 PolyNum,
00138 const MISTRING& string,
00139 double height,
00140 const RVC::OBJECTNAME& StyleName,
00141 const TEXTSTYLE& TextStyle,
00142 MILIST<RVC::VECTOR::LABEL>& LabelList,
00143 bool bOverrideAngle = false,
00144 double OverrideAngle = 0.0
00145 );
00146
00149 POSNMODE_POLYGON GetPosnModePolygon (
00150 ) const { return (m_PosnModePoly); }
00151
00154 double GetLabelSpace (
00155 ) const { return (m_LabelSpace); }
00156
00159 LINECURVE GetLineCurve (
00160 ) const { return (m_LineCurve); }
00161
00164 LABELORIENT GetOrientation (
00165 ) const { return (m_Orientation); }
00166
00168 ERRVALUE Initialize (
00169 const RVC::OBJITEM& ObjItem
00170 );
00171
00173 bool IsInitialized (
00174 ) const { return (m_VectorObj.IsOpen()); }
00175
00177 bool IsOrthogonalLabels (
00178 ) const { return (m_MakeOrthogonal); }
00179
00182 void SetPosnModePolygon (
00183 POSNMODE_POLYGON PosnModePoly
00184 ) { m_PosnModePoly = PosnModePoly; }
00185
00188 void SetMinLineLength (
00189 double MinLineLength
00190 ) { m_MinLineLength = MinLineLength; }
00191
00194 void SetLabelSpace (
00195 double LabelSpace
00196 ) { m_LabelSpace = LabelSpace; }
00197
00199 void SetLineCurve (
00200 LINECURVE LineCurve
00201 ) { m_LineCurve = LineCurve; }
00202
00204 void SetOrientation (
00205 LABELORIENT Orientation
00206 ) { m_Orientation = Orientation; }
00207
00209 void SetOrthogonalLabels (
00210 bool value
00211 ) { m_MakeOrthogonal = value; }
00212
00214 void Stop (
00215 );
00216
00217 private:
00218 #ifndef GENERATING_DOXYGEN_OUTPUT
00219
00220 VECTOR m_VectorObj;
00221 SPANDEVICE* m_SpanDevice;
00222 SIMPLE_ARRAY<LPOLYGON> m_GCPoly;
00223 SIMPLE_ARRAY<LPOINT2D> m_GCLine;
00224 SIMPLE_ARRAY<INT32> m_NumShellLines;
00225 SIMPLE_ARRAY<INT32> m_ShellList;
00226 TRANS2D_AFFINE m_VectorToGC;
00227 POLYLINE m_PolyLine;
00228 POLYLINE m_IsleLine;
00229 POLYLINE m_TempLine;
00230 BITSET m_CheckedSet;
00231 LRECT2D m_LabelExtents;
00232 INT32 m_LabelHeight;
00233 bool m_MakeOrthogonal;
00234 bool m_AdjustLabelHeight;
00235 double m_LabelSpace;
00236 double m_MinLineLength;
00237 LINECURVE m_LineCurve;
00238 LABELORIENT m_Orientation;
00239 POSNMODE_POLYGON m_PosnModePoly;
00240
00241 ERRVALUE AddPolygonLabelToList (MILIST<RVC::VECTOR::LABEL>& LabelList, INT32 PolyNum, const MISTRING& string, double height, double ybase, const RVC::OBJECTNAME& StyleName, const DRECT2D& LabelRect, bool GenerateLeaderLine = false, bool bOverrideAngle = false, double OverrideAngle = 0.0);
00242 void AdjustBaseline (POLYLINE& Baseline, bool bOverrideAngle = false, double OverrideAngle = 0.0);
00243 ERRVALUE ComputeStringExtents (const TEXTSTYLE& TextStyle, const DPOINT2D& point, double height, const MISTRING& string, DRECT2D& extents);
00244
00245 ERRVALUE SetupPolygon (INT32 PolyNum);
00246 void AdjustAffine ();
00247
00248 AUTOLABEL (const AUTOLABEL&);
00249 AUTOLABEL& operator=(const AUTOLABEL&);
00250 #endif // GENERATING_DOXYGEN_OUTPUT
00251
00252 };
00253
00254
00257 class AUTOLABEL::FILTER {
00258 public:
00259 virtual bool Filter (
00260 ELEMTYPE ElemType,
00261 INT32 ElemNum,
00262 const MISTRING& string,
00263 double height
00264 ) = 0;
00265 };
00266
00267 }
00268
00269 #endif