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

📄 oopfeview.cpp

📁 一个计算悬臂梁的有限元vc源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			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=(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=(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",dMinStress+(dMaxStress-dMinStress)/8.0*loop);
		pDC->TextOut(50,50+30*loop,sText);
	}
	pDC->SelectObject(pOldFont);
	pDC->SelectObject(pOldPen);
}

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

void COOPFEView::OnDisplayZoomIn() 
{
	// TODO: Add your command handler code here
	m_dZoomTimes+=1.0;
	Invalidate();
	UpdateWindow();				
}

void COOPFEView::OnDisplayZoomOut() 
{
	// TODO: Add your command handler code here
	if(m_dZoomTimes==-4.0) return;
	m_dZoomTimes-=1.0;
	Invalidate();
	UpdateWindow();				
}

void COOPFEView::SetPenColor(CPen* aPen)
{
	int aiR[256],aiG[256],aiB[256];
	double dBuf,dBuf1;
	int loop;
	double iBegin,iEnd;		

	dBuf=20.0; 
	dBuf1=30;
	for(loop=0;loop<256;loop++){
		aiR[loop]=aiG[loop]=aiB[loop]=0;
	}

	iBegin=0;	iEnd=dBuf;
	for(loop=(int)iBegin;loop<(int)iEnd;loop++){
		aiB[loop]=255;
	}
	
	iBegin=dBuf;	iEnd=dBuf+dBuf1;		
	for(loop=(int)iBegin;loop<(int)iEnd;loop++){
		aiB[loop]=255-(int)(255.0*(loop-iBegin)/(iEnd-iBegin));
	}
	
	iBegin=0;	iEnd=3.0*dBuf+2*dBuf1;		
	for(loop=(int)iBegin;loop<(int)iEnd;loop++){
		aiR[loop]=255;
	}

	iBegin=iEnd;	iEnd=iBegin+dBuf1;		
	for(loop=(int)iBegin;loop<(int)iEnd;loop++){
		aiR[loop]=255-(int)(255.0*(loop-iBegin)/(iEnd-iBegin));
	}

	iBegin=2.0*dBuf+dBuf1;	iEnd=iBegin+dBuf1;		
	for(loop=(int)iBegin;loop<(int)iEnd;loop++){
		aiG[loop]=(int)(255.0*(loop-iBegin)/(iEnd-iBegin));
	}
	iBegin=iEnd;	iEnd=iBegin+3.0*dBuf+2*dBuf1;		
	for(loop=(int)iBegin;loop<(int)iEnd;loop++){
		aiG[loop]=255;
	}
	iBegin=iEnd; iEnd=iEnd+dBuf1;
	for(loop=(int)iBegin;loop<(int)iEnd;loop++){
		aiG[loop]=255-(int)(255.0*(loop-iBegin)/(iEnd-iBegin));
	}

	iBegin=4.0*dBuf+3*dBuf1;	iEnd=iBegin+dBuf1;		
	for(loop=(int)iBegin;loop<(int)iEnd;loop++){
		aiB[loop]=(int)(255.0*(loop-iBegin)/(iEnd-iBegin));
	}
	iBegin=iEnd;   iEnd=256.0;	
	for(loop=(int)iBegin;loop<(int)iEnd;loop++){
		aiB[loop]=255;
	}

	for(loop=0;loop<256;loop++)
		aPen[loop].CreatePen(PS_SOLID,2,RGB(aiR[loop],aiG[loop],aiB[loop]));

	//For 256 grad
	/*
	for(loop=0;loop<256;loop++){
		aPen[loop].CreatePen(PS_SOLID,2,RGB(loop,loop,loop));
	}
	*/
}


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

void COOPFEView::OnDisplayData() 
{
	// TODO: Add your command handler code here
	COOPFEDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	char cBuf;
	int nChar,loop;
	ofstream fout;
	
	fout.open("data.tmp");
	pDoc->m_glEle.OutputData(fout);
	fout.close();

	CFile fin;
	CFileException e;
	fin.Open("data.tmp", CFile::modeRead | CFile::typeBinary, &e );

	pDoc->m_sData.Empty();
	nChar=fin.GetLength( );

	pDoc->m_sData.GetBufferSetLength(nChar);
	for(loop=0;loop<nChar;loop++){
		fin.Read(&cBuf,1);
		pDoc->m_sData.SetAt(loop,cBuf);
	}
	fin.Close();

	pDoc->m_iDisplay=DISPLAY_DATA;
	Invalidate();
	UpdateWindow();				
}

