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

📄 femmeview.cpp

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

#include "stdafx.h"
#include "MainFrm.h"
#include "femme.h"
#include <afxtempl.h>
#include <time.h>
#include "femmeDoc.h"
#include "femmeView.h"
#include "GRIDDLG.h"
#include "EnterPt.h"
#include "KbdZoom.h"
#include "ArcDlg.h"
#include "CopyDlg.h"
#include "fe_libdlg.h"
#include "scaledlg.h"
#include "MirrorDlg.h"
#include "Pref.h"
#include "GroupNumber.h"
#include "promptbox.h"

#include<winreg.h>

#include <process.h>
extern CFemmeApp theApp;

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

int Xm,Ym;

extern lua_State * lua;
extern BOOL bLinehook;
extern BOOL bNoClose;

/////////////////////////////////////////////////////////////////////////////
// CFemmeView

IMPLEMENT_DYNCREATE(CFemmeView, CView)

BEGIN_MESSAGE_MAP(CFemmeView, CView)
	//{{AFX_MSG_MAP(CFemmeView)
	ON_COMMAND(ID_NODE_OP, OnNodeOp)
	ON_COMMAND(ID_SEGMENT_OP, OnSegmentOp)
	ON_COMMAND(ID_BLOCK_OP, OnBlockOp)
	ON_WM_MOUSEMOVE()
	ON_COMMAND(ID_ZOOM_IN, OnZoomIn)
	ON_COMMAND(ID_ZOOM_OUT, OnZoomOut)
	ON_COMMAND(ID_SHOW_GRID, OnShowGrid)
	ON_COMMAND(ID_SET_GRID, OnSetGrid)
	ON_COMMAND(ID_SNAP_GRID, OnSnapGrid)
	ON_COMMAND(ID_SHOW_MESH, OnShowMesh)
	ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
	ON_COMMAND(ID_EDIT_PREFS, OnEditPrefs)
	ON_WM_KEYDOWN()
	ON_WM_LBUTTONDBLCLK()
	ON_WM_RBUTTONDBLCLK()
	ON_COMMAND(ID_ZOOM_NATURAL, OnZoomNatural)
	ON_COMMAND(ID_ZOOM_WND, OnZoomWnd)
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_RBUTTONDOWN()
	ON_COMMAND(ID_MAKE_MESH, OnMakeMesh)
	ON_COMMAND(ID_MENU_ANALYZE, OnMenuAnalyze)
	ON_COMMAND(ID_MENU_VIEWRES, OnMenuViewres)
	ON_COMMAND(ID_ARCSEG_OP, OnArcsegOp)
	ON_COMMAND(ID_UNDO, OnUndo)
	ON_COMMAND(ID_KBDZOOM, OnKbdZoom)
	ON_COMMAND(ID_MOVE_OBJECTS, OnMoveObjects)
	ON_COMMAND(ID_COPY_OBJECTS, OnCopyObjects)
	ON_COMMAND(ID_DXFIN, OnDxfin)
	ON_COMMAND(ID_PURGEMESH, OnPurgemesh)
	ON_COMMAND(ID_DXFWRITE, OnDxfwrite)
	ON_COMMAND(ID_SELECTWND, OnSelectwnd)
	ON_WM_ERASEBKGND()
	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_MENU_MATLIB, OnMenuMatlib)
	ON_COMMAND(ID_GROUP_OP, OnGroupOp)
	ON_COMMAND(ID_OPEN_SELECTED, OnOpenSelected)
	ON_COMMAND(ID_EDIT_SCALE, OnEditScale)
	ON_COMMAND(ID_EDIT_MIRROR, OnEditMirror)
	ON_COMMAND(ID_EDIT_CUT, OnEditCut)
	ON_COMMAND(ID_EDIT_COPY_AS_METAFILE, OnEditCopyAsMetafile)
	ON_COMMAND(ID_VIEW_SHOWNAMES, OnViewShownames)
	ON_COMMAND(ID_FD_SELECTCIRC, OnFDSelectCirc)
	ON_COMMAND(ID_VIEW_SHOWORPHANS, OnViewShowOrphans)
	ON_COMMAND(ID_CREATERADIUS, OnCreateRadius)
	ON_COMMAND(ID_HELP_REGISTER, OnHelpRegister)
	ON_COMMAND(ID_HELP_FINDER, OnHelpFinder)
	ON_UPDATE_COMMAND_UI(ID_EDIT_EXTERIOR, OnUpdateEditExterior)
	//}}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)
