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

📄 record.cpp

📁 EDA PCB 电路设计工具源码 c/c++ for Linux, Windows, Mac, 2008.8 最新
💻 CPP
字号:
/*! \file ../src/record.cpp    \author Probably Klaas Holwerda or Julian Smart    Copyright: 2001-2004 (C) Probably Klaas Holwerda    Licence: wxWidgets Licence    RCS-ID: $Id: record.cpp,v 1.5 2005/05/24 19:13:39 titato Exp $*/#ifdef __GNUG__#pragma implementation #endif#include "../include/booleng.h"#include "../include/record.h"#include "../include/node.h"#include <stdlib.h>#include <math.h>#define LNK _line.GetLink()//int r_index=-1;//void* _Record_Pool[30];//void DeleteRecordPool()//{//   while (r_index!=-1)//   {//     free( _Record_Pool[r_index--]);//   }//}Record::~Record(){}//void* Record::operator new(size_t size)//{////   if (r_index!=-1)//   {//     return _Record_Pool[r_index--];//   }////   return malloc(size);//}//void Record::operator delete(void* recordptr)//{////   if (r_index < 28)//   {//     _Record_Pool[++r_index]= recordptr;//     return;//   }////	free (recordptr);//}//void Record::deletepool()//{////   while (r_index!=-1)//   {//     free( _Record_Pool[r_index--]);//   }//}Record::Record(KBoolLink* link,Bool_Engine* GC)   :_line(GC){   _GC=GC;	_dir=GO_RIGHT;   _a=0;   _b=0;	_line.Set(link);	_line.CalculateLineParameters();}//when the dimensions of a link for a record changes, its line parameters need to be recalculatedvoid Record::SetNewLink(KBoolLink* link){	_line.Set(link);   _line.CalculateLineParameters();}//for beams calculate the ysp on the low scanlinevoid Record::Calc_Ysp(Node* low){	if ((LNK->GetEndNode() == low) || (LNK->GetBeginNode() == low))   {      _ysp=low->GetY();      return;   }   if	(LNK->GetEndNode()->GetX() == LNK->GetBeginNode()->GetX())         _ysp=low->GetY(); //flatlink only in flatbeams   else if (LNK->GetEndNode()->GetX() == low->GetX())         _ysp=LNK->GetEndNode()->GetY();   else if (LNK->GetBeginNode()->GetX() == low->GetX())         _ysp=LNK->GetBeginNode()->GetY();   else      	_ysp=_line.Calculate_Y_from_X(low->GetX());}//to set the _dir for new links in the beamvoid Record::Set_Flags(){	if (LNK->GetEndNode()->GetX()==LNK->GetBeginNode()->GetX()) //flatlink ?	{  //only happens in flat beams		if (LNK->GetEndNode()->GetY() < LNK->GetBeginNode()->GetY())			_dir=GO_RIGHT;		else			_dir=GO_LEFT;	}	else	{		if (LNK->GetEndNode()->GetX() > LNK->GetBeginNode()->GetX())			_dir=GO_RIGHT;		else			_dir=GO_LEFT;	}}KBoolLink* Record::GetLink(){	return LNK;}B_INT Record::Ysp(){	return _ysp;}void Record::SetYsp(B_INT ysp){	_ysp=ysp;}DIRECTION Record::Direction(){	return DIRECTION(_dir);}bool Record::Calc_Left_Right(Record* record_above_me){   bool par=false;   if (!record_above_me)   //null if no record above   { 	_a=0;_b=0;  }   else   {   	_a=record_above_me->_a;   	_b=record_above_me->_b;   }   switch (_dir&1)   {      case GO_LEFT	:	if (LNK->Group() == GROUP_A)                        {                           LNK->SetRightA((bool)(_a>0));                           if (_GC->GetWindingRule())                              LNK->GetInc() ? _a++ : _a--;                           else                           {  //ALTERNATE                              if (_a)                                 _a=0;                              else                                 _a=1;                           }                           LNK->SetLeftA((bool)(_a>0));                           LNK->SetLeftB((bool)(_b>0));                           LNK->SetRightB((bool)(_b>0));                        }                        else                        {                           LNK->SetRightA((bool)(_a > 0));                           LNK->SetLeftA((bool)(_a>0));                           LNK->SetRightB((bool)(_b>0));                           if (_GC->GetWindingRule())                              LNK->GetInc() ? _b++ : _b--;                           else //ALTERNATE                           {                               if (_b)                                    _b=0;                               else                                    _b=1;                           }                           LNK->SetLeftB((bool)(_b>0));                        }                           break;      case	GO_RIGHT	:	if (LNK->Group() == GROUP_A)                        {                           LNK->SetLeftA((bool)(_a>0));                           if (_GC->GetWindingRule())                              LNK->GetInc() ? _a++ : _a--;                           else                           {  //ALTERNATE                              if (_a)                                 _a=0;                              else                                 _a=1;                           }                           LNK->SetRightA((bool)(_a>0));                           LNK->SetLeftB((bool)(_b>0));                           LNK->SetRightB((bool)(_b>0));                        }                        else                        {                           LNK->SetRightA((bool)(_a>0));                           LNK->SetLeftA((bool)(_a>0));                           LNK->SetLeftB((bool)(_b>0));                           if (_GC->GetWindingRule())                              LNK->GetInc() ? _b++ : _b--;                           else                           {  //ALTERNATE                              if (_b)                                 _b=0;                              else                                 _b=1;                           }                           LNK->SetRightB((bool)(_b>0));                        }                        break;      default			:  _GC->error("Undefined Direction of link","function IScanBeam::Calc_Set_Left_Right()");                        break;   }//THE NEXT WILL WORK for MOST windingrule polygons,//even when not taking into acount windingrule// not all/*   switch (_dir&1)   {      case GO_LEFT	:	if (LNK->Group() == GROUP_A)                        {                           LNK->SetRightA((bool)(_a>0));                           if (booleng->Get_WindingRule())                              LNK->GetInc() ? _a++ : _a--;                           else                              _a--;                           LNK->SetLeftA((bool)(_a>0));                           LNK->SetLeftB((bool)(_b>0));                           LNK->SetRightB((bool)(_b>0));                        }                        else                        {                           LNK->SetRightA((bool)(_a > 0));                           LNK->SetLeftA((bool)(_a>0));                           LNK->SetRightB((bool)(_b>0));                           if (booleng->Get_WindingRule())                              LNK->GetInc() ? _b++ : _b--;                           else                              _b--;                           LNK->SetLeftB((bool)(_b>0));                        }                           break;      case	GO_RIGHT	:	if (LNK->Group() == GROUP_A)                           {                              LNK->SetLeftA((bool)(_a>0));                              if (booleng->Get_WindingRule())                                 LNK->GetInc() ? _a++ : _a--;                              else                                 _a++;                              LNK->SetRightA((bool)(_a>0));                              LNK->SetLeftB((bool)(_b>0));                              LNK->SetRightB((bool)(_b>0));                           }                        else                           {                              LNK->SetRightA((bool)(_a>0));                              LNK->SetLeftA((bool)(_a>0));                              LNK->SetLeftB((bool)(_b>0));                              if (booleng->Get_WindingRule())                                 LNK->GetInc() ? _b++ : _b--;                              else                                 _b++;                              LNK->SetRightB((bool)(_b>0));                           }                        break;      default			:  _messagehandler->error("Undefined Direction of link","function IScanBeam::Calc_Set_Left_Right()");                        break;   }*/   //if the records are parallel (same begin/endnodes)   //the above link a/b flag are adjusted to the current a/b depth   if (record_above_me && Equal(record_above_me))   {      par=true;		LNK->Mark();   	record_above_me->_a=_a;   	record_above_me->_b=_b;		if (Direction()== GO_LEFT)		{         //set the bottom side  of the above link         if (record_above_me->Direction()== GO_LEFT)         {            record_above_me->LNK->SetLeftA(LNK->GetLeftA());            record_above_me->LNK->SetLeftB(LNK->GetLeftB());         }         else         {            record_above_me->LNK->SetRightA(LNK->GetLeftA());            record_above_me->LNK->SetRightB(LNK->GetLeftB());         }		}		else		{         //set the bottom side  of the above link         if (record_above_me->Direction()== GO_LEFT)         {            record_above_me->LNK->SetLeftA(LNK->GetRightA());            record_above_me->LNK->SetLeftB(LNK->GetRightB());         }         else         {            record_above_me->LNK->SetRightA(LNK->GetRightA());            record_above_me->LNK->SetRightB(LNK->GetRightB());         }		}   }   return par;}bool Record::Equal(Record *a){	return((bool)( ( LNK->GetOther(a->LNK->GetBeginNode()) == a->LNK->GetEndNode())  &&						  ( LNK->GetOther(a->LNK->GetEndNode())   == a->LNK->GetBeginNode())  ));}KBoolLine* Record::GetLine(){	return &_line;}

⌨️ 快捷键说明

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