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

📄 oopfeview.cpp

📁 一个计算悬臂梁的有限元vc源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	CPen* pOldPen;
	pOldPen=pDC->SelectObject(&pen);

	dMaxMoment=0.0;
	nEle=apEle.GetSize();
	for(loop=0;loop<nEle;loop++){
		iBuf=apEle[loop]->GetElementType();
		if(iBuf==BEAM||iBuf==BEAM_HINGE){
			((CBeam*)apEle[loop])->GetSectionForce(dN,adQ,adM);
			for(loop1=0;loop1<11;loop1++){
				if(adM[loop1]<0.0){
					if(dMaxMoment<-adM[loop1]) dMaxMoment=-adM[loop1];
				}
				else{
					if(dMaxMoment<adM[loop1]) dMaxMoment=adM[loop1];
				}
			}
		}
	}
	dScaleMomentToD=m_nMaxMomentDot/dMaxMoment;

	for(loop=0;loop<nEle;loop++){
		iBuf=apEle[loop]->GetElementType();
		if(iBuf==BEAM||iBuf==BEAM_HINGE){
			((CBeam*)apEle[loop])->GetSectionForce(dN,adQ,adM);
			dLength=((CBeam*)apEle[loop])->GetLength();
			apEle[loop]->GetNode(aiNode,nEleNode);
			dXi0=Node.GetX(aiNode[0]);
			dYi0=Node.GetY(aiNode[0]);
			dXj0=Node.GetX(aiNode[1]);
			dYj0=Node.GetY(aiNode[1]);
			dCos=(dXj0-dXi0)/dLength;
			dSin=(dYj0-dYi0)/dLength;
			
			aPt[0].x=m_ptBase.x+(int)((dXi0-m_dMinX)*m_dScaleRtoD);
			aPt[0].y=m_ptBase.y-(int)((dYi0-m_dMinY)*m_dScaleRtoD);
			for(loop1=0;loop1<11;loop1++){
				dXk0=m_ptBase.x+(int)((dXi0+(dXj0-dXi0)*loop1/10.0-m_dMinX)*m_dScaleRtoD);
				dYk0=m_ptBase.y-(int)((dYi0+(dYj0-dYi0)*loop1/10.0-m_dMinY)*m_dScaleRtoD);
				aPt[loop1+1].x=(int)dXk0+(int)(adM[loop1]*dSin*dScaleMomentToD);
				aPt[loop1+1].y=(int)dYk0+(int)(adM[loop1]*dCos*dScaleMomentToD);
			}
			aPt[12].x=m_ptBase.x+(int)((dXj0-m_dMinX)*m_dScaleRtoD);
			aPt[12].y=m_ptBase.y-(int)((dYj0-m_dMinY)*m_dScaleRtoD);

			pDC->MoveTo(aPt[0]);
			for(loop1=0;loop1<13;loop1++){
				pDC->LineTo(aPt[loop1]);
			}

			dAngle=atan2(dYj0-dYi0, dXj0-dXi0)*180.0/PI;	
			SetFont(font,"Times New Roman",m_nFontSize,dAngle);
			pDC->SetTextColor(RGB(0,0,0));
			pOldFont=pDC->SelectObject(&font);
		
			sText.Format("%0.3f",adM[0]);
			pDC->TextOut(aPt[1].x,aPt[1].y,sText);
			sText.Format("%0.3f",adM[5]);
			pDC->TextOut(aPt[6].x,aPt[6].y,sText);
			sText.Format("%0.3f",adM[10]);
			pDC->TextOut(aPt[11].x,aPt[11].y,sText);

			pDC->SelectObject(pOldFont);
			font.DeleteObject();	 
		}
	}
	pDC->SelectObject(pOldPen);
	pDC->SetBkMode(iOldBkMode);
}


