GME
13
|
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