END_MESSAGE_MAP()

CFemmeView::~CFemmeView()
{

}

/////////////////////////////////////////////////////////////////////////////
// CFemmeView construction/destruction

CFemmeView::CFemmeView()
{
	// Default Colors
	SelColor    =  dSelColor;
	MeshColor   =  dMeshColor;
	BlockColor  =  dBlockColor;
	LineColor   =  dLineColor;
	GridColor   =  dGridColor;
	NodeColor	=  dNodeColor;
	BackColor   =  dBackColor;
	NameColor	=  dNameColor;

	// assume some default behaviors if they can't be
	// loaded from disk
	d_action=0;
	d_mag=100.;
	d_gridsize=0.25;
	d_showgrid=TRUE;
	d_snapgrid=FALSE;
	d_showorigin=FALSE;
	d_shownames=TRUE;

	// Load an updated color map, if it exists

	BinDir=theApp.GetExecutablePath();

	ScanPreferences();

	// now, set default look for the preprocessor;
	EditAction=d_action;
	ox=0.; oy=0.;
	mag=d_mag;	
	GridSize=d_gridsize;			
	GridFlag=d_showgrid;
	SnapFlag=d_snapgrid;
	ShowNames=d_shownames;
	MeshFlag=FALSE;			
	FirstPoint=-1;
	ZoomWndFlag=FALSE;
	SelectWndFlag=FALSE;
	CreateRadiusFlag=FALSE;
	SelectCircFlag=FALSE;
	MaxSeg = 5.0;
	ArcAngle = 90.0;
} 

void CFemmeView::OnNewDocument()
{
	EditAction=d_action;
	ox=0.; oy=0.;
	mag=d_mag;	
	GridSize=d_gridsize;			
	GridFlag=d_showgrid;
	SnapFlag=d_snapgrid;
	ShowNames=d_shownames;
	MeshFlag=FALSE;			
	FirstPoint=-1;
	ZoomWndFlag=FALSE;
	SelectWndFlag=FALSE;
	CreateRadiusFlag=FALSE;
	SelectCircFlag=FALSE;

	CMainFrame *MFrm;
	MFrm=(CMainFrame *)GetTopLevelFrame();
	if (MFrm==NULL) return;
	StatBar=(CStatusBar *)MFrm->GetMessageBar();
	if (StatBar==NULL) return;

	// update check boxes in the main menu...
	EditAction=d_action;
	GridFlag=d_showgrid;
	CMenu* MMnu=MFrm->GetMenu();
	MMnu->CheckMenuItem(ID_NODE_OP, MF_UNCHECKED);
	MMnu->CheckMenuItem(ID_SEGMENT_OP, MF_UNCHECKED);
	MMnu->CheckMenuItem(ID_BLOCK_OP, MF_UNCHECKED);
	MMnu->CheckMenuItem(ID_ARCSEG_OP, MF_UNCHECKED);
	MMnu->CheckMenuItem(ID_GROUP_OP, MF_UNCHECKED);

	CToolBar *pToolBar;
	pToolBar=&MFrm->m_toolBar;    
	CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl();
	tc->PressButton(ID_NODE_OP,FALSE);
	tc->PressButton(ID_SEGMENT_OP,FALSE);
	tc->PressButton(ID_BLOCK_OP,FALSE);
	tc->PressButton(ID_ARCSEG_OP,FALSE);
	tc->PressButton(ID_GROUP_OP,FALSE);

	if(d_action==0){
		tc->PressButton(ID_NODE_OP,TRUE);
		MMnu->CheckMenuItem(ID_NODE_OP, MF_CHECKED);
	}
	if(d_action==1){
		tc->PressButton(ID_SEGMENT_OP,TRUE);
		MMnu->CheckMenuItem(ID_SEGMENT_OP, MF_CHECKED);
	}
	if(d_action==2){
		tc->PressButton(ID_BLOCK_OP,TRUE);
		MMnu->CheckMenuItem(ID_BLOCK_OP, MF_CHECKED);
	}
	if(d_action==3){
		tc->PressButton(ID_ARCSEG_OP,TRUE);
		MMnu->CheckMenuItem(ID_ARCSEG_OP, MF_CHECKED);
	}
	if(d_action==4){
		tc->PressButton(ID_GROUP_OP,TRUE);
		MMnu->CheckMenuItem(ID_GROUP_OP, MF_CHECKED);
	}

	pToolBar=&MFrm->m_toolBar2;    
	tc=&pToolBar->GetToolBarCtrl();
	if(d_showgrid==TRUE){
		MMnu->CheckMenuItem(ID_SHOW_GRID, MF_CHECKED);
		tc->PressButton(ID_SHOW_GRID,TRUE);
	}
	else{
		MMnu->CheckMenuItem(ID_SHOW_GRID, MF_UNCHECKED);
		tc->PressButton(ID_SHOW_GRID,FALSE);
	}

	if(d_snapgrid==TRUE){
		MMnu->CheckMenuItem(ID_SNAP_GRID, MF_CHECKED);
		tc->PressButton(ID_SNAP_GRID,TRUE);
	}
	else{
		MMnu->CheckMenuItem(ID_SNAP_GRID, MF_UNCHECKED);
		tc->PressButton(ID_SNAP_GRID,FALSE);
	}

	if(d_shownames==TRUE){
		MMnu->CheckMenuItem(ID_VIEW_SHOWNAMES, MF_CHECKED);
	}
	else{
		MMnu->CheckMenuItem(ID_VIEW_SHOWNAMES, MF_UNCHECKED);
	}
	
}

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