void COOPFEView::DisplayDeformation(CDC *pDC, COOPFEDoc *pDoc)
{
	int loop,loop1,iBuf,nNode,nEle,nEleNode,aiNode[8];
	double dBuf;
	double adFy[11],dMaxDisp;
	double dScaleDispRtoD;
	double dCos,dSin,dLength;
	CTypedPtrArray <CPtrArray,CBaseElement*>& apEle=pDoc->m_glEle.m_apEle;
	CNode& Node=pDoc->m_glEle.m_Node;
	CPoint aPt[20];
	double dXi0,dXj0,dXk0,dYi0,dYj0,dYk0;
	double dUi,dUj;
	CPen* pOldPen;
	CFont font,*pOldFont;
	CString sText;
	
	DisplayElement(pDC,pDoc);
	if(!pDoc->m_glEle.m_bFlagForceAnalyzed) return;

	CPen pen(PS_SOLID,1,RGB(255,0,0));
	pOldPen=pDC->SelectObject(&pen);
	
	dMaxDisp=0.0;
	nEle=apEle.GetSize();
	for(loop=0;loop<nEle;loop++){
		iBuf=apEle[loop]->GetElementType();
		if(iBuf==BEAM||iBuf==BEAM_HINGE){
			((CBeam*)apEle[loop])->GetSectionDef(adFy,dUi,dUj);
			for(loop1=0;loop1<11;loop1++){
				if(adFy[loop1]<0.0){
					if(dMaxDisp<-adFy[loop1]) dMaxDisp=-adFy[loop1];
				}
				else{
					if(dMaxDisp<adFy[loop1]) dMaxDisp=adFy[loop1];
				}
			}
		}
	}

	nNode=Node.GetNum();
	for(loop=0;loop<nNode;loop++){
		dBuf=fabs(Node.GetCurX(loop)-Node.GetX(loop));
		if(dMaxDisp<dBuf) dMaxDisp=dBuf;
		dBuf=fabs(Node.GetCurY(loop)-Node.GetY(loop));
		if(dMaxDisp<dBuf) dMaxDisp=dBuf;
	}
	dScaleDispRtoD=m_nMaxDispDot/dMaxDisp;

	for(loop=0;loop<nEle;loop++){
		iBuf=apEle[loop]->GetElementType();
		switch(apEle[loop]->GetElementType()){
		case BEAM:
		case BEAM_HINGE:
			((CBeam*)apEle[loop])->GetSectionDef(adFy,dUi,dUj);
			dLength=((CBeam*)apEle[loop])->GetLength();
			apEle[loop]->GetNode(aiNode,nEleNode);
			dXi0=Node.GetX(aiNode[0]);
			dYi0=Node.GetY(aiNode[0]);
			dXj0=Node.GetX(aiNode[1]);
			dYj0=Node.GetY(aiNode[1]);
			dCos=(dXj0-dXi0)/dLength;
			dSin=(dYj0-dYi0)/dLength;
			
			for(loop1=0;loop1<11;loop1++){
				dXk0=m_ptBase.x+(int)((dXi0+(dXj0-dXi0)*loop1/10.0-m_dMinX)*m_dScaleRtoD);
				dYk0=m_ptBase.y-(int)((dYi0+(dYj0-dYi0)*loop1/10.0-m_dMinY)*m_dScaleRtoD);
				aPt[loop1].x=(int)dXk0+(int)(((dUi+(dUj-dUi)*loop1/10.0)*dCos+adFy[loop1]*dSin)*dScaleDispRtoD);
				aPt[loop1].y=(int)dYk0-(int)(((dUi+(dUj-dUi)*loop1/10.0)*dSin-adFy[loop1]*dCos)*dScaleDispRtoD);
			}
			pDC->MoveTo(aPt[0]);
			for(loop1=0;loop1<11;loop1++){
				pDC->LineTo(aPt[loop1]);
			}
			break;
		case TRUSS:
			apEle[loop]->GetNode(aiNode,nEleNode);
			iBuf=aiNode[0];
			aPt[0].x=m_ptBase.x+(int)((Node.GetX(iBuf)-m_dMinX)*m_dScaleRtoD+(Node.GetCurX(iBuf)-Node.GetX(iBuf))*dScaleDispRtoD);
			aPt[0].y=m_ptBase.y-(int)((Node.GetY(iBuf)-m_dMinY)*m_dScaleRtoD+(Node.GetCurY(iBuf)-Node.GetY(iBuf))*dScaleDispRtoD);
			iBuf=aiNode[1];
			aPt[1].x=m_ptBase.x+(int)((Node.GetX(iBuf)-m_dMinX)*m_dScaleRtoD+(Node.GetCurX(iBuf)-Node.GetX(iBuf))*dScaleDispRtoD);
			aPt[1].y=m_ptBase.y-(int)((Node.GetY(iBuf)-m_dMinY)*m_dScaleRtoD+(Node.GetCurY(iBuf)-Node.GetY(iBuf))*dScaleDispRtoD);
			pDC->MoveTo(aPt[0]);
			pDC->LineTo(aPt[1]);
			break;
		case PLANE_8NODE_ELE:
			apEle[loop]->GetNode(aiNode,nEleNode);
			for(loop1=0;loop1<8;loop1++){
				iBuf=aiNode[loop1];
				aPt[loop1].x=m_ptBase.x+(int)((Node.GetX(iBuf)-m_dMinX)*m_dScaleRtoD+(Node.GetCurX(iBuf)-Node.GetX(iBuf))*dScaleDispRtoD);
				aPt[loop1].y=m_ptBase.y-(int)((Node.GetY(iBuf)-m_dMinY)*m_dScaleRtoD+(Node.GetCurY(iBuf)-Node.GetY(iBuf))*dScaleDispRtoD);
			}

			pDC->MoveTo(aPt[7]);
			for(loop1=0;loop1<8;loop1++){
				pDC->LineTo(aPt[loop1]);
			}
			break;
		}
	}
	
	pDC->MoveTo(20,40);
	pDC->LineTo(20+m_nMaxDispDot,40);

	pDC->MoveTo(20,35);
	pDC->LineTo(20,45);
	pDC->MoveTo(20+m_nMaxDispDot,35);
	pDC->LineTo(20+m_nMaxDispDot,45);
	SetFont(font,"Times New Roman",m_nFontSize,0.0);
	sText.Format("%f",dMaxDisp);
	pOldFont=pDC->SelectObject(&font);
	pDC->SetTextColor(RGB(0,0,0));
	pDC->TextOut(20+m_nMaxDispDot+10,40,sText);

	pDC->SelectObject(pOldFont);
	pDC->SelectObject(pOldPen);
}

