📄 femmeview.cpp
字号:
// update check boxes in the main menu...
CMainFrame *MFrm;
MFrm=(CMainFrame *)GetTopLevelFrame();
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_CHECKED);
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,TRUE);
tc->PressButton(ID_GROUP_OP,FALSE);
// InvalidateRect(NULL);
DrawPSLG();
}
void CFemmeView::OnBlockOp()
{
// TODO: Add your command handler code here
CFemmeDoc *pDoc;
pDoc=GetDocument();
pDoc->UnselectAll();
EditAction=2;
// update check boxes in the main menu...
CMainFrame *MFrm;
MFrm=(CMainFrame *)GetTopLevelFrame();
CMenu* MMnu=MFrm->GetMenu();
MMnu->CheckMenuItem(ID_NODE_OP, MF_UNCHECKED);
MMnu->CheckMenuItem(ID_SEGMENT_OP, MF_UNCHECKED);
MMnu->CheckMenuItem(ID_BLOCK_OP, MF_CHECKED);
MMnu->CheckMenuItem(ID_ARCSEG_OP, MF_UNCHECKED);
MMnu->CheckMenuItem(ID_ARCSEG_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,TRUE);
tc->PressButton(ID_ARCSEG_OP,FALSE);
tc->PressButton(ID_GROUP_OP,FALSE);
// InvalidateRect(NULL);
DrawPSLG();
}
void CFemmeView::OnGroupOp()
{
// TODO: Add your command handler code here
CFemmeDoc *pDoc;
pDoc=GetDocument();
pDoc->UnselectAll();
EditAction=4;
// update check boxes in the main menu...
CMainFrame *MFrm;
MFrm=(CMainFrame *)GetTopLevelFrame();
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_CHECKED);
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,TRUE);
// InvalidateRect(NULL);
DrawPSLG();
}
void CFemmeView::OnMouseMove(UINT nFlags, CPoint point)
{
if ((bLinehook==NormalLua) || (bLinehook==HiddenLua))
{
StatBar->SetPaneText(0,"EXECUTING LUASCRIPT -- HIT <BREAK> TO ABORT",TRUE);
CView::OnMouseMove(nFlags, point);
return;
}
if (bLinehook==ImportDXF)
{
StatBar->SetPaneText(0,"IMPORTING DXF -- HIT <BREAK> TO ABORT",TRUE);
CView::OnMouseMove(nFlags, point);
return;
}
if (bLinehook==BuildMask)
{
StatBar->SetPaneText(0,"BUILDING STRESS TENSOR MASK -- HIT <BREAK> TO ABORT",TRUE);
CView::OnMouseMove(nFlags, point);
return;
}
static char statmsg[256];
double x,y,q;
RECT r;
CFemmeDoc *pDoc=GetDocument();
// get size of current client area and convert mouse position into
// position on the actual drawing.
GetClientRect(&r);
q=pow(10.,floor(log(mag)/log(10.)+0.5));
x=(double) point.x; y=(double) (r.bottom-point.y-1);
x=x/mag+ox; y=y/mag+oy;
x=floor(x*q+0.5)/q; y=floor(y*q+0.5)/q;
// process Snap to Grid command
if ( (SnapFlag==TRUE) && ((EditAction==0) || (EditAction==2)) )
{
x=GridSize*floor(0.5+x/GridSize);
y=GridSize*floor(0.5+y/GridSize);
}
if((ZoomWndFlag==2) || (SelectWndFlag==2)){
CDC *pDC=GetDC();
COLORREF ocol;
CZPix p;
int xso,yso,xsi,ysi,xsn,ysn,i,k,lo,hi;
DwgToScreen(wzx,wzy,&xso,&yso,&r);
DwgToScreen(mx,my,&xsi,&ysi,&r);
DwgToScreen(x,y,&xsn,&ysn,&r);
// Draw old rectangle off the screen;
if(ZoomPix.GetSize()>0){
for(k=ZoomPix.GetSize()-1;k>=0;k--)
pDC->SetPixel(ZoomPix[k].x,ZoomPix[k].y,ZoomPix[k].c);
ZoomPix.RemoveAll();
}
// XOR new rectangle onto screen
if(xso<xsn){ lo=xso,hi=xsn; }
else{ lo=xsn; hi=xso; }
for(i=lo;i<=hi;i++){
ocol=pDC->GetPixel(i,ysn);
p.c=ocol; p.x=i; p.y=ysn;
ZoomPix.Add(p);
ocol=ocol ^ RGB(255,255,255);
pDC->SetPixel(i,ysn,ocol);
ocol=pDC->GetPixel(i,yso);
p.c=ocol; p.x=i; p.y=yso;
ZoomPix.Add(p);
ocol=ocol ^ RGB(255,255,255);
pDC->SetPixel(i,yso,ocol);
}
if(yso<ysn){ lo=yso,hi=ysn; }
else{ lo=ysn; hi=yso; }
for(i=lo;i<=hi;i++){
ocol=pDC->GetPixel(xso,i);
p.c=ocol; p.x=xso; p.y=i;
ZoomPix.Add(p);
ocol=ocol ^ RGB(255,255,255);
pDC->SetPixel(xso,i,ocol);
ocol=pDC->GetPixel(xsn,i);
p.c=ocol; p.x=xsn; p.y=i;
ZoomPix.Add(p);
ocol=ocol ^ RGB(255,255,255);
pDC->SetPixel(xsn,i,ocol);
}
ReleaseDC(pDC);
}
if(SelectCircFlag==2){
CDC *pDC=GetDC();
COLORREF ocol;
CZPix p;
double R;
CComplex q;
int xso,yso,xsi,ysi,xsn,ysn,i,k;
DwgToScreen(wzx,wzy,&xso,&yso,&r);
DwgToScreen(mx,my,&xsi,&ysi,&r);
DwgToScreen(x,y,&xsn,&ysn,&r);
// Draw old circle off the screen;
if(ZoomPix.GetSize()>0){
for(k=ZoomPix.GetSize()-1;k>=0;k--)
pDC->SetPixel(ZoomPix[k].x,ZoomPix[k].y,ZoomPix[k].c);
ZoomPix.RemoveAll();
}
// XOR new rectangle onto screen
R=abs((xso-xsn)+I*(yso-ysn));
for(i=1;i<=(int)(2.*PI*R);i++){
q=R*exp(I*((double) i)/R)+(xso+I*yso);
ocol=pDC->GetPixel((int) Re(q),(int) Im(q));
p.c=ocol; p.x=(int) Re(q); p.y=(int) Im(q);
ZoomPix.Add(p);
ocol=ocol ^ RGB(255,255,255);
pDC->SetPixel((int) Re(q),(int) Im(q),ocol);
}
ReleaseDC(pDC);
}
// update mouse location;
mx=x; my=y;
if ((pDoc->Coords==FALSE) && (pDoc->ProblemType==0))
sprintf(statmsg,"(x=%.4f,y=%.4f)",x,y);
else if ((pDoc->Coords==FALSE) && (pDoc->ProblemType==1))
sprintf(statmsg,"(r=%.4f,z=%.4f)",x,y);
else sprintf(statmsg,"(%.4f at %.4f deg)",sqrt(x*x+y*y),atan2(y,x)*180/PI);
StatBar->SetPaneText(0,statmsg,TRUE);
CView::OnMouseMove(nFlags, point);
}
void CFemmeView::OnZoomIn()
{
// TODO: Add your command handler code here
RECT r;
double x,y;
GetClientRect(&r);
x=r.right; y=r.bottom;
ox=ox+0.25*x/mag;
oy=oy+0.25*y/mag;
mag*=2.;
InvalidateRect(NULL);
}
void CFemmeView::OnZoomOut()
{
// TODO: Add your command handler code here
RECT r;
double x,y;
GetClientRect(&r);
x=r.right; y=r.bottom;
ox=ox-0.5*x/mag;
oy=oy-0.5*y/mag;
mag/=2.;
InvalidateRect(NULL);
}
void CFemmeView::OnZoomNatural()
{
// TODO: Add your command handler code here
CFemmeDoc *pDoc=GetDocument();
double x[2],y[2],m[2],w,R,dt;
RECT r;
int i,j,k;
CComplex p,s,c;
// look at points, block labels, and arcs to get bounding box.
if (pDoc->nodelist.GetSize()<2) return;
x[0]=pDoc->nodelist[0].x; x[1]=pDoc->nodelist[0].x;
y[0]=pDoc->nodelist[0].y; y[1]=pDoc->nodelist[0].y;
for(i=1;i<pDoc->nodelist.GetSize();i++)
{
if(pDoc->nodelist[i].x<x[0]) x[0]=pDoc->nodelist[i].x;
if(pDoc->nodelist[i].x>x[1]) x[1]=pDoc->nodelist[i].x;
if(pDoc->nodelist[i].y<y[0]) y[0]=pDoc->nodelist[i].y;
if(pDoc->nodelist[i].y>y[1]) y[1]=pDoc->nodelist[i].y;
}
for(i=0;i<pDoc->blocklist.GetSize();i++)
{
if(pDoc->blocklist[i].x<x[0]) x[0]=pDoc->blocklist[i].x;
if(pDoc->blocklist[i].x>x[1]) x[1]=pDoc->blocklist[i].x;
if(pDoc->blocklist[i].y<y[0]) y[0]=pDoc->blocklist[i].y;
if(pDoc->blocklist[i].y>y[1]) y[1]=pDoc->blocklist[i].y;
}
for(i=0;i<pDoc->arclist.GetSize();i++)
{
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);
s=exp(I*dt);
for(j=0;j<k;j++){
p=(p-c)*s+c;
if(p.re<x[0]) x[0]=p.re;
if(p.re>x[1]) x[1]=p.re;
if(p.im<y[0]) y[0]=p.im;
if(p.im>y[1]) y[1]=p.im;
}
}
if(pDoc->FirstDraw==TRUE){
if((x[1]-x[0]) > (y[1]-y[0])) w=(x[1]-x[0]);
else w=(y[1]-y[0]);
if(w!=0)
GridSize=pow(10.,floor(log(w)/log(10.)-0.5));
}
ox=x[0]; oy=y[0];
GetClientRect(&r);
m[0]=((double) (r.right-1))/(x[1]-x[0]);
m[1]=((double) (r.bottom-1))/(y[1]-y[0]);
if(m[0]<m[1]) mag=m[0];
else mag=m[1];
if(pDoc->FirstDraw==TRUE)
pDoc->FirstDraw=FALSE;
else InvalidateRect(NULL);
}
void CFemmeView::OnZoomWnd()
{
// TODO: Add your command handler code here
ZoomWndFlag=TRUE;
SelectWndFlag=FALSE;
SelectCircFlag=FALSE;
CreateRadiusFlag=FALSE;
}
void CFemmeView::OnSelectwnd()
{
SelectWndFlag=TRUE;
ZoomWndFlag=FALSE;
SelectCircFlag=FALSE;
CreateRadiusFlag=FALSE;
CMainFrame *MFrm;
MFrm=(CMainFrame *)GetTopLevelFrame();
CMenu* MMnu=MFrm->GetMenu();
CToolBar *pToolBar=&MFrm->m_toolBar;
CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl();
tc->PressButton(ID_SELECTWND,TRUE);
}
void CFemmeView::OnFDSelectCirc()
{
SelectCircFlag=TRUE;
SelectWndFlag=FALSE;
CreateRadiusFlag=FALSE;
ZoomWndFlag=FALSE;
CMainFrame *MFrm;
MFrm=(CMainFrame *)GetTopLevelFrame();
CMenu* MMnu=MFrm->GetMenu();
CToolBar *pToolBar=&MFrm->m_toolBar;
CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl();
tc->PressButton(ID_FD_SELECTCIRC,TRUE);
}
void CFemmeView::OnShowGrid()
{
// TODO: Add your command handler code here
CMainFrame *MFrm;
MFrm=(CMainFrame *)GetTopLevelFrame();
CMenu* MMnu=MFrm->GetMenu();
CToolBar *pToolBar;
pToolBar=&MFrm->m_toolBar2;
CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl();
if(GridFlag==TRUE){
GridFlag=FALSE;
MMnu->CheckMenuItem(ID_SHOW_GRID, MF_UNCHECKED);
tc->PressButton(ID_SHOW_GRID,FALSE);
}
else{
GridFlag=TRUE;
MMnu->CheckMenuItem(ID_SHOW_GRID, MF_CHECKED);
tc->PressButton(ID_SHOW_GRID,TRUE);
}
InvalidateRect(NULL);
}
void CFemmeView::OnSetGrid()
{
// TODO: Add your command handler code here
GRIDDLG pDlg;
CFemmeDoc *pDoc=GetDocument();
// Send present parameter values to the dialog
// pDlg.m_rji=TheDoc->vi[0];
pDlg.m_gridsize = GridSize;
pDlg.coords = pDoc->Coords;
// Display dialog and collect data
if(pDlg.DoModal()==IDOK)
{
GridSize=pDlg.m_gridsize;
pDoc->Coords=pDlg.coords;
InvalidateRect(NULL);
}
}
void CFemmeView::OnSnapGrid()
{
// TODO: Add your command handler code here
CMainFrame *MFrm;
MFrm=(CMainFrame *)GetTopLevelFrame();
CMenu* MMnu=MFrm->GetMenu();
CToolBar *pToolBar;
pToolBar=&MFrm->m_toolBar2;
CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl();
if(SnapFlag==TRUE){
SnapFlag=FALSE;
MMnu->CheckMenuItem(ID_SNAP_GRID, MF_UNCHECKED);
tc->PressButton(ID_SNAP_GRID,FALSE);
}
else{
SnapFlag=TRUE;
MMnu->CheckMenuItem(ID_SNAP_GRID, MF_CHECKED);
tc->PressButton(ID_SNAP_GRID,TRUE);
}
}
void CFemmeView::OnShowMesh()
{
// TODO: Add your command handler code here
CFrameWnd *MFrm;
MFrm=GetTopLevelFrame();
CMenu* MMnu=MFrm->GetMenu();
if(MeshFlag==TRUE){
MeshFlag=FALSE;
MMnu->CheckMenuItem(ID_SHOW_MESH, MF_UNCHECKED);
}
else if(MeshUpToDate==TRUE){
MeshFlag=TRUE;
MMnu->CheckMenuItem(ID_SHOW_MESH, MF_CHECKED);
}
InvalidateRect(NULL);
}
void CFemmeView::OnEditCopyAsMetafile()
{
// puts a metafile drawing of the screen on the clipboard
CMetaFileDC Meta;
RECT r;
CRgn R;
Meta.CreateEnhanced(NULL,NULL,NULL,NULL);
GetClientRect(&r);
R.CreateRectRgnIndirect(&r);
Meta.SelectClipRgn(&R);
OnDraw(&Meta);
HENHMETAFILE hMeta=Meta.CloseEnhanced();
OpenClipboard();
EmptyClipboard();
SetClipboardData(CF_ENHMETAFILE,hMeta);
CloseClipboard();
}
void CFemmeView::OnEditCopy()
{
// puts a bitmap of the screen on the clipboard
RECT r;
CDC tempDC;
CBitmap bitmap;
CDC *pDC=GetDC();
GetClientRect(&r);
tempDC.CreateCompatibleDC(pDC);
bitmap.CreateCompatibleBitmap(pDC, r.right, r.bottom);
tempDC.SelectObject(&bitmap);
tempDC.BitBlt(0, 0, r.right, r.bottom, pDC, 0, 0, SRCCOPY);
OpenClipboard();
EmptyClipboard();
SetClipboardData(CF_BITMAP, HBITMAP(bitmap));
CloseClipboard();
}
void CFemmeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
// VK_TAB, VK_DELETE -- ones that we want to catch
CFemmeDoc *pDoc=GetDocument();
if (nChar==VK_LEFT) OnPanLeft();
if (nChar==VK_RIGHT) OnPanRight();
if (nChar==VK_UP) OnPanUp();
if (nChar==VK_DOWN) OnPanDown();
if (nChar==VK_PRIOR) OnZoomIn(); // page up
if (nChar==VK_NEXT) OnZoomOut(); // page down
if (nChar==VK_HOME) OnZoomNatural();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -