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

📄 femmviewview.cpp

📁 一个2D电磁场FEM计算的VC++源程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// femmviewView.cpp : implementation of the CFemmviewView class
//

#include "stdafx.h"
#include <afx.h>
#include <afxtempl.h>
#include "femmview.h"
#include "problem.h"
#include "xyplot.h"
#include "ptloc.h"
#include "femmviewDoc.h"
#include "femmviewView.h"
#include "GridMod.h"
#include "GetPoint.h"
#include "CPlotDlg.h"
#include "MainFrm.h"
#include "KbdZoom.h"
#include "CPlotDlg2.h"
#include "DPlotDlg1.h"
#include "DPlotDlg2.h"
#include "MyMsgBox.h"
#include "XYPlotDlg.h"
#include "LIntDlg.h"
#include "BlockInt.h"
#include "CircDlg.h"
#include "Pref.h"
#include "BendContourDlg.h"
#include "VPlotDlg.h"

#include <process.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

int Xm,Ym;

#define MSKHI (1. + 1.e-08)
#define MSKLO (0. - 1.e-08)

extern lua_State * lua;
extern BOOL bLinehook;
extern CString luascriptname;


/////////////////////////////////////////////////////////////////////////////
// CFemmviewView

IMPLEMENT_DYNCREATE(CFemmviewView, CView)

BEGIN_MESSAGE_MAP(CFemmviewView, CView)
	//{{AFX_MSG_MAP(CFemmviewView)
	ON_COMMAND(ID_ZOOM_IN, OnZoomIn)
	ON_COMMAND(ID_SNAP_GRID, OnSnapGrid)
	ON_COMMAND(ID_SHOW_MESH, OnShowMesh)
	ON_COMMAND(ID_SHOW_GRID, OnShowGrid)
	ON_COMMAND(ID_SET_GRID, OnSetGrid)
	ON_COMMAND(ID_CPLOT, OnCplot)
	ON_COMMAND(ID_DPLOT, OnDplot)
	ON_COMMAND(ID_ZOOM_NATURAL, OnZoomNatural)
	ON_COMMAND(ID_ZOOM_OUT, OnZoomOut)
	ON_COMMAND(ID_ZOOM_WINDOW, OnZoomWindow)
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_RBUTTONDOWN()
	ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
	ON_COMMAND(ID_RELOAD, OnReload)
	ON_COMMAND(ID_MENU_AREA, OnMenuArea)
	ON_COMMAND(ID_MENU_CONTOUR, OnMenuContour)
	ON_COMMAND(ID_MENU_POINT, OnMenuPoint)
	ON_WM_KEYDOWN()
	ON_COMMAND(ID_MENU_PLOT, OnMenuPlot)
	ON_COMMAND(ID_MENU_INTEGRATE, OnMenuIntegrate)
	ON_COMMAND(ID_MENUSHOWPTS, OnMenushowpts)
	ON_COMMAND(ID_KBDZOOM, OnKbdZoom)
	ON_COMMAND(ID_SMOOTH, OnSmooth)
	ON_WM_ERASEBKGND()
	ON_WM_RBUTTONDBLCLK()
	ON_COMMAND(ID_PAN_DOWN, OnPanDown)
	ON_COMMAND(ID_PAN_LEFT, OnPanLeft)
	ON_COMMAND(ID_PAN_RIGHT, OnPanRight)
	ON_COMMAND(ID_PAN_UP, OnPanUp)
	ON_COMMAND(ID_HELP_FINDER, OnHelpFinder)
	ON_COMMAND(ID_VIEW_CIRCPROPS, OnViewCircprops)
	ON_COMMAND(ID_EDIT_PREFS, OnEditPrefs)
	ON_COMMAND(ID_EDIT_COPY_AS_METAFILE, OnEditCopyAsMetafile)
	ON_COMMAND(ID_VIEW_BHCURVES, OnViewBHcurves)
	ON_COMMAND(ID_VIEW_INFO, OnViewInfo)
	ON_COMMAND(ID_VIEW_SHOWNAMES, OnViewShownames)
	ON_COMMAND(ID_VPLOT, OnVplot)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
	ON_COMMAND(ID_HELP_LICENSE, OnHelpLicense)
	ON_WM_LBUTTONDBLCLK()
