www.gusucode.com > VC++开发的电路板画图设计软件源代码源码程序 > VC++开发的电路板画图设计软件源代码源码程序\code\Base.cpp
//Download by http://www.NewXing.com // Base.cpp: implementation of the CBase class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "Pointtest.h" #include "Base.h" #include "baselist.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif extern int RisisNumber; //电阻 extern int PowerNumber; //电源 extern int CapNumber; //电容 extern int DiodeNumber; //二极管 extern int InduNumber; //电感 extern int LightNumber; //灯泡 extern int GroundNumber;//接地 extern int CurrentNumber;//电流表 extern int VoltageNumber;//电压表 extern int SwitchNumber; //开关 extern int RheostatNumber;//变阻器 ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CBase::CBase(int nType,CBaseList* pBaseList) { m_ElementType = nType; m_iSelected = FALSE; CenterPoint = CPoint(0,0); OwnerCenter = CPoint(0,0); WhereIAm = pBaseList; TotalAngle = 0; pBaseList->AddTail(this); number = 0; Size_Of_Ob = CRect(0,0,0,0); m_bSwitch = FALSE; Node1 = Node2 = NODEFINE; MeterValue = 0; } CBase::CBase(int nType) { m_ElementType = nType; m_iSelected = FALSE; CenterPoint = CPoint(0,0); TotalAngle = 0; number = 0; Size_Of_Ob = CRect(0,0,0,0); m_bSwitch = FALSE; Node1 = Node2 = NODEFINE; MeterValue = 0; } CBase::~CBase() { } int CBase::IsSelected() { return m_iSelected; } void CBase::Select() { m_iSelected = TRUE; } void CBase::DeSelect() { m_iSelected = FALSE; } BOOL CBase::GraphInRect( CRect lpRect ) { if( !lpRect ) return FALSE; CRect graphRect, interRect; graphRect = GetGraphRect(); interRect.IntersectRect( &lpRect, &graphRect ); return (!interRect.IsRectEmpty()); } int CBase::GetType() { return m_ElementType; } CRect CBase::GetGraphRect() { return Size_Of_Ob; } CString CBase::GetGraphString() { return Content_Of_Ob; } void CBase::SetData(CString &aa,CRect &bb) { aa = Content_Of_Ob; bb = Size_Of_Ob; } void CBase::GetData(CString aa,CRect bb) { Content_Of_Ob = aa; Size_Of_Ob = bb; } void CBase::AddSon(CBase* Element) { SonList.AddTail(Element); } void CBase::Delete() { POSITION pos = SonList.GetHeadPosition(); while( NULL != pos ) { CBase* pBase = SonList.GetNext( pos ); pBase->Delete(); } // Notify parent this->Notify(); // Notify list WhereIAm->Notify(this); ReduceCount(m_ElementType); delete this; } BOOL CBase::PtInOb(CPoint point) { BOOL result = FALSE; CRect mRect; mRect = GetGraphRect(); if(mRect.PtInRect(point)) result = TRUE; return result; } double CBase::ConvertAngle(int a) { double rValue; rValue = a*PI/180; return rValue; } CPoint CBase::Rotate(double a,CPoint rotate) { CPoint pp; int t1,t2; double b,l,d1,d2; t1 = rotate.x - CenterPoint.x; t2 = CenterPoint.y - rotate.y; l = sqrt(t1*t1+t2*t2); b = atan2(t2,t1); d1 = l*sin(a+b); d2 = l*cos(a+b); d1 = round(d1); d2 = round(d2); pp.y = (long)(CenterPoint.y-d1); pp.x = (long)(d2+CenterPoint.x); return pp; } int CBase::round(double aa)//四舍五入 { double bb; int result; bb = aa - (int)aa; if(bb>0){ if((1 - bb)>bb){ result = (int)aa; return result; }else{ result = (int)aa+1; return result; } }else if(bb<0){ if((1+bb)>-bb){ result = (int)aa; return result; }else{ result = (int)aa-1; return result; } }else{ return (int)aa; } } CRect CBase::GetRect(CPoint pp,CSize bb) { CRect rect(-(bb.cx)/2,-(bb.cy)/2,(bb.cx)/2,(bb.cy)/2); rect.OffsetRect(pp); return rect; } void CBase::DrawSign(CDC* pDC,CPoint cen,int Length) { CPoint fuhao[3],zhenghao[5]; fuhao[0] = cen; zhenghao[0] = cen; fuhao[0].Offset(CSize(-Length,0)); zhenghao[0].Offset(CSize(Length,0)); fuhao[1] = fuhao[2] = fuhao[0]; zhenghao[1] = zhenghao[2] = zhenghao[3] = zhenghao[4] = zhenghao[0]; fuhao[1].Offset(CSize(-5,0)); fuhao[2].Offset(CSize(5,0)); zhenghao[1].Offset(CSize(-5,0)); zhenghao[2].Offset(CSize(5,0)); zhenghao[3].Offset(CSize(0,5)); zhenghao[4].Offset(CSize(0,-5)); for(int i=1;i<5;i++){ if(i<3){ pDC->MoveTo(fuhao[0]); pDC->LineTo(fuhao[i]); } pDC->MoveTo(zhenghao[0]); pDC->LineTo(zhenghao[i]); } } BOOL CBase::IfHaveSon()//是否连线 { if(SonList.IsEmpty()) return FALSE; return TRUE; } void CBase::TextOut(CDC* pDC) { TextPoint = GetTextRect(pDC); pDC->SetBkMode(TRANSPARENT); pDC->TextOut(TextPoint.x,TextPoint.y,Content_Of_Ob); } CPoint CBase::GetTextRect(CDC* pDC) { CPoint point = CenterPoint; CSize size; size = pDC->GetTextExtent(Content_Of_Ob); point.x = CenterPoint.x - size.cx/2; int angle = round(TotalAngle*180/PI); int a = angle%180; if(a) point.y = CenterPoint.y - 27 - size.cy; else point.y = CenterPoint.y - 16 - size.cy; return point; } void CBase::ReduceCount(UINT id) { switch(id){ case ID_RESISTANCE: RisisNumber--; break; case ID_POWER: PowerNumber--; break; case ID_CAPACITANCE: CapNumber--; break; case ID_DIODE: DiodeNumber--; break; case ID_SWITCH: SwitchNumber--; break; case ID_LIGHT: LightNumber--; break; case ID_VOLTAGE_METER: VoltageNumber--; break; case ID_CURRENT_METER: CurrentNumber--; break; case ID_INDUCTANCE: InduNumber--; break; case ID_GROUND: GroundNumber--; break; case ID_RHEOSTAT: RheostatNumber--; break; } } void CBase::AddString(UINT id) { int number; switch(id){ case ID_RESISTANCE: RisisNumber++; number = RisisNumber; break; case ID_POWER: PowerNumber++; number = PowerNumber; break; case ID_CAPACITANCE: CapNumber++; number = CapNumber; break; case ID_DIODE: DiodeNumber++; number = DiodeNumber; break; case ID_SWITCH: SwitchNumber++; number = SwitchNumber; break; case ID_LIGHT: LightNumber++; number = LightNumber; break; case ID_VOLTAGE_METER: VoltageNumber++; number = VoltageNumber; break; case ID_CURRENT_METER: CurrentNumber++; number = CurrentNumber; break; case ID_INDUCTANCE: InduNumber++; number = InduNumber; break; case ID_GROUND: GroundNumber++; number = GroundNumber; break; case ID_RHEOSTAT: RheostatNumber++; number = RheostatNumber; break; } sprintf(SerialNumber,"%d",number); Content_Of_Ob+=SerialNumber; } void CBase::SetPoinT(CPoint pp) { CSize size; size = pp-CenterPoint; OffSet(size); }