📄 femmeview.cpp
字号:
if (nChar==VK_TAB)
{
if ((EditAction==0) || (EditAction==2)) EnterPoint();
if (EditAction==4)
{
CGroupNumber dlg;
dlg.m_groupnumber=0;
if(dlg.DoModal()==IDOK)
{
int i,j;
j=dlg.m_groupnumber;
// now, the group associated with the nearest entity is in j;
// toggle the select of all objects in this group;
for(i=0;i<pDoc->nodelist.GetSize();i++)
if (pDoc->nodelist[i].InGroup==j) pDoc->nodelist[i].ToggleSelect();
for(i=0;i<pDoc->linelist.GetSize();i++)
if (pDoc->linelist[i].InGroup==j) pDoc->linelist[i].ToggleSelect();
for(i=0;i<pDoc->arclist.GetSize();i++)
if (pDoc->arclist[i].InGroup==j) pDoc->arclist[i].ToggleSelect();
for(i=0;i<pDoc->blocklist.GetSize();i++)
if (pDoc->blocklist[i].InGroup==j) pDoc->blocklist[i].ToggleSelect();
DrawPSLG();
}
}
}
if (nChar==VK_DELETE) OnEditCut();
if (nChar==VK_SPACE) OnOpenSelected();
if (nChar==VK_ESCAPE){
pDoc->UnselectAll();
FirstPoint=-1;
ZoomWndFlag=0;
SelectWndFlag=0;
CreateRadiusFlag=0;
CMainFrame *MFrm;
MFrm=(CMainFrame *)GetTopLevelFrame();
CMenu* MMnu=MFrm->GetMenu();
CToolBar *pToolBar=&MFrm->m_toolBar;
CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl();
tc->PressButton(ID_SELECTWND,FALSE);
DrawPSLG();
}
if (nChar==VK_F3)
{
int i;
for (i=0;i<pDoc->blocklist.GetSize();i++)
pDoc->blocklist[i].MaxArea/=4.;
InvalidateRect(NULL);
}
if (nChar==VK_F4)
{
int i;
for (i=0;i<pDoc->blocklist.GetSize();i++)
pDoc->blocklist[i].MaxArea*=4.;
InvalidateRect(NULL);
}
// Call to base class...
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CFemmeView::EnterPoint()
{
// TODO: Add your command handler code here
CEnterPt pDlg;
double x,y,t,d;
int i;
CFemmeDoc* pDoc = GetDocument();
BOOL flag;
// Send present parameter values to the dialog
// pDlg.m_rji=TheDoc->vi[0];
if(pDoc->Coords==FALSE){
pDlg.m_coord1 = mx;
pDlg.m_coord2 = my;
if(pDoc->ProblemType==0){
pDlg.m_label1 = "x-coord";
pDlg.m_label2 = "y-coord";
}
else{
pDlg.m_label1 = "r-coord";
pDlg.m_label2 = "z-coord";
}
}
else{
pDlg.m_coord1=sqrt(mx*mx+my*my);
pDlg.m_coord2=atan2(my,mx)*180/PI;
pDlg.m_label1="radius";
pDlg.m_label2="degrees";
}
// Display dialog and collect data
if(pDlg.DoModal()==IDOK)
{
if(pDoc->Coords==FALSE){
x=pDlg.m_coord1;
y=pDlg.m_coord2;
}
else{
t=pDlg.m_coord2*PI/180;
x=pDlg.m_coord1*cos(t);
y=pDlg.m_coord1*sin(t);
}
pDoc->UpdateUndo();
if (pDoc->nodelist.GetSize()<2) d=1.e-08;
else{
CComplex p0,p1,p2;
p0=pDoc->nodelist[0].CC();
p1=p0;
for(i=1;i<pDoc->nodelist.GetSize();i++)
{
p2=pDoc->nodelist[i].CC();
if(p2.re<p0.re) p0.re=p2.re;
if(p2.re>p1.re) p1.re=p2.re;
if(p2.im<p0.im) p0.im=p2.im;
if(p2.im>p1.im) p1.im=p2.im;
}
d=abs(p1-p0)*1.e-06;
}
if (EditAction==0){
pDoc->UpdateUndo();
flag=pDoc->AddNode(x,y,d);
}
if (EditAction==2){
pDoc->UpdateUndo();
flag=pDoc->AddBlockLabel(x,y,d);
}
if(flag==TRUE){
MeshUpToDate=FALSE;
if(MeshFlag==TRUE) OnShowMesh();
else DrawPSLG();
}
}
}
void CFemmeView::OnLButtonDown(UINT nFlags, CPoint point)
{
if(bLinehook!=FALSE){
CView::OnLButtonDown(nFlags, point);
return;
}
BOOL flag;
CFemmeDoc* pDoc = GetDocument();
if (CreateRadiusFlag==TRUE)
{
int k;
double r;
CreateRadiusFlag=FALSE;
if ((k=pDoc->ClosestNode(mx,my))<0) return; // catch case where no nodes have been drawn yet;
if (pDoc->CanCreateRadius(k)==FALSE)
{
AfxMessageBox("The specified point is not suitable for\nconversion into a radius");
return;
}
CPromptBox dlg;
dlg.mytitle = "Enter desired radius dimension:";
if (dlg.DoModal()==IDOK)
{
r=dlg.ParseDouble();
if (r>0){
if (pDoc->CreateRadius(k,r))
{
InvalidateRect(NULL);
MeshUpToDate=FALSE;
}
else MsgBox("Could not make a radius of the prescribed dimension");
}
}
return;
}
if (SelectWndFlag==1)
{
ZoomPix.RemoveAll();
SelectWndFlag++;
wzx=mx;wzy=my;
return;
}
if (SelectWndFlag==2) return;
if (SelectCircFlag==1)
{
ZoomPix.RemoveAll();
SelectCircFlag++;
wzx=mx;wzy=my;
return;
}
if (SelectCircFlag==2) return;
if (ZoomWndFlag==1)
{
ZoomPix.RemoveAll();
ZoomWndFlag++;
wzx=mx;wzy=my;
return;
}
if (ZoomWndFlag==2) return;
if (EditAction==0){
pDoc->UpdateUndo();
flag=pDoc->AddNode(mx,my,1./mag);
if (flag==TRUE)
{
MeshUpToDate=FALSE;
if(MeshFlag==TRUE) OnShowMesh();
else DrawPSLG();
}
}
if (EditAction==1){
if (FirstPoint<0){
if(pDoc->nodelist.GetSize()==0) return;
FirstPoint=pDoc->ClosestNode(mx,my);
pDoc->nodelist[FirstPoint].ToggleSelect();
DrawPSLG();
}
else{
pDoc->nodelist[FirstPoint].ToggleSelect();
pDoc->UpdateUndo();
flag=pDoc->AddSegment(FirstPoint,pDoc->ClosestNode(mx,my));
FirstPoint=-1;
if(flag==TRUE){
MeshUpToDate=FALSE;
if(MeshFlag==TRUE) OnShowMesh();
else DrawPSLG();
}
else DrawPSLG();
}
}
if (EditAction==2){
pDoc->UpdateUndo();
flag=pDoc->AddBlockLabel(mx,my,1./mag);
if(flag==TRUE)
{
MeshUpToDate=FALSE;
if(MeshFlag==TRUE) OnShowMesh();
else DrawPSLG();
}
}
if (EditAction==3){
if (FirstPoint<0){
if (pDoc->nodelist.GetSize()==0) return;
FirstPoint=pDoc->ClosestNode(mx,my);
pDoc->nodelist[FirstPoint].ToggleSelect();
DrawPSLG();
}
else{
CArcSegment asegm;
CArcDlg dlg;
asegm.n0=FirstPoint;
asegm.n1=pDoc->ClosestNode(mx,my);
pDoc->nodelist[asegm.n1].ToggleSelect();
DrawPSLG();
for(int k=0;k<pDoc->lineproplist.GetSize();k++)
dlg.namelist.Add(pDoc->lineproplist[k].BdryName);
dlg.cursel=0;
dlg.m_MaxSeg=MaxSeg;
dlg.m_ArcAngle=ArcAngle;
if (dlg.DoModal()==IDCANCEL){
FirstPoint=-1;
pDoc->UnselectAll();
DrawPSLG();
return;
}
MaxSeg = asegm.MaxSideLength = dlg.m_MaxSeg;
ArcAngle = asegm.ArcLength = dlg.m_ArcAngle;
if (dlg.cursel==0) asegm.BoundaryMarker="<None>";
else asegm.BoundaryMarker=pDoc->lineproplist[dlg.cursel-1].BdryName;
pDoc->UpdateUndo();
flag=pDoc->AddArcSegment(asegm);
flag=FALSE;
FirstPoint=-1;
pDoc->UnselectAll();
if(flag==TRUE){
MeshUpToDate=FALSE;
if(MeshFlag==TRUE) OnShowMesh();
else DrawPSLG();
}
else DrawPSLG();
}
}
CView::OnLButtonDown(nFlags, point);
}
void CFemmeView::OnLButtonUp(UINT nFlags, CPoint point)
{
if(bLinehook!=FALSE){
CView::OnLButtonUp(nFlags, point);
return;
}
if (ZoomWndFlag==2){
ZoomPix.RemoveAll();
ZoomWndFlag=0;
if((mx==wzx) && (my==wzy)){
InvalidateRect(NULL);
return;
}
RECT r;
double z,m[2];
if (mx<wzx){ z=wzx; wzx=mx; mx=z; }
if (my<wzy){ z=wzy; wzy=my; my=z; }
GetClientRect(&r);
m[0]=((double) r.right)/(mx-wzx);
m[1]=((double) r.bottom)/(my-wzy);
ox=wzx; oy=wzy;
if(m[0]<m[1]) mag=m[0];
else mag=m[1];
InvalidateRect(NULL);
}
if (SelectWndFlag==2){
CMainFrame *MFrm;
MFrm=(CMainFrame *)GetTopLevelFrame();
CMenu* MMnu=MFrm->GetMenu();
CToolBar *pToolBar=&MFrm->m_toolBar;
CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl();
tc->PressButton(ID_SELECTWND,FALSE);
int i,k;
double x,y,z;
CFemmeDoc *pDoc=GetDocument();
SelectWndFlag=0;
if((mx==wzx) && (my==wzy)){
InvalidateRect(NULL);
return;
}
if (mx<wzx){ z=wzx; wzx=mx; mx=z; }
if (my<wzy){ z=wzy; wzy=my; my=z; }
if((EditAction==0) || (EditAction==4))
{
for(i=0;i<pDoc->nodelist.GetSize();i++)
{
x=pDoc->nodelist[i].x; y=pDoc->nodelist[i].y;
if((x<=mx) && (x>=wzx) && (y<=my) && (y>=wzy))
pDoc->nodelist[i].IsSelected=TRUE;
}
}
if((EditAction==2) || (EditAction==4))
{
for(i=0;i<pDoc->blocklist.GetSize();i++)
{
x=pDoc->blocklist[i].x; y=pDoc->blocklist[i].y;
if((x<=mx) && (x>=wzx) && (y<=my) && (y>=wzy))
pDoc->blocklist[i].IsSelected=TRUE;
}
}
if((EditAction==1) || (EditAction==4))
{
for(i=0;i<pDoc->linelist.GetSize();i++)
{
k=0;
x=pDoc->nodelist[pDoc->linelist[i].n0].x;
y=pDoc->nodelist[pDoc->linelist[i].n0].y;
if((x<=mx) && (x>=wzx) && (y<=my) && (y>=wzy)) k++;
x=pDoc->nodelist[pDoc->linelist[i].n1].x;
y=pDoc->nodelist[pDoc->linelist[i].n1].y;
if((x<=mx) && (x>=wzx) && (y<=my) && (y>=wzy)) k++;
if(k==2) pDoc->linelist[i].IsSelected=TRUE;
}
}
if((EditAction==3) || (EditAction==4))
{
for(i=0;i<pDoc->arclist.GetSize();i++)
{
k=0;
x=pDoc->nodelist[pDoc->arclist[i].n0].x;
y=pDoc->nodelist[pDoc->arclist[i].n0].y;
if((x<=mx) && (x>=wzx) && (y<=my) && (y>=wzy)) k++;
x=pDoc->nodelist[pDoc->arclist[i].n1].x;
y=pDoc->nodelist[pDoc->arclist[i].n1].y;
if((x<=mx) && (x>=wzx) && (y<=my) && (y>=wzy)) k++;
if(k==2) pDoc->arclist[i].IsSelected=TRUE;
}
}
InvalidateRect(NULL);
}
if (SelectCircFlag==2){
CMainFrame *MFrm;
MFrm=(CMainFrame *)GetTopLevelFrame();
CMenu* MMnu=MFrm->GetMenu();
CToolBar *pToolBar=&MFrm->m_toolBar;
CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl();
tc->PressButton(ID_FD_SELECTCIRC,FALSE);
int i,k;
double R;
CComplex c,q;
CFemmeDoc *pDoc=GetDocument();
SelectCircFlag=0;
if((mx==wzx) && (my==wzy)){
InvalidateRect(NULL);
return;
}
R=abs((mx-wzx)+I*(my-wzy));
c=wzx+I*wzy;
if((EditAction==0) || (EditAction==4))
{
for(i=0;i<pDoc->nodelist.GetSize();i++)
{
q=pDoc->nodelist[i].CC();
if(abs(q-c)<=R)
pDoc->nodelist[i].IsSelected=TRUE;
}
}
if((EditAction==2) || (EditAction==4))
{
for(i=0;i<pDoc->blocklist.GetSize();i++)
{
q=pDoc->blocklist[i].x+I*pDoc->blocklist[i].y;
if(abs(q-c)<=R)
pDoc->blocklist[i].IsSelected=TRUE;
}
}
if((EditAction==1) || (EditAction==4))
{
for(i=0;i<pDoc->linelist.GetSize();i++)
{
k=0;
q=pDoc->nodelist[pDoc->linelist[i].n0].CC();
if(abs(q-c)<=R) k++;
q=pDoc->nodelist[pDoc->linelist[i].n1].CC();
if(abs(q-c)<=R) k++;
if(k==2) pDoc->linelist[i].IsSelected=TRUE;
}
}
if((EditAction==3) || (EditAction==4))
{
for(i=0;i<pDoc->arclist.GetSize();i++)
{
k=0;
q=pDoc->nodelist[pDoc->arclist[i].n0].CC();
if(abs(q-c)<=R) k++;
q=pDoc->nodelist[pDoc->arclist[i].n1].CC();
if(abs(q-c)<=R) k++;
if(k==2) pDoc->arclist[i].IsSelected=TRUE;
}
}
InvalidateRect(NULL);
}
CView::OnLButtonUp(nFlags, point);
}
void CFemmeView::OnRButtonDown(UINT nFlags, CPoint point)
{
if(bLinehook!=FALSE){
CView::OnRButtonDown(nFlags, point);
return;
}
CFemmeDoc* pDoc = GetDocument();
int i,j;
//toggle select of nearest point
if(EditAction==0){
j=pDoc->ClosestNode(mx,my);
if(j>=0) pDoc->nodelist[j].ToggleSelect();
DrawPSLG();
}
//toggle select of nearest segment
if(EditAction==1){
j=pDoc->ClosestSegment(mx,my);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -