Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

vtkTraversal.h

Go to the documentation of this file.
00001 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- 00002 * 00003 * $Id: vtkTraversal.h,v 1.2 2004/08/10 07:37:22 xpxqx Exp $ 00004 * 00005 * Copyright (c) 2004 Sean McInerney 00006 * All rights reserved. 00007 * 00008 * See Copyright.txt or http://vtkextensions.sourceforge.net/Copyright.html 00009 * for details. 00010 * 00011 * This software is distributed WITHOUT ANY WARRANTY; without even 00012 * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00013 * PURPOSE. See the above copyright notice for more information. 00014 * 00015 */ 00016 #ifndef VTK_TRAVERSAL_H_ 00017 # define VTK_TRAVERSAL_H_ 00018 # include "vtkExtensionsHybridConfigure.h" // vtkExtensions configuration 00019 # include "vtkExtensionsTypes.h" // vtkExtensions types 00020 // VTK Common 00021 # include "vtkDataObject.h" // for inline methods 00022 # include "vtkSource.h" // for inline methods 00023 00024 # define VTK_TRAVERSAL_DISCONNECTED 0x01 00025 # define VTK_TRAVERSAL_PRECEDING 0x02 00026 # define VTK_TRAVERSAL_FOLLOWING 0x04 00027 # define VTK_TRAVERSAL_CONTAINS 0x08 00028 # define VTK_TRAVERSAL_CONTAINED_BY 0x10 00029 # define VTK_TRAVERSAL_IMPLEMENTATION_SPECIFIC 0x20 00030 00031 class vtkCollection; 00032 class vtkDataObjectCollection; 00033 00034 VTK_EXTENSIONS_NAMESPACE_BEGIN 00035 00036 class vtkProcessObjectCollection; 00037 00038 VTK_EXTENSIONS_HYBRID_NESTED_NAMESPACE_BEGIN 00039 00048 class VTK_EXTENSIONS_HYBRID_EXPORT vtkTraversal 00049 { 00050 public: 00051 static vtkTraversal* New (void) { return new vtkTraversal; } 00052 00053 vtkTraversal (void); 00054 //BTX 00055 vtkTraversal (vtkProcessObject* a); 00056 virtual ~vtkTraversal(); 00057 //ETX 00058 00059 void UpdateTop (vtkProcessObject* aNode); 00060 00061 void UpdateTop (void); 00062 00064 vtkProcessObject* InitTraversal (vtkProcessObject* aNode); 00065 00067 vtkProcessObject* InitTraversal (void); 00068 00069 vtkProcessObject* TraverseUp (void); 00070 00071 vtkProcessObject* TraverseForward (int& depth); 00072 00073 vtkProcessObject* TraverseForward (void); 00074 00075 vtkProcessObject* TraverseBackward (void); 00076 00077 vtkProcessObject* Find (vtkProcessObject* node); 00078 00079 vtkProcessObject* FindByType (const char* classname); 00080 vtkProcessObject* FindBySupertype (const char* superclassname); 00081 00082 public: 00084 static vtkProcessObject* GetInputSource (vtkDataObject* o); 00085 00087 static vtkDataObject* GetFirstInput (vtkProcessObject* o); 00088 00090 static vtkDataObject* GetParent (vtkDataObject* o); 00091 00093 static vtkProcessObject* GetParent (vtkProcessObject* o); 00094 00095 //BTX 00097 static vtkCollection* 00098 GetConsumers (vtkDataObject* parent, vtkCollection** = 0); 00099 00101 static vtkDataObjectCollection* 00102 GetOutputs (vtkProcessObject* parent, vtkDataObjectCollection** = 0); 00103 00105 static vtkDataObjectCollection* 00106 GetChildren (vtkDataObject* parent, vtkDataObjectCollection** = 0); 00107 00109 static vtkCollection* 00110 GetConsumers (vtkProcessObject* parent, vtkCollection** = 0); 00111 00113 static vtkProcessObjectCollection* 00114 GetChildren (vtkProcessObject* parent, vtkProcessObjectCollection** = 0); 00115 00116 static int GetNumberOfChildren (vtkDataObject* parent, 00117 vtkDataObjectCollection** = 0); 00118 00119 static int GetNumberOfChildren (vtkProcessObject* parent, 00120 vtkProcessObjectCollection** = 0); 00121 //ETX 00122 00123 static vtkObject* GetFirstConsumer (vtkDataObject* o); 00124 static vtkProcessObject* GetFirstProcessObject (vtkDataObject* o); 00125 static vtkDataObject* GetFirstOutput (vtkProcessObject* o); 00126 00127 static vtkDataObject* GetFirstChild (vtkDataObject* o); 00128 static vtkObject* GetFirstConsumer (vtkProcessObject* o); 00129 static vtkProcessObject* GetFirstChild (vtkProcessObject* o); 00130 00131 static vtkObject* GetLastConsumer (vtkDataObject* o); 00132 static vtkProcessObject* GetLastProcessObject (vtkDataObject* o); 00133 static vtkDataObject* GetLastOutput (vtkProcessObject* o); 00134 00135 static vtkDataObject* GetLastChild (vtkDataObject* o); 00136 static vtkObject* GetLastConsumer (vtkProcessObject* o); 00137 static vtkProcessObject* GetLastChild (vtkProcessObject* o); 00138 00139 static vtkDataObject* GetNextSibling (vtkDataObject* o); 00140 static vtkProcessObject* GetNextSibling (vtkProcessObject* o); 00141 static vtkDataObject* GetPreviousSibling (vtkDataObject* o); 00142 static vtkProcessObject* GetPreviousSibling (vtkProcessObject*); 00143 00144 static vtkDataObject* GetTop (vtkDataObject* o); 00145 static vtkProcessObject* GetTop (vtkProcessObject* o); 00146 00160 static vtkProcessObject* Splice (vtkProcessObject* newNode, 00161 vtkProcessObject* refNode); 00162 00172 static vtkProcessObject* Replace (vtkProcessObject* newNode, 00173 vtkProcessObject* oldNode); 00174 00181 static vtkProcessObject* Remove (vtkProcessObject* oldNode); 00182 00194 static vtkSource* Append (vtkSource* newNode, 00195 vtkProcessObject* refNode); 00196 00197 static vtkBoolType HasChildren (vtkDataObject* o); 00198 static vtkBoolType HasChildren (vtkProcessObject* o); 00199 00200 static unsigned short ComparePosition (vtkProcessObject* o) { return 0; } 00201 00202 static vtkBoolType IsSame (vtkProcessObject* o) {return false;} 00203 static vtkBoolType IsEqual (vtkProcessObject* o) {return false;} 00204 00205 protected: 00206 vtkProcessObject* Top; 00207 vtkProcessObject* Current; 00208 00209 //BTX 00210 typedef vtkTraversal Self; 00211 //ETX 00212 00216 static int GetConsumerIndex (vtkDataObject* o, 00217 vtkObject* consumer); 00218 00222 static int GetOutputIndex (vtkProcessObject* o, 00223 vtkDataObject* output); 00224 00233 static int SetNthInput (vtkProcessObject* node, 00234 int index, 00235 vtkDataObject* input); 00236 00241 static vtkBoolType IsSelfOrAncestor (vtkProcessObject* node, 00242 vtkProcessObject* child); 00243 00244 private: 00250 vtkTraversal (const vtkTraversal&); 00251 void operator= (const vtkTraversal&); 00253 }; 00254 00255 // ---------------------------------------------------------------------------- 00256 inline int 00257 vtkTraversal::GetConsumerIndex (vtkDataObject* aDataObject, 00258 vtkObject* aConsumer) 00259 { 00260 if (aConsumer != NULL && aDataObject != NULL) 00261 { 00262 int n; 00263 00264 if ((n = aDataObject->GetNumberOfConsumers()) > 0) 00265 for (int i=0; i<n; i++) 00266 if (aDataObject->GetConsumer(i) == aConsumer) 00267 return i; 00268 } 00269 00270 return -1; 00271 } 00272 00273 inline int 00274 vtkTraversal::GetOutputIndex (vtkProcessObject* aProcessObject, 00275 vtkDataObject* aOutput) 00276 { 00277 vtkSource* source; 00278 00279 if ( aOutput != NULL && 00280 (source = vtkSource::SafeDownCast(aProcessObject)) != NULL ) 00281 { 00282 int n; 00283 00284 if ((n = source->GetNumberOfOutputs()) > 0) 00285 for (int i=0; i<n; i++) 00286 if ((source->GetOutputs())[i] == aOutput) 00287 return i; 00288 } 00289 00290 return -1; 00291 } 00292 00293 inline int 00294 vtkTraversal::SetNthInput (vtkProcessObject* aProcessObject, 00295 int aIndex, 00296 vtkDataObject* aInput) 00297 { 00298 vtkDataObject** input; 00299 00300 if ( (aProcessObject == NULL) || 00301 (aIndex < 0) || 00302 (aIndex >= aProcessObject->GetNumberOfInputs()) ) 00303 return VTK_ERROR; // Cannot increase number of inputs at this access level. 00304 00305 if (*(input = &((aProcessObject->GetInputs())[aIndex])) == aInput) 00306 return VTK_OK; 00307 00308 if (*input != NULL) 00309 { 00310 (*input)->RemoveConsumer(aProcessObject); 00311 (*input)->UnRegister(aProcessObject); 00312 *input = NULL; 00313 } 00314 00315 if (aInput != NULL) 00316 { 00317 aInput->AddConsumer(aProcessObject); 00318 aInput->Register(aProcessObject); 00319 *input = aInput; // DANGER ?!? 00320 } 00321 00322 aProcessObject->Modified(); 00323 00324 return VTK_OK; 00325 } 00326 00327 inline vtkBoolType 00328 vtkTraversal::IsSelfOrAncestor (vtkProcessObject* aNode, 00329 vtkProcessObject* aChild) 00330 { 00331 if (aNode == aChild) 00332 { 00333 return VTK_TRUE; 00334 } 00335 00336 // If aChild doesn't have children it can't be our ancestor. 00337 if (!Self::HasChildren(aChild)) 00338 { 00339 return VTK_FALSE; 00340 } 00341 00342 vtkProcessObject* parentNode = Self::GetParent(aNode); 00343 00344 while (parentNode != NULL) 00345 { 00346 if (parentNode == aChild) 00347 { 00348 return VTK_TRUE; // Found aChild as one of our ancestors. 00349 } 00350 parentNode = Self::GetParent(parentNode); 00351 } 00352 00353 return VTK_FALSE; 00354 } 00355 00356 // ---------------------------------------------------------------------------- 00357 vtkProcessObject* 00358 vtkTraversal::GetInputSource (vtkDataObject* aInput) 00359 { 00360 if (aInput == NULL) 00361 return NULL; 00362 00363 // Return the next edge up. 00364 return aInput->GetSource(); 00365 } 00366 00367 vtkDataObject* 00368 vtkTraversal::GetFirstInput (vtkProcessObject* aProcessObject) 00369 { 00370 if (aProcessObject == NULL || aProcessObject->GetNumberOfInputs() < 1) 00371 return NULL; 00372 00373 if (aProcessObject->GetNumberOfInputs() > 1) 00374 vtkGenericWarningMacro(<< "vtkTraversal does not handle > 1 inputs."); 00375 00376 // Return the next edge up. 00377 return (aProcessObject->GetInputs())[0]; 00378 } 00379 00380 // ---------------------------------------------------------------------------- 00381 vtkDataObject* 00382 vtkTraversal::GetParent (vtkDataObject* aDataObject) 00383 { 00384 vtkProcessObject* source; 00385 00386 // Get the edge connecting this node. 00387 if ((source = Self::GetInputSource(aDataObject)) != NULL) 00388 // Return the next node up. 00389 return Self::GetFirstInput(source); 00390 00391 return NULL; 00392 } 00393 00394 vtkProcessObject* 00395 vtkTraversal::GetParent (vtkProcessObject* aProcessObject) 00396 { 00397 vtkDataObject* dataObject; 00398 00399 // Get the edge connecting this node. 00400 if ((dataObject = Self::GetFirstInput(aProcessObject)) != NULL) 00401 // Return the next node up. 00402 return Self::GetInputSource(dataObject); 00403 00404 return NULL; 00405 } 00406 00407 // ---------------------------------------------------------------------------- 00408 vtkObject* 00409 vtkTraversal::GetFirstConsumer (vtkDataObject* aDataObject) 00410 { 00411 vtkObject* o = NULL; 00412 int n, i = 0; 00413 00414 if (aDataObject != NULL && (n = aDataObject->GetNumberOfConsumers()) > 0) 00415 while (i < n && (o = aDataObject->GetConsumer(i)) == NULL) i++; 00416 00417 return o; 00418 } 00419 00420 vtkProcessObject* 00421 vtkTraversal::GetFirstProcessObject (vtkDataObject* aDataObject) 00422 { 00423 vtkProcessObject* o = NULL; 00424 int n, i = 0; 00425 00426 if (aDataObject != NULL && (n = aDataObject->GetNumberOfConsumers()) > 0) 00427 while ( i < n && 00428 (o = vtkProcessObject::SafeDownCast(aDataObject->GetConsumer(i))) 00429 == NULL) i++; 00430 00431 return o; 00432 } 00433 00434 vtkDataObject* 00435 vtkTraversal::GetFirstOutput (vtkProcessObject* aProcessObject) 00436 { 00437 vtkDataObject* result = NULL; 00438 vtkSource* source; 00439 00440 if ((source = vtkSource::SafeDownCast(aProcessObject)) != NULL) 00441 { 00442 int n, i = 0; 00443 00444 if (source != NULL && (n = source->GetNumberOfOutputs()) > 0) 00445 while (i < n && (result = (source->GetOutputs())[i]) == NULL) i++; 00446 } 00447 00448 return result; 00449 } 00450 00451 // ---------------------------------------------------------------------------- 00452 vtkDataObject* 00453 vtkTraversal::GetFirstChild (vtkDataObject* aDataObject) 00454 { 00455 vtkDataObject* result = NULL; 00456 vtkProcessObject* processObject; 00457 00458 if ((processObject = Self::GetFirstProcessObject(aDataObject)) != NULL) 00459 while ( processObject != NULL && 00460 (result = Self::GetFirstOutput(processObject)) == NULL ) 00461 processObject = Self::GetNextSibling(processObject); 00462 00463 return result; 00464 } 00465 00466 vtkObject* 00467 vtkTraversal::GetFirstConsumer (vtkProcessObject* aProcessObject) 00468 { 00469 vtkObject* result = NULL; 00470 vtkDataObject* output; 00471 00472 if ((output = Self::GetFirstOutput(aProcessObject)) != NULL) 00473 while (output != NULL && (result = Self::GetFirstConsumer(output)) == NULL) 00474 output = Self::GetNextSibling(output); 00475 00476 return result; 00477 } 00478 00479 vtkProcessObject* 00480 vtkTraversal::GetFirstChild (vtkProcessObject* aProcessObject) 00481 { 00482 vtkProcessObject* result = NULL; 00483 vtkDataObject* output; 00484 00485 if ((output = Self::GetFirstOutput(aProcessObject)) != NULL) 00486 while (output!=NULL && (result = Self::GetFirstProcessObject(output))==NULL) 00487 output = Self::GetNextSibling(output); 00488 00489 return result; 00490 } 00491 00492 // ---------------------------------------------------------------------------- 00493 vtkObject* 00494 vtkTraversal::GetLastConsumer (vtkDataObject* aDataObject) 00495 { 00496 vtkObject* o = NULL; 00497 int n; 00498 00499 if (aDataObject != NULL && (n = aDataObject->GetNumberOfConsumers()) > 0) 00500 while (n > 0 && (o = aDataObject->GetConsumer(n-1)) == NULL) n--; 00501 00502 return o; 00503 } 00504 00505 vtkProcessObject* 00506 vtkTraversal::GetLastProcessObject (vtkDataObject* aDataObject) 00507 { 00508 vtkProcessObject* o = NULL; 00509 int n; 00510 00511 if (aDataObject != NULL && (n = aDataObject->GetNumberOfConsumers()) > 0) 00512 while ( n > 0 && 00513 (o = vtkProcessObject::SafeDownCast(aDataObject->GetConsumer(n-1))) 00514 == NULL ) n--; 00515 00516 return o; 00517 } 00518 00519 vtkDataObject* 00520 vtkTraversal::GetLastOutput (vtkProcessObject* aProcessObject) 00521 { 00522 vtkDataObject* result = NULL; 00523 vtkSource* source; 00524 00525 if ((source = vtkSource::SafeDownCast(aProcessObject)) != NULL) 00526 { 00527 int n; 00528 00529 if (source != NULL && (n = source->GetNumberOfOutputs()) > 0) 00530 while (n > 0 && (result = (source->GetOutputs())[n-1]) == NULL) n--; 00531 } 00532 00533 return result; 00534 } 00535 00536 // ---------------------------------------------------------------------------- 00537 vtkDataObject* 00538 vtkTraversal::GetLastChild (vtkDataObject* aDataObject) 00539 { 00540 vtkDataObject* result = NULL; 00541 vtkProcessObject* processObject; 00542 00543 if ((processObject = Self::GetLastProcessObject(aDataObject)) != NULL) 00544 while ( processObject != NULL && 00545 (result = Self::GetLastOutput(processObject)) == NULL ) 00546 processObject = Self::GetPreviousSibling(processObject); 00547 00548 return result; 00549 } 00550 00551 vtkObject* 00552 vtkTraversal::GetLastConsumer (vtkProcessObject* aProcessObject) 00553 { 00554 vtkObject* result = NULL; 00555 vtkDataObject* output; 00556 00557 if ((output = Self::GetLastOutput(aProcessObject)) != NULL) 00558 while (output != NULL && (result = Self::GetLastConsumer(output)) == NULL) 00559 output = Self::GetPreviousSibling(output); 00560 00561 return result; 00562 } 00563 00564 vtkProcessObject* 00565 vtkTraversal::GetLastChild (vtkProcessObject* aProcessObject) 00566 { 00567 vtkProcessObject* result = NULL; 00568 vtkDataObject* output; 00569 00570 if ((output = Self::GetLastOutput(aProcessObject)) != NULL) 00571 while (output!=NULL && (result = Self::GetLastProcessObject(output))==NULL) 00572 output = Self::GetPreviousSibling(output); 00573 00574 return result; 00575 } 00576 00577 // ---------------------------------------------------------------------------- 00578 vtkDataObject* 00579 vtkTraversal::GetNextSibling (vtkDataObject* aDataObject) 00580 { 00581 vtkDataObject* result = NULL; 00582 vtkSource* up; 00583 int i; 00584 00585 if ((up = vtkSource::SafeDownCast(Self::GetInputSource(aDataObject))) != NULL) 00586 if ((i = Self::GetOutputIndex(up, aDataObject) + 1) > 0) 00587 while ( i < up->GetNumberOfOutputs() && 00588 (result = (up->GetOutputs())[i]) == NULL ) 00589 i++; 00590 00591 return result; 00592 } 00593 00594 vtkProcessObject* 00595 vtkTraversal::GetNextSibling (vtkProcessObject* aProcessObject) 00596 { 00597 vtkProcessObject* result = NULL; 00598 vtkDataObject* up; 00599 int i; 00600 00601 if ((up = Self::GetFirstInput(aProcessObject)) != NULL) 00602 if ((i = Self::GetConsumerIndex(up, aProcessObject) + 1) > 0) 00603 while ( i < up->GetNumberOfConsumers() && 00604 (result=vtkProcessObject::SafeDownCast(up->GetConsumer(i)))==NULL) 00605 i++; 00606 00607 return result; 00608 } 00609 00610 vtkDataObject* 00611 vtkTraversal::GetPreviousSibling (vtkDataObject* aDataObject) 00612 { 00613 vtkDataObject* result = NULL; 00614 vtkSource* up; 00615 int i; 00616 00617 if ((up = vtkSource::SafeDownCast(Self::GetInputSource(aDataObject))) != NULL) 00618 if ((i = Self::GetOutputIndex(up, aDataObject) - 1) >= 0) 00619 while ( i >= 0 && 00620 (result = (up->GetOutputs())[i]) == NULL ) 00621 i--; 00622 00623 return result; 00624 } 00625 00626 vtkProcessObject* 00627 vtkTraversal::GetPreviousSibling (vtkProcessObject* aProcessObject) 00628 { 00629 vtkProcessObject* result = NULL; 00630 vtkDataObject* up; 00631 int i; 00632 00633 if ((up = Self::GetFirstInput(aProcessObject)) != NULL) 00634 if ((i = Self::GetConsumerIndex(up,aProcessObject) - 1) >= 0) 00635 while ( i >= 0 && 00636 (result=vtkProcessObject::SafeDownCast(up->GetConsumer(i)))==NULL) 00637 i--; 00638 00639 return result; 00640 } 00641 00642 // ---------------------------------------------------------------------------- 00643 vtkDataObject* 00644 vtkTraversal::GetTop (vtkDataObject* aDataObject) 00645 { 00646 vtkDataObject* child = aDataObject; 00647 vtkDataObject* parent; 00648 00649 while ((parent = Self::GetParent(child)) != NULL) child = parent; 00650 00651 return child; 00652 } 00653 00654 vtkProcessObject* 00655 vtkTraversal::GetTop (vtkProcessObject* aProcessObject) 00656 { 00657 vtkProcessObject* child = aProcessObject; 00658 vtkProcessObject* parent; 00659 00660 while ((parent = Self::GetParent(child)) != NULL) child = parent; 00661 00662 return child; 00663 } 00664 00665 // ---------------------------------------------------------------------------- 00666 inline void 00667 vtkTraversal::UpdateTop (vtkProcessObject* aNode) 00668 { 00669 this->Top = Self::GetTop(aNode); 00670 this->Current = aNode; 00671 } 00672 00673 inline void 00674 vtkTraversal::UpdateTop (void) 00675 { 00676 this->Top = Self::GetTop(this->Top); 00677 } 00678 00679 inline vtkProcessObject* 00680 vtkTraversal::InitTraversal (vtkProcessObject* aNode) 00681 { 00682 return (this->Current = aNode); 00683 } 00684 00685 inline vtkProcessObject* 00686 vtkTraversal::InitTraversal (void) 00687 { 00688 return (this->Current = this->Top); 00689 } 00690 00691 inline vtkProcessObject* 00692 vtkTraversal::TraverseUp (void) 00693 { 00694 if (this->Current != NULL) this->Current = Self::GetParent(this->Current); 00695 00696 return this->Current; 00697 } 00698 00699 inline vtkProcessObject* 00700 vtkTraversal::TraverseForward (int& aDepth) 00701 { 00702 vtkProcessObject* ptr; 00703 00704 // If the current node is set and has a child ... 00705 if ((ptr = Self::GetFirstChild(this->Current)) != NULL) 00706 { 00707 this->Current = ptr; 00708 aDepth++; 00709 00710 return this->Current; 00711 } 00712 00713 vtkProcessObject* child; 00714 00715 // If the current node is set and has a next sibling ... 00716 if ((ptr = vtkTraversal::GetNextSibling(this->Current)) != NULL) 00717 { 00718 this->Current = ptr; 00719 00720 return this->Current; 00721 } 00722 00723 // Traverse upward in search of a next sibling ... 00724 while ((this->Current != NULL) && (ptr == NULL)) 00725 { 00726 this->Current = Self::GetParent(this->Current); 00727 ptr = vtkTraversal::GetNextSibling(this->Current); 00728 aDepth--; 00729 } 00730 if (this->Current != NULL) 00731 { 00732 this->Current = ptr; 00733 } 00734 00735 return this->Current; 00736 } 00737 00738 inline vtkProcessObject* 00739 vtkTraversal::TraverseForward (void) 00740 { 00741 int d; 00742 00743 return this->TraverseForward(d); 00744 } 00745 00746 inline vtkProcessObject* 00747 vtkTraversal::TraverseBackward (void) 00748 { 00749 vtkProcessObject* ptr; 00750 00751 // If the current node is set and has a previous sibling ... 00752 if ((ptr = Self::GetPreviousSibling(this->Current)) != NULL) 00753 { 00754 while ((ptr = Self::GetFirstChild(this->Current = ptr)) != NULL) 00755 { 00756 while ((ptr = Self::GetNextSibling(this->Current = ptr)) != NULL) 00757 { 00758 if ( Self::GetNextSibling(this->Current = ptr) == NULL && 00759 (ptr = Self::GetFirstChild(this->Current)) != NULL ) 00760 { 00761 this->Current = ptr; 00762 } 00763 } 00764 } 00765 } 00766 else 00767 { 00768 this->Current = Self::GetParent(this->Current); 00769 } 00770 00771 return this->Current; 00772 } 00773 00774 inline vtkProcessObject* 00775 vtkTraversal::Find (vtkProcessObject* aTarget) 00776 { 00777 if (aTarget != NULL) 00778 { 00779 for ( vtkProcessObject* node = this->InitTraversal(); 00780 node != NULL; 00781 node = this->TraverseForward() ) 00782 if (node == aTarget) 00783 return node; 00784 } 00785 00786 return NULL; 00787 } 00788 00789 inline vtkProcessObject* 00790 vtkTraversal::FindByType (const char* aName) 00791 { 00792 if (aName != NULL && aName[0] != '\0') 00793 { 00794 for ( vtkProcessObject* node = this->InitTraversal(); 00795 node != NULL; 00796 node = this->TraverseForward() ) 00797 if (strcmp(node->GetClassName(), aName) == 0) 00798 return node; 00799 } 00800 00801 return NULL; 00802 } 00803 00804 inline vtkProcessObject* 00805 vtkTraversal::FindBySupertype (const char* aName) 00806 { 00807 if (aName != NULL && aName[0] != '\0') 00808 { 00809 for ( vtkProcessObject* node = this->InitTraversal(); 00810 node != NULL; 00811 node = this->TraverseForward() ) 00812 if (node->IsA(aName) == 1) 00813 return node; 00814 } 00815 00816 return NULL; 00817 } 00818 00819 #if 0 00820 // ---------------------------------------------------------------------------- 00821 inline int 00822 vtkTraversal::InsertBefore (vtkProcessObject* aInsertion, 00823 vtkProcessObject* aReference) 00824 { 00825 if (aInsertion == NULL) 00826 { 00827 vtkGenericWarningMacro(<< "NULL pointer to child to be inserted."); 00828 return VTK_ERROR; 00829 } 00830 00831 if (aReference == NULL) 00832 { 00833 vtkGenericWarningMacro(<< "NULL pointer to insertion reference child."); 00834 return VTK_ERROR; 00835 } 00836 00837 vtkProcessObject* refParent; 00838 00839 if ((refParent = Self::GetParent(aReference)) == NULL) 00840 { 00841 vtkGenericWarningMacro(<< "Insertion reference child is parentless."); 00842 return VTK_ERROR; 00843 } 00844 00845 // Make sure the new child is not "this" node or an ancestor of "this" node. 00846 if (Self::IsSelfOrAncestor(refParent, aInsertion)) 00847 { 00848 vtkGenericWarningMacro(<< "Bad request to insert ancestor as child."); 00849 return VTK_ERROR; 00850 } 00851 00852 vtkProcessObject* oldParent; 00853 00854 /* 00855 * Remove the element from the old parent if one exists, since oldParent 00856 * is a vtkNode this will do the right thing even if the parent of 00857 * aInsertion is at top level. This code also handles the case where the 00858 * new child is alleady a child of this node 00859 * -- jst@citec.fi 00860 */ 00861 if ((oldParent = Self::GetParent(aInsertion)) != NULL) 00862 { 00863 vtkProcessObject* tmpNode; 00864 int origChildCount, newChildCount; 00865 00866 origChildCount = Self::GetNumberOfChildren(refParent); 00867 00868 // Does not matter if this call fails here or not. 00869 Self::RemoveChild(oldParent, aInsertion, tmpNode); 00870 00871 newChildCount = Self::GetNumberOfChildren(refParent); 00872 00873 /* 00874 * Check if our child count changed during the RemoveChild call, if 00875 * it did then oldParent is most likely this node. In this case we 00876 * must check if refPos is still correct (unless it's zero). 00877 */ 00878 if ((refPos != 0) && (origChildCount != newChildCount)) 00879 { 00880 /* 00881 * Check that aReference is now at refPos - 1. 00882 * This will happen if the new child was one of aReferences' 00883 * previous siblings. 00884 */ 00885 if (aReference == Self::ChildAt(refParent, refPos - 1)) 00886 { 00887 refPos--; 00888 } 00889 } 00890 } 00891 00892 return this->InsertChildAt(aInsertion, refPos); 00893 } 00894 #endif /* 0 */ 00895 00896 VTK_EXTENSIONS_HYBRID_NAMESPACE_END 00897 00898 #endif /* VTK_TRAVERSAL_H_ */ 00899 /* 00900 * End of: $Id: vtkTraversal.h,v 1.2 2004/08/10 07:37:22 xpxqx Exp $. 00901 * 00902 */

Generated on Tue Aug 10 03:38:42 2004 for vtkExtensions by doxygen 1.3.7