⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 graphlst.cpp

📁 EDA PCB 电路设计工具源码 c/c++ for Linux, Windows, Mac, 2008.8 最新
💻 CPP
字号:
/*! \file ../src/graphlst.cpp    \brief Implements a list of graphs    \author Probably Klaas Holwerda     Copyright: 2001-2004 (C) Probably Klaas Holwerda     Licence: wxWidgets Licence    RCS-ID: $Id: graphlst.cpp,v 1.8 2005/05/24 19:13:38 titato Exp $*/#ifdef __GNUG__#pragma implementation #endif//#include "debugdrv.h"#include "../include/booleng.h"#include "../include/graphlst.h"//extern Debug_driver* _debug_driver;//this here is to initialize the static iterator of graphlist//with NOLIST constructorint 	graphsorterX( Graph *, Graph * );int 	graphsorterY( Graph *, Graph * );GraphList::GraphList(Bool_Engine* GC) {   _GC=GC;}GraphList::GraphList( GraphList* other ) {   _GC = other->_GC;   TDLI<Graph> _LI = TDLI<Graph>( other );	_LI.tohead();	while (!_LI.hitroot())	{      insend( new Graph( _LI.item() ) );		_LI++;	}}GraphList::~GraphList(){   TDLI<Graph> _LI=TDLI<Graph>(this);	//first empty the graph	_LI.delete_all();}//prepare the graphlist for the boolean operations//group all graphs into ONE graphvoid GraphList::Prepare(Graph* total){   if (empty())      return;   //round to grid and put in one graph	_GC->SetState("Simplify");	// Simplify all graphs in the list	Simplify( (double) _GC->GetGrid() );   if ( ! _GC->GetOrientationEntryMode() )   {      TDLI<Graph> _LI=TDLI<Graph>(this);      _LI.tohead();      while (!_LI.hitroot())      {			_LI.item()->MakeClockWise();         _LI++;      }   }	Renumber();	//the graplist contents will be transferred to one graph	MakeOneGraph(total);}// the function will make from all the graphs in the graphlist one graph,// simply by throwing all the links in one graph, the graphnumbers will// not be changedvoid GraphList::MakeOneGraph(Graph* total){   TDLI<Graph> _LI=TDLI<Graph>(this);	_LI.tohead();	while(!_LI.hitroot())	{		total->TakeOver(_LI.item());		delete _LI.item();		_LI.remove();	}}//// Renumber all the graphs//void GraphList::Renumber(){   if ( _GC->GetOrientationEntryMode() )   {      TDLI<Graph> _LI=TDLI<Graph>(this);	   _LI.tohead();	   while (!_LI.hitroot())	   {         if ( _LI.item()->GetFirstLink()->Group() == GROUP_A )		      _LI.item()->SetNumber(1);         else		      _LI.item()->SetNumber(2);		   _LI++;	   }   }   else   {	   unsigned int Number = 1;      TDLI<Graph> _LI=TDLI<Graph>(this);	   _LI.tohead();	   while (!_LI.hitroot())	   {		   _LI.item()->SetNumber(Number++);		   _LI++;	   }   }}// Simplify the graphsvoid GraphList::Simplify(double marge){   TDLI<Graph> _LI=TDLI<Graph>(this);	_LI.foreach_mf(&Graph::Reset_Mark_and_Bin);	_LI.tohead();	while (!_LI.hitroot())	{		if (_LI.item()->Simplify( (B_INT) marge))      { 			if (_LI.item()->GetNumberOfLinks() < 3)				// delete this graph from the graphlist         {            delete _LI.item();            _LI.remove();         }      }		else			_LI++;	}}// Smoothen the graphsvoid GraphList::Smoothen(double marge){   TDLI<Graph> _LI=TDLI<Graph>(this);	_LI.foreach_mf(&Graph::Reset_Mark_and_Bin);	_LI.tohead();	while (!_LI.hitroot())	{		if (_LI.item()->Smoothen( (B_INT) marge))      {			if (_LI.item()->GetNumberOfLinks() < 3)			// delete this graph from the graphlist         {            delete _LI.item();            _LI.remove();         }      }		else			_LI++;	}}// Turn off all markers in all the graphsvoid GraphList::UnMarkAll(){   TDLI<Graph> _LI=TDLI<Graph>(this);	_LI.foreach_mf(&Graph::Reset_Mark_and_Bin);}//==============================================================================////======================== BOOLEAN FUNCTIONS ===================================////==============================================================================void GraphList::Correction(){   TDLI<Graph> _LI=TDLI<Graph>(this);	int todo=_LI.count();   if ( _GC->GetInternalCorrectionFactor()) //not zero   {      _LI.tohead();      for(int i=0; i<todo ; i++)      {         //the input graph will be empty in the end         GraphList *_correct=new GraphList(_GC);         {            _LI.item()->MakeClockWise();            _LI.item()->Correction(_correct,_GC->GetInternalCorrectionFactor());            delete _LI.item();            _LI.remove();            //move corrected graphlist to result            while (!_correct->empty())            {               //add to end               _LI.insend((Graph*)_correct->headitem());               _correct->removehead();            }         }         delete _correct;      }   }     }void GraphList::MakeRings(){   TDLI<Graph> _LI=TDLI<Graph>(this);	int todo=_LI.count();	_LI.tohead();	for(int i=0; i<todo ; i++)	{		//the input graph will be empty in the end		GraphList *_ring=new GraphList(_GC);		{			_LI.item()->MakeClockWise();			_LI.item()->MakeRing(_ring,_GC->GetInternalCorrectionFactor());         delete _LI.item();			_LI.remove();			//move created rings graphs to this			while (!_ring->empty())			{				//add to end				((Graph*)_ring->headitem())->MakeClockWise();				_LI.insend((Graph*)_ring->headitem());				_ring->removehead();			}		}		delete _ring;	}}//merge the graphs in the list and return the merged resultvoid GraphList::Merge(){   if (count()<=1)      return;   {      TDLI<Graph> _LI=TDLI<Graph>(this);      _LI.tohead();      while (!_LI.hitroot())      {         _LI.item()->SetGroup(GROUP_A);         _LI++;      }   }   Graph* _tomerge=new Graph(_GC);   Renumber();   //the graplist contents will be transferred to one graph   MakeOneGraph(_tomerge);   //the original is empty now   _tomerge->Prepare(1);   _tomerge->Boolean(BOOL_OR,this);	delete _tomerge;}#define TRIALS 30  #define SAVEME 1//perform boolean operation on the graphs in the listvoid GraphList::Boolean(BOOL_OP operation, int intersectionRunsMax ){	_GC->SetState("Performing Boolean Operation");   if (count()==0)         return;	Graph* _prepared = new Graph(_GC);   if (empty())      return;      //round to grid and put in one graph	_GC->SetState("Simplify");   int intersectionruns = 1;   while ( intersectionruns <= intersectionRunsMax )   {      try	   {         Prepare( _prepared );         if (_prepared->GetNumberOfLinks())         {            //calculate intersections etc.            _GC->SetState("prepare");            _prepared->Prepare( intersectionruns );            //_prepared->writegraph(true);            _prepared->Boolean(operation,this);         }         intersectionruns = intersectionRunsMax +1;      }	   catch (Bool_Engine_Error& error)	   {#if KBOOL_DEBUG         _prepared->WriteGraphKEY(_GC);#endif         intersectionruns++;         if ( intersectionruns == intersectionRunsMax )         {            _prepared->WriteGraphKEY(_GC);            _GC->info(error.GetErrorMessage(), "error");		      throw error;         }      }      catch(...)      {#if KBOOL_DEBUG         _prepared->WriteGraphKEY(_GC);#endif         intersectionruns++;         if ( intersectionruns == intersectionRunsMax )         {            _prepared->WriteGraphKEY(_GC);            _GC->info("Unknown exception", "error");		      throw;         }      }   }	delete _prepared;}void GraphList::WriteGraphs(){   TDLI<Graph> _LI=TDLI<Graph>(this);	_LI.tohead();	while(!_LI.hitroot())	{        _LI.item()->writegraph( false );        _LI++;	}}void GraphList::WriteGraphsKEY( Bool_Engine* GC ){   FILE* file = fopen("graphkeyfile.key", "w");   fprintf(file,"\      HEADER 5; \      BGNLIB; \      LASTMOD {2-11-15  15:39:21}; \      LASTACC {2-11-15  15:39:21}; \      LIBNAME trial; \      UNITS; \      USERUNITS 0.0001; PHYSUNITS 1e-009; \   \      BGNSTR;  \      CREATION {2-11-15  15:39:21}; \      LASTMOD  {2-11-15  15:39:21}; \      STRNAME top; \   ");   TDLI<Graph> _LI=TDLI<Graph>(this);	_LI.tohead();	while(!_LI.hitroot())	{        _LI.item()->WriteKEY( GC, file );        _LI++;	}   fprintf(file,"\      ENDSTR top; \      ENDLIB; \   ");   fclose (file);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -