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

📄 jointlist.cpp

📁 此程序实现了类似protel电路画图程序。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		POSITION posE = pOther->pElementList.m_pListElement.GetHeadPosition();
		while(posE != NULL)
		{
			CAElement* pE = pOther->pElementList.m_pListElement.GetNext(posE);
			if(!pE->IsWorked() && pE!=pSwitch)
			{
				SetSpecialElCurrent(pE,pOther);
			}
			if( pE != pSwitch )
			{
				if((pE->IsTheP1Joint( pOther ) && !pSwitch->IsTheP1Joint( pOther ))
				|| (!pE->IsTheP1Joint( pOther ) && pSwitch->IsTheP1Joint( pOther )))
				{
					i += pE->GetCurrent();
				}
				else if(( pE->IsTheP1Joint( pOther ) && pSwitch->IsTheP1Joint( pOther ))
					 || ( !pE->IsTheP1Joint( pOther ) && !pSwitch->IsTheP1Joint( pOther )))
				{
					i += -pE->GetCurrent();
				}
			}
		}
	}
	else
	{
		i = 0;
	}
	pSwitch->SetWorked(true);
	pSwitch->SetCurrent(i);
}
void CJointList::SetInductorCurrent(CAElement* pInductor,CAJoint* p)
{
	float i = 0;
	CAJoint* p1 = pInductor->GetJointStruct()->pJoint1;
	CAJoint* p2 = pInductor->GetJointStruct()->pJoint2;
	CAJoint* pOther;
	if(p1 == p) pOther = p2;
	else		pOther = p1;
	POSITION posE = pOther->pElementList.m_pListElement.GetHeadPosition();
	while(posE != NULL)
	{
		CAElement* pE = pOther->pElementList.m_pListElement.GetNext(posE);
		if(!pE->IsWorked() && pE!=pInductor)
		{
			SetSpecialElCurrent(pE,pOther);
		}
		if( pE != pInductor )
		{
			if((pE->IsTheP1Joint( pOther ) && !pInductor->IsTheP1Joint( pOther ))
			|| (!pE->IsTheP1Joint( pOther ) && pInductor->IsTheP1Joint( pOther )))
			{
				i += pE->GetCurrent();
			}
			else if(( pE->IsTheP1Joint( pOther ) && pInductor->IsTheP1Joint( pOther ))
				 || ( !pE->IsTheP1Joint( pOther ) && !pInductor->IsTheP1Joint( pOther )))
			{
				i += -pE->GetCurrent();
			}
		}
	}
	pInductor->SetWorked(true);
	pInductor->SetCurrent(i);
}
void CJointList::SetCapacityCurrent(CAElement* pCapacity,CAJoint *p)
{
	pCapacity->SetCurrent(0);
}
void CJointList::SetResistanceCurrent(CAElement* pResistance,CAJoint* p)
{
	CAJoint* p1 = pResistance->GetJointStruct()->pJoint1;
	CAJoint* p2 = pResistance->GetJointStruct()->pJoint2;
	float    v1 = p1->GetVoltage();
	float    v2 = p2->GetVoltage();
/*	if(v1 > v2)
	{
		pResistance->SetCurrent((v1-v2)/pResistance->GetValue());
	}
	else
	{
		pResistance->SetCurrent((v2-v1)/pResistance->GetValue());
	}*/
	pResistance->SetCurrent((v2-v1)/pResistance->GetValue());
	pResistance->SetWorked(true);
}
void CJointList::SetPowerCurrent(CAElement* pPower,CAJoint* p)
{
	float i = 0;
	/*CAJoint* p1InSave = pPower->GetJointStruct()->pJoint1;
	CAJoint* p2InSave = pPower->GetJointStruct()->pJoint2;
	CAElement* pRealP = GetElement( pPower,m_pSaveRealList );
	CAJoint* p1InReal = pRealP->GetJointStruct()->pJoint1;
	CAJoint* p2InReal = pRealP->GetJointStruct()->pJoint2;
	CAElement* pR;
	if(pPOwer == p1InReal->pElementList.m_pListElement.GetHead())
	{
		pR = p1InReal->pElementList.m_pListElement.GetTail();
	}	
	else
	{
		pR = p1InReal->pElementList.m_pListElement.GetHead();
	}*/
	CAJoint* p1 = pPower->GetJointStruct()->pJoint1;
	CAJoint* p2 = pPower->GetJointStruct()->pJoint2;
	CAJoint* pOther;
//	int nCount1 = p1->pElementList.m_pListElement.GetCount();
//	int nCount2 = p2->pElementList.m_pListElement.GetCount();
//	if( nCount1 == 2 )
//	{
//		pOther = p1;
//	}
//	else
//	{
//		pOther = p2;
//	}
	if(p1 == p) pOther = p2;
	else		pOther = p1;
	int nParelCount = SetParrelPowerCurrent( pPower,pOther);
	POSITION posE = pOther->pElementList.m_pListElement.GetHeadPosition();
	int nCount = pOther->pElementList.m_pListElement.GetCount();
	while(posE != NULL)
	{
		CAElement* pE = pOther->pElementList.m_pListElement.GetNext(posE);
	//	if(nCount == 2 )
	//	{
	//		if(!pE->IsWorked() && pE!=pPower )
	//		{
	//			SetSpecialElCurrent(pE,pOther);
	//		}
	//	}
	//	else
	//	{
		//	if(!pE->IsWorked() && pE->GetType()!= ID_POWER )
			if( !pE->IsWorked() && pE != pPower && !pE->IsSetParel() )
			{
				SetSpecialElCurrent(pE,pOther);
			}
			if( !pE->IsSetParel() && pE != pPower ) 
				
			{
				if((pE->IsTheP1Joint( pOther ) && !pPower->IsTheP1Joint( pOther ))
				|| (!pE->IsTheP1Joint( pOther ) && pPower->IsTheP1Joint( pOther )))
				{
					i += pE->GetCurrent();
				}
				else if(( pE->IsTheP1Joint( pOther ) && pPower->IsTheP1Joint( pOther ))
					 || ( !pE->IsTheP1Joint( pOther ) && !pPower->IsTheP1Joint( pOther )))
				{
					i += -pE->GetCurrent();
				}
			}
//				i += pE->GetCurrent();
			pE->SetIsParel( false );
	//	}
	}
	pPower->SetWorked(true);
	pPower->SetCurrent(i/nParelCount);
	pPower->SetIsParel( false );
	
}
void CJointList::SetDiodeCurrent(CAElement* pDiode,CAJoint* p)
{
	float i = 0;
	CAJoint* p1 = pDiode->GetJointStruct()->pJoint1;
	CAJoint* p2 = pDiode->GetJointStruct()->pJoint2;
	if(p1->GetVoltage() != p2->GetVoltage())
	{
		pDiode->SetCurrent(0);
	}
	else
	{
		CAJoint* pOther;
		if(p1 == p) pOther = p2;
		else		pOther = p1;
		POSITION posE = pOther->pElementList.m_pListElement.GetHeadPosition();
		while(posE != NULL)
		{
			CAElement* pE = pOther->pElementList.m_pListElement.GetNext(posE);
			if(!pE->IsWorked() && pE!=pDiode)
			{
				SetSpecialElCurrent(pE,pOther);
			}
			if( pE!=pDiode )
			{
				if((pE->IsTheP1Joint( pOther ) && !pDiode->IsTheP1Joint( pOther ))
					|| (!pE->IsTheP1Joint( pOther ) && pDiode->IsTheP1Joint( pOther )))
				{
					i += pE->GetCurrent();
				}
				else if(( pE->IsTheP1Joint( pOther ) && pDiode->IsTheP1Joint( pOther ))
						 || ( !pE->IsTheP1Joint( pOther ) && !pDiode->IsTheP1Joint( pOther )))
				{
					i += -pE->GetCurrent();
				}
			}
//			i += pE->GetCurrent();
		}
	}
	pDiode->SetWorked(true);
	pDiode->SetCurrent(i);
}