END_MESSAGE_MAP()

void MyMessageBox(CString s)
{
	CString z;
	char linfeed[3];
	int i;

	sprintf(linfeed,"%c%c",0x0D,0x0A);
	for(i=0;i<s.GetLength();i++)
		if (s[i]=='\n') z+=linfeed;
		else z+=s[i];

	CMyMsgBox msgdlg;
	msgdlg.m_mymsg=z;
	msgdlg.DoModal();
}

/////////////////////////////////////////////////////////////////////////////
// CFemmviewView construction/destruction

CFemmviewView::CFemmviewView()
{
	// TODO: add construction code here
	d_EditAction=0;
	d_GridFlag=FALSE;
	d_SnapFlag=FALSE;
	d_MeshFlag=FALSE;
	d_LegendFlag=TRUE;
	d_GreyContours=FALSE;
	d_NumContours=19;	
	d_ShowAr=TRUE; 		
	d_ShowAi=FALSE;	
	d_ShowMask=FALSE;
	d_DensityPlot=0;
	d_VectorPlot=0;
	d_PtsFlag=TRUE;		
	d_ResetOnReload=FALSE;
	d_Smooth=TRUE;
	d_PlotPoints=150;
	d_ShowNames=FALSE;

	ox=0.; oy=0.; mag=100.;		// lower left corner is origin; 100 dpi
	GridSize=0.25;				// 1/4" grid
	Coords=FALSE;
	ZoomWndFlag=FALSE;
	DrawSelected=-1;
	VectorScaleFactor=1;

	//////////////////////////////
	// Default Colors           //
	//////////////////////////////

	// Greyscale Colormap
	Grey00=RGB(55,55,55);
	Grey01=RGB(65,65,65);
	Grey02=RGB(75,75,75);
	Grey03=RGB(85,85,85);
	Grey04=RGB(95,95,95);
	Grey05=RGB(105,105,105);
	Grey06=RGB(115,115,115);
	Grey07=RGB(125,125,125);
	Grey08=RGB(135,135,135);
	Grey09=RGB(145,145,145);
	Grey10=RGB(155,155,155);
	Grey11=RGB(165,165,165);
	Grey12=RGB(175,175,175);
	Grey13=RGB(185,185,185);
	Grey14=RGB(195,195,195);
	Grey15=RGB(205,205,205);
	Grey16=RGB(215,215,215);
	Grey17=RGB(225,225,225);
	Grey18=RGB(235,235,235);
	Grey19=RGB(245,245,245);

	// BELA Colormap
	Color19=RGB(0,255,255);
	Color18=RGB(37,255,195);
	Color17=RGB(69,255,147);
	Color16=RGB(98,255,108);
	Color15=RGB(123,255,76);
	Color14=RGB(148,255,51);
	Color13=RGB(171,255,31);
	Color12=RGB(194,255,16);
	Color11=RGB(217,255,6);
	Color10=RGB(242,255,1);
	Color09=RGB(255,242,1);
	Color08=RGB(255,217,6);
	Color07=RGB(255,194,16);
	Color06=RGB(255,171,31);
	Color05=RGB(255,148,51);
	Color04=RGB(255,123,76);
	Color03=RGB(255,98,108);
	Color02=RGB(255,69,147);
	Color01=RGB(255,37,195);
	Color00=RGB(255,0,255);

	// Other colors
	SelColor    =  RGB(255,0,0);
	MeshColor   =  RGB(213,228,20);
	BlockColor  =  RGB(0,125,0);
	LineColor   =  RGB(0,0,255);
	RegionColor =  RGB(0,255,0);
	GridColor   =	RGB(0,0,255);
	BackColor   =  RGB(255,255,255);
	NodeColor	 =	RGB(0,0,0);
	TextColor   =  RGB(0,0,0);
	RealFluxLineColor = RGB(0,0,0);
	ImagFluxLineColor = RGB(128,128,128);
	MaskLineColor = RGB(255,128,64);
	NameColor = RGB(0,0,0);
	RealVectorColor = RGB(0,0,0);
	ImagVectorColor = RGB(128,128,128);

	CString comline=GetCommandLine();
	CString ucomline=comline;
	ucomline.MakeUpper();
	int lim=ucomline.Find("FEMMVIEW.EXE");
	comline=comline.Left(lim);
	if (comline[0]=='\"'){
		comline.SetAt(0,' ');
		comline.TrimLeft();
	}

	BinDir=comline;

	ScanPreferences();

	// Apply default behaviors
	EditAction=d_EditAction;
	GridFlag=d_GridFlag;	
	SnapFlag=d_SnapFlag;	
	MeshFlag=d_MeshFlag;	
	LegendFlag=d_LegendFlag;
	GreyContours=d_GreyContours;		
	NumContours=d_NumContours;
	ShowAr=d_ShowAr;
	ShowAi=d_ShowAi;
	ShowMask=d_ShowMask;
	DensityPlot=d_DensityPlot;
	VectorPlot=d_VectorPlot;
	VectorScaleFactor=1;
	PtsFlag=d_PtsFlag;	
	ShowNames=d_ShowNames;
}

