00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 #ifndef INC_GRE_LABELPLACEMENT_H
00064 #define INC_GRE_LABELPLACEMENT_H
00065
00066
00067 #ifndef INC_RVC_ELEMENT_H
00068 #include <rvc/element.h>
00069 #endif
00070
00071 #ifndef INC_MI32_TEXTBASE_H
00072 #include <mi32/textbase.h>
00073 #endif
00074
00075 #ifndef INC_MI32_POLYLINE_H
00076 #include <mi32/polyline.h>
00077 #endif
00078
00079 class LABELSTYLE;
00080 class QUADTREE;
00081 class REGION2D;
00082 struct COLOR;
00083 struct LINESTYLE;
00084 struct POINTSTYLE;
00085
00086 namespace MGD {
00087 class CONTEXT;
00088 }
00089
00090 namespace RVC {
00091 class STYLEPATTERN_SYMBOL;
00092 }
00093
00094 namespace GRE {
00095 class LAYER;
00096 class LAYERDC;
00097 class VIEW;
00098 class LABELPLACEMENT;
00099
00100 class LABELATTACHMENT {
00101 public:
00102
00103 LABELATTACHMENT (
00104 ) { }
00105
00106
00107 LABELATTACHMENT (
00108 const RVC::ELEMENT& elem
00109 ) :
00110 m_elem(elem)
00111 {
00112 }
00113
00114
00115 LABELATTACHMENT (
00116 const LABELATTACHMENT& rhs
00117 ) :
00118 m_elem(rhs.m_elem),
00119 m_leader(rhs.m_leader)
00120 {
00121 }
00122
00123
00124 LABELATTACHMENT (
00125 const RVC::ELEMENT& elem,
00126 const POLYLINE& leader
00127 ) :
00128 m_elem(elem),
00129 m_leader(leader)
00130 {
00131 }
00132
00133 ~LABELATTACHMENT() {}
00134
00135 const RVC::ELEMENT& GetElement (
00136 ) const {
00137 return (m_elem);
00138 }
00139
00140 const POLYLINE& GetLeader (
00141 ) const {
00142 return (m_leader);
00143 }
00144
00145 void SetElement (
00146 const RVC::ELEMENT& elem
00147 ) {
00148 m_elem = elem;
00149 }
00150
00151 void SetLeader (
00152 const POLYLINE& leader
00153 ) {
00154 m_leader = leader;
00155 }
00156
00157 private:
00158 RVC::ELEMENT m_elem;
00159 POLYLINE m_leader;
00160
00161 };
00162
00163
00164
00165
00166
00167
00168
00169 class LABELPLACE {
00170 public:
00171
00172 LABELPLACE();
00173
00174
00175 LABELPLACE (
00176 const LABELPLACE& rhs
00177 );
00178
00179
00180 ~LABELPLACE();
00181
00182
00183 LABELPLACE& operator=(
00184 const LABELPLACE& rhs
00185 );
00186
00187
00188
00189
00190 void ComputeLabelExtents (
00191 MGD::CONTEXT* gc,
00192 REGION2D& region,
00193 bool bIgnoreLeaders = false
00194 ) const;
00195
00196
00197 void DeleteAttachment (
00198 const RVC::ELEMENT& element
00199 );
00200
00201
00202
00203
00204
00205 void Detach (
00206 );
00207
00208
00209 ERRVALUE Draw (
00210 LAYERDC* pDC,
00211 const COLOR* ForegroundColor = 0
00212 ) const;
00213
00214
00215 ERRVALUE DrawSample (
00216 MGD::CONTEXT& gc,
00217 const COLOR* ForegroundColor = 0,
00218 bool bDrawLeaders = true
00219 ) const;
00220
00221
00222 const MILIST<LABELATTACHMENT>& GetAttachments (
00223 ) const;
00224
00225 double GetBaseAngle (
00226 ) const;
00227
00228 const POLYLINE& GetBaseLine (
00229 ) const;
00230
00231 TEXTBASEORIGIN GetBaseOrigin (
00232 ) const;
00233
00234 const DPOINT2D& GetBasePoint (
00235 ) const;
00236
00237 bool GetDrawBaseLine (
00238 ) const;
00239
00240
00241
00242 bool GetBaseLineStyle (
00243 LINESTYLE&
00244 ) const;
00245
00246
00247
00248
00249 LAYER* GetLayer (
00250 ) const;
00251
00252
00253
00254 const DPOINT2D& GetOffset (
00255 ) const;
00256
00257
00258
00259 const DPOINT2D& GetSymbolPoint (
00260 ) const;
00261
00262
00263 const POINTSTYLE& GetPointStyle (
00264 ) const;
00265
00266
00267 const SIMPLE_ARRAY<UINT8>& GetPointSymbol (
00268 ) const;
00269
00270
00271
00272 double GetPriority (
00273 ) const;
00274
00275
00276 const REGION2D& GetRegion (
00277 ) const;
00278
00279 const LABELSTYLE& GetStyle (
00280 ) const;
00281
00282 const MISTRING& GetText (
00283 ) const;
00284
00285
00286 bool HasPoint (
00287 ) const;
00288
00289
00290 bool HasText (
00291 ) const;
00292
00293
00294 bool IsAttached (
00295 ELEMTYPE ElemType,
00296 INT32 ElemNum
00297 ) const;
00298
00299
00300 bool IsAttached (
00301 const RVC::ELEMENT& elem
00302 ) const;
00303
00304
00305
00306 bool IsLocked (
00307 ) const;
00308
00309
00310
00311 void LockPosition (
00312 bool locked = true
00313 );
00314
00315
00316 void Move (
00317 const DPOINT2D& delta
00318 );
00319
00320
00321 void AddAttachment (
00322 const LABELATTACHMENT& attachment
00323 );
00324
00325
00326 void AddAttachment (
00327 const RVC::ELEMENT& element
00328 );
00329
00330 void SetBaseLine (
00331 const POLYLINE& baseline
00332 );
00333
00334 void SetBaseLine (
00335 const DPOINT2D& pt,
00336 double angle,
00337 TEXTBASEORIGIN origin
00338 );
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348 void SetCopyOnWrite (
00349 bool bCopyOnWrite = true
00350 ) {
00351 m_bCopyOnWrite = bCopyOnWrite;
00352 }
00353
00354 void SetDrawBaseLine (
00355 bool draw = true
00356 );
00357
00358
00359 void SetBaseLineStyle (
00360 const LINESTYLE& style
00361 );
00362
00363
00364
00365 void SetPoint (
00366 const DPOINT2D& location
00367 );
00368
00369
00370 void SetPointStyle (
00371 const POINTSTYLE& style
00372 );
00373
00374
00375 void SetPointSymbol (
00376 const SIMPLE_ARRAY<UINT8>& symbol
00377 );
00378
00379
00380 void SetPointSymbol (
00381 const RVC::STYLEPATTERN_SYMBOL& symbol
00382 );
00383
00384
00385
00386 void SetPriority (
00387 double priority
00388 );
00389
00390
00391 void SetRegion (
00392 const REGION2D& region
00393 );
00394
00395 void SetStyle (
00396 const LABELSTYLE& style
00397 );
00398
00399 void SetText (
00400 const MISTRING& str
00401 );
00402
00403 #if !defined(GENERATING_DOXYGEN_OUTPUT)
00404
00405 void SetParent (
00406 GRE::LABELPLACEMENT* parent
00407 );
00408
00409 GRE::LABELPLACEMENT* GetParent (
00410 ) const;
00411
00412
00413
00414
00415
00416
00417 const MIUNICODE* GetUserString (
00418 ) const;
00419
00420
00421
00422
00423
00424 void SetUserString (
00425 const MISTRING& str
00426 );
00427
00428 void Zoom (
00429 double scale
00430 );
00431
00432
00433
00434 void SetID (
00435 INT32 id
00436 );
00437 #endif
00438
00439 private:
00440
00441 class PRIV;
00442 PRIV *m_priv;
00443 bool m_bCopyOnWrite;
00444 };
00445
00446
00447
00448
00449 class LABELPLACEMENT {
00450 public:
00451 class ITERATOR;
00452 class CONST_ITERATOR;
00453 friend class CONST_ITERATOR;
00454
00455 class CONST_ITERATOR {
00456 public:
00457
00458
00459 CONST_ITERATOR (
00460 ) :
00461 m_placement(0),
00462 m_num(-1)
00463 { }
00464
00465
00466 virtual ~CONST_ITERATOR() {};
00467
00468
00469 CONST_ITERATOR (
00470 const CONST_ITERATOR& rhs
00471 ) :
00472 m_placement(rhs.m_placement),
00473 m_place(rhs.m_place),
00474 m_num(rhs.m_num)
00475 {}
00476
00477
00478
00479 CONST_ITERATOR (
00480 LABELPLACEMENT* placement
00481 ) :
00482 m_placement(placement),
00483 m_num(-1)
00484 {
00485 ReadNext(true);
00486 }
00487
00488
00489 const LABELPLACE& operator* (
00490 ) const { return (m_place); }
00491
00492
00493 const LABELPLACE* operator-> (
00494 ) const { return (&**this); }
00495
00496
00497 CONST_ITERATOR& operator++(
00498 ) {
00499 ReadNext(true);
00500 return *this;
00501 }
00502
00503
00504 CONST_ITERATOR operator++(int
00505 ) {
00506 CONST_ITERATOR temp = *this;
00507 ++*this;
00508 return(temp);
00509 }
00510
00511
00512 CONST_ITERATOR& operator--(
00513 ) {
00514 ReadPrev(true);
00515 return *this;
00516 }
00517
00518
00519 CONST_ITERATOR operator--(int
00520 ) {
00521 CONST_ITERATOR temp = *this;
00522 --*this;
00523 return(temp);
00524 }
00525
00526
00527 bool operator== (
00528 const CONST_ITERATOR& rhs
00529 ) const {
00530 if (m_num == -1 && rhs.m_num == -1) return (true);
00531 return (m_num == rhs.m_num && m_placement == rhs.m_placement);
00532 }
00533
00534
00535 bool operator!= (
00536 const CONST_ITERATOR& rhs
00537 ) const { return (!(*this == rhs)); }
00538
00539 #if !defined(GENERATING_DOXYGEN_OUTPUT)
00540 protected:
00541 LABELPLACEMENT* m_placement;
00542 LABELPLACE m_place;
00543 int m_num;
00544 void ReadPrev (bool bIsConst);
00545 void ReadNext (bool bIsConst);
00546 #endif
00547 };
00548
00549 friend class ITERATOR;
00550 class ITERATOR : public CONST_ITERATOR {
00551 public:
00552 ITERATOR();
00553
00554
00555 ITERATOR(LABELPLACEMENT* placement) :
00556 CONST_ITERATOR(placement)
00557 { }
00558
00559
00560 LABELPLACE& operator* (
00561 ) { return (m_place); }
00562
00563
00564 LABELPLACE* operator-> (
00565 ) { return (&**this); }
00566
00567
00568 ITERATOR& operator++() {
00569 ReadNext(false);
00570 return (*this);
00571 }
00572
00573
00574 ITERATOR operator++(int
00575 ) {
00576 ITERATOR temp = *this;
00577 ++*this;
00578 return(temp);
00579 }
00580
00581
00582 ITERATOR& operator--() {
00583 ReadPrev(false);
00584 return (*this);
00585 };
00586
00587
00588 ITERATOR operator--(int
00589 ) {
00590 ITERATOR temp = *this;
00591 --*this;
00592 return(temp);
00593 }
00594
00595
00596 bool operator== (
00597 const ITERATOR& rhs
00598 ) const;
00599
00600
00601 bool operator!= (
00602 const ITERATOR& rhs
00603 ) const { return (!(*this == rhs)); }
00604 };
00605
00606
00607
00608 static ERRVALUE Deconflict (
00609 SIMPLE_ARRAY<LABELPLACEMENT*>& LabelSets
00610 );
00611
00612
00613 LABELPLACEMENT (
00614 LAYER* layer,
00615 VIEW* view
00616 );
00617
00618
00619 virtual ~LABELPLACEMENT (
00620 );
00621
00622
00623 ERRVALUE Add (
00624 const LABELPLACE& place
00625 );
00626
00627
00628 CONST_ITERATOR Begin (
00629 ) const { return (CONST_ITERATOR(const_cast<LABELPLACEMENT*>(this))); }
00630
00631
00632 void Clear (
00633 );
00634
00635
00636
00637
00638 void DeleteLabels (
00639 const RVC::ELEMENT& element
00640 );
00641
00642
00643 CONST_ITERATOR End (
00644 ) const { return (CONST_ITERATOR(0)); }
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654 INT32 Find (
00655 const DPOINT2D& pt,
00656 GRE::LABELPLACE& place,
00657 int maxdist = 0
00658 ) const;
00659
00660
00661
00662
00663
00664 INT32 Find (
00665 const DPOINT2D& pt,
00666 MILIST<GRE::LABELPLACE*>& list,
00667 int maxdist = 0
00668 ) const;
00669
00670
00671
00672
00673
00674 INT32 Find (
00675 const DRECT2D& rect,
00676 MILIST<GRE::LABELPLACE*>& list
00677 ) const;
00678
00679
00680
00681
00682
00683
00684 INT32 Find (
00685 const REGION2D& region,
00686 MILIST<GRE::LABELPLACE*>& list
00687 ) const;
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697 ERRVALUE GetCombinedRegion (
00698 REGION2D& region,
00699 bool bClear = true
00700 ) const;
00701
00702
00703
00704 bool GetLabelPlace (
00705 const RVC::ELEMENT& elem,
00706 GRE::LABELPLACE& place
00707 ) const;
00708
00709
00710
00711 bool GetLabelPlaces (
00712 const RVC::ELEMENT& elem,
00713 MILIST<GRE::LABELPLACE>& places
00714 ) const;
00715
00716 LAYER* GetLayer (
00717 ) const;
00718
00719 int GetNumItems (
00720 ) const;
00721
00722 VIEW* GetView (
00723 ) const;
00724
00725 private:
00726
00727
00728
00729
00730
00731
00732
00733 virtual bool v_CompareLabels (
00734 const RVC::ELEMENT& elem1,
00735 const RVC::ELEMENT& elem2
00736 ) const;
00737
00738 #if !defined(GENERATING_DOXYGEN_OUTPUT)
00739 class PRIV;
00740 PRIV* m_priv;
00741
00742 protected:
00743
00744 GRE::LABELPLACE* GetItem (
00745 int num
00746 );
00747 public:
00748
00749 QUADTREE& GetQuadTree();
00750
00751 #endif
00752 };
00753
00754
00755 }
00756
00757
00758 #endif // INC_GRE_LABELPLACEMENT_H
00759