void CJointList::SetSpecialElCurrent(CAElement *pE,CAJoint* p)
{
	int type = pE->GetType();
	switch(type)
	{
	case ID_POWER:
		SetPowerCurrent(pE,p);
		break;
	case ID_RESISTANCE:
		SetResistanceCurrent(pE,p);
		break;
	case ID_CAPACITANCE:
		SetCapacityCurrent(pE,p);
		break;
	case ID_INDUCTANCE:
		SetInductorCurrent(pE,p);
		break;
	case ID_SWITCH:
		SetSwitchCurrent(pE,p);
		break;
	case ID_DIODE:
		SetDiodeCurrent(pE,p);
		break;
	case ID_CURRENT_METER:
		SetAmpermeterCurrent(pE,p);
		break;
	case ID_VOLTAGE_METER:
		SetVoltmeterCurrent(pE,p);
		break;
	default:
		break;
	}
}

/*CAElement* CJointList::GetSameElInOtherList(CAElement *pE, JointList *pList)
{
	CAJoint* p1 = pE->GetJointStruct()->pJoint1;
	CAJoint* p2 = pE->GetJointStruct()->pJoint2;
	int order1 = p1->GetOrder();
	int order2 = p2->GetOrder();
	int type1   = pE->GetType();
	POSITION pos = pList->GetHeadPosition();
	while(pos != NULL)
	{
		CAJoint* pJ   = pList->GetNext(pos);
		POSITION posE = pJ->pElementList.m_pListElement.GetHeadPosition();
		while(posE != NULL)
		{
			CAElement* pEOther = pJ->pElementList.m_pListElement.GetNext(posE);
			int type2		   = pEOther->GetType();
			CAJoint* p11       = pEOther->GetJointStruct()->pJoint1;
			CAJoint* p22       = pEOther->GetJointStruct()->pJoint2;
			int order11		   = p11->GetOrder();
			int order22		   = p22->GetOrder();
			if(type1 == type2)
			{
				if    (order11 == order1 && order22 == order2)
				{
					return pEOther;
				}
				else if(order11 == order2 && order22 == order1)
				{
					return pEOther;
				}
			}
		}
	}
	return NULL;
}*/

