#include "stdafx.h" #include #include #include "problem.h" #include "femm.h" #include "xyplot.h" #include "femmviewDoc.h" #include "femmviewview.h" #include "MainFrm.h" #include "windows.h" //necessary for bitmap saving #include "lua.h" #include "mycommandlineinfo.h" #include "promptbox.h" #include "ChildFrm.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif extern lua_State *lua; extern BOOL bLinehook; extern void *pFemmviewdoc; extern CLuaConsoleDlg *LuaConsole; extern BOOL lua_byebye; extern int m_luaWindowStatus; #define CatchNullDocument(); if (pFemmviewdoc==NULL)\ { CString msg="No magnetics output in focus"; \ lua_error(L,msg.GetBuffer(1)); \ return 0;} //-------------------Lua Extensions------------------------- void CFemmviewDoc::initalise_lua() { // use a messagebox to display errors lua_register(lua,"mo_setfocus",lua_switchfocus); lua_register(lua,"mo_getpointvalues",lua_getpointvals); lua_register(lua,"mo_close",lua_exitpost); lua_register(lua,"mo_addcontour",lua_addcontour); lua_register(lua,"mo_clearcontour",lua_clearcontour); lua_register(lua,"mo_lineintegral",lua_lineintegral); lua_register(lua,"mo_selectblock",lua_selectblock); lua_register(lua,"mo_groupselectblock",lua_groupselectblock); lua_register(lua,"mo_clearblock",lua_clearblock); lua_register(lua,"mo_blockintegral",lua_blockintegral); lua_register(lua,"mo_zoomnatural",lua_zoomnatural); lua_register(lua,"mo_zoomin",lua_zoomin); lua_register(lua,"mo_zoomout",lua_zoomout); lua_register(lua,"mo_zoom",lua_zoom); lua_register(lua,"mo_showgrid",lua_showgrid); lua_register(lua,"mo_hidegrid",lua_hidegrid); lua_register(lua,"mo_gridsnap",lua_gridsnap); lua_register(lua,"mo_setgrid",lua_setgrid); lua_register(lua,"mo_showmesh",lua_showmesh); lua_register(lua,"mo_hidemesh",lua_hidemesh); lua_register(lua,"mo_hidedensityplot",lua_hidedensity); lua_register(lua,"mo_showdensityplot",lua_showdensity); lua_register(lua,"mo_hidecontourplot",lua_hidecountour); lua_register(lua,"mo_showcontourplot",lua_showcountour); lua_register(lua,"mo_showvectorplot",lua_vectorplot); lua_register(lua,"mo_smooth",lua_smoothing); lua_register(lua,"mo_showpoints",lua_showpoints); lua_register(lua,"mo_hidepoints",lua_hidepoints); lua_register(lua,"mo_shownames",lua_shownames); lua_register(lua,"mo_getprobleminfo",lua_getprobleminfo); lua_register(lua,"mo_savebitmap",lua_savebitmap); lua_register(lua,"mo_getcircuitproperties",lua_getcircuitprops); lua_register(lua,"mo_savemetafile",lua_saveWMF); lua_register(lua,"mo_refreshview",lua_refreshview); lua_register(lua,"mo_selectpoint",lua_selectline); lua_register(lua,"mo_seteditmode",lua_seteditmode); lua_register(lua,"mo_bendcontour",lua_bendcontour); lua_register(lua,"mo_makeplot",lua_makeplot); lua_register(lua,"mo_reload",lua_reload); lua_register(lua,"mo_gradient",lua_gradient); lua_register(lua,"mo_gettitle",lua_gettitle); lua_register(lua,"mo_get_title",lua_gettitle); lua_register(lua,"mo_set_weighting_scheme",lua_weighting); lua_register(lua,"mo_setweightingscheme",lua_weighting); lua_register(lua,"mo_resize",luaResize); lua_register(lua,"mo_minimize",luaMinimize); lua_register(lua,"mo_maximize",luaMaximize); lua_register(lua,"mo_restore", luaRestore); // compatibility with alternate lua function naming convention lua_register(lua,"mo_set_focus",lua_switchfocus); lua_register(lua,"mo_get_point_values",lua_getpointvals); lua_register(lua,"mo_add_contour",lua_addcontour); lua_register(lua,"mo_clear_contour",lua_clearcontour); lua_register(lua,"mo_line_integral",lua_lineintegral); lua_register(lua,"mo_select_block",lua_selectblock); lua_register(lua,"mo_group_select_block",lua_groupselectblock); lua_register(lua,"mo_clear_block",lua_clearblock); lua_register(lua,"mo_block_integral",lua_blockintegral); lua_register(lua,"mo_zoom_natural",lua_zoomnatural); lua_register(lua,"mo_zoom_in",lua_zoomin); lua_register(lua,"mo_zoom_out",lua_zoomout); lua_register(lua,"mo_show_grid",lua_showgrid); lua_register(lua,"mo_hide_grid",lua_hidegrid); lua_register(lua,"mo_show_mesh",lua_showmesh); lua_register(lua,"mo_hide_mesh",lua_hidemesh); lua_register(lua,"mo_hide_density_plot",lua_hidedensity); lua_register(lua,"mo_show_density_plot",lua_showdensity); lua_register(lua,"mo_hide_contour_plot",lua_hidecountour); lua_register(lua,"mo_show_contour_plot",lua_showcountour); lua_register(lua,"mo_show_vector_plot",lua_vectorplot); lua_register(lua,"mo_show_points",lua_showpoints); lua_register(lua,"mo_hide_points",lua_hidepoints); lua_register(lua,"mo_grid_snap",lua_gridsnap); lua_register(lua,"mo_set_grid",lua_setgrid); lua_register(lua,"mo_get_problem_info",lua_getprobleminfo); lua_register(lua,"mo_save_bitmap",lua_savebitmap); lua_register(lua,"mo_get_circuit_properties",lua_getcircuitprops); lua_register(lua,"mo_save_metafile",lua_saveWMF); lua_register(lua,"mo_refresh_view",lua_refreshview); lua_register(lua,"mo_select_point",lua_selectline); lua_register(lua,"mo_set_edit_mode",lua_seteditmode); lua_register(lua,"mo_bend_contour",lua_bendcontour); lua_register(lua,"mo_make_plot",lua_makeplot); lua_register(lua,"mo_show_names",lua_shownames); // functions to access low-level mesh info lua_register(lua,"mo_numnodes",lua_numnodes); lua_register(lua,"mo_numelements",lua_numelements); lua_register(lua,"mo_getnode",lua_getnode); lua_register(lua,"mo_getelement",lua_getelement); lua_register(lua,"mo_num_nodes",lua_numnodes); lua_register(lua,"mo_num_elements",lua_numelements); lua_register(lua,"mo_get_node",lua_getnode); lua_register(lua,"mo_get_element",lua_getelement); lua_register(lua,"mo_get_gap_b",lua_getAGEflux); lua_register(lua,"mo_getgapb",lua_getAGEflux); lua_register(lua,"mo_gap_integral",lua_gapintegral); lua_register(lua,"mo_gapintegral",lua_gapintegral); lua_register(lua,"mo_get_gap_a",lua_getgapa); lua_register(lua,"mo_getgapa",lua_getgapa); lua_register(lua,"mo_getgapharmonics",lua_getgapharmonics); lua_register(lua,"mo_get_gap_harmonics",lua_getgapharmonics); pFemmviewdoc=this; } int CFemmviewDoc::lua_switchfocus(lua_State *L) { POSITION tpos,dpos; CDocTemplate* pTemp; CFemmviewDoc* pDoc; CString DocTitle,ThisTitle; int n; // get title of desired document from Lua n=lua_gettop(L); if (n==0) return NULL; DocTitle.Format("%s",lua_tostring(L,n)); DocTitle.MakeLower(); if(DocTitle.Right(4)==".ans") DocTitle=DocTitle.Left(DocTitle.GetLength()-4); // get pointer to document template for FemmeDoc tpos=AfxGetApp()->GetFirstDocTemplatePosition( ); for(int i=0;i<5;i++) pTemp=AfxGetApp()->GetNextDocTemplate(tpos); // leaf through documents to get a pointer to the // document with the right title dpos=pTemp->GetFirstDocPosition(); while(dpos!=NULL) { pDoc=(CFemmviewDoc *)pTemp->GetNextDoc(dpos); ThisTitle=pDoc->GetTitle(); ThisTitle.MakeLower(); if(ThisTitle.Right(4)==".ans") ThisTitle=ThisTitle.Left(ThisTitle.GetLength()-4); if(ThisTitle==DocTitle) { pFemmviewdoc=pDoc; return NULL; } } // if we can't find it, throw an error message CString msg; msg.Format("No document that matches %s",DocTitle); lua_error(L,msg.GetBuffer(1)); return NULL; } int CFemmviewDoc::lua_dumpheader(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); return 0; } int CFemmviewDoc::lua_getpointvals(lua_State * L) { // for compatibility with 4.0 and 4.1 Lua implementation if (((CFemmApp*) AfxGetApp())->CompatibilityMode!=0) return ((CFemmviewDoc *)pFemmviewdoc)->old_lua_getpointvals(L); CatchNullDocument(); double px,py; px=lua_todouble(L,1); py=lua_todouble(L,2); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); CPointVals u; CComplex Jtot; if(thisDoc->GetPointValues(px, py, u)==TRUE) { lua_pushnumber(L,u.A); lua_pushnumber(L,u.B1); lua_pushnumber(L,u.B2); lua_pushnumber(L,u.c); lua_pushnumber(L,u.E); lua_pushnumber(L,u.H1); lua_pushnumber(L,u.H2); lua_pushnumber(L,u.Je); lua_pushnumber(L,u.Js); lua_pushnumber(L,u.mu1); lua_pushnumber(L,u.mu2); lua_pushnumber(L,u.Pe); lua_pushnumber(L,u.Ph); lua_pushnumber(L,u.ff); return 14; } return 0; } int CFemmviewDoc::lua_exitpost(lua_State * L) { CatchNullDocument(); ((CFemmviewDoc *)pFemmviewdoc)->OnCloseDocument( ); return 0; } int CFemmviewDoc::lua_reload(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); // theView->BeginWaitCursor(); thisDoc->OnReload(); // theView->EndWaitCursor(); if (theView->d_ResetOnReload==FALSE) thisDoc->FirstDraw=FALSE; theView->RedrawView(); theView->LuaViewInfo(); return 0; } void CFemmviewView::LuaViewInfo() { OnViewInfo(); } int CFemmviewDoc::lua_addcontour(lua_State * L) { CatchNullDocument(); CComplex z; int i; z.Set(lua_todouble(L,1),lua_todouble(L,2)); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); i=(int) thisDoc->contour.GetSize(); if(i>0){ if (z!=thisDoc->contour[i-1]) thisDoc->contour.Add(z); } else thisDoc->contour.Add(z); theView->DrawUserContour(FALSE); return 0; } int CFemmviewDoc::lua_clearcontour(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); theView->EraseUserContour(TRUE); thisDoc->contour.RemoveAll(); return 0; } int CFemmviewDoc::lua_lineintegral(lua_State * L) { // for compatibility with 4.0 and 4.1 Lua implementation if (((CFemmApp*) AfxGetApp())->CompatibilityMode!=0) return ((CFemmviewDoc *)pFemmviewdoc)->old_lua_lineintegral(L); CatchNullDocument(); int type; CComplex *z; z=(CComplex *)calloc(4,sizeof(CComplex)); type=(int) lua_todouble(L,1); // 0- B.n // 1 - H.t // 2 - Cont length // 3 - Force from stress tensor // 4 - Torque from stress tensor // 5 - (B.n)^2 if (type<0 || type >5) { CString msg; msg.Format("Invalid line integral selected %d",type); lua_error(L,msg.GetBuffer(1)); return 0; } CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); thisDoc->LineIntegral(type,z); switch(type) { case 2: // length result lua_pushnumber(lua,z[0].re); // contour length lua_pushnumber(lua,z[0].im); // swept area free(z); return 2; case 3: // force results if (thisDoc->Frequency!=0){ lua_pushnumber(lua,z[2].re); lua_pushnumber(lua,z[3].re); lua_pushnumber(lua,z[0]); lua_pushnumber(lua,z[1]); free(z); return 4; } else{ lua_pushnumber(lua,z[0].re); lua_pushnumber(lua,z[1].re); free(z); return 2; } case 4: // torque results if(thisDoc->Frequency!=0){ lua_pushnumber(lua,z[1].re); lua_pushnumber(lua,z[0]); free(z); return 2; } else { lua_pushnumber(lua,z[0].re); lua_pushnumber(lua,0); free(z); return 2; } default: lua_pushnumber(lua,z[0]); lua_pushnumber(lua,z[1]); free(z); return 2; } free(z); return 0; } int CFemmviewDoc::lua_selectblock(lua_State * L) { CatchNullDocument(); double px,py; px=lua_todouble(L,1); py=lua_todouble(L,2); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); theView->EditAction=2; int k; if (thisDoc->meshelem.GetSize()>0){ k=thisDoc->InTriangle(px,py); if(k>=0){ thisDoc->bHasMask=FALSE; thisDoc->blocklist[thisDoc->meshelem[k].lbl].ToggleSelect(); // RedrawView(); theView->DrawSelected=thisDoc->meshelem[k].lbl; HDC myDCH=GetDC(theView->m_hWnd); CDC tempDC; CDC *pDC; pDC=tempDC.FromHandle(myDCH); //CDC *pDC=GetDC(theView->m_hWnd); theView->OnDraw(pDC); theView->DrawSelected=-1; theView->ReleaseDC(pDC); thisDoc->UpdateAllViews(theView); } } return 0; } int CFemmviewDoc::lua_groupselectblock(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); theView->EditAction=2; int j,k,n; if (thisDoc->meshelem.GetSize()>0) { n=lua_gettop(L); k=0; if (n>0) k=(int)lua_todouble(L,1); for(j=0;jblocklist.GetSize();j++) { if ((thisDoc->blocklist[j].InGroup==k) || (n==0)) thisDoc->blocklist[j].ToggleSelect(); thisDoc->bHasMask=FALSE; } /* for(j=0;jlinelist.GetSize();j++) { if ((thisDoc->linelist[j].InGroup==k) || (n==0)) thisDoc->linelist[j].ToggleSelect(); thisDoc->bHasMask=FALSE; } for(j=0;jarclist.GetSize();j++) { if ((thisDoc->arclist[j].InGroup==k) || (n==0)) thisDoc->arclist[j].ToggleSelect(); thisDoc->bHasMask=FALSE; } */ HDC myDCH=GetDC(theView->m_hWnd); CDC tempDC; CDC *pDC; pDC=tempDC.FromHandle(myDCH); //CDC *pDC=GetDC(theView->m_hWnd); theView->OnDraw(pDC); theView->DrawSelected=-1; theView->ReleaseDC(pDC); thisDoc->UpdateAllViews(theView); } return 0; } int CFemmviewDoc::lua_clearblock(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); thisDoc->bHasMask=FALSE; for(int i=0;iblocklist.GetSize();i++) { if (thisDoc->blocklist[i].IsSelected==TRUE) thisDoc->blocklist[i].IsSelected=FALSE; } theView->EditAction=0; theView->RedrawView(); // HDC myDCH=GetDC(theView->m_hWnd); // CDC tempDC; // CDC *pDC; // pDC=tempDC.FromHandle(myDCH); //CDC *pDC=GetDC(theView->m_hWnd); // theView->OnDraw(pDC); // theView->DrawSelected=-1; // theView->ReleaseDC(pDC); // thisDoc->UpdateAllViews(theView); return 0; } int CFemmviewDoc::lua_blockintegral(lua_State * L) { // for compatibility with 4.0 and 4.1 Lua implementation if (((CFemmApp*) AfxGetApp())->CompatibilityMode!=0) return ((CFemmviewDoc *)pFemmviewdoc)->old_lua_blockintegral(L); CatchNullDocument(); int type; type=(int) lua_todouble(L,1); CFemmviewDoc *thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; CatchNullDocument(); POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); CComplex z; int i; BOOL flg=FALSE; for(i=0;iblocklist.GetSize();i++) if (thisDoc->blocklist[i].IsSelected==TRUE) flg=TRUE; if(flg==FALSE) { CString msg="Cannot integrate\nNo area has been selected"; lua_error(L,msg.GetBuffer(1)); return 0; } z=thisDoc->BlockIntegral(type); lua_pushnumber(L,z); return 1; } int CFemmviewDoc::lua_zoomin(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); RECT r; double x,y; theView->GetClientRect(&r); x=r.right; y=r.bottom; theView->ox=theView->ox+0.25*x/theView->mag; theView->oy=theView->oy+0.25*y/theView->mag; theView->mag*=2.; theView->RedrawView(); return 0; } int CFemmviewDoc::lua_zoom(lua_State * L) { CatchNullDocument(); double x[2],y[2],m[2]; x[0]=lua_todouble(L,1); y[0]=lua_todouble(L,2); x[1]=lua_todouble(L,3); y[1]=lua_todouble(L,4); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); CRect r; theView->ox=x[0]; theView->oy=y[0]; theView->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]mag=m[0]; else theView->mag=m[1]; theView->Invalidate(TRUE); return 0; } int CFemmviewDoc::lua_zoomnatural(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); CFemmviewDoc *pDoc=theView->GetDocument(); double x[2],y[2],m[2],w; RECT r; int i; if (pDoc->meshnode.GetSize()<2) return 0; x[0]=pDoc->meshnode[0].x; x[1]=pDoc->meshnode[0].x; y[0]=pDoc->meshnode[0].y; y[1]=pDoc->meshnode[0].y; for(i=1;imeshnode.GetSize();i++) { if(pDoc->meshnode[i].xmeshnode[i].x; if(pDoc->meshnode[i].x>x[1]) x[1]=pDoc->meshnode[i].x; if(pDoc->meshnode[i].ymeshnode[i].y; if(pDoc->meshnode[i].y>y[1]) y[1]=pDoc->meshnode[i].y; } 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) theView->GridSize=pow(10.,floor(log(w)/log(10.)-1.)); } theView->ox=x[0]; theView->oy=y[0]; theView->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]mag=m[0]; else theView->mag=m[1]; if(pDoc->FirstDraw==TRUE) pDoc->FirstDraw=FALSE; else theView->RedrawView(); return 0; } int CFemmviewDoc::lua_zoomout(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); RECT r; double x,y; theView->GetClientRect(&r); x=r.right; y=r.bottom; theView->ox=theView->ox-0.5*x/theView->mag; theView->oy=theView->oy-0.5*y/theView->mag; theView->mag/=2.; theView->RedrawView(); return 0; } int CFemmviewDoc::lua_showmesh(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); CMainFrame *MFrm; MFrm=(CMainFrame *)theView->GetTopLevelFrame(); CMenu* MMnu=MFrm->GetMenu(); CToolBar *pToolBar; pToolBar=&MFrm->m_FV_toolBar1; CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl(); theView->MeshFlag=TRUE; MMnu->CheckMenuItem(ID_SHOW_MESH, MF_CHECKED); tc->PressButton(ID_SHOW_MESH,TRUE); theView->RedrawView(); return 0; } int CFemmviewDoc::lua_hidemesh(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); CMainFrame *MFrm; MFrm=(CMainFrame *)theView->GetTopLevelFrame(); CMenu* MMnu=MFrm->GetMenu(); CToolBar *pToolBar; pToolBar=&MFrm->m_FV_toolBar1; CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl(); theView->MeshFlag=FALSE; MMnu->CheckMenuItem(ID_SHOW_MESH, MF_UNCHECKED); tc->PressButton(ID_SHOW_MESH,FALSE); theView->RedrawView(); return 0; } int CFemmviewDoc::lua_hidegrid(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); CMainFrame *MFrm; MFrm=(CMainFrame *)theView->GetTopLevelFrame(); CMenu* MMnu=MFrm->GetMenu(); CToolBar *pToolBar; pToolBar=&MFrm->m_leftbar; CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl(); theView->GridFlag=FALSE; MMnu->CheckMenuItem(ID_SHOW_GRID, MF_UNCHECKED); tc->PressButton(ID_SHOW_GRID,FALSE); theView->RedrawView(); return 0; } int CFemmviewDoc::lua_showgrid(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); CMainFrame *MFrm; MFrm=(CMainFrame *)theView->GetTopLevelFrame(); CMenu* MMnu=MFrm->GetMenu(); CToolBar *pToolBar; pToolBar=&MFrm->m_leftbar; CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl(); theView->GridFlag=TRUE; MMnu->CheckMenuItem(ID_SHOW_GRID, MF_CHECKED); tc->PressButton(ID_SHOW_GRID,TRUE); theView->RedrawView(); return 0; } int CFemmviewDoc::lua_showdensity(lua_State * L) { CatchNullDocument(); BOOL showlegend; BOOL gscale; double m_ub1,m_lb1; CString type; int btnState; //type real,imag,mag; CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); showlegend=(int) lua_todouble(L,1); gscale=(int) lua_todouble(L,2); m_ub1=lua_todouble(L,3); m_lb1=lua_todouble(L,4); if(m_lb1>m_ub1) { double temp=m_lb1; m_lb1=m_ub1; m_ub1=temp; } type.Format("%s",lua_tostring(L,5)); btnState=0; if (thisDoc->Frequency==0) { if((type=="mag") || (type=="bmag")) btnState=1; if((type=="real") || (type=="breal")) btnState=1; if((type=="imag") || (type=="bimag")) btnState=1; if(type=="hmag") btnState=2; if(type=="hreal") btnState=2; if(type=="himag") btnState=2; if(type=="jmag") btnState=3; if(type=="jreal") btnState=3; if(type=="jimag") btnState=3; } else{ if((type=="mag") || (type=="bmag")) btnState=1; if((type=="real") || (type=="breal")) btnState=2; if((type=="imag") || (type=="bimag")) btnState=3; if(type=="hmag") btnState=4; if(type=="hreal") btnState=5; if(type=="himag") btnState=6; if(type=="jmag") btnState=7; if(type=="jreal") btnState=8; if(type=="jimag") btnState=9; } if (showlegend==-1) { m_lb1=thisDoc->d_PlotBounds[btnState-1][0]; m_ub1=thisDoc->d_PlotBounds[btnState-1][1]; showlegend=1; gscale=0; } theView->DensityPlot=btnState; theView->LegendFlag=showlegend; theView->GreyContours=gscale; if(btnState>0) { thisDoc->PlotBounds[btnState-1][0]=m_lb1; thisDoc->PlotBounds[btnState-1][1]=m_ub1; } theView->RedrawView(); return 0; } int CFemmviewDoc::lua_hidedensity(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); theView->DensityPlot=0; theView->RedrawView(); return 0; } int CFemmviewDoc::lua_showcountour(lua_State * L) { CatchNullDocument(); int m_numcontours; double m_alow,m_ahigh; CString type; m_numcontours=(int) lua_todouble(L,1); m_alow=lua_todouble(L,2); m_ahigh=lua_todouble(L,3); type=lua_tostring(L,4); type.MakeLower(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); if(thisDoc->Frequency!=0) { if(type=="real") { theView->ShowAr=true; theView->ShowAi=false; } if(type=="imag") { theView->ShowAi=true; theView->ShowAr=false; } if(type=="both") { theView->ShowAi=theView->ShowAr=true; } thisDoc->A_Low=m_alow; thisDoc->A_High=m_ahigh; theView->NumContours=m_numcontours; theView->RedrawView(); } else{ theView->ShowAr=true; theView->ShowAi=FALSE; thisDoc->A_Low=m_alow; thisDoc->A_High=m_ahigh; theView->NumContours=m_numcontours; theView->RedrawView(); } if(m_numcontours==-1) { thisDoc->A_Low=thisDoc->A_lb; thisDoc->A_High=thisDoc->A_ub; theView->NumContours=19; } theView->RedrawView(); return 0; } int CFemmviewDoc::lua_hidecountour(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); theView->ShowAr=FALSE; theView->ShowAi=FALSE; theView->RedrawView(); return 0; } int CFemmviewDoc::lua_smoothing(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); CString temp; temp.Format("%s",lua_tostring(L,1)); temp.MakeLower(); CMainFrame *MFrm; MFrm=(CMainFrame *)theView->GetTopLevelFrame(); CMenu* MMnu=MFrm->GetMenu(); if (temp=="off") { thisDoc->Smooth=FALSE; MMnu->CheckMenuItem(ID_SMOOTH, MF_UNCHECKED); } if (temp=="on") { thisDoc->Smooth=TRUE; MMnu->CheckMenuItem(ID_SMOOTH, MF_CHECKED); } if (temp !="on" && temp !="off") { CString msg="Unknown option for smoothing"; lua_error(L,msg.GetBuffer(1)); return 0; } theView->RedrawView(); return 0; } int CFemmviewDoc::lua_showpoints(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); CFrameWnd *MFrm; MFrm=theView->GetTopLevelFrame(); CMenu* MMnu=MFrm->GetMenu(); theView->PtsFlag=TRUE; MMnu->CheckMenuItem(ID_MENUSHOWPTS, MF_CHECKED); theView->RedrawView(); return 0; } int CFemmviewDoc::lua_hidepoints(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); CFrameWnd *MFrm; MFrm=theView->GetTopLevelFrame(); CMenu* MMnu=MFrm->GetMenu(); theView->PtsFlag=FALSE; MMnu->CheckMenuItem(ID_MENUSHOWPTS, MF_UNCHECKED); theView->RedrawView(); return 0; } int CFemmviewDoc::lua_gridsnap(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); CString temp; temp.Format("%s",lua_tostring(L,1)); temp.MakeLower(); CMainFrame *MFrm; MFrm=(CMainFrame *)theView->GetTopLevelFrame(); CMenu* MMnu=MFrm->GetMenu(); CToolBar *pToolBar; pToolBar=&MFrm->m_leftbar; CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl(); if(temp=="off"){ theView->SnapFlag=FALSE; MMnu->CheckMenuItem(ID_SNAP_GRID, MF_UNCHECKED); tc->PressButton(ID_SNAP_GRID,FALSE); } else{ theView->SnapFlag=TRUE; MMnu->CheckMenuItem(ID_SNAP_GRID, MF_CHECKED); tc->PressButton(ID_SNAP_GRID,TRUE); } if (temp !="on" && temp !="off") { CString msg="Unknown option for grid snap"; lua_error(L,msg.GetBuffer(1)); return 0; } return 0; } int CFemmviewDoc::lua_setgrid(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); CString temp; int coords=0; double gridsize; gridsize=lua_todouble(L,1); temp.Format("%s",lua_tostring(L,2)); temp.MakeLower(); if (temp=="cart") coords=0; if (temp=="polar") coords=1; if (temp !="cart" && temp !="polar") { CString msg="Unknown option for set grid"; lua_error(L,msg.GetBuffer(1)); return 0; } theView->GridSize=gridsize; thisDoc->Coords=coords; theView->RedrawView(); return 0; } int CFemmviewDoc::lua_getprobleminfo(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); lua_pushnumber(L,thisDoc->ProblemType); lua_pushnumber(L,thisDoc->Frequency); lua_pushnumber(L,thisDoc->Depth); lua_pushnumber(L,thisDoc->LengthConv[thisDoc->LengthUnits]); return 4; } int CFemmviewDoc::lua_savebitmap(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); CString filename; filename.Format("%s",lua_tostring(L,1)); RECT r; CDC tempDC; CBitmap bitmap; CBitmap *oldbitmap; CDC *pDC=theView->GetDC(); theView->GetClientRect(&r); tempDC.CreateCompatibleDC(pDC); bitmap.CreateCompatibleBitmap(pDC, r.right, r.bottom); oldbitmap=tempDC.SelectObject(&bitmap); tempDC.Rectangle(0,0,r.right,r.bottom); theView->OnDraw(&tempDC); // tempDC.BitBlt(0, 0, r.right, r.bottom, pDC, 0, 0, SRCCOPY); PBITMAPINFO pbmi; pbmi=thisDoc->CreateBitmapInfoStruct(theView->m_hWnd,HBITMAP(bitmap)); thisDoc->CreateBMPFile(theView->m_hWnd,filename.GetBuffer(1),pbmi,HBITMAP(bitmap),tempDC.m_hDC); tempDC.SelectObject(oldbitmap); theView->ReleaseDC(pDC); tempDC.DeleteDC(); bitmap.DeleteObject(); // to save a bitmap file we need // a bitmapheader lets use the v5 // OpenClipboard(); // EmptyClipboard(); // SetClipboardData(CF_BITMAP, HBITMAP(bitmap)); // CloseClipboard(); return 0; } PBITMAPINFO CFemmviewDoc::CreateBitmapInfoStruct(HWND hwnd, HBITMAP hBmp) { BITMAP bmp; PBITMAPINFO pbmi; WORD cClrBits; // Retrieve the bitmap's color format, width, and height. if (!GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bmp)) {//errhandler("GetObject", hwnd); MsgBox("Critical error on getting bmp info, possible page fault ahoy25"); } // Convert the color format to a count of bits. cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel); if (cClrBits == 1) cClrBits = 1; else if (cClrBits <= 4) cClrBits = 4; else if (cClrBits <= 8) cClrBits = 8; else if (cClrBits <= 16) cClrBits = 16; else if (cClrBits <= 24) cClrBits = 24; else cClrBits = 32; // Allocate memory for the BITMAPINFO structure. (This structure // contains a BITMAPINFOHEADER structure and an array of RGBQUAD // data structures.) if (cClrBits >= 24) pbmi = (PBITMAPINFO) LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * ((int)(1<< cClrBits))); // There is no RGBQUAD array for the 24-bit-per-pixel format. else pbmi = (PBITMAPINFO) LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER)); // Initialize the fields in the BITMAPINFO structure. pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); pbmi->bmiHeader.biWidth = bmp.bmWidth; pbmi->bmiHeader.biHeight = bmp.bmHeight; pbmi->bmiHeader.biPlanes = bmp.bmPlanes; pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel; if (cClrBits < 24) pbmi->bmiHeader.biClrUsed = (1<bmiHeader.biCompression = BI_RGB; // Compute the number of bytes in the array of color // indices and store the result in biSizeImage. // For Windows NT/2000, the width must be DWORD aligned unless // the bitmap is RLE compressed. This example shows this. // For Windows 95/98, the width must be WORD aligned unless the // bitmap is RLE compressed. pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * cClrBits +31) & ~31) /8 * pbmi->bmiHeader.biHeight; // Set biClrImportant to 0, indicating that all of the // device colors are important. pbmi->bmiHeader.biClrImportant = 0; return pbmi; } void CFemmviewDoc::CreateBMPFile(HWND hwnd, LPTSTR pszFile, PBITMAPINFO pbi, HBITMAP hBMP, HDC hDC) { HANDLE hf; // file handle BITMAPFILEHEADER hdr; // bitmap file-header PBITMAPINFOHEADER pbih; // bitmap info-header LPBYTE lpBits; // memory pointer DWORD dwTotal; // total count of bytes DWORD cb; // incremental count of bytes BYTE *hp; // byte pointer DWORD dwTmp; pbih = (PBITMAPINFOHEADER) pbi; lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage); if (!lpBits) MsgBox("Critical error on getting bmp info, possible page fault ahoy26"); // errhandler("GlobalAlloc", hwnd); // Retrieve the color table (RGBQUAD array) and the bits // (array of palette indices) from the DIB. if (!GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits, pbi, DIB_RGB_COLORS)) { // errhandler("GetDIBits", hwnd); MsgBox("Critical error on getting bmp info, possible page fault ahoy27"); } // Create the .BMP file. hf = CreateFile(pszFile, GENERIC_READ | GENERIC_WRITE, (DWORD) 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL); if (hf == INVALID_HANDLE_VALUE) {// errhandler("CreateFile", hwnd); MsgBox("Critical error on getting bmp info, possible page fault ahoy28"); } hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M" // Compute the size of the entire file. hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD) + pbih->biSizeImage); hdr.bfReserved1 = 0; hdr.bfReserved2 = 0; // Compute the offset to the array of color indices. hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof (RGBQUAD); // Copy the BITMAPFILEHEADER into the .BMP file. if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER), (LPDWORD) &dwTmp, NULL)) { MsgBox("Critical error on getting bmp info, possible page fault ahoy29"); // errhandler("WriteFile", hwnd); } // Copy the BITMAPINFOHEADER and RGBQUAD array into the file. if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER) + pbih->biClrUsed * sizeof (RGBQUAD), (LPDWORD) &dwTmp, ( NULL))) // errhandler("WriteFile", hwnd); MsgBox("Critical error on getting bmp info, possible page fault ahoy30"); // Copy the array of color indices into the .BMP file. dwTotal = cb = pbih->biSizeImage; hp = lpBits; if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL)) // errhandler("WriteFile", hwnd); MsgBox("Critical error on getting bmp info, possible page fault ahoy31"); // Close the .BMP file. if (!CloseHandle(hf)) // errhandler("CloseHandle", hwnd); MsgBox("Critical error on getting bmp info, possible page fault ahoy32"); // Free memory. GlobalFree((HGLOBAL)lpBits); } int CFemmviewDoc::lua_getcircuitprops(lua_State *L) { // for compatibility with 4.0 and 4.1 Lua implementation if (((CFemmApp*) AfxGetApp())->CompatibilityMode!=0) return ((CFemmviewDoc *)pFemmviewdoc)->old_lua_getcircuitprops(L); CatchNullDocument(); CFemmviewDoc * TheDoc; // note normally thisdoc CFemmviewView * theView; TheDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=TheDoc->GetFirstViewPosition(); theView=(CFemmviewView *)TheDoc->GetNextView(pos); int NumCircuits,k; CString circuitname; circuitname=lua_tostring(L,1); k=-1; // ok we need to find the correct entry for the circuit name NumCircuits=(int) TheDoc->circproplist.GetSize(); for(int i=0;icircproplist[i].CircName==circuitname) { k=i; i=NumCircuits; // that will break it } } // trap errors if(k==-1) { CString msg="Unknown circuit"; lua_error(L,msg.GetBuffer(1)); return 0; } CComplex amps,volts,fluxlinkage; amps =TheDoc->circproplist[k].Amps; volts=TheDoc->GetVoltageDrop(k); fluxlinkage=TheDoc->GetFluxLinkage(k); lua_pushnumber(L,amps); lua_pushnumber(L,volts); lua_pushnumber(L,fluxlinkage); return 3; } int CFemmviewDoc::lua_saveWMF(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); CString filename; filename.Format("%s",lua_tostring(L,1)); RECT r; CDC tempDC; CDC *pDC=theView->GetDC(); CMetaFileDC Meta; CRgn R; Meta.CreateEnhanced(NULL,NULL,NULL,NULL); theView->GetClientRect(&r); R.CreateRectRgnIndirect(&r); Meta.SelectClipRgn(&R); theView->OnDraw(&Meta); HENHMETAFILE hMeta=Meta.CloseEnhanced(); DeleteEnhMetaFile(CopyEnhMetaFile(hMeta,filename)); DeleteEnhMetaFile(hMeta); return 0; } int CFemmviewDoc::lua_refreshview(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); CDC *pDC=theView->GetDC(); // erase background CBrush backBrush(theView->BackColor); CBrush* pOldBrush = pDC->SelectObject(&backBrush); CRect rect; pDC->GetClipBox(&rect); pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY); pDC->SelectObject(pOldBrush); // redraw the view theView->OnDraw(pDC); return 0; } int CFemmviewDoc::lua_selectline(lua_State *L) { CatchNullDocument(); CFemmviewDoc * pDoc; // note normally thisdoc CFemmviewView * theView; pDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=pDoc->GetFirstViewPosition(); theView=(CFemmviewView *)pDoc->GetNextView(pos); theView->EditAction=1; // make sure things update OK double mx,my; int i,j,k,m; mx=lua_todouble(L,1); my=lua_todouble(L,2); //*************** { if (pDoc->nodelist.GetSize()>0){ i=pDoc->ClosestNode(mx,my); CComplex x,y,z; double R,d1,d2; int lineno,arcno,flag=0; z.Set(pDoc->nodelist[i].x,pDoc->nodelist[i].y); if (pDoc->contour.GetSize()>0){ //check to see if point is the same as last point in the contour; y=pDoc->contour[pDoc->contour.GetSize()-1]; if ((y.re==z.re) && (y.im==z.im)) return 0; j=pDoc->ClosestNode(y.re,y.im); x.Set(pDoc->nodelist[j].x,pDoc->nodelist[j].y); //check to see if this point and the last point are ends of an //input segment; lineno=-1; d1=1.e08; if (abs(x-y)<1.e-08){ for(k=0;klinelist.GetSize();k++){ if((pDoc->linelist[k].n0==j) && (pDoc->linelist[k].n1==i)) { d2=fabs(pDoc->ShortestDistanceFromSegment(mx,my,k)); if(d2linelist[k].n0==i) && (pDoc->linelist[k].n1==j)) { d2=fabs(pDoc->ShortestDistanceFromSegment(mx,my,k)); if(d2arclist.GetSize();k++){ if((pDoc->arclist[k].n0==j) && (pDoc->arclist[k].n1==i)) { d2=pDoc->ShortestDistanceFromArc(CComplex(mx,my), pDoc->arclist[k]); if(d2arclist[k].n0==i) && (pDoc->arclist[k].n1==j)) { d2=pDoc->ShortestDistanceFromArc(CComplex(mx,my), pDoc->arclist[k]); if(d2contour.Add(z); theView->DrawUserContour(FALSE); return 0; } if((lineno<0) && (arcno<0)){ pDoc->contour.Add(z); theView->DrawUserContour(FALSE); } if(lineno>=0){ j=(int) pDoc->contour.GetSize(); if(j>1){ if(abs(pDoc->contour[j-2]-z)<1.e-08){ //CView::OnLButtonDown(nFlags, point); return 0; } } pDoc->contour.Add(z); theView->DrawUserContour(FALSE); } if(arcno>=0){ k=arcno; pDoc->GetCircle(pDoc->arclist[k],x,R); j=(int) ceil(pDoc->arclist[k].ArcLength/pDoc->arclist[k].MaxSideLength); if(flag==TRUE) z=exp(I*pDoc->arclist[k].ArcLength*PI/(180.*((double) j)) ); else z=exp(-I*pDoc->arclist[k].ArcLength*PI/(180.*((double) j)) ); for(i=0;icontour.GetSize(); if(m>1){ if(abs(pDoc->contour[m-2]-y)<1.e-08){ //CView::OnLButtonDown(nFlags, point); return 0; } } pDoc->contour.Add(y); theView->DrawUserContour(FALSE); } } } } //************* return 0; } int CFemmviewDoc::lua_seteditmode(lua_State *L) { CatchNullDocument(); CString EditAction; EditAction.Format("%s",lua_tostring(L,1)); EditAction.MakeLower(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); if (EditAction=="point") { if (theView->EditAction==1){ theView->EraseUserContour(TRUE); thisDoc->contour.RemoveAll(); } if (theView->EditAction==2){ int i; BOOL flg=FALSE; thisDoc->bHasMask=FALSE; for(i=0;iblocklist.GetSize();i++) { if (thisDoc->blocklist[i].IsSelected==TRUE) { thisDoc->blocklist[i].IsSelected=FALSE; flg=TRUE; } } if(flg==TRUE) theView->RedrawView(); } theView->EditAction=0; } if (EditAction=="contour") { if(theView->EditAction==2){ int i; BOOL flg=FALSE; thisDoc->bHasMask=FALSE; for(i=0;iblocklist.GetSize();i++){ if (thisDoc->blocklist[i].IsSelected==TRUE) { thisDoc->blocklist[i].IsSelected=FALSE; flg=TRUE; } } if(flg==TRUE) theView->RedrawView(); } theView->EditAction=1; } if (EditAction=="area") { if(theView->EditAction==1){ theView->EraseUserContour(TRUE); thisDoc->contour.RemoveAll(); } theView->EditAction=2; } return 0; } int CFemmviewDoc::lua_bendcontour(lua_State *L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); thisDoc->BendContour(lua_todouble(L,1),lua_todouble(L,2)); theView->InvalidateRect(NULL); return 0; } int CFemmviewDoc::lua_makeplot(lua_State *L) { CatchNullDocument(); CFemmviewDoc *pDoc; CFemmviewView *pView; pDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=pDoc->GetFirstViewPosition(); pView=(CFemmviewView *)pDoc->GetNextView(pos); int PlotType,npoints,FileFormat,n; CString ToFile; // if ((pView->EditAction!=1) || (pDoc->contour.GetSize()==0)){ if (pDoc->contour.GetSize()==0){ CString outmsg; outmsg.Format("*** Cannot create a plot;\r\n*** No contour has been defined\r\n"); LuaConsole->ToOutput(outmsg); return FALSE; } n=lua_gettop(L); if(n>0) PlotType=(int) lua_todouble(L,1); else return FALSE; if(n>1) npoints=(int) lua_todouble(L,2); else npoints=pView->d_PlotPoints; CXYPlot xyplot; pDoc->GetLineValues(xyplot,PlotType,npoints); if(n<3) { CMetaFileDC Meta; Meta.CreateEnhanced(NULL,NULL,NULL,NULL); HGLOBAL BoundingBox=GlobalAlloc(0,256); xyplot.MakePlot(&Meta,(char *) BoundingBox); HENHMETAFILE hMeta=Meta.CloseEnhanced(); if (hMeta==NULL) MsgBox("No Handle..."); if (pView->OpenClipboard()==FALSE) MsgBox("Cannot access the Clipboard"); else{ EmptyClipboard(); if(SetClipboardData(CF_ENHMETAFILE,hMeta)==NULL) MsgBox("Couldn't SetClipboardData"); if(SetClipboardData(CF_TEXT,BoundingBox)==NULL) MsgBox("Couldn't SetClipboardData"); CloseClipboard(); // fire up plot viewer; ((CFemmApp *)AfxGetApp())->CreateNewDocument(8); } } else{ ToFile.Format("%s",lua_tostring(L,3)); if(n>3){ FileFormat=(int) lua_todouble(L,4); if (xyplot.ToDisk(FileFormat,ToFile)==FALSE) LuaConsole->ToOutput("*** Couldn't write data to disk\r\n"); } else{ CMetaFileDC Meta; Meta.CreateEnhanced(NULL,NULL,NULL,NULL); HGLOBAL BoundingBox=GlobalAlloc(0,256); xyplot.MakePlot(&Meta,(char *) BoundingBox); HENHMETAFILE hMeta=Meta.CloseEnhanced(); if (hMeta==NULL) MsgBox("No Handle..."); DeleteEnhMetaFile(CopyEnhMetaFile(hMeta,ToFile)); DeleteEnhMetaFile(hMeta); } } return TRUE; } int CFemmviewDoc::lua_shownames(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); int flg=(int)lua_todouble(L,1); if (flg!=0) flg=1; theView->ShowNames=flg; theView->InvalidateRect(NULL); return 0; } int CFemmviewDoc::lua_vectorplot(lua_State * L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); int n=lua_gettop(L); if (n>0) theView->VectorPlot=(int)lua_todouble(L,1); if (n>1) theView->VectorScaleFactor=lua_todouble(L,2); theView->InvalidateRect(NULL); return 0; } /* int CFemmviewDoc::lua_gradient(lua_State *L) { // computes the gradients of the B field by differentiating // the shape functions that are used to represent the smoothed // B in an element. CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); double x,y; int i,n[3]; double b[3],c[3],da; CComplex dbxdx,dbxdy,dbydx,dbydy; CElement elm; x=lua_todouble(L,1); y=lua_todouble(L,2); i=thisDoc->InTriangle(x,y); if(i<0){ for(i=0;i<8;i++) lua_pushnumber(L,0); return 8; } elm=thisDoc->meshelem[i]; for(i=0;i<3;i++) n[i]=elm.p[i]; b[0]=thisDoc->meshnode[n[1]].y - thisDoc->meshnode[n[2]].y; b[1]=thisDoc->meshnode[n[2]].y - thisDoc->meshnode[n[0]].y; b[2]=thisDoc->meshnode[n[0]].y - thisDoc->meshnode[n[1]].y; c[0]=thisDoc->meshnode[n[2]].x - thisDoc->meshnode[n[1]].x; c[1]=thisDoc->meshnode[n[0]].x - thisDoc->meshnode[n[2]].x; c[2]=thisDoc->meshnode[n[1]].x - thisDoc->meshnode[n[0]].x; da=(b[0]*c[1]-b[1]*c[0])*thisDoc->LengthConv[thisDoc->LengthUnits]; dbxdx=0; dbxdy=0; dbydx=0; dbydy=0; for(i=0;i<3;i++) { dbxdx+=elm.b1[i]*b[i]/da; dbxdy+=elm.b1[i]*c[i]/da; dbydx+=elm.b2[i]*b[i]/da; dbydy+=elm.b2[i]*c[i]/da; } if (thisDoc->ProblemType==PLANAR) { // in a source-free region, we can get a little bit // of smoothing by enforcing the dependencies that // are implied by the differential equation. dbxdx=(dbxdx-dbydy)/2.; dbydy=-dbxdx; dbydx=(dbydx+dbxdy)/2; dbxdy=dbydx; } lua_pushnumber(L,Re(dbxdx)); lua_pushnumber(L,Im(dbxdx)); lua_pushnumber(L,Re(dbxdy)); lua_pushnumber(L,Im(dbxdy)); lua_pushnumber(L,Re(dbydx)); lua_pushnumber(L,Im(dbydx)); lua_pushnumber(L,Re(dbydy)); lua_pushnumber(L,Im(dbydy)); return 8; } */ int CFemmviewDoc::lua_gradient(lua_State *L) { // computes the gradients of the B field by differentiating // the shape functions that are used to represent the smoothed // B in an element. CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); int i; double xo,yo,x,y,da,p0,p1,p2; CComplex dbxdx,dbxdy,dbydx,dbydy,Mx,My; xo=lua_todouble(L,1); yo=lua_todouble(L,2); dbxdx=0; dbxdy=0; dbydx=0; dbydy=0; for(i=0;imeshelem.GetSize();i++) { thisDoc->GetMagnetization(i,Mx,My); da=muo*thisDoc->ElmArea(i)/thisDoc->LengthConv[thisDoc->LengthUnits]; x=Re(thisDoc->meshelem[i].ctr); y=Im(thisDoc->meshelem[i].ctr); p0=PI*pow(pow(x - xo,2.) + pow(y - yo,2.),3.); p1=(-3.*pow(x - xo,2.) + pow(y - yo,2.))*(y - yo); p2=(x - xo)*(pow(x - xo,2.) - 3.*pow(y - yo,2.)); dbxdx+=(da*(-(My*p1) + Mx*p2))/p0; dbydx+=(da*(-(Mx*p1) - My*p2))/p0; dbxdy+=(da*(-(Mx*p1) - My*p2))/p0; dbydy+=-(da*(-(My*p1) + Mx*p2))/p0; } lua_pushnumber(L,Re(dbxdx)); lua_pushnumber(L,Im(dbxdx)); lua_pushnumber(L,Re(dbxdy)); lua_pushnumber(L,Im(dbxdy)); lua_pushnumber(L,Re(dbydx)); lua_pushnumber(L,Im(dbydx)); lua_pushnumber(L,Re(dbydy)); lua_pushnumber(L,Im(dbydy)); return 8; } int CFemmviewDoc::luaResize(lua_State *L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); CChildFrame *pChildFrm = (CChildFrame *)theView->GetParentFrame(); int n=lua_gettop(L); if (n!=2) return 0; int nWidth = (int)lua_todouble(L,1); int nHeight = (int)lua_todouble(L,2); pChildFrm->ResizeClient(nWidth,nHeight,TRUE); return 0; } int CFemmviewDoc::luaMinimize(lua_State *L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); CChildFrame *pChildFrm = (CChildFrame *)theView->GetParentFrame(); pChildFrm->ShowWindow(SW_MINIMIZE); return 0; } int CFemmviewDoc::luaMaximize(lua_State *L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); CChildFrame *pChildFrm = (CChildFrame *)theView->GetParentFrame(); pChildFrm->ShowWindow(SW_MAXIMIZE); return 0; } int CFemmviewDoc::luaRestore(lua_State *L) { CatchNullDocument(); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); CChildFrame *pChildFrm = (CChildFrame *)theView->GetParentFrame(); pChildFrm->ShowWindow(SW_RESTORE); return 0; } //////////////////////////////////////////////////////////////////////////////////// // // old versions for compatibility // //////////////////////////////////////////////////////////////////////////////////// int CFemmviewDoc::old_lua_lineintegral(lua_State * L) { CatchNullDocument(); int type; CComplex *z; z=(CComplex *)calloc(4,sizeof(CComplex)); type=(int) lua_todouble(L,1); // 0- B.n // 1 - H.t // 2 - Cont length // 3 - Force from stress tensor // 4 - Torque from stress tensor // 5 - (B.n)^2 if (type<0 || type >5) { CString msg; msg.Format("Invalid line integral selected %d",type); lua_error(L,msg.GetBuffer(1)); return 0; } CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); thisDoc->LineIntegral(type,z); switch(type) { case 3: // force results if (thisDoc->Frequency!=0){ lua_pushnumber(lua,z[2].re); lua_pushnumber(lua,0); lua_pushnumber(lua,z[3].re); lua_pushnumber(lua,0); lua_pushnumber(lua,z[0].re); lua_pushnumber(lua,z[0].im); lua_pushnumber(lua,z[1].re); lua_pushnumber(lua,z[1].im); free(z); return 8; } else{ lua_pushnumber(lua,z[0].re); lua_pushnumber(lua,0); lua_pushnumber(lua,z[1].re); lua_pushnumber(lua,0); free(z); return 4; } case 4: // torque results if(thisDoc->Frequency!=0){ lua_pushnumber(lua,z[1].re); lua_pushnumber(lua,0); lua_pushnumber(lua,z[0].re); lua_pushnumber(lua,z[0].im); free(z); return 4; } else { lua_pushnumber(lua,z[0].re); lua_pushnumber(lua,0); lua_pushnumber(lua,0); lua_pushnumber(lua,0); free(z); return 4; } default: lua_pushnumber(lua,z[0].re); lua_pushnumber(lua,z[0].im); lua_pushnumber(lua,z[1].re); lua_pushnumber(lua,z[1].im); free(z); return 4; } free(z); return 0; } int CFemmviewDoc::old_lua_getpointvals(lua_State * L) { CatchNullDocument(); double px,py; px=lua_todouble(L,1); py=lua_todouble(L,2); CFemmviewDoc * thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); CPointVals u; CComplex Jtot; if(thisDoc->GetPointValues(px, py, u)==TRUE) { lua_pushnumber(L,u.A.re); lua_pushnumber(L,u.A.im); lua_pushnumber(L,u.B1.re); lua_pushnumber(L,u.B1.im); lua_pushnumber(L,u.B2.re); lua_pushnumber(L,u.B2.im); lua_pushnumber(L,u.c); lua_pushnumber(L,u.E); lua_pushnumber(L,u.H1.re); lua_pushnumber(L,u.H1.im); lua_pushnumber(L,u.H2.re); lua_pushnumber(L,u.H2.im); lua_pushnumber(L,u.Je.re); lua_pushnumber(L,u.Je.im); lua_pushnumber(L,u.Js.re); lua_pushnumber(L,u.Js.im); lua_pushnumber(L,u.mu1.re); lua_pushnumber(L,u.mu1.im); lua_pushnumber(L,u.mu2.re); lua_pushnumber(L,u.mu2.im); lua_pushnumber(L,u.Pe); lua_pushnumber(L,u.Ph); lua_pushnumber(L,u.ff); return 23; } return 0; } int CFemmviewDoc::old_lua_blockintegral(lua_State * L) { CatchNullDocument(); int type; type=(int) lua_todouble(L,1); CFemmviewDoc *thisDoc; CFemmviewView * theView; thisDoc=(CFemmviewDoc *)pFemmviewdoc; CatchNullDocument(); POSITION pos; pos=thisDoc->GetFirstViewPosition(); theView=(CFemmviewView *)thisDoc->GetNextView(pos); CComplex z; int i; BOOL flg=FALSE; for(i=0;iblocklist.GetSize();i++) if (thisDoc->blocklist[i].IsSelected==TRUE) flg=TRUE; if(flg==FALSE) { CString msg="Cannot integrate\nNo area has been selected"; lua_error(L,msg.GetBuffer(1)); return 0; } z=thisDoc->BlockIntegral(type); lua_pushnumber(L,z.re); lua_pushnumber(L,z.im); return 2; } int CFemmviewDoc::old_lua_getcircuitprops(lua_State *L) { CatchNullDocument(); CFemmviewDoc * TheDoc; // note normally thisdoc CFemmviewView * theView; TheDoc=(CFemmviewDoc *)pFemmviewdoc; POSITION pos; pos=TheDoc->GetFirstViewPosition(); theView=(CFemmviewView *)TheDoc->GetNextView(pos); int NumCircuits,k; CString circuitname; circuitname=lua_tostring(L,1); k=-1; // ok we need to find the correct entry for the circuit name NumCircuits=(int) TheDoc->circproplist.GetSize(); for(int i=0;icircproplist[i].CircName==circuitname) { k=i; i=NumCircuits; // that will break it } } // trap errors if(k==-1) { CString msg="Unknown circuit"; lua_error(L,msg.GetBuffer(1)); return 0; } CComplex amps,volts,fluxlinkage; amps =TheDoc->circproplist[k].Amps; volts=TheDoc->GetVoltageDrop(k); fluxlinkage=TheDoc->GetFluxLinkage(k); lua_pushnumber(L,Re(amps)); lua_pushnumber(L,Im(amps)); lua_pushnumber(L,Re(volts)); lua_pushnumber(L,Im(volts)); lua_pushnumber(L,Re(fluxlinkage)); lua_pushnumber(L,Im(fluxlinkage)); return 6; } int CFemmviewDoc::lua_gettitle(lua_State *L) { CatchNullDocument(); CFemmviewDoc * thisDoc; thisDoc=(CFemmviewDoc *)pFemmviewdoc; lua_pushstring(L,thisDoc->GetTitle()); return 1; } /////////////////////////////////////////////////////// // Functions that provide low-level access to the mesh /////////////////////////////////////////////////////// int CFemmviewDoc::lua_numnodes(lua_State *L) { CatchNullDocument(); CFemmviewDoc * thisDoc; thisDoc=(CFemmviewDoc *)pFemmviewdoc; lua_pushnumber(L,(int) thisDoc->meshnode.GetSize()); return 1; } int CFemmviewDoc::lua_numelements(lua_State *L) { CatchNullDocument(); CFemmviewDoc * thisDoc; thisDoc=(CFemmviewDoc *)pFemmviewdoc; lua_pushnumber(L,(int) thisDoc->meshelem.GetSize()); return 1; } int CFemmviewDoc::lua_getnode(lua_State *L) { CatchNullDocument(); CFemmviewDoc * thisDoc; thisDoc=(CFemmviewDoc *)pFemmviewdoc; int k=(int) lua_todouble(L,1); k--; if ((k<0) || (k>=thisDoc->meshnode.GetSize())) return 0; lua_pushnumber(L,thisDoc->meshnode[k].x); lua_pushnumber(L,thisDoc->meshnode[k].y); return 2; } int CFemmviewDoc::lua_getelement(lua_State *L) { CatchNullDocument(); CFemmviewDoc * thisDoc; thisDoc=(CFemmviewDoc *)pFemmviewdoc; int k=(int) lua_todouble(L,1); k--; if ((k<0) || (k>=thisDoc->meshelem.GetSize())) return 0; lua_pushnumber(L,thisDoc->meshelem[k].p[0]+1); lua_pushnumber(L,thisDoc->meshelem[k].p[1]+1); lua_pushnumber(L,thisDoc->meshelem[k].p[2]+1); lua_pushnumber(L,Re(thisDoc->meshelem[k].ctr)); lua_pushnumber(L,Im(thisDoc->meshelem[k].ctr)); lua_pushnumber(L,thisDoc->ElmArea(k)); lua_pushnumber(L,thisDoc->blocklist[thisDoc->meshelem[k].lbl].InGroup); return 7; } int CFemmviewDoc::lua_weighting(lua_State *L) { CatchNullDocument(); CFemmviewDoc * thisDoc; thisDoc=(CFemmviewDoc *)pFemmviewdoc; thisDoc->WeightingScheme=(int)lua_todouble(L,1); thisDoc->bHasMask=FALSE; return 0; } int CFemmviewDoc::lua_getAGEflux(lua_State *L) { CatchNullDocument(); CFemmviewDoc * thisDoc; thisDoc=(CFemmviewDoc *)pFemmviewdoc; int i,k; CString myBdryName; CComplex br=0; CComplex bt=0; double n,tta; myBdryName.Format("%s",lua_tostring(L,1)); // figure out which AGE is being asked for i=-1; for(k=0;kagelist.GetSize();k++) if (thisDoc->agelist[k].BdryName==myBdryName) i=k; // if the requested AGE exists, roll up the flux density // at the specified angle. Note: angle is specified in degrees if (i>=0){ tta=lua_todouble(L,2)*PI/180; for(k=0;kagelist[i].nn;k++) { n=thisDoc->agelist[i].nh[k]; br += thisDoc->agelist[i].brc[k]*cos(n*tta) + thisDoc->agelist[i].brs[k]*sin(n*tta); bt += thisDoc->agelist[i].btc[k]*cos(n*tta) + thisDoc->agelist[i].bts[k]*sin(n*tta); } } lua_pushnumber(L,br); lua_pushnumber(L,bt); return 2; } int CFemmviewDoc::lua_gapintegral(lua_State *L) { CatchNullDocument(); CFemmviewDoc * thisDoc; thisDoc=(CFemmviewDoc *)pFemmviewdoc; CString myBdryName; int i,k,IntegralType; myBdryName.Format("%s",lua_tostring(L,1)); // figure out which AGE is being asked for i=-1; for(k=0;kagelist.GetSize();k++) if (thisDoc->agelist[k].BdryName==myBdryName) i=k; if (i<0){ // Case where named AGE is not found lua_pushnumber(L,0); return 1; } IntegralType=(int)lua_todouble(L,2); double R = (thisDoc->agelist[i].ri + thisDoc->agelist[i].ro)/2.; if (IntegralType==0) // DC torque version using harmonic solution in airgap { int k; double tq=0; for(k=0;kagelist[i].nn;k++) { tq += Re(thisDoc->agelist[i].brc[k]*conj(thisDoc->agelist[i].btc[k]) + thisDoc->agelist[i].brs[k]*conj(thisDoc->agelist[i].bts[k])); } tq*=(PI*R*R*thisDoc->Depth)/muo; if (thisDoc->Frequency!=0) tq/=2.; lua_pushnumber(L,tq); return 1; } /* if (IntegralType==0) // DC torque { int k; CComplex tq=0; double dt=(PI/180.)*(thisDoc->agelist[i].totalArcLength/thisDoc->agelist[i].totalArcElements); CComplex br,bt; for(k=0;kagelist[i].totalArcElements;k++) { br = thisDoc->agelist[i].br[k]; bt = thisDoc->agelist[i].bt[k]; // add in torque contribution for this element tq = tq + (br*conj(bt) + conj(br)*bt)/(2.*muo)*R*dt*R*thisDoc->Depth; } tq *= 360./((double) thisDoc->agelist[i].totalArcLength); if (thisDoc->Frequency!=0) tq/=2.; lua_pushnumber(L,tq); return 1; } */ if (IntegralType==3) // 2X torque { int k; CComplex tq=0; if (thisDoc->Frequency!=0) { for(k=0;kagelist[i].nn;k++) { tq += thisDoc->agelist[i].brc[k]*thisDoc->agelist[i].btc[k] + thisDoc->agelist[i].brs[k]*thisDoc->agelist[i].bts[k]; } tq*=(PI*R*R*thisDoc->Depth)/(2.*muo); } lua_pushnumber(L,tq); return 1; } if (IntegralType==1) // DC Force { int k; CComplex fx=0; CComplex fy=0; CComplex dfx,dfy; if (round(thisDoc->agelist[i].totalArcLength)==360) { for(k=1;kagelist[i].nn;k++) { dfx = (((thisDoc->agelist[i].brs[k] + thisDoc->agelist[i].btc[k])*conj(thisDoc->agelist[i].brs[k-1] - thisDoc->agelist[i].btc[k-1]) + (thisDoc->agelist[i].brs[k-1] - thisDoc->agelist[i].btc[k-1])*conj(thisDoc->agelist[i].brs[k] + thisDoc->agelist[i].btc[k]) + (thisDoc->agelist[i].brc[k] - thisDoc->agelist[i].bts[k])*conj(thisDoc->agelist[i].brc[k-1] + thisDoc->agelist[i].bts[k-1]) + (thisDoc->agelist[i].brc[k-1] + thisDoc->agelist[i].bts[k-1])*conj(thisDoc->agelist[i].brc[k] - thisDoc->agelist[i].bts[k]))); dfy = (((-thisDoc->agelist[i].brc[k] + thisDoc->agelist[i].bts[k])*conj(thisDoc->agelist[i].brs[k-1] - thisDoc->agelist[i].btc[k-1]) + (thisDoc->agelist[i].brc[k-1] + thisDoc->agelist[i].bts[k-1])*conj(thisDoc->agelist[i].brs[k] + thisDoc->agelist[i].btc[k]) + (thisDoc->agelist[i].brs[k] + thisDoc->agelist[i].btc[k])*conj(thisDoc->agelist[i].brc[k-1] + thisDoc->agelist[i].bts[k-1]) + (-thisDoc->agelist[i].brs[k-1] + thisDoc->agelist[i].btc[k-1])*conj(thisDoc->agelist[i].brc[k] - thisDoc->agelist[i].bts[k]))); fx+=Re(dfx); fy+=Re(dfy); } fx*=thisDoc->Depth*PI*R/(4.*muo); fy*=thisDoc->Depth*PI*R/(4.*muo); if (thisDoc->Frequency!=0) { fx/=2.; fy/=2.; } } lua_pushnumber(L,fx); lua_pushnumber(L,fy); return 2; } if (IntegralType==4) // 2X Force { int k; CComplex fx=0; CComplex fy=0; CComplex dfx,dfy; if ((round(thisDoc->agelist[i].totalArcLength)==360) && (thisDoc->Frequency!=0)) { for(k=1;kagelist[i].nn;k++) { dfx = (thisDoc->agelist[i].brs[k-1] - thisDoc->agelist[i].btc[k-1])*(thisDoc->agelist[i].brs[k] + thisDoc->agelist[i].btc[k]) + (thisDoc->agelist[i].brc[k-1] + thisDoc->agelist[i].bts[k-1])*(thisDoc->agelist[i].brc[k] - thisDoc->agelist[i].bts[k]); dfy = (thisDoc->agelist[i].brs[k] + thisDoc->agelist[i].btc[k])*(thisDoc->agelist[i].brc[k-1] + thisDoc->agelist[i].bts[k-1]) - (thisDoc->agelist[i].brs[k-1] - thisDoc->agelist[i].btc[k-1])*(thisDoc->agelist[i].brc[k] - thisDoc->agelist[i].bts[k]); fx+=dfx; fy+=dfy; } fx*=thisDoc->Depth*PI*R/(4.*muo); fy*=thisDoc->Depth*PI*R/(4.*muo); } lua_pushnumber(L,fx); lua_pushnumber(L,fy); return 2; } if (IntegralType==5) // Incremental Torque { int k; CComplex tq=0; for(k=0;kagelist[i].nn;k++) { tq += thisDoc->agelist[i].btcPrev[k] * thisDoc->agelist[i].brc[k] + thisDoc->agelist[i].brcPrev[k] * thisDoc->agelist[i].btc[k] + thisDoc->agelist[i].btsPrev[k] * thisDoc->agelist[i].brs[k] + thisDoc->agelist[i].brsPrev[k] * thisDoc->agelist[i].bts[k]; } tq*=(PI*R*R*thisDoc->Depth)/muo; lua_pushnumber(L,tq); return 1; } if (IntegralType==6) // Incremental Force { int k; CComplex fx=0; CComplex fy=0; CComplex dfx,dfy; if ((round(thisDoc->agelist[i].totalArcLength)==360) && (thisDoc->Frequency!=0)) { for(k=1;kagelist[i].nn;k++) { dfx = (thisDoc->agelist[i].brs[k] + thisDoc->agelist[i].btc[k])*(thisDoc->agelist[i].brsPrev[k-1] - thisDoc->agelist[i].btcPrev[k-1]) + (thisDoc->agelist[i].brs[k-1] - thisDoc->agelist[i].btc[k-1])*(thisDoc->agelist[i].brsPrev[k] + thisDoc->agelist[i].btcPrev[k]) + (thisDoc->agelist[i].brc[k] - thisDoc->agelist[i].bts[k])*(thisDoc->agelist[i].brcPrev[k-1] + thisDoc->agelist[i].btsPrev[k-1]) + (thisDoc->agelist[i].brc[k-1] + thisDoc->agelist[i].bts[k-1])*(thisDoc->agelist[i].brcPrev[k] - thisDoc->agelist[i].btsPrev[k]); dfy = (thisDoc->agelist[i].brsPrev[k] + thisDoc->agelist[i].btcPrev[k])*(thisDoc->agelist[i].brc[k-1] + thisDoc->agelist[i].bts[k-1]) - (thisDoc->agelist[i].brsPrev[k-1] - thisDoc->agelist[i].btcPrev[k-1])*(thisDoc->agelist[i].brc[k] - thisDoc->agelist[i].bts[k]) + (thisDoc->agelist[i].brs[k] + thisDoc->agelist[i].btc[k])*(thisDoc->agelist[i].brcPrev[k-1] + thisDoc->agelist[i].btsPrev[k-1]) - (thisDoc->agelist[i].brs[k-1] - thisDoc->agelist[i].btc[k-1])*(thisDoc->agelist[i].brcPrev[k] - thisDoc->agelist[i].btsPrev[k]); fx+=dfx; fy+=dfy; } fx*=thisDoc->Depth*PI*R/(2.*muo); fy*=thisDoc->Depth*PI*R/(2.*muo); } lua_pushnumber(L,fx); lua_pushnumber(L,fy); return 2; } if (IntegralType==2) // (Time-Average) Stored Energy { int k,n; CComplex W=0; double Ri = thisDoc->agelist[i].ri/R; double Ro = thisDoc->agelist[i].ro/R; double dr = R*(Ro-Ri); for(k=0;kagelist[i].nn;k++) { n=thisDoc->agelist[i].nh[k]; if (n!=0) W+= (thisDoc->agelist[i].brs[k]*thisDoc->agelist[i].brs[k] + thisDoc->agelist[i].brc[k]*thisDoc->agelist[i].brc[k] + thisDoc->agelist[i].bts[k]*thisDoc->agelist[i].bts[k] + thisDoc->agelist[i].btc[k]*thisDoc->agelist[i].btc[k])*dr; else W+=2*dr*thisDoc->agelist[i].btc[k]*thisDoc->agelist[i].btc[k]; } W=Re(W)*(PI*R*thisDoc->Depth)/(2.*muo); if (thisDoc->Frequency!=0) W/=2; lua_pushnumber(L,W); return 1; } return 0; } int CFemmviewDoc::lua_getgapa(lua_State *L) { CatchNullDocument(); CFemmviewDoc * thisDoc; thisDoc=(CFemmviewDoc *)pFemmviewdoc; int i,k; CString myBdryName; CComplex ac=0; double n,tta,R; myBdryName.Format("%s",lua_tostring(L,1)); // figure out which AGE is being asked for i=-1; for(k=0;kagelist.GetSize();k++) if (thisDoc->agelist[k].BdryName==myBdryName) i=k; // if the requested AGE exists, roll up the flux density // at the specified angle. Note: angle is specified in degrees if (i>=0){ R=(thisDoc->agelist[i].ri+thisDoc->agelist[i].ro)/2.; tta=lua_todouble(L,2)*PI/180; for(k=0;kagelist[i].nn;k++) { n=thisDoc->agelist[i].nh[k]; if (n==0) ac+=thisDoc->agelist[i].aco; else ac += (R/n)*(-thisDoc->agelist[i].brs[k]*cos(n*tta) + thisDoc->agelist[i].brc[k]*sin(n*tta)); } } lua_pushnumber(L,ac); return 1; } int CFemmviewDoc::lua_getgapharmonics(lua_State *L) { CatchNullDocument(); CFemmviewDoc * thisDoc; thisDoc=(CFemmviewDoc *)pFemmviewdoc; CString myBdryName; int i,k; if (lua_gettop(L)==0) return 0; // figure out which AGE is being asked for myBdryName.Format("%s",lua_tostring(L,1)); for(k=0,i=-1;kagelist.GetSize();k++) if (thisDoc->agelist[k].BdryName==myBdryName) i=k; if (i<0) return 0; // no AGE here by that name; // if _just_ the name is specified, return the number of the highest harmonic if (lua_gettop(L)==1) { k=thisDoc->agelist[i].nn; if (k==0) lua_pushnumber(L,0); else lua_pushnumber(L,thisDoc->agelist[i].nh[k-1]); return 1; } // otherwise, give all the magnitudes of the harmonic; if (thisDoc->agelist[i].nn==0) return 0; // error case double n = lua_todouble(L,2); CComplex acc=0; CComplex acs=0; CComplex brs=0; CComplex brc=0; CComplex bts=0; CComplex btc=0; if (n<0) return 0; for(k=0;kagelist[i].nn;k++) { if (thisDoc->agelist[i].nh[k]==n) break; } if (kagelist[i].nn) { if (n==0) { acc=thisDoc->agelist[i].aco; acs=0; } else{ double R = (thisDoc->agelist[i].ri+thisDoc->agelist[i].ro)/2.; acc = - (R/n)*thisDoc->agelist[i].brs[k]; acs = (R/n)*thisDoc->agelist[i].brc[k]; brc = thisDoc->agelist[i].brc[k]; brs = thisDoc->agelist[i].brs[k]; btc = thisDoc->agelist[i].btc[k]; bts = thisDoc->agelist[i].bts[k]; } } lua_pushnumber(L,acc); lua_pushnumber(L,acs); lua_pushnumber(L,brc); lua_pushnumber(L,brs); lua_pushnumber(L,btc); lua_pushnumber(L,bts); return 6; }