📄 femmviewview.cpp
字号:
// 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 + -