/////////////////////////////////////////////////////////////////////////////
// CFemmeView drawing

void CFemmeView::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;
}

void CFemmeView::DrawPSLG()
{
	RECT r;
	GetClientRect(&r);
	int i,j,k;				// usual iterators...
	int xs,ys,nx,ny;
	double xd,yd,side,R,dt;
	CComplex c,p,s;
	CString lbl;
	
	CPen *pOldPen;
	CPen penBlue,penRed,penBlack,penGreen,penMesh;
	penBlue.CreatePen(PS_SOLID,1,LineColor);
	penRed.CreatePen(PS_SOLID,1,SelColor);
	penBlack.CreatePen(PS_SOLID,1,NodeColor);
	penGreen.CreatePen(PS_SOLID,1,BlockColor);
	penMesh.CreatePen(PS_SOLID,1,MeshColor);

	CFemmeDoc *pDoc=GetDocument();
	CDC *pDC=GetDC();

	CFont fntArial,*pOldFont;
	fntArial.CreateFont(16,6,0,0,0,0,0,0,0,0,0,0,0,"Arial");
	pOldFont=pDC->SelectObject(&fntArial);

	// make sure all the right boxes are checked.
	CheckIt();


	// Convert node coordinates to screen coordinates
	for(i=0;i<pDoc->nodelist.GetSize();i++)
	  DwgToScreen(pDoc->nodelist[i].x,pDoc->nodelist[i].y,
				  &(pDoc->nodelist[i].xs),&(pDoc->nodelist[i].ys),&r);
				if(d_showorigin==TRUE)
	
	// Draw grid if it is enabled...
	if (GridFlag==TRUE)
	{
		int skip;
		BOOL drawgrid=TRUE;

		ScreenToDwg((int) r.right, (int) r.top, &xd, &yd, &r);
		nx=(int) (floor(xd/GridSize) - ceil(ox/GridSize));
		ny=(int) (floor(yd/GridSize) - ceil(oy/GridSize));
		
		if (nx>0){
			if((r.right/nx)<2) drawgrid=FALSE;
		}

		if (drawgrid==FALSE){
			StatBar->SetPaneText(0,"Grid too dense to display.",TRUE);
		}
		else{
			skip=__min((nx/20)+1,(ny/20)+1);
			skip=(int) pow(2.,floor(log((double) skip)/log(2.)));
			for(i=0,xd=GridSize*ceil(ox/GridSize);i<=nx;i++,xd+=GridSize)
				for(j=0,yd=GridSize*ceil(oy/GridSize);j<=ny;j++,yd+=GridSize)
				{
					if((i==skip*(i/skip)) || (j==skip*(j/skip)))
					{
						DwgToScreen(xd,yd,&xs,&ys,&r);
						pDC->SetPixel((int) xs, (int) ys, GridColor );
					}
				}
		}
	}

	// draw origin marker if it is enabled
	if(d_showorigin==TRUE)
	{
		// is the origin in the view area?
		if (DwgToScreen(0.,0.,&xs,&ys,&r)==TRUE)
		{
			if ((xs>-10) && (ys>-10) && (xs<r.right+10) && (ys<r.bottom+10))
			{
				// ok, the origin is in the view area;
				// draw a cross at the origin.
				pOldPen = pDC->SelectObject( &penBlack );
				MyMoveTo(pDC,xs-9,ys);
				MyLineTo(pDC,xs+9,ys);
				MyMoveTo(pDC,xs,ys-9);
				MyLineTo(pDC,xs,ys+9);
				pDC->SelectObject( pOldPen );
			}
		}
	}
	// Draw lines linking nodes
	for(i=0;i<pDoc->linelist.GetSize();i++)
	{
		if(pDoc->linelist[i].IsSelected==FALSE)
			pOldPen = pDC->SelectObject( &penBlue );
		else pOldPen = pDC->SelectObject( &penRed );

		MyMoveTo(pDC,pDoc->nodelist[pDoc->linelist[i].n0].xs,
					pDoc->nodelist[pDoc->linelist[i].n0].ys);
		MyLineTo(pDC,pDoc->nodelist[pDoc->linelist[i].n1].xs,
					pDoc->nodelist[pDoc->linelist[i].n1].ys);
		
		pDC->SelectObject( pOldPen );
	}

	// Draw Arc Segments;
	for(i=0;i<pDoc->arclist.GetSize();i++)
	{
		if(pDoc->arclist[i].IsSelected==FALSE)
			pOldPen = pDC->SelectObject( &penBlue );
		else pOldPen = pDC->SelectObject( &penRed );
		k=(int) ceil(pDoc->arclist[i].ArcLength/pDoc->arclist[i].MaxSideLength);
		dt=pDoc->arclist[i].ArcLength*PI/(((double) k)*180.);

		pDoc->GetCircle(pDoc->arclist[i],c,R);
		p.Set(pDoc->nodelist[pDoc->arclist[i].n0].x,
			  pDoc->nodelist[pDoc->arclist[i].n0].y);
		DwgToScreen(p.re,p.im,&xs,&ys,&r);
		MyMoveTo(pDC,xs,ys);
		s=exp(I*dt);
		for(j=0;j<k;j++){
			p=(p-c)*s+c;
			DwgToScreen(p.re,p.im,&xs,&ys,&r);
			MyLineTo(pDC,xs,ys);
		}
		pDC->SelectObject( pOldPen );
	}
	// Draw node points
	for(i=0;i<pDoc->nodelist.GetSize();i++)
	{
		xs=pDoc->nodelist[i].xs;
		ys=pDoc->nodelist[i].ys;

		if(pDoc->nodelist[i].IsSelected==FALSE)
			pOldPen = pDC->SelectObject( &penBlack );
		else pOldPen = pDC->SelectObject( &penRed );

		MyMoveTo(pDC,xs-2,ys-2);
		MyLineTo(pDC,xs-2,ys+2);
		MyLineTo(pDC,xs+2,ys+2);
		MyLineTo(pDC,xs+2,ys-2);
		MyLineTo(pDC,xs-2,ys-2);

		pDC->SelectObject( pOldPen );
	}
	
	// Draw node block labels
	for(i=0;i<pDoc->blocklist.GetSize();i++)
	{
		DwgToScreen(pDoc->blocklist[i].x,pDoc->blocklist[i].y,&xs,&ys,&r);

		if(pDoc->blocklist[i].IsSelected==FALSE)
			pOldPen = pDC->SelectObject( &penGreen );
		else pOldPen = pDC->SelectObject( &penRed );

		MyMoveTo(pDC,xs-2,ys-2);
		MyLineTo(pDC,xs-2,ys+2);
		MyLineTo(pDC,xs+2,ys+2);
		MyLineTo(pDC,xs+2,ys-2);
		MyLineTo(pDC,xs-2,ys-2);

		// circle approximately showing area constraint...
		if((pDoc->blocklist[i].MaxArea>0) && 
		   (pDoc->blocklist[i].BlockType!="<No Mesh>")){
			side=sqrt(pDoc->blocklist[i].MaxArea/PI);
			j=(int) ceil(side*mag);
		/*
			// zoom-safe replacement
			CComplex p;
			int kmax;
			MyMoveTo(pDC,xs+j,ys);
			kmax=(int) (2.*PI*((double) j)/5.);
			if (kmax>36) kmax=36;
			if ((kmax<8) && (kmax>0)) kmax=8;
			for(k=1;k<=kmax;k++)
			{
				p=exp(I*k*2.*PI/((double) kmax))*((double) j);
				MyLineTo(pDC,xs+((int) Re(p)),ys+((int) Im(p)));
			}
		*/
			pDC->Arc(xs-j,ys-j,xs+j+1,ys+j+1,xs+j+1,ys,xs+j+1,ys);
		}

		// draw a line indicating the magnetization direction;
		for(j=0,k=-1;j<pDoc->blockproplist.GetSize();j++)
			if (pDoc->blocklist[i].BlockType==pDoc->blockproplist[j].BlockName)
				k=j;
		if (k>=0)
			if (pDoc->blockproplist[k].H_c!=0)
			{
				int vx,vy;
				CComplex ar;
				ar=(cos(pDoc->blocklist[i].MagDir*PI/180))+
					I*(sin(pDoc->blocklist[i].MagDir*PI/180));
				vx=xs - ((int) (10.*ar.re));
				vy=ys + ((int) (10.*ar.im));
				MyMoveTo(pDC,vx,vy);
				vx=xs + ((int) (10.*ar.re));
				vy=ys - ((int) (10.*ar.im));
				MyLineTo(pDC,vx,vy);
				ar/=(1.+I)/sqrt(2.);
				MyLineTo(pDC,vx-((int) (6.*ar.re)),vy+((int) (6*ar.im)));
				MyMoveTo(pDC,vx,vy);
				ar*=I;
				MyLineTo(pDC,vx-((int) (6.*ar.re)),vy+((int) (6*ar.im)));
			}
	
		if(ShowNames){
			pDC->SetTextAlign(TA_BASELINE);
			pDC->SetBkMode(TRANSPARENT);
			for(k=0,lbl="<None>";k<pDoc->blockproplist.GetSize();k++)
				if (pDoc->blockproplist[k].BlockName==pDoc->blocklist[i].BlockType)
					lbl=pDoc->blocklist[i].BlockType;
			if (pDoc->blocklist[i].BlockType=="<No Mesh>") lbl="<No Mesh>";
			pDC->TextOut(xs+5,ys,lbl);

			pDC->SetTextAlign(TA_TOP);
			for(k=0,lbl="";k<pDoc->circproplist.GetSize();k++)
				if (pDoc->circproplist[k].CircName==pDoc->blocklist[i].InCircuit)
				{
					if(pDoc->circproplist[k].CircType==1)
						lbl.Format("[%s:%i]",pDoc->circproplist[k].CircName,
						            pDoc->blocklist[i].Turns);
					else lbl="["+pDoc->blocklist[i].InCircuit+"]";
				}
			pDC->TextOut(xs+5,ys,lbl);
		}

		pDC->SelectObject( pOldPen );
	}
	pDC->SelectObject(pOldFont);
	fntArial.DeleteObject();

	ReleaseDC(pDC);
}

BOOL CFemmeView::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)) );

⌨️ 快捷键说明

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