CFemmviewView::~CFemmviewView()
{
}

BOOL CFemmviewView::PreCreateWindow(CREATESTRUCT& cs)
{
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CFemmviewView drawing
void CFemmviewView::ScreenToDwg(int xs, int ys, double *xd, double *yd, RECT *r)
{
	double x,y;
	x=(double) xs;
	y=(double) ys;

	*xd=x/mag+ox;
	*yd=(((double) r->bottom) - y- 1.)/mag + oy;
}

BOOL CFemmviewView::DwgToScreen(double xd, double yd, int *xs, int *ys, RECT *r)
{
	double x,y;
	x=mag*(xd-ox);
	y=((double) r->bottom)- 1. - mag*(yd-oy);
//	if((fabs(x)>32768.) || (fabs(y)>32768.)) return FALSE;
	if((fabs(x)>2.147483648e9) || (fabs(y)>2.147483648e9)) return FALSE;
	*xs = (int) (mag*(xd-ox));
	*ys = ((int) r->bottom) - 1 - ((int) (mag*(yd-oy)) );
	return TRUE;
}

void CFemmviewView::DoContours(CDC *pDC,int *p,int side,int Aflag)
{
	int i,j,k;
	static double q[4][4];
	static double *m[4];
	static int u[4];
	double *swap;
	double hi,lo,a,b,z,offset;
	double a0,a1,r0,r1,md;

	CFemmviewDoc *pDoc=GetDocument();
	
	switch(side)
	{
		case 0 : u[0]=p[0]; u[1]=p[1]; u[2]=p[1]; u[3]=p[2]; break;
		case 1 : u[0]=p[1]; u[1]=p[2]; u[2]=p[2]; u[3]=p[0]; break;
		default: u[0]=p[2]; u[1]=p[0]; u[2]=p[0]; u[3]=p[1]; break;
	}

	for(i=0;i<4;i++){
		m[i]=q[i];
		m[i][0]=(double) pDoc->meshnode[u[i]].xs;
		m[i][1]=(double) pDoc->meshnode[u[i]].ys;
		m[i][3]=pDoc->meshnode[u[i]].x;
		if (Aflag==0) m[i][2]=pDoc->meshnode[u[i]].A.re;
		if (Aflag==1) m[i][2]=pDoc->meshnode[u[i]].A.im;
		if (Aflag==2) m[i][2]=pDoc->meshnode[u[i]].msk;
	}

	// scale A for easier analysis.  Not necessary if mask is being displayed,
	// since mask always varies between zero and one.
	
	if (Aflag<2)
	{
		for(i=0;i<4;i++) m[i][2]=NumContours*(m[i][2]-pDoc->A_Low)/
							 (pDoc->A_High-pDoc->A_Low);
		offset=-NumContours*pDoc->A_Low/(pDoc->A_High-pDoc->A_Low);
	}
	else
	{
		for(i=0;i<4;i++) m[i][2]=NumContours*(m[i][2]-MSKLO)/(MSKHI-MSKLO);
		offset=-NumContours*MSKLO/(MSKHI-MSKLO);
	}

	// swap around so that lowest magnitude is first point in
	// each line...
	if (m[0][2]>m[1][2]){
		swap=m[1];
		m[1]=m[0];
		m[0]=swap;
	}
	if (m[2][2]>m[3][2]){
		swap=m[3];
		m[3]=m[2];
		m[2]=swap;
	}

	// figure out which contours lie in this section
	lo=m[0][2]; if(m[2][2]>lo) lo=m[2][2];
	hi=m[1][2]; if(m[3][2]<hi) hi=m[3][2];
	if(fabs(hi-lo)<0.0000000001) return;
	j=(int) ceil(lo); k=(int) floor(hi);

	for(i=j;i<=k;i++)
	if((i>=0) && (i<NumContours)) {
		z=(double) i;
		a=(z-m[0][2])/(m[1][2]-m[0][2]);
		b=(z-m[2][2])/(m[3][2]-m[2][2]);
	
		if((pDoc->ProblemType==1) && (Aflag!=2)){

			r0=m[0][3]; r1=m[1][3];
			if(fabs(r0)>1.e-06) a0=(m[0][2]-offset)/r0; else a0=0;
			if(fabs(r1)>1.e-06) a1=(m[1][2]-offset)/r1; else a1=0;
			md=(a0+a1)*(r0+r1)/4. + offset;

			if((md>m[0][2]) && (md<m[1][2]) && (fabs(2.*md-m[0][2]-m[1][2])>1.e-2))
			{
				a=(3.*m[0][2] + m[1][2] - 4.*md + 
					sqrt(pow(3.*m[0][2] + m[1][2] - 4.*md,2.) - 
		     	   8.*(m[0][2] + m[1][2] - 2.*md)*(m[0][2] - z)))/
				   (4.*(m[0][2] + m[1][2] - 2*md));
			}

		
			r0=m[2][3]; r1=m[3][3];
			if(fabs(r0)>1.e-06) a0=(m[2][2]-offset)/r0; else a0=0;
			if(fabs(r1)>1.e-06) a1=(m[3][2]-offset)/r1; else a1=0;
			md=(a0+a1)*(r0+r1)/4. + offset;

			if((md>m[2][2]) && (md<m[3][2]) && (fabs(2.*md-m[2][2]-m[3][2])>1.e-2))
			{
				b=(3.*m[2][2] + m[3][2] - 4.*md + 
					sqrt(pow(3.*m[2][2] + m[3][2] - 4.*md,2.) - 
					8.*(m[2][2] + m[3][2] - 2.*md)*(m[2][2] - z)))/
					(4.*(m[2][2] + m[3][2] - 2*md));
			}
		
		}	
	
		MyMoveTo(pDC,(int) ((m[1][0]-m[0][0])*a+m[0][0]),
			        (int) ((m[1][1]-m[0][1])*a+m[0][1]));
		MyLineTo(pDC,(int) ((m[3][0]-m[2][0])*b+m[2][0]),
					(int) ((m[3][1]-m[2][1])*b+m[2][1]));
		
		if(Aflag==0)
		pDC->SetPixel((int) ((m[3][0]-m[2][0])*b+m[2][0]),
					(int) ((m[3][1]-m[2][1])*b+m[2][1]), RealFluxLineColor );
		
		if(Aflag==1)
		pDC->SetPixel((int) ((m[3][0]-m[2][0])*b+m[2][0]),
					(int) ((m[3][1]-m[2][1])*b+m[2][1]), ImagFluxLineColor );

		if(Aflag==2)
		pDC->SetPixel((int) ((m[3][0]-m[2][0])*b+m[2][0]),
					(int) ((m[3][1]-m[2][1])*b+m[2][1]), MaskLineColor );
	}
}
////////////////
void CFemmviewView::PlotFluxDensity(CDC *pDC,int elmnum,int flag)
{
	int i,j,k,n,lav;
	double b,bn[3],bh,bl,y,z;
	CComplex b1[3],b2[3];
	POINT ps[3];
	static double c[64][3],p[3][2];
	CElement elm;
	CFemmviewDoc *pDoc=GetDocument();

	elm=pDoc->meshelem[elmnum];

	if(pDoc->blocklist[elm.lbl].IsSelected==TRUE) return;

	const COLORREF mymap[]={
		Color00,Color01,Color02,Color03,Color04,
		Color05,Color06,Color07,Color08,Color09,
		Color10,Color11,Color12,Color13,Color14,
		Color15,Color16,Color17,Color18,Color19
	};	

	const COLORREF greymap[]={
		Grey00,Grey01,Grey02,Grey03,Grey04,
		Grey05,Grey06,Grey07,Grey08,Grey09,
		Grey10,Grey11,Grey12,Grey13,Grey14,
		Grey15,Grey16,Grey17,Grey18,Grey19
	};

	for(i=0;i<3;i++){
		if(flag<4){
			if (pDoc->Smooth==TRUE)
			{
				b1[i]=elm.b1[i];
				b2[i]=elm.b2[i];
			}
			else{
				b1[i]=elm.B1;
				b2[i]=elm.B2;
			}
		}
		else pDoc->GetJA(elmnum,b1,b2); // when we're doing
										// J instead of B;
	}

	if(pDoc->Frequency==0) flag=1;

	bl=pDoc->B_lb;
	bh=pDoc->B_ub;
	switch(flag)
	{
		case 1:
			for(i=0;i<3;i++)
				bn[i]=sqrt(b1[i].re*b1[i].re + b1[i].im*b1[i].im +
			          b2[i].re*b2[i].re + b2[i].im*b2[i].im);
			break;

		case 2:
			for(i=0;i<3;i++)
				bn[i]=sqrt(b1[i].re*b1[i].re + b2[i].re*b2[i].re);
			break;

		case 3:
			for(i=0;i<3;i++)
				bn[i]=sqrt(b1[i].im*b1[i].im + b2[i].im*b2[i].im);
			break;

		case 4:
			for(i=0;i<3;i++)
				bn[i]=abs(b1[i]);
			break;

		case 5:
			for(i=0;i<3;i++)
				bn[i]=fabs(b1[i].re);
			break;
		
		case 6:
			for(i=0;i<3;i++)
				bn[i]=fabs(b1[i].im);
			break;

		default:
			return;
	}

	if(bh==bl) return;
	else for(i=0;i<3;i++) bn[i]=20.*(bn[i]-bl)/(bh-bl);

	// find subtriangle edges;
	for(i=0,n=0;i<3;i++)
	{
		c[n][0]=(double) pDoc->meshnode[elm.p[i]].xs;
		c[n][1]=(double) pDoc->meshnode[elm.p[i]].ys;
		c[n][2]=bn[i];
		n++; if(n>=64) return;
		j=i+1; if(j==3) j=0;
		p[0][0]=(double) pDoc->meshnode[elm.p[i]].xs;
		p[0][1]=(double) pDoc->meshnode[elm.p[i]].ys;
		p[1][0]=(double) pDoc->meshnode[elm.p[j]].xs;
		p[1][1]=(double) pDoc->meshnode[elm.p[j]].ys;
		p[2][0]=bn[i];
		p[2][1]=bn[j];
		if(p[2][0]<p[2][1])
			for(z=ceil(p[2][0]);z<p[2][1];z++)
			{
				y=(z-p[2][0])/(p[2][1]-p[2][0]);
				c[n][0]=(1.-y)*p[0][0] + y*p[1][0];
				c[n][1]=(1.-y)*p[0][1] + y*p[1][1];

⌨️ 快捷键说明

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