void COOPFEView::OnDisplayCompressionStress() 
{
	// TODO: Add your command handler code here
	COOPFEDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->m_iDisplay=DISPLAY_CSTRESS;
	Invalidate();
	UpdateWindow();		
}

void COOPFEView::DisplayTensionStress(CDC *pDC, COOPFEDoc *pDoc)
{
	bool bBuf;
	int loop,loop1,iBuf,nEle,aiNode[8];
	int iColor;
	double adGaussX[9],adGaussY[9];
	double adEleNodeX[8],adEleNodeY[8];
	double adMainStress[9],adMainStress1[9],adMainStressAngle[9];
	double dMaxStress,dMinStress;
	double dScaleColor;
	double dCos,dSin,dLength;
	double dMaxX,dMinX,dMaxY,dMinY;
	CPen aPen[256],*pOldPen;
	CFont font,*pOldFont;
	CPoint pt,pt1;
	CString sText;

	CTypedPtrArray <CPtrArray,CBaseElement*>& apEle=pDoc->m_glEle.m_apEle;
	CNode& Node=pDoc->m_glEle.m_Node;
	
	DisplayElement(pDC,pDoc);
	if(!pDoc->m_glEle.m_bFlagForceAnalyzed) return;

	SetPenColor(aPen);
	pOldPen=pDC->SelectObject(&aPen[0]);

	nEle=apEle.GetSize();
	dMinStress=dMaxStress=0.0;
	bBuf=false;
	for(loop=0;loop<nEle;loop++){
		if(apEle[loop]->GetElementType()==PLANE_8NODE_ELE){
			((CPlane8NodeEle*)apEle[loop])->
				GetMainStress(adMainStress,adMainStress1,adMainStressAngle);
			for(loop1=0;loop1<9;loop1++){
				if(adMainStress[loop1]>0.0){
					dMinStress=dMaxStress=adMainStress[loop1];
					bBuf=true;
					break;
				}
				if(adMainStress1[loop1]>0.0){
					dMinStress=dMaxStress=adMainStress1[loop1];
					bBuf=true;
					break;
				}
			}
		}
		if(bBuf) break;
	}

	for(loop=0;loop<nEle;loop++){
		if(apEle[loop]->GetElementType()==PLANE_8NODE_ELE){
			((CPlane8NodeEle*)apEle[loop])->
				GetMainStress(adMainStress,adMainStress1,adMainStressAngle);
			for(loop1=0;loop1<9;loop1++){
				if(adMainStress[loop1]>0){
					if(dMaxStress<adMainStress[loop1])
						dMaxStress=adMainStress[loop1];
					if(dMinStress>adMainStress[loop1])
						dMinStress=adMainStress[loop1];
				}
				if(adMainStress1[loop1]>0){
					if(dMaxStress<adMainStress1[loop1])
						dMaxStress=adMainStress1[loop1];
					if(dMinStress>adMainStress1[loop1])
						dMinStress=adMainStress1[loop1];
				}
			}
		}
	}

	if(dMaxStress-dMinStress>0.0)
		dScaleColor=255/(dMaxStress-dMinStress);

	for(loop=0;loop<nEle;loop++){
		if(apEle[loop]->GetElementType()==PLANE_8NODE_ELE){
			apEle[loop]->GetNode(aiNode,iBuf);
			for(loop1=0;loop1<8;loop1++){
				adEleNodeX[loop1]=Node.GetX(aiNode[loop1]);
				adEleNodeY[loop1]=Node.GetY(aiNode[loop1]);
			}
			
			dMaxX=dMinX=adEleNodeX[0];
			dMaxY=dMinY=adEleNodeY[0];
			for(loop1=1;loop1<8;loop1++){
				if(dMaxX<adEleNodeX[loop1]) dMaxX=adEleNodeX[loop1];
				if(dMinX>adEleNodeX[loop1]) dMinX=adEleNodeX[loop1];
				if(dMaxY<adEleNodeY[loop1]) dMaxY=adEleNodeY[loop1];
				if(dMinY>adEleNodeY[loop1]) dMinY=adEleNodeY[loop1];
			}
			if((dMaxX-dMinX)>(dMaxY-dMinY)){
				dLength=(dMaxX-dMinX)/8.0;
			}
			else{
				dLength=(dMaxY-dMinY)/8.0;
			}
			((CPlane8NodeEle*)apEle[loop])->
				GetGaussPtGCoordinate(adGaussX,adGaussY);
			((CPlane8NodeEle*)apEle[loop])->
				GetMainStress(adMainStress,adMainStress1,adMainStressAngle);
			for(loop1=0;loop1<9;loop1++){
				if(adMainStress[loop1]>0.0){
					dCos=cos(adMainStressAngle[loop1]);
					dSin=sin(adMainStressAngle[loop1]);
					pt.x=m_ptBase.x
						+(int)((adGaussX[loop1]-dCos*dLength-m_dMinX)*m_dScaleRtoD);
					pt.y=m_ptBase.y
						-(int)((adGaussY[loop1]-dSin*dLength-m_dMinY)*m_dScaleRtoD);
				
					pt1.x=m_ptBase.x
						+(int)((adGaussX[loop1]+dCos*dLength-m_dMinX)*m_dScaleRtoD);
					pt1.y=m_ptBase.y
						-(int)((adGaussY[loop1]+dSin*dLength-m_dMinY)*m_dScaleRtoD);
					iColor=255-(int)((adMainStress[loop1]-dMinStress)*dScaleColor);
					pDC->SelectObject(&aPen[iColor]);
					pDC->MoveTo(pt);	pDC->LineTo(pt1);
				}
				if(adMainStress1[loop1]>0.0){
					dCos=cos(adMainStressAngle[loop1]);
					dSin=sin(adMainStressAngle[loop1]);
					pt.x=m_ptBase.x
						+(int)((adGaussX[loop1]+dSin*dLength-m_dMinX)*m_dScaleRtoD);
					pt.y=m_ptBase.y
						-(int)((adGaussY[loop1]-dCos*dLength-m_dMinY)*m_dScaleRtoD);
					pt1.x=m_ptBase.x
						+(int)((adGaussX[loop1]-dSin*dLength-m_dMinX)*m_dScaleRtoD);
					pt1.y=m_ptBase.y
						-(int)((adGaussY[loop1]+dCos*dLength-m_dMinY)*m_dScaleRtoD);
					iColor=255-(int)((adMainStress1[loop1]-dMinStress)*dScaleColor);
					pDC->SelectObject(&aPen[iColor]);
					pDC->MoveTo(pt);	pDC->LineTo(pt1);
				}
			}
		}
	}

	pt.x=20;
	pt1.x=40;
	for(loop=0;loop<256;loop++){
		pt.y=pt1.y=50+loop;
		pDC->SelectObject(&aPen[loop]);	
		pDC->MoveTo(pt);	pDC->LineTo(pt1);
	}

	SetFont(font,"Times New Roman",m_nFontSize,0.0);
	pOldFont=pDC->SelectObject(&font);
	pDC->SetTextColor(RGB(0,0,0));
	for(loop=0;loop<9;loop++){
		sText.Format("%0.2f",dMaxStress+(dMinStress-dMaxStress)/8.0*loop);
		pDC->TextOut(50,50+30*loop,sText);
	}
	pDC->SelectObject(pOldFont);
	pDC->SelectObject(pOldPen);
}