void COOPFEView::DisplayData(CDC *pDC, COOPFEDoc *pDoc)
{
	int loop,nChar,nLine,iLine;
	int nFontHeight,nFontInterval,nTotalFontHeight;
	CString sBuf;
	CSize sizeTotal,sizePage,sizeLine;
	CRect rect;
	CFont font;
	CFont* pOldFont;

	nLine=0;
	nChar=pDoc->m_sData.GetLength();
	for(loop=0;loop<nChar;loop++){
		if(pDoc->m_sData[loop]==(char)13){
			nLine++;
		}
	}

	nFontHeight=18; 	nFontInterval=2;
	nTotalFontHeight=nFontHeight+nFontInterval;
	SetFont(font,"Times New Roman",nFontHeight,0.0);
	pOldFont=pDC->SelectObject(&font);

	sizeTotal.cx = 1500;
	sizeTotal.cy = (int)(nTotalFontHeight*nLine)+200;
	GetClientRect(&rect);
	sizePage.cx=rect.right;
	sizePage.cy=rect.bottom;
	sizeLine.cx=sizePage.cx/10;
	sizeLine.cy=sizePage.cy/10;
	SetScrollSizes(MM_TEXT,sizeTotal,sizePage,sizeLine);

	iLine=0;
	sBuf.Empty();
	for(loop=0;loop<nChar;loop++){
		if(pDoc->m_sData[loop]==(char)13){
			loop++;
			pDC->TextOut(2,iLine*nTotalFontHeight,sBuf);
			sBuf.Empty();
			iLine++;
		}
		else{
			sBuf+=pDoc->m_sData[loop];
		}
	}
	pDC->SelectObject(pOldFont);
}

void COOPFEView::SetFont(CFont &font, char *sFontName, int nFontHeight,double dAngle)
{
	LOGFONT logFont;
	memset(&logFont, 0, sizeof(LOGFONT));
	logFont.lfEscapement=(int)(dAngle*10.0);
	logFont.lfHeight = nFontHeight;
	strcpy(logFont.lfFaceName, sFontName);
	VERIFY(font.CreateFontIndirect(&logFont));  
}

void COOPFEView::OnDispalySettings() 
{
	// TODO: Add your command handler code here
	CDlgDisplaySet dlgDisplaySet;
	dlgDisplaySet.m_nEditMaxDispDot=m_nMaxDispDot;
	dlgDisplaySet.m_nEditMaxMomentDot=m_nMaxMomentDot;
	dlgDisplaySet.m_nEditMaxShearDot=m_nMaxShearDot;
	dlgDisplaySet.m_nEditFontSize=m_nFontSize;
	dlgDisplaySet.m_nEditMaxAxialForce=m_nMaxAxialForceDot;
	if(dlgDisplaySet.DoModal()==IDOK){
		m_nMaxDispDot=dlgDisplaySet.m_nEditMaxDispDot;
		m_nMaxMomentDot=dlgDisplaySet.m_nEditMaxMomentDot;
		m_nMaxShearDot=dlgDisplaySet.m_nEditMaxShearDot;
		m_nFontSize=dlgDisplaySet.m_nEditFontSize;
		m_nMaxAxialForceDot=dlgDisplaySet.m_nEditMaxAxialForce;
	}
	Invalidate();
	UpdateWindow();				
}

