GME  13
ArGraph.cpp
Go to the documentation of this file.
00001 //COM'd by Tamas (check AutoRouterGraph.cpp, AutoRouterBox.cpp, AutoRouterPath.cpp, AutoRouterPort.cpp)
00002 #include "stdafx.h"
00003 //#include <math.h>
00004 //#include "afxcoll.h"
00005 //#include "afxtempl.h"
00006 //
00007 //#include "ArGraph.h"
00008 //
00009 //#ifdef _DEBUG
00011 //#endif
00012 //
00014 //
00015 //
00016 //CArPort::CArPort():   stored_ref(NULL),
00017 //                                      owner(NULL),
00018 //                                      limitedDirections( false),
00019 //                                      rect(0,0,0,0),
00020 //                                      attributes(ARPORT_Default)
00021 //{
00022 //      CalculateSelfPoints();
00023 //}
00024 //
00025 //CArPort::~CArPort()
00026 //{
00027 //}
00028 //
00029 //CArBox* CArPort::GetOwner() const
00030 //{
00031 //      ASSERT( owner != NULL );
00032 //      return owner;
00033 //}
00034 //
00035 //void CArPort::SetOwner(CArBox* o)
00036 //{
00037 //      ASSERT( owner == NULL || o == NULL );
00038 //      owner = o;
00039 //}
00040 //
00042 //
00043 //int CArPort::CanHaveStartEndPointOn(EArDir dir, int isstart) const
00044 //{
00045 //      int d = (int) dir;
00046 //      ASSERT( 0 <= d && d <= 3 );
00047 //
00048 //      if( isstart )
00049 //              d += 4;
00050 //
00051 //      return (attributes & (1 << d)) != 0;
00052 //}
00053 //
00054 //int CArPort::CanHaveStartEndPoint(int isstart) const
00055 //{
00056 //      return (attributes & (isstart ? ARPORT_StartOnAll : ARPORT_EndOnAll)) != 0;
00057 //}
00058 //
00059 //int CArPort::CanHaveStartEndPointHorizontal(int ishorizontal) const
00060 //{
00061 //      return (attributes & (ishorizontal ? ARPORT_StartEndHorizontal : ARPORT_StartEndVertical)) != 0;
00062 //}
00063 //
00064 //EArDir CArPort::GetStartEndDirTo(CPoint point, int isstart, EArDir notthis) const
00065 //{
00066 //      ASSERT( !IsRectEmpty() );
00067 //
00068 //      CSize offset = point - rect.CenterPoint();
00069 //
00070 //      EArDir dir1 = GetMajorDir(offset);
00071 //
00072 //      if( dir1 != notthis && CanHaveStartEndPointOn(dir1, isstart) )
00073 //              return dir1;
00074 //
00075 //      EArDir dir2 = GetMinorDir(offset);
00076 //
00077 //      if( dir2 != notthis && CanHaveStartEndPointOn(dir2, isstart) )
00078 //              return dir2;
00079 //
00080 //      EArDir dir3 = ReverseDir(dir2);
00081 //
00082 //      if( dir3 != notthis && CanHaveStartEndPointOn(dir3, isstart) )
00083 //              return dir3;
00084 //
00085 //      EArDir dir4 = ReverseDir(dir1);
00086 //
00087 //      if( dir4 != notthis && CanHaveStartEndPointOn(dir4, isstart) )
00088 //              return dir4;
00089 //
00090 //      if( CanHaveStartEndPointOn(dir1, isstart) )
00091 //              return dir1;
00092 //
00093 //      if( CanHaveStartEndPointOn(dir2, isstart) )
00094 //              return dir2;
00095 //
00096 //      if( CanHaveStartEndPointOn(dir3, isstart) )
00097 //              return dir3;
00098 //
00099 //      if( CanHaveStartEndPointOn(dir4, isstart) )
00100 //              return dir4;
00101 //
00102 //      return Dir_Top;
00103 //}
00104 //
00105 //int CArPort::CanCreateStartEndPointAt(CPoint point, int isstart, int nearness) const
00106 //{
00107 //      return CanHaveStartEndPoint(isstart) && IsPointIn(point, rect, nearness);
00108 //}
00109 //
00110 //CPoint CArPort::CreateStartEndPointAt(CPoint point, int isstart) const
00111 //{
00112 //      ASSERT( !IsRectEmpty() );
00113 //
00114 //      EArDir dir = Dir_None;
00115 //
00116 //      CArFindNearestLine nearest(point);
00117 //
00118 //      if( CanHaveStartEndPointOn(Dir_Top, isstart) && nearest.HLine(rect.left, rect.right-1, rect.top) )
00119 //              dir = Dir_Top;
00120 //
00121 //      if( CanHaveStartEndPointOn(Dir_Right, isstart) && nearest.VLine(rect.top, rect.bottom-1, rect.right-1) )
00122 //              dir = Dir_Right;
00123 //
00124 //      if( CanHaveStartEndPointOn(Dir_Bottom, isstart) && nearest.HLine(rect.left, rect.right-1, rect.bottom-1) )
00125 //              dir = Dir_Bottom;
00126 //
00127 //      if( CanHaveStartEndPointOn(Dir_Left, isstart) && nearest.VLine(rect.top, rect.bottom-1, rect.left) )
00128 //              dir = Dir_Left;
00129 //
00130 //      ASSERT( IsRightAngle(dir) );
00131 //
00132 //      if( IsConnectToCenter() )
00133 //              return CreateStartEndPointOn(dir);
00134 //
00135 //      if( point.x < rect.left )
00136 //              point.x = rect.left;
00137 //      else if( rect.right <= point.x )
00138 //              point.x = rect.right-1;
00139 //
00140 //      if( point.y < rect.top )
00141 //              point.y = rect.top;
00142 //      else if( rect.bottom <= point.y )
00143 //              point.y = rect.bottom-1;
00144 //
00145 //      switch(dir)
00146 //      {
00147 //      case Dir_Top:
00148 //              point.y = rect.top;
00149 //              break;
00150 //
00151 //      case Dir_Right:
00152 //              point.x = rect.right-1;
00153 //              break;
00154 //
00155 //      case Dir_Bottom:
00156 //              point.y = rect.bottom-1;
00157 //              break;
00158 //
00159 //      case Dir_Left:
00160 //              point.x = rect.left;
00161 //              break;
00162 //      }
00163 //
00164 //      return point;
00165 //}
00166 //
00167 //CPoint CArPort::CreateStartEndPointOn(EArDir dir) const
00168 //{
00169 //      ASSERT( !IsRectEmpty() );
00170 //      ASSERT( IsRightAngle(dir) );
00171 //
00172 //      switch( dir )
00173 //      {
00174 //      case Dir_Top:
00175 //              return CPoint((rect.left + rect.right)/2, rect.top);
00176 //
00177 //      case Dir_Bottom:
00178 //              return CPoint((rect.left + rect.right)/2, rect.bottom-1);
00179 //
00180 //      case Dir_Left:
00181 //              return CPoint(rect.left, (rect.top + rect.bottom)/2);
00182 //      }
00183 //
00184 //      return CPoint(rect.right-1, (rect.top + rect.bottom)/2);
00185 //}
00186 //
00187 //void CArPort::SetAttributes(unsigned int attr)
00188 //{
00189 //      ASSERT( owner == NULL );
00190 //
00191 //      attributes = attr;
00192 //}
00193 //
00195 //
00196 //void CArPort::SetRect(CRect r)
00197 //{
00198 //      ASSERT( r.Width() >= 3 && r.Height() >= 3 );
00199 //
00200 //      rect = r;
00201 //      CalculateSelfPoints();
00202 //}
00203 //
00204 //void CArPort::ShiftBy(CSize offset)
00205 //{
00206 //      ASSERT( !rect.IsRectEmpty() );
00207 //
00208 //      rect += offset;
00209 //      CalculateSelfPoints();
00210 //}
00211 //
00212 //void CArPort::CalculateSelfPoints()
00213 //{
00214 //      selfpoints[0].x = rect.left;
00215 //      selfpoints[0].y = rect.top;
00216 //
00217 //      selfpoints[1].x = rect.right - 1;
00218 //      selfpoints[1].y = rect.top;
00219 //
00220 //      selfpoints[2].x = rect.right - 1;
00221 //      selfpoints[2].y = rect.bottom - 1;
00222 //
00223 //      selfpoints[3].x = rect.left;
00224 //      selfpoints[3].y = rect.bottom - 1;
00225 //}
00226 //
00228 //
00229 //IMPLEMENT_SERIAL(CArPort, CObject, 0);
00230 //
00231 //void CArPort::Serialize(CArchive& ar)
00232 //{
00233 //      ASSERT( stored_ref == NULL );
00234 //
00235 //      if( ar.IsStoring() )
00236 //      {
00237 //              ar << this;
00238 //              ar << rect;
00239 //      }
00240 //      else
00241 //      {
00242 //              ar >> stored_ref;
00243 //              ar >> rect;
00244 //      }
00245 //}
00246 //
00248 //
00249 //#ifdef _DEBUG
00250 //
00251 //void CArPort::AssertValid() const
00252 //{
00253 //}
00254 //
00255 //void CArPort::AssertValidStartEndPoint(CPoint point, EArDir dir, int isstart) const
00256 //{
00257 //      ASSERT( !IsRectEmpty() );
00258 //
00259 //      if( dir == Dir_None )
00260 //      {
00261 //              dir = OnWhichEdge(point);
00262 //              ASSERT( IsRightAngle(dir) );
00263 //      }
00264 //      else
00265 //      {
00266 //              ASSERT( dir == OnWhichEdge(point) );
00267 //      }
00268 //
00269 //      ASSERT( CanHaveStartEndPointOn(dir, isstart) );
00270 //}
00271 //
00272 //#endif
00273 //
00274 //
00276 //
00277 //
00278 //CArBox::CArBox(): owner(NULL),
00279 //                                rect(0,0,0,0),
00280 //                                atomic(0)
00281 //{
00282 //      CalculateSelfPoints();
00283 //}
00284 //
00285 //CArBox::~CArBox()
00286 //{
00287 //      DeleteAllPorts();
00288 //}
00289 //
00290 //CArGraph* CArBox::GetOwner() const
00291 //{
00292 //      ASSERT( owner != NULL );
00293 //      return owner;
00294 //}
00295 //
00296 //void CArBox::SetOwner(CArGraph* graph)
00297 //{
00298 //      ASSERT( owner == NULL || graph == NULL );
00299 //
00300 //      owner = graph;
00301 //}
00302 //
00304 //
00305 //CArPort* CArBox::CreatePort() const
00306 //{
00307 //      CArPort* port = new CArPort;
00308 //      ASSERT( port != NULL );
00309 //
00310 //      return port;
00311 //}
00312 //
00313 //void CArBox::Add(CArPort* port)
00314 //{
00315 //      ASSERT( port != NULL && port->owner == NULL );
00316 //      ASSERT( !atomic );
00317 //
00318 //      port->SetOwner(this);
00319 //      ports.AddTail(port);
00320 //
00321 //#ifdef _DEBUG
00322 //      AssertValidPort(port);
00323 //#endif
00324 //}
00325 //
00326 //void CArBox::Delete(CArPort* port)
00327 //{
00328 //      ASSERT( port != NULL && port->owner == this );
00329 //
00330 //#ifdef _DEBUG
00331 //      AssertValidPort(port);
00332 //
00333 //      if( atomic )
00334 //              ASSERT( ports.GetCount() == 1 );
00335 //#endif
00336 //
00337 //      POSITION pos = ports.Find(port);
00338 //      ASSERT( pos != NULL );
00339 //      ports.RemoveAt(pos);
00340 //
00341 //      delete port;
00342 //
00343 //      atomic = 0;
00344 //}
00345 //
00346 //void CArBox::DeleteAllPorts()
00347 //{
00348 //      POSITION pos = ports.GetHeadPosition();
00349 //      while( pos != NULL )
00350 //              delete ports.GetNext(pos);
00351 //
00352 //      ports.RemoveAll();
00353 //
00354 //      atomic = 0;
00355 //}
00356 //
00357 //CArPort* CArBox::GetPortAt(CPoint point, int nearness) const
00358 //{
00359 //      POSITION pos = ports.GetHeadPosition();
00360 //      while( pos != NULL )
00361 //      {
00362 //              CArPort* port = ports.GetNext(pos);
00363 //              if( port->IsPortAt(point, nearness) )
00364 //                      return port;
00365 //      }
00366 //
00367 //      return NULL;
00368 //}
00369 //
00371 //
00372 //void CArBox::SetAtomicPort(CArPort* port)
00373 //{
00374 //      ASSERT( HasNoPort() );
00375 //      ASSERT( !IsRectEmpty() );
00376 //      ASSERT( !atomic );
00377 //
00378 //      port->SetRect(rect);
00379 //      Add(port);
00380 //
00381 //      atomic = 1;
00382 //}
00383 //
00384 //CArPort* CArBox::GetAtomicPort() const
00385 //{
00386 //      ASSERT( atomic && ports.GetCount() == 1 );
00387 //
00388 //      return ports.GetHead();
00389 //}
00390 //
00392 //
00393 //void CArBox::SetRect(CRect r)
00394 //{
00395 //      ASSERT( r.Width() >= 3 && r.Height() >= 3 );
00396 //      ASSERT( r.TopLeft().x >= ED_MINCOORD && r.TopLeft().y >= ED_MINCOORD );
00397 //      ASSERT( r.BottomRight().x <= ED_MAXCOORD && r.BottomRight().y <= ED_MAXCOORD );
00398 //      ASSERT( HasNoPort() || atomic );
00399 //
00400 //      rect = r;
00401 //      CalculateSelfPoints();
00402 //
00403 //      if( atomic )
00404 //      {
00405 //              ASSERT( ports.GetCount() == 1 );
00406 //              ports.GetHead()->SetRect(r);
00407 //      }
00408 //}
00409 //
00410 //void CArBox::ShiftBy(CSize offset)
00411 //{
00412 //      rect += offset;
00413 //
00414 //      POSITION pos = ports.GetHeadPosition();
00415 //      while( pos != NULL )
00416 //              ports.GetNext(pos)->ShiftBy(offset);
00417 //
00418 //      CalculateSelfPoints();
00419 //}
00420 //
00421 //void CArBox::CalculateSelfPoints()
00422 //{
00423 //      selfpoints[0].x = rect.left;
00424 //      selfpoints[0].y = rect.top;
00425 //
00426 //      selfpoints[1].x = rect.right - 1;
00427 //      selfpoints[1].y = rect.top;
00428 //
00429 //      selfpoints[2].x = rect.right - 1;
00430 //      selfpoints[2].y = rect.bottom - 1;
00431 //
00432 //      selfpoints[3].x = rect.left;
00433 //      selfpoints[3].y = rect.bottom - 1;
00434 //}
00435 //
00437 //
00438 //IMPLEMENT_SERIAL(CArBox, CObject, 0);
00439 //
00440 //void CArBox::Serialize(CArchive& ar)
00441 //{
00442 //      if( ar.IsStoring() )
00443 //              ar << rect;
00444 //      else
00445 //              ar >> rect;
00446 //
00447 //      ports.Serialize(ar);
00448 //
00449 //      if( ar.IsLoading() )
00450 //      {
00451 //              POSITION pos = ports.GetHeadPosition();
00452 //              while( pos != NULL )
00453 //                      ports.GetNext(pos)->SetOwner(this);
00454 //
00455 //              CalculateSelfPoints();
00456 //      }
00457 //}
00458 //
00459 //CArPort* CArBox::ResolveStoredRef(CArPort* ref)
00460 //{
00461 //      POSITION pos = ports.GetHeadPosition();
00462 //      while( pos != NULL )
00463 //      {
00464 //              CArPort* port = ports.GetNext(pos);
00465 //              if( port->MatchStoredRef(ref) )
00466 //                      return port;
00467 //      }
00468 //
00469 //      return NULL;
00470 //}
00471 //              
00472 //void CArBox::ClearStoredRefs()
00473 //{
00474 //      POSITION pos = ports.GetHeadPosition();
00475 //      while( pos != NULL )
00476 //              ports.GetNext(pos)->ClearStoredRefs();
00477 //}
00478 //
00480 //
00481 //#ifdef _DEBUG
00482 //
00483 //void CArBox::AssertValid() const
00484 //{
00485 //      POSITION pos = ports.GetHeadPosition();
00486 //      while( pos != NULL )
00487 //      {
00488 //              CArPort* port = ports.GetNext(pos);
00489 //              AssertValidPort(port);
00490 //      }
00491 //}
00492 //
00493 //void CArBox::AssertValidPort(const CArPort* port) const
00494 //{
00495 //      ASSERT_VALID(port);
00496 //
00497 //      if( owner != NULL )
00498 //              ASSERT( port->GetOwner() == this );
00499 //
00500 //      ASSERT( IsRectIn(port->rect, rect) );
00501 //}
00502 //
00503 //#endif
00504 //
00505 //
00506 //
00508 //
00509 //
00510 //
00511 //CArPath::CArPath(): owner(NULL),
00512 //                                      ref_type(ref_type_valid),
00513 //                                      startport(NULL),
00514 //                                      endport(NULL),
00515 //                                      attributes(ARPATH_Default),
00516 //                                      state(ARPATHST_Default),
00517 //                                      extptr(NULL)
00518 //{
00519 //}
00520 //
00521 //CArPath::~CArPath()
00522 //{
00523 //      DeleteAll();
00524 //}
00525 //
00526 //CArGraph* CArPath::GetOwner() const
00527 //{
00528 //      ASSERT( owner != NULL );
00529 //      return owner;
00530 //}
00531 //
00532 //void CArPath::SetOwner(CArGraph* graph)
00533 //{
00534 //      ASSERT( owner == NULL || graph == NULL );
00535 //      owner = graph;
00536 //}
00537 //
00539 //
00540 //void CArPath::SetStartPort(CArPort* port)
00541 //{
00542 //      ASSERT( owner == NULL );
00543 //      startport = port;
00544 //}
00545 //
00546 //void CArPath::SetEndPort(CArPort* port)
00547 //{
00548 //      ASSERT( owner == NULL );
00549 //      endport = port;
00550 //}
00551 //
00552 //void CArPath::ClearPorts()
00553 //{
00554 //      ASSERT( owner == NULL );
00555 //
00556 //      startport = NULL;
00557 //      endport = NULL;
00558 //}
00559 //
00560 //CArPort* CArPath::GetStartPort() const
00561 //{
00562 //      ASSERT( startport != NULL );
00563 //      return startport;
00564 //}
00565 //
00566 //CArPort* CArPath::GetEndPort() const
00567 //{
00568 //      ASSERT( endport != NULL );
00569 //      return endport;
00570 //}
00571 //
00573 //
00574 //void CArPath::AddTail(CPoint point)
00575 //{
00576 //      ASSERT( !IsConnected() );
00577 //      points.AddTail(point);
00578 //}
00579 //
00580 //void CArPath::DeleteAll()
00581 //{
00582 //      points.RemoveAll();
00583 //      state = ARPATHST_Default;
00584 //}
00585 //
00586 //CPoint CArPath::GetStartPoint() const
00587 //{
00588 //      ASSERT( points.GetCount() >= 2 );
00589 //
00590 //      return points.GetHead();
00591 //}
00592 //
00593 //CPoint CArPath::GetEndPoint() const
00594 //{
00595 //      ASSERT( points.GetCount() >= 2 );
00596 //
00597 //      return points.GetTail();
00598 //}
00599 //
00600 //CPoint CArPath::GetOutOfBoxStartPoint() const
00601 //{
00602 //      ASSERT( points.GetCount() >= 2 );
00603 //
00604 //      POSITION pos = points.GetHeadPosition();
00605 //      CPoint p = points.GetNext(pos);
00606 //      EArDir d = GetDir(points.GetAt(pos) - p);
00607 //      ASSERT( IsRightAngle(d) );
00608 //
00609 //      GetPointCoord(p, d) = GetRectOuterCoord(GetStartBox()->GetRect(), d);
00610 //      ASSERT( points.GetAt(pos) == p || GetDir(points.GetAt(pos) - p) == d ); 
00611 //
00612 //      return p;
00613 //}
00614 //
00615 //CPoint CArPath::GetOutOfBoxEndPoint() const
00616 //{
00617 //      ASSERT( points.GetCount() >= 2 );
00618 //
00619 //      POSITION pos = points.GetTailPosition();
00620 //      CPoint p = points.GetPrev(pos);
00621 //      EArDir d = GetDir(points.GetAt(pos) - p);
00622 //      ASSERT( IsRightAngle(d) );
00623 //
00624 //      GetPointCoord(p, d) = GetRectOuterCoord(GetEndBox()->GetRect(), d);
00625 //      ASSERT( points.GetAt(pos) == p || GetDir(points.GetAt(pos) - p) == d ); 
00626 //
00627 //      return p;
00628 //}
00629 //
00630 //POSITION CArPath::GetPointPosAt(CPoint point, int nearness) const
00631 //{
00632 //      POSITION pos = points.GetHeadPosition();
00633 //      while( pos != NULL )
00634 //      {
00635 //              POSITION oldpos = pos;
00636 //              if( IsPointNear(points.GetNext(pos), point, nearness) )
00637 //                      return oldpos;
00638 //      }
00639 //      
00640 //      return NULL;
00641 //}
00642 //
00643 //POSITION CArPath::GetEdgePosAt(CPoint point, int nearness) const
00644 //{
00645 //      CPoint a;
00646 //      CPoint b;
00647 //
00648 //      POSITION pos = GetTailEdge(a, b);
00649 //      while( pos != NULL )
00650 //      {
00651 //              if( IsPointNearLine(point, a, b, nearness) )
00652 //                      return pos;
00653 //
00654 //              GetPrevEdge(pos, a, b);
00655 //      }
00656 //
00657 //      return NULL;
00658 //}
00659 //
00660 //void CArPath::SimplifyTrivially()
00661 //{
00662 //      ASSERT( !IsConnected() );
00663 //
00664 //      if( points.GetCount() <= 2 )
00665 //              return;
00666 //      
00667 //      POSITION pos = points.GetHeadPosition();
00668 //
00669 //      POSITION pos1 = pos;
00670 //      ASSERT( pos1 != NULL );
00671 //      CPoint p1 = points.GetNext(pos);
00672 //
00673 //      POSITION pos2 = pos;
00674 //      ASSERT( pos2 != NULL );
00675 //      CPoint p2 = points.GetNext(pos);
00676 //
00677 //      EArDir dir12 = GetDir(p2-p1);
00678 //
00679 //      POSITION pos3 = pos;
00680 //      ASSERT( pos3 != NULL );
00681 //      CPoint p3 = points.GetNext(pos);
00682 //
00683 //      EArDir dir23 = GetDir(p3-p2); 
00684 //
00685 //      for(;;)
00686 //      {
00687 //              if( dir12 == Dir_None || dir23 == Dir_None ||
00688 //                      (dir12 != Dir_Skew && dir23 != Dir_Skew &&
00689 //                      (dir12 == dir23 || dir12 == ReverseDir(dir23)) ) )
00690 //              {
00691 //                      points.RemoveAt(pos2);
00692 //                      dir12 = GetDir(p3-p1);
00693 //              }
00694 //              else
00695 //              {
00696 //                      pos1 = pos2;
00697 //                      p1 = p2;
00698 //                      dir12 = dir23;
00699 //              }
00700 //
00701 //              if( pos == NULL )
00702 //                      return;
00703 //
00704 //              pos2 = pos3;
00705 //              p2 = p3;
00706 //
00707 //              pos3 = pos;
00708 //              p3 = points.GetNext(pos);
00709 //
00710 //              dir23 = GetDir(p3-p2);
00711 //      }
00712 //
00713 //#ifdef _DEBUG
00714 //      AssertValidPoints();
00715 //#endif
00716 //}
00717 //
00719 //
00720 //POSITION CArPath::GetHeadEdge(CPoint& start, CPoint& end) const
00721 //{
00722 //      if( points.GetCount() < 2 )
00723 //              return NULL;
00724 //
00725 //      POSITION pos = points.GetHeadPosition();
00726 //      ASSERT( pos != NULL );
00727 //
00728 //      start = points.GetNext(pos);
00729 //      ASSERT( pos != NULL );
00730 //
00731 //      end = points.GetAt(pos);
00732 //
00733 //      return pos;
00734 //}
00735 //
00736 //POSITION CArPath::GetTailEdge(CPoint& start, CPoint& end) const
00737 //{
00738 //      if( points.GetCount() < 2 )
00739 //              return NULL;
00740 //
00741 //      POSITION pos = points.GetTailPosition();
00742 //      ASSERT( pos != NULL );
00743 //
00744 //      end = points.GetPrev(pos);
00745 //      ASSERT( pos != NULL );
00746 //
00747 //      start = points.GetAt(pos);
00748 //
00749 //      return pos;
00750 //}
00751 //
00752 //void CArPath::GetNextEdge(POSITION& pos, CPoint& start, CPoint& end) const
00753 //{
00754 //#ifdef _DEBUG
00755 //      AssertValidPos(pos);
00756 //#endif
00757 //
00758 //      points.GetNext(pos);
00759 //      ASSERT( pos != NULL );
00760 //
00761 //      POSITION p = pos;
00762 //      start = points.GetNext(p);
00763 //      if( p == NULL )
00764 //              pos = NULL;
00765 //      else
00766 //              end = points.GetAt(p);
00767 //}
00768 //
00769 //void CArPath::GetPrevEdge(POSITION& pos, CPoint& start, CPoint& end) const
00770 //{
00771 //#ifdef _DEBUG
00772 //      AssertValidPos(pos);
00773 //#endif
00774 //
00775 //      end = points.GetPrev(pos);
00776 //      if( pos != NULL )
00777 //              start = points.GetAt(pos);
00778 //}
00779 //
00780 //void CArPath::GetEdge(POSITION pos, CPoint& start, CPoint& end) const
00781 //{
00782 //#ifdef _DEBUG
00783 //      AssertValidPos(pos);
00784 //#endif
00785 //
00786 //      start = points.GetNext(pos);
00787 //      ASSERT( pos != NULL );
00788 //
00789 //      end = points.GetAt(pos);
00790 //}
00791 //
00792 //POSITION CArPath::GetHeadEdgePtrs(CPoint*& start, CPoint*& end)
00793 //{
00794 //      if( points.GetCount() < 2 )
00795 //              return NULL;
00796 //
00797 //      POSITION pos = points.GetHeadPosition();
00798 //      ASSERT( pos != NULL );
00799 //
00800 //      start = &(points.GetNext(pos));
00801 //      ASSERT( pos != NULL );
00802 //
00803 //      end = &(points.GetAt(pos));
00804 //
00805 //      return pos;
00806 //}
00807 //
00808 //POSITION CArPath::GetTailEdgePtrs(CPoint*& start, CPoint*& end)
00809 //{
00810 //      if( points.GetCount() < 2 )
00811 //              return NULL;
00812 //
00813 //      POSITION pos = points.GetTailPosition();
00814 //      ASSERT( pos != NULL );
00815 //
00816 //      end = &(points.GetPrev(pos));
00817 //      ASSERT( pos != NULL );
00818 //
00819 //      start = &(points.GetAt(pos));
00820 //
00821 //      return pos;
00822 //}
00823 //
00824 //void CArPath::GetNextEdgePtrs(POSITION& pos, CPoint*& start, CPoint*& end)
00825 //{
00826 //#ifdef _DEBUG
00827 //      AssertValidPos(pos);
00828 //#endif
00829 //
00830 //      points.GetNext(pos);
00831 //      ASSERT( pos != NULL );
00832 //
00833 //      POSITION p = pos;
00834 //      start = &(points.GetNext(p));
00835 //      if( p == NULL )
00836 //              pos = NULL;
00837 //      else
00838 //              end = &(points.GetAt(p));
00839 //}
00840 //
00841 //void CArPath::GetPrevEdgePtrs(POSITION& pos, CPoint*& start, CPoint*& end)
00842 //{
00843 //#ifdef _DEBUG
00844 //      AssertValidPos(pos);
00845 //#endif
00846 //
00847 //      end = &(points.GetPrev(pos));
00848 //      if( pos != NULL )
00849 //              start = &(points.GetAt(pos));
00850 //}
00851 //
00852 //void CArPath::GetEdgePtrs(POSITION pos, CPoint*& start, CPoint*& end)
00853 //{
00854 //#ifdef _DEBUG
00855 //      AssertValidPos(pos);
00856 //#endif
00857 //
00858 //      start = &(points.GetNext(pos));
00859 //      ASSERT( pos != NULL );
00860 //
00861 //      end = &(points.GetAt(pos));
00862 //}
00863 //
00864 //CPoint* CArPath::GetStartPoint(POSITION pos)
00865 //{
00866 //#ifdef _DEBUG
00867 //      AssertValidPos(pos);
00868 //#endif
00869 //
00870 //      return &(points.GetAt(pos));
00871 //}
00872 //
00873 //CPoint* CArPath::GetEndPoint(POSITION pos)
00874 //{
00875 //#ifdef _DEBUG
00876 //      AssertValidPos(pos);
00877 //#endif
00878 //
00879 //      points.GetNext(pos);
00880 //      ASSERT( pos != NULL );
00881 //
00882 //      return &(points.GetAt(pos));
00883 //}
00884 //
00885 //CPoint* CArPath::GetPointBeforeEdge(POSITION pos)
00886 //{
00887 //#ifdef _DEBUG
00888 //      AssertValidPos(pos);
00889 //#endif
00890 //
00891 //      points.GetPrev(pos);
00892 //      if( pos == NULL )
00893 //              return NULL;
00894 //
00895 //      return &(points.GetAt(pos));
00896 //}
00897 //
00898 //CPoint* CArPath::GetPointAfterEdge(POSITION pos)
00899 //{
00900 //#ifdef _DEBUG
00901 //      AssertValidPos(pos);
00902 //#endif
00903 //
00904 //      points.GetNext(pos);
00905 //      ASSERT( pos != NULL );
00906 //
00907 //      points.GetNext(pos);
00908 //      if( pos == NULL )
00909 //              return NULL;
00910 //
00911 //      return &(points.GetAt(pos));
00912 //}
00913 //
00914 //POSITION CArPath::GetEdgePosBeforePoint(POSITION pos) const
00915 //{
00916 //#ifdef _DEBUG
00917 //      AssertValidPos(pos);
00918 //#endif
00919 //
00920 //      points.GetPrev(pos);
00921 //      return pos;
00922 //}
00923 //
00924 //POSITION CArPath::GetEdgePosAfterPoint(POSITION pos) const
00925 //{
00926 //#ifdef _DEBUG
00927 //      AssertValidPos(pos);
00928 //#endif
00929 //
00930 //      POSITION p = pos;
00931 //      points.GetNext(p);
00932 //      if( p == NULL )
00933 //              return NULL;
00934 //
00935 //      return pos;
00936 //}
00937 //
00938 //POSITION CArPath::GetEdgePosForStartPoint(CPoint* startpoint)
00939 //{
00940 //      POSITION pos = points.GetHeadPosition();
00941 //      while( pos != NULL )
00942 //      {
00943 //              if( &(points.GetNext(pos)) == startpoint )
00944 //              {
00945 //                      ASSERT( pos != NULL );
00946 //                      points.GetPrev(pos);
00947 //                      break;
00948 //              }
00949 //      }
00950 //
00951 //      ASSERT( pos != NULL );
00952 //      return pos;
00953 //}
00954 //
00956 //
00957 //CRect CArPath::GetSurroundRect() const
00958 //{
00959 //      CRect rect(INT_MAX,INT_MAX,INT_MIN,INT_MIN);
00960 //
00961 //      POSITION pos = points.GetHeadPosition();
00962 //      while( pos != NULL )
00963 //      {
00964 //              CPoint point = points.GetNext(pos);
00965 //
00966 //              rect.left = min(rect.left, point.x);
00967 //              rect.top = min(rect.top, point.y);
00968 //              rect.right = max(rect.right, point.x);
00969 //              rect.bottom = max(rect.bottom, point.y);
00970 //      }
00971 //
00972 //      if( rect.left == INT_MAX || rect.top == INT_MAX ||
00973 //              rect.right == INT_MIN || rect.bottom == INT_MIN )
00974 //      {
00975 //              rect.SetRectEmpty();
00976 //      }
00977 //
00978 //      return rect;
00979 //}
00980 //
00981 //int CArPath::IsPathClip(CRect rect) const
00982 //{
00983 //      CPoint a;
00984 //      CPoint b;
00985 //
00986 //      POSITION pos = GetTailEdge(a, b);
00987 //      while( pos != NULL )
00988 //      {
00989 //              if( IsLineClipRect(a, b, rect) )
00990 //                      return 1;
00991 //
00992 //              GetPrevEdge(pos, a, b);
00993 //      }
00994 //
00995 //      return 0;
00996 //}
00997 //
00998 //void CArPath::SetAttributes(unsigned int attr)
00999 //{
01001 //
01002 //      attributes = attr;
01003 //}
01004 //
01005 //void CArPath::SetState(int s)
01006 //{
01007 //      ASSERT( owner != NULL );
01008 //
01009 //      state = s;
01010 //
01011 //#ifdef _DEBUG
01012 //      AssertValid();
01013 //#endif
01014 //}
01015 //
01016 //EArDir CArPath::GetEndDir() const
01017 //{
01018 //      unsigned int a = attributes & ARPATH_EndMask;
01019 //      return a & ARPATH_EndOnTop ? Dir_Top : 
01020 //      a & ARPATH_EndOnRight ? Dir_Right : 
01021 //      a & ARPATH_EndOnBottom ? Dir_Bottom :
01022 //      a & ARPATH_EndOnLeft ? Dir_Left : Dir_None;
01023 //}
01024 //
01025 //EArDir CArPath::GetStartDir() const
01026 //{
01027 //      unsigned int a = attributes & ARPATH_StartMask;
01028 //      return a & ARPATH_StartOnTop ? Dir_Top : 
01029 //      a & ARPATH_StartOnRight ? Dir_Right : 
01030 //      a & ARPATH_StartOnBottom ? Dir_Bottom :
01031 //      a & ARPATH_StartOnLeft ? Dir_Left : Dir_None;
01032 //}
01033 //
01035 //
01036 //IMPLEMENT_SERIAL(CArPath, CObject, 0);
01037 //
01038 //void CArPath::Serialize(CArchive& ar)
01039 //{
01040 //      ASSERT( HasRealReferences() );
01041 //
01042 //      if( ar.IsStoring() )
01043 //      {
01044 //              ar << startport;
01045 //              ar << endport;
01046 //              
01047 //              ar << points.GetCount();
01048 //              POSITION pos = points.GetHeadPosition();
01049 //              while( pos != NULL )
01050 //                      ar << points.GetNext(pos);
01051 //      }
01052 //      else
01053 //      {
01054 //              ASSERT( startport == NULL && endport == NULL && points.IsEmpty() );
01055 //
01056 //              ar >> startport;
01057 //              ar >> endport;
01058 //
01059 //              ref_type = ref_type_stored;
01060 //
01061 //              int count;
01062 //              ar >> count;
01063 //              while( count-- > 0 )
01064 //              {
01065 //                      CPoint point;
01066 //                      ar >> point;
01067 //                      AddTail(point);
01068 //              }
01069 //      }
01070 //}
01071 //
01072 //void CArPath::LocateRefs()
01073 //{
01074 //      ASSERT( ref_type == ref_type_stored );
01075 //      ASSERT( owner != NULL );
01076 //
01077 //      if( startport != NULL )
01078 //              startport = owner->ResolveStoredRef(startport);
01079 //
01080 //      if( endport != NULL )
01081 //              endport = owner->ResolveStoredRef(endport);
01082 //
01083 //      ref_type = ref_type_valid;
01084 //
01085 //      ASSERT_VALID(this);
01086 //}
01087 //
01089 //
01090 //#ifdef _DEBUG
01091 //
01092 //void CArPath::AssertValid() const
01093 //{
01094 //      if( startport != NULL )
01095 //              ASSERT_VALID(startport);
01096 //
01097 //      if( endport != NULL )
01098 //              ASSERT_VALID(endport);
01099 //
01100 //      if( IsConnected() )
01101 //              ASSERT( !points.IsEmpty() );
01102 //      else
01103 //              ASSERT( points.IsEmpty() );
01104 //}
01105 //
01106 //void CArPath::AssertValidPos(POSITION pos) const
01107 //{
01108 //      ASSERT( pos != NULL );
01109 //
01110 //      POSITION p = points.GetHeadPosition();
01111 //      for(;;)
01112 //      {
01113 //              ASSERT( p != NULL );
01114 //              if( p == pos )
01115 //                      return;
01116 //
01117 //              points.GetNext(p);
01118 //      }
01119 //}
01120 //
01121 //#pragma warning( disable : 4701 )
01122 //
01123 //void CArPath::AssertValidPoints() const
01124 //{
01125 //      points.AssertValid();
01126 //
01127 //      if( points.IsEmpty() )
01128 //              return;
01129 //
01130 //#ifdef _DEBUG_DEEP
01131 //      TRACE("CArPath::AssertValidPoints (count=%d) START\n", points.GetCount());
01132 //#endif
01133 //
01134 //      POSITION pos = points.GetHeadPosition();
01135 //      ASSERT( points.GetCount() >= 2 && pos != NULL );
01136 //
01137 //      POSITION p1p = NULL;
01138 //      POSITION p2p = NULL;
01139 //      POSITION p3p;
01140 //
01141 //      CPoint p1;
01142 //      CPoint p2;
01143 //
01144 //      EArDir d12;
01145 //      EArDir d23;
01146 //      d23 = d12 = Dir_None;// init by zolmol
01147 //
01148 //      while( pos != NULL )
01149 //      {
01150 //              p3p = p2p;
01151 //              p2p = p1p;
01152 //              p1p = pos;
01153 //
01154 //              p2 = p1;
01155 //              p1 = points.GetNext(pos);
01156 //
01157 //#ifdef _DEBUG_DEEP
01158 //              TRACE("%p (%d,%d)\n", p1p, p1.x, p1.y);
01159 //#endif
01160 //              d23 = d12;
01161 //              if( p2p != NULL )
01162 //              {
01163 //                      d12 = GetDir(p2 - p1);
01164 //                      ASSERT( IsRightAngle(d12) );
01165 //              }
01166 //
01167 //              if( p3p != NULL )
01168 //                      ASSERT( AreInRightAngle(d12, d23) );
01169 //      }
01170 //
01171 //#ifdef _DEBUG_DEEP
01172 //      TRACE("CArPath::AssertValidPoints END\n");
01173 //#endif
01174 //
01175 //}
01176 //
01177 //#endif
01178 //
01179 //
01181 //
01182 //
01183 //CArGraph::CArGraph(): horizontal(1),
01184 //                                        vertical(0)
01185 //{
01186 //      horizontal.owner = this;
01187 //      vertical.owner = this;
01188 //      CalculateSelfPoints();
01189 //      AddEdges(this);
01190 //}
01191 //
01192 //CArGraph::~CArGraph()
01193 //{
01194 //      DeleteEdges(this);
01195 //      DeleteAll();
01196 //}
01197 //
01199 //
01200 //CArBox* CArGraph::CreateBox() const
01201 //{
01202 //      CArBox* box = new CArBox;
01203 //      ASSERT( box != NULL );
01204 //
01205 //      return box;
01206 //}
01207 //
01208 //void CArGraph::Add(CArBox* box)
01209 //{
01210 //      ASSERT( box != NULL );
01211 //      ASSERT( box->owner == NULL );
01212 //
01213 //      DisconnectPathsClipping(box->GetRect());
01214 //
01215 //      box->SetOwner(this);
01216 //
01217 //      boxes.AddTail(box);
01218 //
01219 //      AddBoxAndPortEdges(box);
01220 //}
01221 //
01222 //void CArGraph::Remove(CArBox* box)
01223 //{
01224 //      ASSERT( box != NULL && box->owner == this );
01225 //
01226 //      DeleteBoxAndPortEdges(box);
01227 //
01228 //      POSITION pos = paths.GetHeadPosition();
01229 //      while( pos != NULL )
01230 //      {
01231 //              CArPath* path = paths.GetNext(pos);
01232 //
01233 //              if( path->GetStartPort()->GetOwner() == box || path->GetEndPort()->GetOwner() == box )
01234 //                      Delete(path);
01235 //      }
01236 //
01237 //      box->SetOwner(NULL);
01238 //
01239 //      pos = boxes.Find(box);
01240 //      ASSERT( pos != NULL );
01241 //      boxes.RemoveAt(pos);
01242 //}
01243 //
01244 //void CArGraph::Delete(CArBox* box)
01245 //{
01246 //      if( box->owner != NULL )
01247 //      {
01248 //              ASSERT( box->owner == this );
01249 //
01250 //              Remove(box);
01251 //      }
01252 //
01253 //      delete box;
01254 //}
01255 //
01256 //void CArGraph::DeleteAllBoxes()
01257 //{
01258 //      POSITION pos = boxes.GetHeadPosition();
01259 //      while( pos != NULL )
01260 //      {
01261 //              CArBox* box = boxes.GetNext(pos);
01262 //
01263 //              DeleteBoxAndPortEdges(box);
01264 //
01265 //              delete box;
01266 //      }
01267 //
01268 //      boxes.RemoveAll();
01269 //}
01270 //
01271 //void CArGraph::SetPortAttr(CArPort* port, unsigned int attr)
01272 //{
01273 //      ASSERT_VALID(port);
01274 //
01275 //      DisconnectPathsFrom(port);
01276 //      port->SetAttributes(attr);
01277 //}
01278 //
01279 //int CArGraph::IsRectClipBoxes(CRect rect) const
01280 //{
01281 //      POSITION pos = boxes.GetHeadPosition();
01282 //      while( pos != NULL )
01283 //      {
01284 //              if( IsRectClip(rect, boxes.GetNext(pos)->rect) )
01285 //                      return 1;
01286 //      }
01287 //
01288 //      return 0;
01289 //}
01290 //
01291 //int CArGraph::IsLineClipBoxes(CPoint p1, CPoint p2) const
01292 //{
01293 //      CRect rect(p1, p2);
01294 //      rect.NormalizeRect();
01295 //      ASSERT( rect.left == rect.right || rect.top == rect.bottom );
01296 //
01297 //      if( rect.left == rect.right)
01298 //              rect.right++;
01299 //      if( rect.top == rect.bottom )
01300 //              rect.bottom++;
01301 //
01302 //      return IsRectClipBoxes(rect);
01303 //}
01304 //
01305 //int CArGraph::CanBoxAt(CRect rect) const
01306 //{
01307 //      return !IsRectClipBoxes(InflatedRect(rect, 1));
01308 //}
01309 //
01310 //int CArGraph::CanShiftBy(CArBox* box, CSize offset) const
01311 //{
01312 //      ASSERT_VALID(box);
01313 //
01314 //      CRect rect = box->rect + offset;
01315 //      rect.InflateRect(1, 1);
01316 //
01317 //      POSITION pos = boxes.GetHeadPosition();
01318 //      while( pos != NULL )
01319 //      {
01320 //              CArBox* b = boxes.GetNext(pos);
01321 //              if( b != box && IsRectClip(rect, b->rect) )
01322 //                      return 0;
01323 //      }
01324 //
01325 //      return 1;
01326 //}
01327 //
01328 //void CArGraph::ShiftBy(CArBox* box, CSize offset)
01329 //{
01330 //      ASSERT_VALID(box);
01331 //
01332 //      DeleteBoxAndPortEdges(box);
01333 //      box->ShiftBy(offset);
01334 //      AddBoxAndPortEdges(box);
01335 //      
01336 //      DisconnectPathsClipping(box->GetRect());
01337 //      DisconnectPathsFrom(box);
01338 //}
01339 //
01340 //CArBox* CArGraph::GetBoxAt(CPoint point, int nearness) const
01341 //{
01342 //      POSITION pos = boxes.GetHeadPosition();
01343 //      while( pos != NULL )
01344 //      {
01345 //              CArBox* box = boxes.GetNext(pos);
01346 //              if( box->IsBoxAt(point, nearness) )
01347 //                      return box;
01348 //      }
01349 //
01350 //      return NULL;
01351 //}
01352 //
01353 //CArPort* CArGraph::GetPortAt(CPoint point, int nearness) const
01354 //{
01355 //      POSITION pos = boxes.GetHeadPosition();
01356 //      while( pos != NULL )
01357 //      {
01358 //              CArPort* port = boxes.GetNext(pos)->GetPortAt(point, nearness);
01359 //              if( port != NULL )
01360 //                      return port;
01361 //      }
01362 //
01363 //      return NULL;
01364 //}
01365 //
01368 //CArPath* CArGraph::CreatePath() const
01369 //{
01370 //      CArPath* path = new CArPath;
01371 //      ASSERT( path != NULL );
01372 //
01373 //      return path;
01374 //}
01375 //
01376 //void CArGraph::Add(CArPath* path)
01377 //{
01378 //      ASSERT( path != NULL && path->owner == NULL );
01379 //
01380 //      path->SetOwner(this);
01381 //
01382 //      paths.AddTail(path);
01383 //      AddEdges(path);
01384 //
01385 //#ifdef _DEBUG
01386 //      AssertValidPath(path);
01387 //#endif
01388 //}
01389 //
01390 //void CArGraph::Remove(CArPath* path)
01391 //{
01392 //      ASSERT( path != NULL && path->owner == this );
01393 //
01394 //      DeleteEdges(path);
01395 //
01396 //      path->SetOwner(NULL);
01397 //
01398 //      POSITION pos = paths.Find(path);
01399 //      ASSERT( pos != NULL );
01400 //      paths.RemoveAt(pos);
01401 //
01402 //      path->SetOwner(NULL);
01403 //}
01404 //
01405 //void CArGraph::Delete(CArPath* path)
01406 //{
01407 //      ASSERT( path != NULL );
01408 //
01409 //      if( path->owner != NULL )
01410 //      {
01411 //              ASSERT( path->owner == this );
01412 //
01413 //              Remove(path);
01414 //      }
01415 //
01416 //      delete path;
01417 //}
01418 //
01419 //void CArGraph::DeleteAllPaths()
01420 //{
01421 //      POSITION pos = paths.GetHeadPosition();
01422 //      while( pos != NULL )
01423 //      {
01424 //              CArPath* path = paths.GetNext(pos);
01425 //
01426 //              DeleteEdges(path);
01427 //              path->SetOwner(NULL);
01428 //              delete path;
01429 //      }
01430 //
01431 //      paths.RemoveAll();
01432 //}
01433 //
01434 //CArPath* CArGraph::GetPathAt(CPoint point, int nearness) const
01435 //{
01436 //      POSITION pos = paths.GetHeadPosition();
01437 //      while( pos != NULL )
01438 //      {
01439 //              CArPath* path = paths.GetNext(pos);
01440 //              if( path->IsPathAt(point, nearness) )
01441 //                      return path;
01442 //      }
01443 //
01444 //      return NULL;
01445 //}
01446 //
01447 //CArPath* CArGraph::GetPathPointAt(CPoint point, POSITION& pos, int nearness) const
01448 //{
01449 //      POSITION pathpos = paths.GetHeadPosition();
01450 //      while( pathpos != NULL )
01451 //      {
01452 //              CArPath* path = paths.GetNext(pathpos);
01453 //              ASSERT( path != NULL );
01454 //              pos = path->GetPointPosAt(point, nearness);
01455 //              if( pos != NULL )
01456 //                      return path;
01457 //      }
01458 //
01459 //      return NULL;
01460 //}
01461 //
01462 //CArPath* CArGraph::GetPathEdgeAt(CPoint point, POSITION& pos, int nearness) const
01463 //{
01464 //      POSITION pathpos = paths.GetHeadPosition();
01465 //      while( pathpos != NULL )
01466 //      {
01467 //              CArPath* path = paths.GetNext(pathpos);
01468 //              ASSERT( path != NULL );
01469 //              pos = path->GetEdgePosAt(point, nearness);
01470 //              if( pos != NULL )
01471 //                      return path;
01472 //      }
01473 //
01474 //      return NULL;
01475 //}
01476 //
01477 //SArEdge* CArGraph::GetPathEdgeAt(CArPath* path, POSITION pos) const
01478 //{
01479 //      ASSERT( path != NULL && pos != NULL );
01480 //
01481 //      CPoint* start;
01482 //      CPoint* end;
01483 //
01484 //      path->GetEdgePtrs(pos, start, end);
01485 //      ASSERT( start != NULL && end != NULL );
01486 //
01487 //      if( start->y == end->y )
01488 //              return horizontal.GetEdge(start, end);
01489 //      else if( start->x == end->x )
01490 //              return vertical.GetEdge(start, end);
01491 //
01492 //      return NULL;
01493 //}
01494 //
01495 //SArEdge* CArGraph::GetPathEdgeAt(CPoint point, int nearness) const
01496 //{
01497 //      POSITION pos;
01498 //      CArPath* path = GetPathEdgeAt(point, pos, nearness);
01499 //      if( path )
01500 //              return GetPathEdgeAt(path, pos);
01501 //
01502 //      return NULL;
01503 //}
01504 //
01505 //SArEdge* CArGraph::GetListEdgeAt(CPoint point, int nearness) const
01506 //{
01507 //      SArEdge* edge;
01508 //
01509 //      edge = horizontal.GetEdgeAt(point, nearness);
01510 //      if( edge )
01511 //              return edge;
01512 //
01513 //      return vertical.GetEdgeAt(point, nearness);
01514 //}
01515 //
01516 //CArPath* CArGraph::AddPath(CArPort* startport, CArPort* endport)
01517 //{
01520 //
01521 //      CArPath* path = CreatePath();
01522 //      path->SetStartPort(startport);
01523 //      path->SetEndPort(endport);
01524 //      Add(path);
01525 //
01526 //      return path;
01527 //}
01528 //
01530 //
01531 //CRect CArGraph::GetSurroundRect() const
01532 //{
01533 //      CRect rect(0,0,0,0);
01534 //
01535 //      POSITION pos;
01536 //
01537 //      pos = boxes.GetHeadPosition();
01538 //      while( pos != NULL )
01539 //              rect |= boxes.GetNext(pos)->rect;
01540 //
01541 //      pos = paths.GetHeadPosition();
01542 //      while( pos != NULL )
01543 //              rect |= paths.GetNext(pos)->GetSurroundRect();
01544 //
01545 //      return rect;
01546 //}
01547 //
01548 //int CArGraph::AutoRoute()
01549 //{
01550 //      ConnectAllDisconnectedPaths();
01551 //
01552 //      int updated = 0;
01553 //      int last = 0;
01554 //      int c = 100;            // max # of total op
01555 //      int dm = 10;            // max # of distribution op
01556 //      int d = 0;
01557 //
01558 //      while( c > 0 )
01559 //      {
01560 //              if( c > 0 )
01561 //              {
01562 //                      if( last == 1 )
01563 //                              break;
01564 //
01565 //                      c--;
01566 //                      if( SimplifyPaths() )
01567 //                      {
01568 //                              updated = 1;
01569 //                              last = 1;
01570 //                      }
01571 //              }
01572 //
01573 //              if( c > 0 )
01574 //              {
01575 //                      if( last == 2 )
01576 //                              break;
01577 //
01578 //                      c--;
01579 //                      if( horizontal.Block_ScanBackward() )
01580 //                      {
01581 //                              updated = 1;
01582 //
01583 //                              do
01584 //                                      c--;
01585 //                              while( c > 0 && horizontal.Block_ScanBackward() );
01586 //
01587 //                              if( last < 2 || last > 5 )
01588 //                                      d = 0;
01589 //                              else if( ++d >= dm )
01590 //                                      break;
01591 //                              
01592 //                              last = 2;
01593 //                      }
01594 //              }
01595 //              
01596 //              if( c > 0 )
01597 //              {
01598 //                      if( last == 3 )
01599 //                              break;
01600 //
01601 //                      c--;
01602 //                      if( horizontal.Block_ScanForward() )
01603 //                      {
01604 //                              updated = 1;
01605 //
01606 //                              do
01607 //                                      c--;
01608 //                              while( c > 0 && horizontal.Block_ScanForward() );
01609 //
01610 //                              if( last < 2 || last > 5 )
01611 //                                      d = 0;
01612 //                              else if( ++d >= dm )
01613 //                                      break;
01614 //                              
01615 //                              last = 3;
01616 //                      }
01617 //              }
01618 //
01619 //              if( c > 0 )
01620 //              {
01621 //                      if( last == 4 )
01622 //                              break;
01623 //
01624 //                      c--;
01625 //                      if( vertical.Block_ScanBackward() )
01626 //                      {
01627 //                              updated = 1;
01628 //
01629 //                              do
01630 //                                      c--;
01631 //                              while( c > 0 && vertical.Block_ScanBackward() );
01632 //
01633 //                              if( last < 2 || last > 5 )
01634 //                                      d = 0;
01635 //                              else if( ++d >= dm )
01636 //                                      break;
01637 //                              
01638 //                              last = 4;
01639 //                      }
01640 //              }
01641 //              if( c > 0 )
01642 //              {
01643 //                      if( last == 5 )
01644 //                              break;
01645 //
01646 //                      c--;
01647 //                      if( vertical.Block_ScanForward() )
01648 //                      {
01649 //                              updated = 1;
01650 //
01651 //                              do
01652 //                                      c--;
01653 //                              while( c > 0 && vertical.Block_ScanForward() );
01654 //
01655 //                              if( last < 2 || last > 5 )
01656 //                                      d = 0;
01657 //                              else if( ++d >= dm )
01658 //                                      break;
01659 //                              
01660 //                              last = 5;
01661 //                      }
01662 //              }
01663 //              
01664 //              if( c > 0 )
01665 //              {
01666 //                      if( last == 6 )
01667 //                              break;
01668 //
01669 //                      c--;
01670 //                      if( horizontal.Block_SwitchWrongs() )
01671 //                      {
01672 //                              updated = 1;
01673 //                              last = 6;
01674 //                      }
01675 //              }
01676 //
01677 //              if( c > 0 )
01678 //              {
01679 //                      if( last == 7 )
01680 //                              break;
01681 //
01682 //                      c--;
01683 //                      if( vertical.Block_SwitchWrongs() )
01684 //                      {
01685 //                              updated = 1;
01686 //                              last = 7;
01687 //                      }
01688 //              }
01689 //
01690 //              if( last == 0 )
01691 //                      break;
01692 //      }
01693 //
01694 //      if( c <= 0 )
01695 //      {
01696 //              // MessageBeep(MB_ICONEXCLAMATION);
01697 //              updated = -1;
01698 //      }
01699 //
01700 //      return updated;
01701 //}
01702 //
01704 //
01705 //CArBox* CArGraph::GetOutOfBox(CPoint& point, EArDir dir) const
01706 //{
01707 //      ASSERT( IsRightAngle(dir) );
01708 //
01709 //      CArBox* boxby = NULL;
01710 //
01711 //      POSITION pos = boxes.GetHeadPosition();
01712 //      while( pos != NULL )
01713 //      {
01714 //              CArBox* box = boxes.GetNext(pos);
01715 //              if( box->rect.PtInRect(point) )
01716 //              {
01717 //                      CRect& rect = box->rect;
01718 //                      boxby = box;
01719 //                      pos = boxes.GetHeadPosition();
01720 //
01721 //                      GetPointCoord(point, dir) = GetRectOuterCoord(rect, dir);
01722 //              }
01723 //      }
01724 //
01725 //      return boxby;
01726 //}
01727 //
01728 //CArBox* CArGraph::GoToNextBox(CPoint& point, EArDir dir, long stophere) const
01729 //{
01730 //      ASSERT( IsRightAngle(dir) );
01731 //      ASSERT( GetPointCoord(point, dir) != stophere );
01732 //
01733 //      CArBox* boxby = NULL;
01734 //
01735 //      POSITION pos = boxes.GetHeadPosition();
01736 //      while( pos != NULL )
01737 //      {
01738 //              CArBox* box = boxes.GetNext(pos);
01739 //              CRect& rect = box->rect;
01740 //
01741 //              if( IsPointInDirFrom(point, rect, ReverseDir(dir)) &&
01742 //                      IsPointBetweenSides(point, rect, dir) &&
01743 //                      IsCoordInDirFrom(stophere, GetRectOuterCoord(rect, ReverseDir(dir)), dir) )
01744 //              {
01745 //                      stophere = GetRectOuterCoord(rect, ReverseDir(dir));
01746 //                      boxby = box;
01747 //              }
01748 //      }
01749 //
01750 //      GetPointCoord(point, dir) = stophere;
01751 //      return boxby;
01752 //}
01753 //
01754 //void CArGraph::GetLimitsOfEdge(CPoint start, CPoint end, long& min, long& max) const
01755 //{
01756 //      long t;
01757 //
01758 //      POSITION pos = boxes.GetHeadPosition();
01759 //      CArBox* box;
01760 //
01761 //      if( start.y == end.y )
01762 //      {
01763 //              if( start.x > end.x )
01764 //              {
01765 //                      t = start.x;
01766 //                      start.x = end.x;
01767 //                      end.x = t;
01768 //              }
01769 //
01770 //              while( pos != NULL )
01771 //              {
01772 //                      box = boxes.GetNext(pos);
01773 //                      CRect& rect = box->rect;
01774 //
01775 //                      if(start.x < rect.right && rect.left <= end.x)
01776 //                      {
01777 //                              if( rect.bottom <= start.y && rect.bottom > min )
01778 //                                      min = rect.bottom;
01779 //                              if( rect.top > start.y && rect.top < max )
01780 //                                      max = rect.top;
01781 //                      }
01782 //              }
01783 //      }
01784 //      else
01785 //      {
01786 //              ASSERT( start.x == end.x );
01787 //
01788 //              if( start.y > end.y )
01789 //              {
01790 //                      t = start.y;
01791 //                      start.y = end.y;
01792 //                      end.y = t;
01793 //              }
01794 //
01795 //              while( pos != NULL )
01796 //              {
01797 //                      box = boxes.GetNext(pos);
01798 //                      CRect& rect = box->rect;
01799 //
01800 //                      if(start.y < rect.bottom && rect.top <= end.y)
01801 //                      {
01802 //                              if( rect.right <= start.x && rect.right > min )
01803 //                                      min = rect.right;
01804 //                              if( rect.left > start.x && rect.left < max )
01805 //                                      max = rect.left;
01806 //                      }
01807 //              }
01808 //      }
01809 //
01810 //      max--;
01811 //}
01812 //
01813 //void CArGraph::Connect(CArPath* path)
01814 //{
01815 //      ASSERT( path != NULL && path->GetOwner() == this );
01816 //
01817 //      CArPort* startport = path->GetStartPort();
01818 //      CArPort* endport = path->GetEndPort();
01819 //
01820 //      EArDir startdir = path->GetStartDir();
01821 //      if( startdir == Dir_None                                                                // recalc startdir if empty
01822 //              || startport->HasLimitedDirs() && !startport->CanHaveStartEndPointOn( startdir, 1)) // or is limited and userpref is invalid
01823 //              startdir = startport->GetStartEndDirTo(endport->GetCenter(), 1);
01824 //
01825 //      EArDir enddir = path->GetEndDir();
01826 //      if( enddir == Dir_None                                                                  // like above
01827 //              || endport->HasLimitedDirs() && !endport->CanHaveStartEndPointOn( enddir, 0))
01828 //              enddir = endport->GetStartEndDirTo(startport->GetCenter(), 0, startport == endport ? startdir : Dir_None );
01829 //
01830 //      CPoint startpoint = startport->CreateStartEndPointOn(startdir);
01831 //      CPoint endpoint = endport->CreateStartEndPointOn(enddir);
01832 //
01833 //      if( startpoint == endpoint )
01834 //              startpoint = StepOneInDir(startpoint, NextClockwiseDir(startdir));
01835 //
01836 //      Connect(path, startpoint, endpoint);
01837 //}
01838 //
01839 //void CArGraph::Connect(CArPath* path, CPoint startpoint, CPoint endpoint)
01840 //{
01841 //      ASSERT( path != NULL && path->GetOwner() == this );
01842 //      ASSERT( !path->IsConnected() );
01843 //      ASSERT( startpoint != endpoint );
01844 //
01845 //      EArDir startdir = path->GetStartPort()->OnWhichEdge(startpoint);
01846 //      EArDir enddir = path->GetEndPort()->OnWhichEdge(endpoint);
01847 //      ASSERT( IsRightAngle(startdir) && IsRightAngle(enddir) );
01848 //
01849 //      CPoint start = startpoint;
01850 //      GetOutOfBox(start, startdir);
01851 //      ASSERT( start != startpoint );
01852 //
01853 //      CPoint end = endpoint;
01854 //      GetOutOfBox(end, enddir);
01855 //      ASSERT( end != endpoint );
01856 //
01857 //      CPointList ret;
01858 //      const CPointList& points = path->points;
01859 //      ASSERT( points.IsEmpty() );
01860 //
01861 //      ConnectPoints(ret, start, end, startdir, enddir);
01862 //
01863 //      path->DeleteAll();
01864 //      path->AddTail(startpoint);
01865 //
01866 //      POSITION pos = ret.GetHeadPosition();
01867 //      while( pos != NULL )
01868 //              path->AddTail(ret.GetNext(pos));
01869 //
01870 //      path->AddTail(endpoint);
01871 //
01872 //      path->SimplifyTrivially();
01873 //      SimplifyPathPoints(path);
01874 //      CenterStairsInPathPoints(path);
01875 //      path->SetState(ARPATHST_Connected);
01876 //
01877 //      AddEdges(path);
01878 //}
01879 //
01880 //void CArGraph::ConnectPoints(CPointList& ret, CPoint start, CPoint end, EArDir hintstartdir, EArDir hintenddir)
01881 //{
01882 //      ASSERT( ret.IsEmpty() );
01883 //      ASSERT( !IsPointInBox(start) && !IsPointInBox(end) );
01884 //
01885 //      CPoint thestart = start;
01886 //
01887 //      while( start != end )
01888 //      {
01889 //              EArDir dir1 = ExGetMajorDir(end-start);
01890 //              EArDir dir2 = ExGetMinorDir(end-start);
01891 //              ASSERT( dir1 != Dir_None );
01892 //
01893 //              ASSERT( dir1 == GetMajorDir(end-start) );
01894 //              ASSERT( dir2 == Dir_None || dir2 == GetMinorDir(end-start) );
01895 //
01896 //              if( ret.IsEmpty() && dir2 == hintstartdir && dir2 != Dir_None )
01897 //              {
01898 //                      dir2 = dir1;
01899 //                      dir1 = hintstartdir;
01900 //              }
01901 //
01902 //              ret.AddTail(start);
01903 //              CPoint old = start;
01904 //
01905 //              CArBox* box = GoToNextBox(start, dir1, end);
01906 //              if( start == old )
01907 //              {
01908 //                      ASSERT( box != NULL );
01909 //                      CRect& rect = box->rect;
01910 //
01911 //                      if( dir2 == Dir_None )
01912 //                              dir2 = NextClockwiseDir(dir1);
01913 //
01914 //                      ASSERT( dir1 != dir2 && dir1 != Dir_None && dir2 != Dir_None );
01915 //
01916 //                      if( IsPointInDirFrom(end, rect, dir2) )
01917 //                      {
01918 //                              ASSERT( !IsPointInDirFrom(start, rect, dir2) );
01919 //                              GoToNextBox(start, dir2, end);
01920 //                              ASSERT( IsPointInDirFrom(start, rect, dir2) );
01921 //                      }
01922 //                      else
01923 //                      {
01924 //                              ASSERT( IsPointBetweenSides(end, rect, dir1) );
01925 //                              ASSERT( !IsPointIn(end, rect) );
01926 //
01927 //                              int rev = 0;
01928 //
01929 //                              if( ReverseDir(dir2) == hintenddir )
01930 //                                      rev = 1;
01931 //                              else if( dir2 != hintenddir )
01932 //                              {
01933 //                                      if( IsPointBetweenSides(thestart, rect, dir1) )
01934 //                                      {
01935 //                                              if(     IsPointInDirFrom(rect.TopLeft()+rect.BottomRight(), start + end, dir2) )
01936 //                                                      rev = 1;
01937 //                                      }
01938 //                                      else
01939 //                                              if( IsPointInDirFrom(start, thestart, dir2) )
01940 //                                                      rev = 1;
01941 //                              }
01942 //
01943 //                              if( rev )
01944 //                              {
01945 //                                      dir2 = ReverseDir(dir2);
01946 //                              }
01947 //
01948 //                              GetPointCoord(start, dir2) = GetRectOuterCoord(rect, dir2);
01949 //
01950 //                              ASSERT( start != old );
01951 //                              ret.AddTail(start);
01952 //
01953 //                              old = start;
01954 //
01955 //                              GetPointCoord(start, dir1) = GetRectOuterCoord(rect, dir1);
01956 //                              ASSERT( IsPointInDirFrom(end, start, dir1) );
01957 //                              if( GetPointCoord(start, dir1) != GetPointCoord(end, dir1) )
01958 //                                      GoToNextBox(start, dir1, end);
01959 //                      }
01960 //
01961 //                      ASSERT( start != old );
01962 //              }
01963 //      }
01964 //
01965 //      ret.AddTail(end);
01966 //}
01967 //
01968 //void CArGraph::DisconnectAll()
01969 //{
01970 //      POSITION pos = paths.GetHeadPosition();
01971 //      while( pos != NULL )
01972 //              Disconnect(paths.GetNext(pos));
01973 //}
01974 //
01975 //void CArGraph::Disconnect(CArPath* path)
01976 //{
01977 //      ASSERT( path != NULL && path->GetOwner() == this );
01978 //
01979 //      if( path->IsConnected() )
01980 //              DeleteEdges(path);
01981 //
01982 //      path->DeleteAll();
01983 //}
01984 //
01985 //void CArGraph::DisconnectPathsClipping(CRect rect)
01986 //{
01987 //      POSITION pos = paths.GetTailPosition();
01988 //      while( pos != NULL )
01989 //      {
01990 //              CArPath* path = paths.GetPrev(pos);
01991 //
01992 //              if( path->IsPathClip(rect) )
01993 //                      Disconnect(path);
01994 //      }
01995 //}
01996 //
01997 //void CArGraph::DisconnectPathsFrom(CArBox* box)
01998 //{
01999 //      ASSERT_VALID(box);
02000 //
02001 //      POSITION pos = paths.GetTailPosition();
02002 //      while( pos != NULL )
02003 //      {
02004 //              CArPath* path = paths.GetPrev(pos);
02005 //
02006 //              CArBox* startbox = path->GetStartPort()->GetOwner();
02007 //              CArBox* endbox = path->GetEndPort()->GetOwner();
02008 //
02009 //              if( (startbox == box || endbox == box) )
02010 //                      Disconnect(path);
02011 //      }
02012 //}
02013 //
02014 //void CArGraph::DisconnectPathsFrom(CArPort* port)
02015 //{
02016 //      ASSERT_VALID(port);
02017 //
02018 //      POSITION pos = paths.GetTailPosition();
02019 //      while( pos != NULL )
02020 //      {
02021 //              CArPath* path = paths.GetPrev(pos);
02022 //
02023 //              CArPort* startport = path->GetStartPort();
02024 //              CArPort* endport = path->GetEndPort();
02025 //
02026 //              if( (startport == port || endport == port) )
02027 //                      Disconnect(path);
02028 //      }
02029 //}
02030 //
02032 //
02033 //void CArGraph::AddAllEdges()
02034 //{
02035 //      ASSERT( horizontal.IsEmpty() && vertical.IsEmpty() );
02036 //
02037 //      POSITION pos;
02038 //
02039 //      pos = boxes.GetHeadPosition();
02040 //      while( pos != NULL )
02041 //              AddBoxAndPortEdges(boxes.GetNext(pos));
02042 //
02043 //      pos = paths.GetHeadPosition();
02044 //      while( pos != NULL )
02045 //              AddEdges(paths.GetNext(pos));
02046 //}
02047 //
02048 //void CArGraph::AddBoxAndPortEdges(CArBox* box)
02049 //{
02050 //      ASSERT( box != NULL );
02051 //
02052 //      AddEdges(box);
02053 //
02054 //      POSITION pos = box->ports.GetHeadPosition();
02055 //      while( pos != NULL )
02056 //              AddEdges(box->ports.GetNext(pos));
02057 //}
02058 //
02059 //void CArGraph::DeleteBoxAndPortEdges(CArBox* box)
02060 //{
02061 //      ASSERT( box != NULL );
02062 //
02063 //      DeleteEdges(box);
02064 //
02065 //      POSITION pos = box->ports.GetHeadPosition();
02066 //      while( pos != NULL )
02067 //              DeleteEdges(box->ports.GetNext(pos));
02068 //}
02069 //
02071 //
02072 //int CArGraph::CanDeleteTwoEdgesAt(CArPath* path, POSITION pos)
02073 //{
02074 //#ifdef _DEBUG
02075 //      ASSERT( path->GetOwner() == this );
02076 //      ASSERT_VALID(path);
02077 //      ASSERT( path->IsConnected() );
02078 //      path->AssertValidPos(pos);
02079 //#ifdef _DEBUG_DEEP
02080 //      horizontal.AssertValidPathEdges(path);
02081 //      vertical.AssertValidPathEdges(path);
02082 //#endif
02083 //#endif
02084 //
02085 //      CPointList& points = path->points;
02086 //
02087 //      POSITION pointpos = pos;
02088 //      CPoint* point = &(points.GetNext(pos));
02089 //      POSITION npointpos = pos; if( npointpos == NULL ) return 0;
02090 //      CPoint* npoint = &(points.GetNext(pos));
02091 //      POSITION nnpointpos = pos; if( nnpointpos == NULL ) return 0;
02092 //      CPoint* nnpoint = &(points.GetNext(pos));
02094 //      pos = pointpos;
02095 //      points.GetPrev(pos);
02096 //      POSITION ppointpos = pos; if( ppointpos == NULL ) return 0;
02097 //      CPoint* ppoint = &(points.GetPrev(pos));
02098 //      POSITION pppointpos = pos; if( pppointpos == NULL ) return 0;
02099 //      CPoint* pppoint = &(points.GetAt(pos));
02100 //      if( *npoint == *point) return 0; // direction of zero-length edges can't be determined, so don't delete them
02101 //
02102 //      ASSERT( pppointpos != NULL && ppointpos != NULL && pointpos != NULL && npointpos != NULL && nnpointpos != NULL );
02103 //      ASSERT( pppoint != NULL && ppoint != NULL && point != NULL && npoint != NULL && nnpoint != NULL );
02104 //
02105 //      EArDir dir = GetDir(*npoint - *point);
02106 //      ASSERT( IsRightAngle(dir) );
02107 //      int ishorizontal = IsHorizontal(dir);
02108 //
02109 //      CPoint newpoint;
02110 //      GetPointCoord(newpoint, ishorizontal) = GetPointCoord(*npoint, ishorizontal);
02111 //      GetPointCoord(newpoint, !ishorizontal) = GetPointCoord(*ppoint, !ishorizontal);
02112 //
02113 //      ASSERT( GetDir(newpoint - *ppoint) == dir );
02114 //
02115 //      if( IsLineClipBoxes(newpoint, *npoint) ) return 0;
02116 //      if( IsLineClipBoxes(newpoint, *ppoint) ) return 0;
02117 //
02118 //      return 1;
02119 //}
02120 //
02121 //void CArGraph::DeleteTwoEdgesAt(CArPath* path, POSITION pos)
02122 //{
02123 //#ifdef _DEBUG
02124 //      ASSERT( path->GetOwner() == this );
02125 //      ASSERT_VALID(path);
02126 //      ASSERT( path->IsConnected() );
02127 //      path->AssertValidPos(pos);
02128 //#ifdef _DEBUG_DEEP
02129 //      horizontal.AssertValidPathEdges(path);
02130 //      vertical.AssertValidPathEdges(path);
02131 //#endif
02132 //#endif
02133 //
02134 //      CPointList& points = path->points;
02135 //
02136 //      POSITION pointpos = pos;
02137 //      CPoint* point = &(points.GetNext(pos));
02138 //      POSITION npointpos = pos;
02139 //      CPoint* npoint = &(points.GetNext(pos));
02140 //      POSITION nnpointpos = pos;
02141 //      CPoint* nnpoint = &(points.GetNext(pos));
02142 //      POSITION nnnpointpos = pos;
02143 //      pos = pointpos;
02144 //      points.GetPrev(pos);
02145 //      POSITION ppointpos = pos;
02146 //      CPoint* ppoint = &(points.GetPrev(pos));
02147 //      POSITION pppointpos = pos;
02148 //      CPoint* pppoint = &(points.GetAt(pos));
02149 //
02150 //      ASSERT( pppointpos != NULL && ppointpos != NULL && pointpos != NULL && npointpos != NULL && nnpointpos != NULL );
02151 //      ASSERT( pppoint != NULL && ppoint != NULL && point != NULL && npoint != NULL && nnpoint != NULL );
02152 //
02153 //      EArDir dir = GetDir(*npoint - *point);
02154 //      ASSERT( IsRightAngle(dir) );
02155 //      int ishorizontal = IsHorizontal(dir);
02156 //
02157 //      CPoint newpoint;
02158 //      GetPointCoord(newpoint, ishorizontal) = GetPointCoord(*npoint, ishorizontal);
02159 //      GetPointCoord(newpoint, !ishorizontal) = GetPointCoord(*ppoint, !ishorizontal);
02160 //
02161 //      ASSERT( GetDir(newpoint - *ppoint) == dir );
02162 //
02163 //      ASSERT( !IsLineClipBoxes(newpoint, *npoint) );
02164 //      ASSERT( !IsLineClipBoxes(newpoint, *ppoint) );
02165 //
02166 //      CArEdgeList& hlist = GetEdgeList(ishorizontal);
02167 //      CArEdgeList& vlist = GetEdgeList(!ishorizontal);
02168 //
02169 //      SArEdge* ppedge = hlist.GetEdge(pppoint, ppoint);
02170 //      SArEdge* pedge = vlist.GetEdge(ppoint, point);
02171 //      SArEdge* nedge = hlist.GetEdge(point, npoint);
02172 //      SArEdge* nnedge = vlist.GetEdge(npoint, nnpoint);
02173 //
02174 //      ASSERT( ppedge != NULL && pedge != NULL && nedge != NULL && nnedge != NULL );
02175 //
02176 //      vlist.Delete(pedge);
02177 //      hlist.Delete(nedge);
02178 //
02179 //      points.RemoveAt(pointpos);
02180 //      points.RemoveAt(npointpos);
02181 //      points.SetAt(ppointpos, newpoint);
02182 //
02183 //      ASSERT( ppedge->endpoint == ppoint && ppedge->endpoint_next == point );
02184 //      ppedge->endpoint_next = nnpoint;
02185 //
02186 //      ASSERT( nnedge->startpoint == npoint && nnedge->startpoint_prev == point );
02187 //      nnedge->startpoint = ppoint;
02188 //      nnedge->startpoint_prev = pppoint;
02189 //
02190 //      if( nnnpointpos != NULL )
02191 //      {
02192 //              SArEdge* nnnedge = hlist.GetEdge(nnpoint, &(points.GetAt(nnnpointpos)));
02193 //              ASSERT( nnnedge != NULL );
02194 //              ASSERT( nnnedge->startpoint_prev == npoint && nnnedge->startpoint == nnpoint );
02195 //              nnnedge->startpoint_prev = ppoint;
02196 //      }
02197 //
02198 //      if( *nnpoint == newpoint )
02199 //              DeleteSamePointsAt(path, ppointpos);
02200 //
02201 //#ifdef _DEBUG_DEEP
02202 //      ASSERT_VALID(path);
02203 //      horizontal.AssertValidPathEdges(path);
02204 //      vertical.AssertValidPathEdges(path);
02205 //#endif
02206 //}
02207 //
02208 //void CArGraph::DeleteSamePointsAt(CArPath* path, POSITION pos)
02209 //{
02210 //#ifdef _DEBUG
02211 //      ASSERT( path->GetOwner() == this );
02212 //      ASSERT_VALID(path);
02213 //      ASSERT( path->IsConnected() );
02214 //      path->AssertValidPos(pos);
02215 //#endif
02216 //
02217 //      CPointList& points = path->points;
02218 //
02219 //      POSITION pointpos = pos;
02220 //      CPoint* point = &(points.GetNext(pos));
02221 //      POSITION npointpos = pos;
02222 //      CPoint* npoint = &(points.GetNext(pos));
02223 //      POSITION nnpointpos = pos;
02224 //      CPoint* nnpoint = &(points.GetNext(pos));
02225 //      POSITION nnnpointpos = pos;
02226 //      pos = pointpos;
02227 //      points.GetPrev(pos);
02228 //      POSITION ppointpos = pos;
02229 //      CPoint* ppoint = &(points.GetPrev(pos));
02230 //      POSITION pppointpos = pos;
02231 //      CPoint* pppoint = pos == NULL ? NULL : &(points.GetAt(pos));
02232 //
02233 //      ASSERT( ppointpos != NULL && pointpos != NULL && npointpos != NULL && nnpointpos != NULL );
02234 //      ASSERT( ppoint != NULL && point != NULL && npoint != NULL && nnpoint != NULL );
02235 //      ASSERT( *point == *npoint && *point != *ppoint );
02236 //
02237 //      EArDir dir = GetDir(*point - *ppoint);
02238 //      ASSERT( IsRightAngle(dir) );
02239 //      int ishorizontal = IsHorizontal(dir);
02240 //
02241 //      CArEdgeList& hlist = GetEdgeList(ishorizontal);
02242 //      CArEdgeList& vlist = GetEdgeList(!ishorizontal);
02243 //
02244 //      SArEdge* pedge = hlist.GetEdge(ppoint, point);
02245 //      SArEdge* nedge = vlist.GetEdge(point, npoint);
02246 //      SArEdge* nnedge = hlist.GetEdge(npoint, nnpoint);
02247 //
02248 //      ASSERT( pedge != NULL && nedge != NULL && nnedge != NULL );
02249 //
02250 //      vlist.Delete(pedge);
02251 //      hlist.Delete(nedge);
02252 //
02253 //      points.RemoveAt(pointpos);
02254 //      points.RemoveAt(npointpos);
02255 //
02256 //      if( pppointpos != NULL )
02257 //      {
02258 //              SArEdge* ppedge = vlist.GetEdge(pppoint, ppoint);
02259 //              ASSERT( ppedge != NULL && ppedge->endpoint == ppoint && ppedge->endpoint_next == point );
02260 //              ppedge->endpoint_next = nnpoint;
02261 //      }
02262 //
02263 //      ASSERT( nnedge->startpoint == npoint && nnedge->startpoint_prev == point );
02264 //      nnedge->startpoint = ppoint;
02265 //      nnedge->startpoint_prev = pppoint;
02266 //
02267 //      if( nnnpointpos != NULL )
02268 //      {
02269 //              SArEdge* nnnedge = vlist.GetEdge(nnpoint, &(points.GetAt(nnnpointpos)));
02270 //              ASSERT( nnnedge != NULL && nnnedge->startpoint_prev == npoint && nnnedge->startpoint == nnpoint );
02271 //              nnnedge->startpoint_prev = ppoint;
02272 //      }
02273 //
02274 //#ifdef _DEBUG_DEEP
02275 //      ASSERT_VALID(path);
02276 //      horizontal.AssertValidPathEdges(path);
02277 //      vertical.AssertValidPathEdges(path);
02278 //#endif
02279 //}
02280 //
02281 //int CArGraph::SimplifyPaths()
02282 //{
02283 //      int was = 0;
02284 //
02285 //      POSITION pathpos = paths.GetHeadPosition();
02286 //      while( pathpos != NULL )
02287 //      {
02288 //              CArPath* path = paths.GetNext(pathpos);
02289 //              ASSERT_VALID(path);
02290 //
02291 //              CPointList& points = path->points;
02292 //              POSITION pointpos = points.GetHeadPosition();
02293 //
02294 //              while( pointpos != NULL )
02295 //              {
02296 //                      if( CanDeleteTwoEdgesAt(path, pointpos) )
02297 //                      {
02298 //                              DeleteTwoEdgesAt(path, pointpos);
02299 //                              was = 1;
02300 //                              break;
02301 //                      }
02302 //                      points.GetNext(pointpos);
02303 //              }
02304 //      }
02305 //
02306 //      return was;
02307 //}
02308 //
02309 //#pragma warning(disable: 4700)
02310 //void CArGraph::CenterStairsInPathPoints(CArPath* path)
02311 //{
02312 //      ASSERT( path != NULL );
02313 //      ASSERT( !path->IsConnected() );
02314 //      CPointList& points = path->points;
02315 //      ASSERT( points.GetCount() >= 2 );
02316 //
02317 //#ifdef _DEBUG
02318 //      path->AssertValidPoints();
02319 //#endif
02320 //
02321 //      CPoint p1;
02322 //      CPoint p2;
02323 //      CPoint p3;
02324 //      CPoint p4;
02325 //
02326 //      POSITION p1p = NULL;
02327 //      POSITION p2p = NULL;
02328 //      POSITION p3p = NULL;
02329 //      POSITION p4p = NULL;
02330 //
02331 //      EArDir d12 = Dir_None;
02332 //      EArDir d23 = Dir_None;
02333 //      EArDir d34 = Dir_None;
02334 //
02335 //      POSITION pos = points.GetHeadPosition();
02336 //      ASSERT( pos != NULL );
02337 //
02338 //      p1p = pos;
02339 //      p1 = points.GetNext(pos);
02340 //
02341 //      while( pos != NULL )
02342 //      {
02343 //              p4p = p3p;
02344 //              p3p = p2p;
02345 //              p2p = p1p;
02346 //              p1p = pos;
02347 //
02348 //              p4 = p3;
02349 //              p3 = p2;
02350 //              p2 = p1;
02351 //              p1 = points.GetNext(pos);
02352 //
02353 //              d34 = d23;
02354 //              d23 = d12;
02355 //
02356 //              if( p2p != NULL )
02357 //              {
02358 //                      d12 = GetDir(p2 - p1);
02359 //#ifdef _DEBUG
02360 //                      ASSERT( IsRightAngle(d12) );
02361 //                      if( p3p != NULL )
02362 //                              ASSERT( AreInRightAngle(d12, d23) );
02363 //#endif
02364 //              }
02365 //
02366 //              if( p4p != NULL && d12 == d34 )
02367 //              {
02368 //                      ASSERT( p1p != NULL && p2p != NULL && p3p != NULL && p4p != NULL );
02369 //
02370 //                      CPoint np2 = p2;
02371 //                      CPoint np3 = p3;
02372 //                      int h = IsHorizontal(d12);
02373 //
02374 //                      long p4x = GetPointCoord(p4, h);
02375 //                      long p3x = GetPointCoord(p3, h);
02376 //                      long p1x = GetPointCoord(p1, h);
02377 //
02378 //                      if( p1x < p4x )
02379 //                      {
02380 //                              long t = p1x;
02381 //                              p1x = p4x;
02382 //                              p4x = t;
02383 //                      }
02384 //
02385 //                      if( p4x < p3x && p3x < p1x )
02386 //                      {
02387 //                              long m = (p4x + p1x)/2;
02388 //                              GetPointCoord(np2, h) = m;
02389 //                              GetPointCoord(np3, h) = m;
02390 //
02391 //                              GetLimitsOfEdge(np2, np3, p4x, p1x);
02392 //
02393 //                              m = (p4x + p1x)/2;
02394 //                              GetPointCoord(np2, h) = m;
02395 //                              GetPointCoord(np3, h) = m;
02396 //
02397 //                              if( !IsLineClipBoxes(np2, np3) &&
02398 //                                      !IsLineClipBoxes(p1p == points.GetTailPosition() ? path->GetOutOfBoxEndPoint() : p1, np2) &&
02399 //                                      !IsLineClipBoxes(p4p == points.GetHeadPosition() ? path->GetOutOfBoxStartPoint() : p4, np3) )
02400 //                              {
02401 //                                      p2 = np2;
02402 //                                      p3 = np3;
02403 //                                      points.SetAt(p2p, p2);
02404 //                                      points.SetAt(p3p, p3);
02405 //                              }
02406 //                      }
02407 //              }
02408 //      }
02409 //
02410 //#ifdef _DEBUG
02411 //      path->AssertValidPoints();
02412 //#endif
02413 //}
02414 //
02415 //void CArGraph::SimplifyPathPoints(CArPath* path)
02416 //{
02417 //      ASSERT( path != NULL );
02418 //      ASSERT( !path->IsConnected() );
02419 //      CPointList& points = path->points;
02420 //      ASSERT( points.GetCount() >= 2 );
02421 //
02422 //#ifdef _DEBUG
02423 //      path->AssertValidPoints();
02424 //#endif
02425 //
02426 //      CPoint p1;
02427 //      CPoint p2;
02428 //      CPoint p3;
02429 //      CPoint p4;
02430 //      CPoint p5;
02431 //
02432 //      POSITION p1p = NULL;
02433 //      POSITION p2p = NULL;
02434 //      POSITION p3p = NULL;
02435 //      POSITION p4p = NULL;
02436 //      POSITION p5p = NULL;
02437 //
02438 //      POSITION pos = points.GetHeadPosition();
02439 //      ASSERT( pos != NULL );
02440 //
02441 //      p1p = pos;
02442 //      p1 = points.GetNext(pos);
02443 //
02444 //      while( pos != NULL )
02445 //      {
02446 //              p5p = p4p;
02447 //              p4p = p3p;
02448 //              p3p = p2p;
02449 //              p2p = p1p;
02450 //              p1p = pos;
02451 //
02452 //              p5 = p4;
02453 //              p4 = p3;
02454 //              p3 = p2;
02455 //              p2 = p1;
02456 //              p1 = points.GetNext(pos);
02457 //
02458 //              if( p5p != NULL )
02459 //              {
02460 //                      ASSERT( p1p != NULL && p2p != NULL && p3p != NULL && p4p != NULL && p5p != NULL );
02461 //                      ASSERT( p1 != p2 && p2 != p3 && p3 != p4 && p4 != p5 );
02462 //
02463 //                      EArDir d = GetDir(p2 - p1);
02464 //                      ASSERT( IsRightAngle(d) );
02465 //                      int h = IsHorizontal(d);
02466 //
02467 //                      CPoint np3;
02468 //                      GetPointCoord(np3, h) = GetPointCoord(p5, h);
02469 //                      GetPointCoord(np3, !h) = GetPointCoord(p1, !h);
02470 //
02471 //                      if( !IsLineClipBoxes(p2, np3) && !IsLineClipBoxes(np3, p4) )
02472 //                      {
02473 //                              points.RemoveAt(p2p);
02474 //                              points.RemoveAt(p4p);
02475 //                              points.SetAt(p3p, np3);
02476 //                              if( np3 == p1 )
02477 //                                      points.RemoveAt(p1p);
02478 //                              if( np3 == p5 )
02479 //                                      points.RemoveAt(p5p);
02480 //
02481 //                              p1p = NULL;
02482 //                              p2p = NULL;
02483 //                              p3p = NULL;
02484 //                              p4p = NULL;
02485 //
02486 //                              pos = points.GetHeadPosition();
02487 //                      }
02488 //              }
02489 //      }
02490 //
02491 //#ifdef _DEBUG
02492 //      path->AssertValidPoints();
02493 //#endif
02494 //}
02495 //#pragma warning(default: 4700)
02496 //
02497 //void CArGraph::ConnectAllDisconnectedPaths()
02498 //{
02499 //      POSITION pos = paths.GetHeadPosition();
02500 //      while( pos != 0 )
02501 //      {
02502 //              CArPath* path = paths.GetNext(pos);
02503 //
02504 //              if( !path->IsConnected() )
02505 //                      Connect(path);
02506 //      }
02507 //}
02508 //
02510 //
02511 //void CArGraph::CalculateSelfPoints()
02512 //{
02513 //      selfpoints[0].x = ED_MINCOORD;
02514 //      selfpoints[0].y = ED_MINCOORD;
02515 //
02516 //      selfpoints[1].x = ED_MAXCOORD;
02517 //      selfpoints[1].y = ED_MINCOORD;
02518 //
02519 //      selfpoints[2].x = ED_MAXCOORD;
02520 //      selfpoints[2].y = ED_MAXCOORD;
02521 //
02522 //      selfpoints[3].x = ED_MINCOORD;
02523 //      selfpoints[3].y = ED_MAXCOORD;
02524 //}
02525 //
02527 //
02528 //IMPLEMENT_SERIAL(CArGraph, CObject, 0);
02529 //
02530 //void CArGraph::Serialize(CArchive& ar)
02531 //{
02532 //      if( ar.IsLoading() )
02533 //      {
02534 //              ASSERT( IsEmpty() );
02535 //              POSITION pos;
02536 //
02537 //              boxes.Serialize(ar);
02538 //              pos = boxes.GetHeadPosition();
02539 //              while( pos != NULL )
02540 //                      boxes.GetNext(pos)->SetOwner(this);
02541 //              
02542 //              paths.Serialize(ar);
02543 //              pos = paths.GetHeadPosition();
02544 //              while( pos != NULL )
02545 //                      paths.GetNext(pos)->SetOwner(this);
02546 //
02547 //              LocateRefs();
02548 //              ClearStoredRefs();
02549 //              AddAllEdges();
02550 //      }
02551 //      else
02552 //      {
02553 //              boxes.Serialize(ar);
02554 //              paths.Serialize(ar);
02555 //      }
02556 //}
02557 //
02558 //CArPort* CArGraph::ResolveStoredRef(CArPort* stored_ref)
02559 //{
02560 //      POSITION pos = boxes.GetHeadPosition();
02561 //      while( pos != NULL )
02562 //      {
02563 //              CArPort* ptr = boxes.GetNext(pos)->ResolveStoredRef(stored_ref);
02564 //              if( ptr != NULL )
02565 //                      return ptr;
02566 //      }
02567 //
02568 //      return NULL;
02569 //}
02570 //
02571 //void CArGraph::LocateRefs()
02572 //{
02573 //      POSITION pos = paths.GetHeadPosition();
02574 //      while( pos != NULL )
02575 //              paths.GetNext(pos)->LocateRefs();
02576 //}
02577 //
02578 //void CArGraph::ClearStoredRefs()
02579 //{
02580 //      POSITION pos = boxes.GetHeadPosition();
02581 //      while( pos != NULL )
02582 //              boxes.GetNext(pos)->ClearStoredRefs();
02583 //}
02584 //
02586 //
02587 //#ifdef _DEBUG
02588 //
02589 //void CArGraph::AssertValid() const
02590 //{
02591 //      POSITION pos;
02592 //
02593 //      pos = boxes.GetHeadPosition();
02594 //      while( pos != NULL )
02595 //      {
02596 //              CArBox* box = boxes.GetNext(pos);
02597 //              AssertValidBox(box);
02598 //      }
02599 //
02600 //      pos = paths.GetHeadPosition();
02601 //      while( pos != NULL )
02602 //      {
02603 //              CArPath* path = paths.GetNext(pos);
02604 //              AssertValidPath(path);
02605 //      }
02606 //}
02607 //
02608 //void CArGraph::AssertValidBox(CArBox* box) const
02609 //{
02610 //      ASSERT_VALID(box);
02611 //      ASSERT( box->owner == this );
02612 //      ASSERT( boxes.Find(box) != NULL );
02613 //}
02614 //
02615 //void CArGraph::AssertValidPath(CArPath* path) const
02616 //{
02617 //      ASSERT_VALID(path);
02618 //      ASSERT( path->owner == this );
02619 //      ASSERT( paths.Find(path) != NULL );
02620 //
02621 //      CArPort* port = path->GetStartPort();
02622 //      ASSERT_VALID(port);
02623 //      ASSERT( port->GetOwner()->GetOwner() == this );
02624 //      port->GetOwner()->AssertValidPort(port);
02625 //      if( path->IsConnected() )
02626 //              port->AssertValidStartEndPoint(path->points.GetHead(), Dir_None, 1);
02627 //
02628 //      port = path->GetEndPort();
02629 //      ASSERT_VALID(port);
02630 //      ASSERT( port->GetOwner()->GetOwner() == this );
02631 //      port->GetOwner()->AssertValidPort(port);
02632 //      if( path->IsConnected() )
02633 //              port->AssertValidStartEndPoint(path->points.GetTail(), Dir_None, 0);
02634 //
02635 //      if( !path->IsConnected() )
02636 //              ASSERT( path->HasNoPoint() );
02637 //
02638 //      path->AssertValidPoints();
02639 //
02640 //      CPointList& points = path->points;
02641 //      if( !points.IsEmpty() )
02642 //      {
02643 //              ASSERT( points.GetCount() >= 2 );
02644 //              POSITION pos = points.GetHeadPosition();
02645 //              ASSERT( pos != NULL );
02646 //
02647 //              ASSERT( IsPointInBox(points.GetNext(pos)) );
02648 //
02649 //              while( pos != NULL )
02650 //              {
02651 //                      CPoint p = points.GetNext(pos);
02652 //                      if( pos != NULL )
02653 //                              ASSERT( !IsPointInBox(p) );
02654 //                      else
02655 //                              ASSERT( IsPointInBox(p) );
02656 //              }
02657 //      }
02658 //}
02659 //
02660 //#endif