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