void COOPFEView::OnOutputDxfDeformation() 
{
	// TODO: Add your command handler code here
	COOPFEDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	int loop,loop1,iBuf,nNode,nEle,nEleNode,aiNode[8];
	double dBuf;
	double adFy[11],dMaxDisp;
	double dScaleDispRtoD,dScaleDispRtoDXF,dTextHeight;
	double dCos,dSin,dLength;
	CTypedPtrArray <CPtrArray,CBaseElement*>& apEle=pDoc->m_glEle.m_apEle;
	CNode& Node=pDoc->m_glEle.m_Node;
	double dXi0,dXj0,dXk0,dYi0,dYj0,dYk0;
	double dUi,dUj;
	double adX[11],adY[11];
	CString sText;
	CString sFileName;
	ofstream fout;

	if(!pDoc->m_glEle.m_bFlagForceAnalyzed) return;

	CFileDialog dlg(FALSE);
	char sFilter[]="DXF(*.dxf)\0*.dxf\0\0";
	dlg.m_ofn.lpstrFilter=sFilter;

	if(dlg.DoModal()==IDOK){
		sFileName=dlg.GetPathName();
		if(sFileName.GetLength()==0) return;
		if(sFileName.Find(".dxf")<0) sFileName+=".dxf";
		fout.open(sFileName);
	}
	
	fout<<"  0"<<endl;
	fout<<"SECTION"<<endl;
	fout<<"  2"<<endl;
	fout<<"ENTITIES"<<endl;

	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;
	dScaleDispRtoDXF=dScaleDispRtoD/m_dScaleRtoD;

	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=dXi0+(dXj0-dXi0)*loop1/10.0;
				dYk0=dYi0+(dYj0-dYi0)*loop1/10.0;
				adX[loop1]=dXk0+((dUi+(dUj-dUi)*loop1/10.0)*dCos+adFy[loop1]*dSin)*dScaleDispRtoDXF;
				adY[loop1]=dYk0+((dUi+(dUj-dUi)*loop1/10.0)*dSin-adFy[loop1]*dCos)*dScaleDispRtoDXF;
			}
			for(loop1=0;loop1<10;loop1++)
				DXFLine(fout,adX[loop1],adY[loop1],adX[loop1+1],adY[loop1+1]);			
			break;
		case TRUSS:
			apEle[loop]->GetNode(aiNode,nEleNode);
			iBuf=aiNode[0];
			adX[0]=Node.GetX(iBuf)+(Node.GetCurX(iBuf)-Node.GetX(iBuf))*dScaleDispRtoDXF;
			adY[0]=Node.GetY(iBuf)+(Node.GetCurY(iBuf)-Node.GetY(iBuf))*dScaleDispRtoDXF;
			iBuf=aiNode[1];
			adX[1]=Node.GetX(iBuf)+(Node.GetCurX(iBuf)-Node.GetX(iBuf))*dScaleDispRtoDXF;
			adY[1]=Node.GetY(iBuf)+(Node.GetCurY(iBuf)-Node.GetY(iBuf))*dScaleDispRtoDXF;
			DXFLine(fout,adX[0],adY[0],adX[1],adY[1]);			
			break;
		case PLANE_8NODE_ELE:
			apEle[loop]->GetNode(aiNode,nEleNode);
			for(loop1=0;loop1<8;loop1++){
				iBuf=aiNode[loop1];
				adX[loop1]=Node.GetX(iBuf)+(Node.GetCurX(iBuf)-Node.GetX(iBuf))*dScaleDispRtoDXF;
				adY[loop1]=Node.GetY(iBuf)+(Node.GetCurY(iBuf)-Node.GetY(iBuf))*dScaleDispRtoDXF;
			}
			for(loop1=0;loop1<7;loop1++)
				DXFLine(fout,adX[loop1],adY[loop1],adX[loop1+1],adY[loop1+1]);			
			DXFLine(fout,adX[7],adY[7],adX[0],adY[0]);			
			break;
		}
	}
	
	dTextHeight=m_nFontSize/m_dScaleRtoD;
	adX[0]=m_dMinX;
	adY[0]=m_dMinY-2.0*dMaxDisp*dScaleDispRtoDXF;
	adX[1]=m_dMinX+dMaxDisp*dScaleDispRtoDXF;
	adY[1]=m_dMinY-2.0*dMaxDisp*dScaleDispRtoDXF;
	DXFLine(fout,adX[0],adY[0],adX[1],adY[1]);	

	sText.Format("%f",dMaxDisp);
	adX[0]=adX[1]+dMaxDisp*dScaleDispRtoDXF;	
	DXFText(fout,adX[0],adY[0],dTextHeight,0.0,sText);
		
	fout<<"  0"<<endl;
	fout<<"ENDSEC"<<endl;
	fout<<"  0"<<endl;
	fout<<"EOF"<<endl;
	fout.close();
}

void COOPFEView::DXFLine(ofstream &fout, double dX, double dY, double dX1, double dY1)
{
	fout<<"  0"<<endl;
	fout<<"LINE"<<endl;
	fout<<"  8"<<endl;
	fout<<"0"<<endl;
	fout<<" 10"<<endl;
	fout<<dX<<endl;
	fout<<" 20"<<endl;
	fout<<dY<<endl;
	fout<<" 30"<<endl;
	fout<<"0.0"<<endl;
	fout<<" 11"<<endl;
	fout<<dX1<<endl;
	fout<<" 21"<<endl;
	fout<<dY1<<endl;
	fout<<" 31"<<endl;
	fout<<"0.0"<<endl;
}

void COOPFEView::DXFText(ofstream &fout, double dX, double dY,double dHeight,double dAngle, CString sText)
{
	fout<<"  0"<<endl;
	fout<<"TEXT"<<endl;
	fout<<"  8"<<endl;
	fout<<"0"<<endl;
	fout<<" 10"<<endl;
	fout<<dX<<endl;
	fout<<" 20"<<endl;
	fout<<dY<<endl;
	fout<<" 30"<<endl;
	fout<<"0.0"<<endl;
	fout<<" 40"<<endl;
	fout<<dHeight<<endl;
	fout<<" 41"<<endl;
	fout<<0.8<<endl;
	fout<<" 50"<<endl;
	fout<<dAngle<<endl;
	fout<<"  1"<<endl;

⌨️ 快捷键说明

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