void CJointList::GiveMeBase(int base)
{
	m_nBase = base;
}

int CJointList::GetBaseOrder()
{
	return m_nBase;
}

void CJointList::SetVoltOutput(ElementList *pElList, JointList *pList)
{
	POSITION pos = pElList->GetHeadPosition();
	while( pos != NULL )
	{
		CAElement* pE		= pElList->GetNext( pos );
//		int	order1			= pE->GetOrderStruct()->order1;
//		int order2			= pE->GetOrderStruct()->order2;
		CAElement* pEInSave = GetElement(pE,pList);
		pE->SetVoltage( pEInSave->GetVoltage() );
	}
}

void CJointList::SetAmperOutput(ElementList *pElList, JointList *pList)
{
	POSITION pos = pElList->GetHeadPosition();
	while( pos != NULL )
	{
		CAElement* pE		= pElList->GetNext( pos );
//		int order1			= pE->GetOrderStruct()->order1;
//		int order2			= pE->GetOrderStruct()->order2;
		CAElement* pEInSave = GetElement(pE,pList);
		pE->SetCurrent( pEInSave->GetCurrent() );
	}
}

/*CAElement* CJointList::GetSameElInOtherList(int type,int order1, int order2, JointList *pList)
{
	POSITION posJ = pList->GetHeadPosition();
	while( posJ != NULL )
	{
		CAJoint* pJ = pList->GetNext( posJ );
		POSITION posE = pJ->pElementList.m_pListElement.GetHeadPosition();
		while( posE != NULL )
		{
			CAElement* pE = pJ->pElementList.m_pListElement.GetNext( posE );
			if( pE->GetType() == type )
			{
				CAJoint* p1 = pE->GetJointStruct()->pJoint1;
				CAJoint* p2 = pE->GetJointStruct()->pJoint2;
				int      o1 = p1->GetOrder();
				int      o2 = p2->GetOrder();
				if( order1 == o1 && order2 == o2 )
				{
					return pE;
				}
				else if( order1 == o2 && order2 == o1 )
				{
					return pE;
				}
			}
		}
	}
	return NULL;
}
*/
int CJointList::GetElementCount(JointList* pList)
{
	int nCount = 0;
	SetWorkedInList( false,pList );
	POSITION posJ = pList->GetHeadPosition();
	while( posJ != NULL )
	{
		CAJoint* pJ = pList->GetNext( posJ );
		POSITION posE = pJ->pElementList.m_pListElement.GetHeadPosition();
		while( posE != NULL )
		{
			CAElement* pE = pJ->pElementList.m_pListElement.GetNext( posE );
			if( !pE->IsWorked() )
			{
				nCount ++;
				pE->SetWorked( true );
			}
		}
	}
	return nCount;
}

void CJointList::SetAllIsSetVoltage(BOOL b, JointList *pList)
{
	POSITION pos = pList->GetHeadPosition();
	while( pos != NULL )
	{
		CAJoint* pJoint = pList->GetNext( pos );
		pJoint->SetIsSetVoltage( b );
	}
}


BOOL CJointList::GoTheWay(CAJoint *pJoint)
{
	return false;
	//1.All Is Resistance;
	//2.Only one and it IsSetVoltage;
	//3.
}

int CJointList::SetParrelPowerCurrent(CAElement *pPower,CAJoint* pJ)
{
	int nCount = 1;
	pPower->SetIsParel( false );
//	CAJoint* p1 = pPower->GetJointStruct()->pJoint1;
//	CAJoint* p2 = pPower->GetJointStruct()->pJoint2;
	POSITION pos = pJ->pElementList.m_pListElement.GetHeadPosition();
	while( pos != NULL )
	{
		CAElement* pE = pJ->pElementList.m_pListElement.GetNext( pos );
		pE->SetIsParel( false );
		if( pE->GetType() == ID_POWER && pE != pPower )
		{
			if( IsSameJoint( pPower,pE ) )
			{
				nCount ++;
			//	pE->SetIsParel( true );
				pE->SetIsParel( true );
				pPower->SetIsParel( true );
			}
		}
	}
	return nCount;
}

BOOL CJointList::IsSameJoint(CAElement *pE1, CAElement *pE2)
{
	BOOL b1,b2;
	if(pE1->GetJointStruct()->pJoint1==pE2->GetJointStruct()->pJoint1)
	{
		b1=true;
	}
	else
	{
		b1=false;
	}
	if(pE1->GetJointStruct()->pJoint2==pE2->GetJointStruct()->pJoint2)
	{
		b2=true;
	}
	else
	{
		b2=false;
	}
	if(b1&&b2)
	{
		return true;
	}
	else
	{
		return false;
	}
}

⌨️ 快捷键说明

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