void COOPFEView::DisplayCompressionStress(CDC *pDC, COOPFEDoc *pDoc)
{
	bool bBuf;
	int loop,loop1,iBuf,nEle,aiNode[8];
	int iColor;
	double adGaussX[9],adGaussY[9];
	double adEleNodeX[8],adEleNodeY[8];
	double adMainStress[9],adMainStress1[9],adMainStressAngle[9];
	double dMaxStress,dMinStress;
	double dScaleColor;
	double dCos,dSin,dLength;
	double dMaxX,dMinX,dMaxY,dMinY;
	CPoint pt,pt1;
	CPen aPen[256],*pOldPen;
	CFont font,*pOldFont;
	CString sText;

	CTypedPtrArray <CPtrArray,CBaseElement*>& apEle=pDoc->m_glEle.m_apEle;
	CNode& Node=pDoc->m_glEle.m_Node;
	
	DisplayElement(pDC,pDoc);
	if(!pDoc->m_glEle.m_bFlagForceAnalyzed) return;

	SetPenColor(aPen);
	pOldPen=pDC->SelectObject(&aPen[0]);

	nEle=apEle.GetSize();
	dMinStress=dMaxStress=0.0;
	bBuf=false;
	for(loop=0;loop<nEle;loop++){
		if(apEle[loop]->GetElementType()==PLANE_8NODE_ELE){
			((CPlane8NodeEle*)apEle[loop])->
				GetMainStress(adMainStress,adMainStress1,adMainStressAngle);
			for(loop1=0;loop1<9;loop1++){
				if(adMainStress[loop1]<0.0){
					dMinStress=dMaxStress=adMainStress[loop1];
					bBuf=true;
					break;
				}
				if(adMainStress1[loop1]<0.0){
					dMinStress=dMaxStress=adMainStress1[loop1];
					bBuf=true;
					break;
				}
			}
		}
		if(bBuf) break;
	}

	for(loop=0;loop<nEle;loop++){
		if(apEle[loop]->GetElementType()==PLANE_8NODE_ELE){
			((CPlane8NodeEle*)apEle[loop])->
				GetMainStress(adMainStress,adMainStress1,adMainStressAngle);
			for(loop1=0;loop1<9;loop1++){
				if(adMainStress[loop1]<0.0){
					if(dMaxStress<adMainStress[loop1])
						dMaxStress=adMainStress[loop1];
					if(dMinStress>adMainStress[loop1])
						dMinStress=adMainStress[loop1];
				}
				if(adMainStress1[loop1]<0){
					if(dMaxStress<adMainStress1[loop1])
						dMaxStress=adMainStress1[loop1];
					if(dMinStress>adMainStress1[loop1])
						dMinStress=adMainStress1[loop1];
				}
			}
		}
	}

	if(dMaxStress-dMinStress>0.0)
		dScaleColor=255/(dMaxStress-dMinStress);

	for(loop=0;loop<nEle;loop++){
		if(apEle[loop]->GetElementType()==PLANE_8NODE_ELE){
			apEle[loop]->GetNode(aiNode,iBuf);
			for(loop1=0;loop1<8;loop1++){
				adEleNodeX[loop1]=Node.GetX(aiNode[loop1]);
				adEleNodeY[loop1]=Node.GetY(aiNode[loop1]);
			}
			
			dMaxX=dMinX=adEleNodeX[0];
			dMaxY=dMinY=adEleNodeY[0];
			for(loop1=1;loop1<8;loop1++){
				if(dMaxX<adEleNodeX[loop1]) dMaxX=adEleNodeX[loop1];
				if(dMinX>adEleNodeX[loop1]) dMinX=adEleNodeX[loop1];
				if(dMaxY<adEleNodeY[loop1]) dMaxY=adEleNodeY[loop1];
				if(dMinY>adEleNodeY[loop1]) dMinY=adEleNodeY[loop1];
			}
			if((dMaxX-dMinX)>(dMaxY-dMinY)){
				dLength=(dMaxX-dMinX)/8.0;
			}

⌨️ 快捷键说明

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