FEMM/femm/femm.cpp

1419 lines
35 KiB
C++

// femm.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "femm.h"
#include "FemmeDoc.h"
#include "FemmeView.h"
#include "xyplot.h"
#include "problem.h"
#include "FemmviewDoc.h"
#include "FemmviewView.h"
#include "hdrawDoc.h"
#include "hdrawView.h"
#include "hv_problem.h"
#include "hviewDoc.h"
#include "hviewView.h"
#include "cdrawDoc.h"
#include "cdrawView.h"
#include "cv_problem.h"
#include "cviewDoc.h"
#include "cviewView.h"
#include "beladrawDoc.h"
#include "beladrawView.h"
#include "bv_problem.h"
#include "belaviewDoc.h"
#include "belaviewView.h"
#include "femmplotDoc.h"
#include "femmplotView.h"
#include "MainFrm.h"
#include "ChildFrm.h"
#include "promptbox.h"
#include "lua.h"
#include "MyCommandLineInfo.h"
#include "NewDocDlg.h"
#include <afxadv.h>
#include <afxctl.h>
#include <process.h>
#include "MyRecentFileList.h"
#ifdef MATHLINK
#include "mathlink.h"
#endif
extern void lua_baselibopen (lua_State *L);
extern void lua_iolibopen (lua_State *L);
extern void lua_strlibopen (lua_State *L);
extern void lua_mathlibopen (lua_State *L);
extern void lua_dblibopen (lua_State *L);
extern void *pFemmeDoc;
extern void *pFemmviewdoc;
extern void *pBeladrawDoc;
extern void *pBelaviewDoc;
extern void *phdrawDoc;
extern void *phviewDoc;
extern void *pcdrawDoc;
extern void *pcviewDoc;
extern CLuaConsoleDlg *LuaConsole;
extern lua_State *lua;
extern BOOL bLinehook;
extern BOOL lua_byebye;
extern HANDLE hProc;
extern int m_luaWindowStatus;
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CFemmApp
BEGIN_MESSAGE_MAP(CFemmApp, CWinApp)
//{{AFX_MSG_MAP(CFemmApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
ON_COMMAND(ID_FILE_OPEN_LUA_SCRIPT, OnFileOpenLuaScript)
ON_COMMAND(ID_FILE_NEW, OnFileNew)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
//}}AFX_MSG_MAP
// Standard file based document commands
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
// Standard print setup command
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFemmApp construction
CFemmApp::CFemmApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
// defaults
d_luaconsole=FALSE;
d_sepplot=FALSE;
d_defdoc=0;
d_SmartMesh=TRUE;
session_SmartMesh=-1;
d_bShowOutputWindow=TRUE;
bFileLink=FALSE;
bActiveX=FALSE;
IFile=GetExecutablePath()+"ifile.txt";
OFile=GetExecutablePath()+"ofile.txt";
luaShowWindow=NULL;
CompatibilityMode=0;
#ifdef MATHLINK
bMathLink=FALSE;
#endif
ScanPrefs();
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CFemmApp object
CFemmApp theApp;
// lua globals
lua_State *lua; // the main lua object
BOOL bLinehook;
BOOL lua_byebye;
CString luafiles[20];
CLuaConsoleDlg *LuaConsole=NULL;
int luafilepointer; // both used during the CMyCommandLineInfo parsing
CFemmApp *pApp;
HANDLE hProc;
int m_luaWindowStatus=SW_SHOW;
CString luascriptname;
void *pFemmeDoc=NULL; // pointer to the Femme document currently in use
void *pFemmviewdoc=NULL; // pointer to the Femmview document currently in use
void *pBeladrawDoc=NULL; // pointer to the Beladraw document currently in use
void *pBelaviewDoc=NULL; // pointer to the Belaview document currently in use
void *phdrawDoc=NULL; // pointer to the hdraw document currently in use
void *phviewDoc=NULL; // pointer to the hview document currently in use
void *pcdrawDoc=NULL;
void *pcviewDoc=NULL;
#ifdef MATHLINK
// Mathlink;
MLINK alink;
MLENV mathenv;
#endif
/////////////////////////////////////////////////////////////////////////////
// CFemmApp initialization
BOOL CFemmApp::InitInstance()
{
// Initialize OLE libraries
if (!AfxOleInit())
{
MsgBox("OLE initialization failed. Make sure that the OLE libraries are the correct version.");
return FALSE;
}
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
// Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
// Change the registry key under which our settings are stored.
// TODO: You should modify this string to be something appropriate
// such as the name of your company or organization.
SetRegistryKey(_T("Gedanken Magnetics\\FEMM\\4"));
LoadStdProfileSettings(8); // Load standard INI file options (including MRU)
// Parse the command line to see if launched as OLE server
if (RunEmbedded() || RunAutomated())
{
// Register all OLE server (factories) as running. This enables the
// OLE libraries to create objects from other applications.
COleTemplateServer::RegisterAll();
m_luaWindowStatus=SW_SHOWMINNOACTIVE;
}
else
{
// When a server application is launched stand-alone, it is a good idea
// to update the system registry in case it has been damaged.
COleObjectFactory::UpdateRegistryAll();
}
//04EF434A-1A91-495A-85AA-C625602B4AF4
const IID LIBID_ActiveFEMM = { 0x04EF434A, 0x1A91, 0x495A, { 0x85, 0xAA, 0xC6, 0x25, 0x60, 0x2B, 0x4A, 0xF4 } };
// if(AfxOleRegisterTypeLib(AfxGetInstanceHandle(), LIBID_ActiveFEMM, _T("femm.TLB"))==FALSE) MsgBox("TypeLib not registered!");
AfxOleRegisterTypeLib(AfxGetInstanceHandle(), LIBID_ActiveFEMM, _T("femm.TLB"),NULL);
// Initialize Lua
bLinehook=FALSE;
lua=lua_open(4096);
lua_baselibopen(lua);
lua_strlibopen(lua);
lua_mathlibopen(lua);
lua_iolibopen(lua);
// register some common Lua functionality
lua_register(lua,"_ALERT",lua_ERROR);
lua_register(lua,"messagebox",lua_messagebox);
lua_register(lua,"pause",lua_afxpause);
lua_register(lua,"prompt",lua_promptbox);
lua_register(lua,"open",luaOpenDocument);
lua_register(lua,"quit",lua_endapp);
lua_register(lua,"exit",lua_endapp);
lua_register(lua,"create",lua_newdocument);
lua_register(lua,"Complex",lua_Complex);
lua_register(lua,"newdocument",lua_newdocument);
lua_register(lua,"new_document",lua_newdocument);
lua_register(lua,"showpointprops" ,lua_showpointprops);
lua_register(lua,"hidepointprops" ,lua_hidepointprops);
lua_register(lua,"show_point_props",lua_showpointprops);
lua_register(lua,"hide_point_props",lua_hidepointprops);
#ifdef MATHLINK
lua_register(lua,"mlput",lua_to_mathematica);
lua_register(lua,"mlopen",lua_open_mathlink);
lua_register(lua,"mlclose",lua_close_mathlink);
#endif
lua_register(lua,"flput",lua_to_filelink);
lua_register(lua,"setcompatibilitymode",lua_compatibilitymode);
lua_register(lua,"setcurrentdirectory",lua_setcurrentdirectory);
lua_register(lua,"chdir",lua_setcurrentdirectory);
lua_register(lua,"smartmesh",lua_smartmesh);
lua_register(lua,"makeplot",lua_makeplot);
lua_setlinehook(lua,line_hook);
pApp=this;
NumViews=0;
// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views.
CMultiDocTemplate* pFemmeDocTemplate;
pFemmeDocTemplate = new CMultiDocTemplate(
IDR_FEMMETYPE,
RUNTIME_CLASS(CFemmeDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CFemmeView));
AddDocTemplate(pFemmeDocTemplate);
CMultiDocTemplate* pbeladrawDocTemplate;
pbeladrawDocTemplate = new CMultiDocTemplate(
IDR_BELADRAWTYPE,
RUNTIME_CLASS(CbeladrawDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CbeladrawView));
AddDocTemplate(pbeladrawDocTemplate);
CMultiDocTemplate* phdrawDocTemplate;
phdrawDocTemplate = new CMultiDocTemplate(
IDR_HDRAWTYPE,
RUNTIME_CLASS(ChdrawDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(ChdrawView));
AddDocTemplate(phdrawDocTemplate);
CMultiDocTemplate* pcdrawDocTemplate;
pcdrawDocTemplate = new CMultiDocTemplate(
IDR_CDRAWTYPE,
RUNTIME_CLASS(CcdrawDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CcdrawView));
AddDocTemplate(pcdrawDocTemplate);
CMultiDocTemplate* pFemmviewDocTemplate;
pFemmviewDocTemplate = new CMultiDocTemplate(
IDR_FEMMVIEWTYPE,
RUNTIME_CLASS(CFemmviewDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CFemmviewView));
AddDocTemplate(pFemmviewDocTemplate);
CMultiDocTemplate* pBelaviewDocTemplate;
pBelaviewDocTemplate = new CMultiDocTemplate(
IDR_BELAVIEWTYPE,
RUNTIME_CLASS(CbelaviewDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CbelaviewView));
AddDocTemplate(pBelaviewDocTemplate);
CMultiDocTemplate* phviewDocTemplate;
phviewDocTemplate = new CMultiDocTemplate(
IDR_HVIEWTYPE,
RUNTIME_CLASS(ChviewDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(ChviewView));
AddDocTemplate(phviewDocTemplate);
CMultiDocTemplate* pcviewDocTemplate;
pcviewDocTemplate = new CMultiDocTemplate(
IDR_CVIEWTYPE,
RUNTIME_CLASS(CcviewDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CcviewView));
AddDocTemplate(pcviewDocTemplate);
CMultiDocTemplate* pFemmplotDocTemplate;
pFemmplotDocTemplate = new CMultiDocTemplate(
IDR_FEMMPLOTTYPE,
RUNTIME_CLASS(CFemmplotDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CFemmplotView));
AddDocTemplate(pFemmplotDocTemplate);
// create main MDI Frame window
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
m_pMainWnd = pMainFrame;
// Enable drag/drop open
m_pMainWnd->DragAcceptFiles();
// Enable DDE Execute open
EnableShellOpen();
RegisterShellFileTypes(TRUE);
#ifdef MATHLINK
if (__argc>1)
if(strcmp("-mathlink",__argv[1])==0) bMathLink=TRUE;
if(!bMathLink)
#endif
{
// Parse command line for standard shell commands, DDE, file open
CMyCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// don't display annoying "new document" dialog automatically
if(cmdInfo.m_nShellCommand==CCommandLineInfo::FileNew)
{
cmdInfo.m_nShellCommand=CCommandLineInfo::FileNothing;
switch(d_defdoc)
{
case 1:
OnFileNew();
break;
case 2:
CreateNewDocument(0);
break;
case 3:
CreateNewDocument(1);
break;
case 4:
CreateNewDocument(2);
break;
case 5:
CreateNewDocument(3);
break;
default:
break;
}
// load up most recently used file if nothing else on tap
// if ((luascriptname.IsEmpty()) && (m_pRecentFileList->GetSize()>0))
// m_pMainWnd->PostMessage(WM_COMMAND, ID_FILE_MRU_FILE1);
}
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo)) return FALSE;
}
// lua extension: if we are running in quiet mode, hide window
this->m_nCmdShow=m_luaWindowStatus;
// The main window has been initialized, so show and update it.
pMainFrame->ShowWindow(m_nCmdShow);
pMainFrame->UpdateWindow();
#ifdef MATHLINK
// If -mathlink has been specified on the command line, open the link;
if (bMathLink)
{
mathenv = MLInitialize(0);
alink = MLOpen(__argc,__argv);
if(alink==NULL){
MsgBox("problem opening a MathLink link\n");
bMathLink=FALSE;
}
else MLActivate(alink);
}
#endif
// !!!
// Load up an external lua script that does canned initialization.
// Users can modify this file to get their own custom initialization functionality.
CString initlua=GetExecutablePath()+"init.lua";
FILE *fp;
if ( (fp=fopen(initlua,"rt")) != NULL)
{
fclose(fp);
if (int lua_error_code=lua_dofile(lua,initlua)!=0)
{
if (lua_error_code==LUA_ERRRUN)
AfxMessageBox("Run Error in init.lua");
if (lua_error_code==LUA_ERRMEM)
AfxMessageBox("Lua memory Error in init.lua");
if (lua_error_code==LUA_ERRERR)
AfxMessageBox("User error error in init.lua");
if (lua_error_code==LUA_ERRFILE)
AfxMessageBox("File Error in init.lua");
}
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
CString m_compiledate;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
// No message handlers
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
m_compiledate = __DATE__;
// m_compiledate = "11Apr2012";
//}}AFX_DATA_INIT
#ifdef MATHLINK
#ifdef _DEBUG
m_compiledate += " (Mathematica Debug)";
#else
m_compiledate += " (Mathematica Build)";
#endif
#endif
#ifdef _WIN64
m_compiledate += " (x64)";
#endif
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
DDX_Text(pDX, IDC_COMPILEDATE, m_compiledate);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// App command to run the dialog
void CFemmApp::OnAppAbout()
{
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
/////////////////////////////////////////////////////////////////////////////
// CFemmApp message handlers
int CFemmApp::ExitInstance()
{
lua_close(lua);
#ifdef MATHLINK
if(bMathLink){
MLClose(alink);
MLDeinitialize(mathenv);
bMathLink=FALSE;
}
#endif
return CWinApp::ExitInstance();
}
void CFemmApp::OnFileOpenLuaScript()
{
static char BASED_CODE szFilter[] = "Lua Script Files (*.lua)|*.lua|";
char ext[]=".lua";
CFileDialog MyDlg(TRUE,ext,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
if(MyDlg.DoModal()==IDOK){
luascriptname=MyDlg.GetPathName();
CString FolderPath=luascriptname.Left(MyDlg.m_ofn.nFileOffset);
SetCurrentDirectory(FolderPath);
}
}
BOOL CFemmApp::OnIdle(LONG lCount)
{
static time_t timestamp=0;
static char inbuff[4096];
// if a lua script was specified on the command line, run it.
// Invoking the lua script here, rather than in InitInstance,
// makes sure that everything is initialized correctly before
// the lua script starts to run.
if (luascriptname.GetLength()!=0){
if(m_luaWindowStatus==SW_SHOW) bLinehook=NormalLua;
else bLinehook=HiddenLua;
CString doscript=luascriptname;
luascriptname.Empty();
int lua_error_code;
lua_byebye=FALSE;
CStatusBar *StatBar=(CStatusBar *)((CMainFrame *)m_pMainWnd)->GetMessageBar();
StatBar->SetPaneText(0,"EXECUTING LUASCRIPT -- HIT <ESC> TO ABORT",TRUE);
if (lua_error_code=lua_dofile(lua,doscript)!=0)
{
// if (lua_error_code==LUA_ERRRUN)
// AfxMessageBox("Run Error");
if (lua_error_code==LUA_ERRMEM)
AfxMessageBox("Lua memory Error");
if (lua_error_code==LUA_ERRERR)
AfxMessageBox("User error error");
if (lua_error_code==LUA_ERRFILE)
AfxMessageBox("File Error");
}
StatBar->SetPaneText(0,"Ready",TRUE);
if(lua_byebye==TRUE){
ASSERT(AfxGetMainWnd() != NULL);
AfxGetMainWnd()->PostMessage(WM_CLOSE);
}
bLinehook=FALSE;
}
#ifdef MATHLINK
// Sniff for any Mathlink message if Mathlink is connected
if (bMathLink)
{
MLFlush(alink);
if(MLReady(alink))
{
char *mathstring;
CString luacmd;
if(MLGetString(alink,(const char **) &mathstring))
{
luacmd=mathstring;
MLDisownString(alink,mathstring);
if(m_luaWindowStatus==SW_SHOW) bLinehook=NormalLua;
else bLinehook=HiddenLua;
int lua_error_code;
lua_byebye=FALSE;
CStatusBar *StatBar=(CStatusBar *)((CMainFrame *)m_pMainWnd)->GetMessageBar();
// StatBar->SetPaneText(0,"EXECUTING LUASCRIPT -- HIT <ESC> TO ABORT",TRUE);
if (lua_error_code=lua_dostring(lua,luacmd)!=0)
{
// if (lua_error_code==LUA_ERRRUN)
// AfxMessageBox("Run Error");
if (lua_error_code==LUA_ERRMEM)
AfxMessageBox("Lua memory Error");
if (lua_error_code==LUA_ERRERR)
AfxMessageBox("User error error");
if (lua_error_code==LUA_ERRFILE)
AfxMessageBox("File Error");
}
// StatBar->SetPaneText(0,"Ready",TRUE);
if(lua_byebye==TRUE){
ASSERT(AfxGetMainWnd() != NULL);
AfxGetMainWnd()->PostMessage(WM_CLOSE);
}
bLinehook=FALSE;
time(&timestamp);
}
else{
MsgBox("MathLink::Closing connection");
MLClose(alink);
MLDeinitialize(mathenv);
bMathLink=FALSE;
}
}
// have to return something other than zero
// so that the program will keep checking
// to see if there is a new mathlink message;
// A kludge is to call for a 1ms sleep. Otherwise,
// the program hogs all the CPU time checking for
// new messages, slowing down the entire system.
if (time(NULL)!=timestamp) Sleep(1);
CWinApp::OnIdle(0);
return TRUE;
}
#endif
// Sniff for kludge IPC messages sent via temporary files
if (bFileLink)
{
FILE *fp;
char *s;
if ( (fp=fopen(IFile,"rt")) != NULL)
{
s=fgets(inbuff,4096,fp);
fclose(fp);
if((s!=NULL) && (strlen(inbuff)!=0))
{
DeleteFile(IFile);
if(m_luaWindowStatus==SW_SHOW) bLinehook=NormalLua;
else bLinehook=HiddenLua;
int lua_error_code;
lua_byebye=FALSE;
CStatusBar *StatBar=(CStatusBar *)((CMainFrame *)m_pMainWnd)->GetMessageBar();
// StatBar->SetPaneText(0,"EXECUTING LUASCRIPT -- HIT <ESC> TO ABORT",TRUE);
if (lua_error_code=lua_dostring(lua,inbuff)!=0)
{
// if (lua_error_code==LUA_ERRRUN)
// AfxMessageBox("Run Error");
if (lua_error_code==LUA_ERRMEM)
AfxMessageBox("Lua memory Error");
if (lua_error_code==LUA_ERRERR)
AfxMessageBox("User error error");
if (lua_error_code==LUA_ERRFILE)
AfxMessageBox("File Error");
}
// StatBar->SetPaneText(0,"Ready",TRUE);
if(lua_byebye==TRUE){
ASSERT(AfxGetMainWnd() != NULL);
AfxGetMainWnd()->PostMessage(WM_CLOSE);
}
bLinehook=FALSE;
time(&timestamp);
}
}
// have to return something other than zero
// so that the program will keep checking
// to see if there is a new mathlink message;
// A kludge is to call for a 1ms sleep. Otherwise,
// the program hogs all the CPU time checking for
// new messages, slowing down the entire system.
if(time(NULL)!=timestamp) Sleep(1);
CWinApp::OnIdle(0);
return TRUE;
}
return CWinApp::OnIdle(lCount);
}
void CFemmApp::line_hook(lua_State *L, lua_Debug *ar)
{
MSG msg;
while ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
if ((msg.message == WM_KEYDOWN) && (msg.wParam == VK_ESCAPE))
{
bLinehook=FALSE;
// If there is a running process (e.g. the solver), kill it
if (hProc!=NULL) TerminateProcess(hProc,NULL);
hProc=NULL;
// bust out of script
lua_error(L,NULL);
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
int CFemmApp::lua_endapp(lua_State *L)
{
lua_byebye=TRUE;
return 0;
}
int CFemmApp::luaOpenDocument(lua_State *L)
{
CString temp;
int n=lua_gettop(L);
if (n==0) return 0;
temp.Format("%s",lua_tostring(L,1));
if (n>1){
switch((int) lua_todouble(L,2))
{
case 1:
theApp.luaShowWindow=SW_MINIMIZE;
break;
case 2:
theApp.luaShowWindow=SW_RESTORE;
break;
case 3:
theApp.luaShowWindow=SW_MAXIMIZE;
break;
default:
theApp.luaShowWindow=NULL;
}
}
theApp.OpenDocumentFile(temp);
return 0;
}
int CFemmApp::lua_promptbox(lua_State *L)
{
CPromptBox dlg;
if(lua_gettop(L)>0) dlg.mytitle = lua_tostring(L,1);
dlg.DoModal();
lua_pushstring(L,dlg.instring);
return TRUE;
}
int CFemmApp::lua_afxpause(lua_State * L)
{
AfxMessageBox("LUA pause");
return 0;
}
int CFemmApp::lua_messagebox(lua_State *L)
{
CString errmsg;
errmsg.Format("%s",lua_tostring(L,1));
AfxMessageBox(errmsg,MB_ICONINFORMATION);
return 0;
}
int CFemmApp::lua_ERROR(lua_State *L)
{
CString errmsg;
errmsg.Format("%s",lua_tostring(L,1));
theApp.LuaErrmsg=errmsg;
// Somthing went wrong in lua execution
// Windows dosn't have stdout so lets afxmessagebox it
if(theApp.bFileLink)
{
FILE* fp;
fp=fopen(theApp.OFile,"wt");
if(fp!=NULL){
errmsg.Replace("error:","");
errmsg.Replace("\"","\\\"");
errmsg.Replace("\n","\\n");
fprintf(fp,"error(\"FEMM returns:\\n%s\\n\")", (const char *) errmsg);
fclose(fp);
}
}
else if (!theApp.bActiveX) AfxMessageBox(errmsg);
return 0;
}
int CFemmApp::lua_newdocument(lua_State *L)
{
if(lua_gettop(L)>0) theApp.CreateNewDocument((int) lua_todouble(L,1));
return 0;
}
void CFemmApp::CreateNewDocument(int n)
{
// First, catch a special case where the new document
// is an XY plot and we want to open it in another window
// all together
if ((n==7) && (d_sepplot))
{
char CommandLine[MAX_PATH];
sprintf(CommandLine,"%sfemmplot.exe", (const char *) ((CFemmApp *)AfxGetApp())->GetExecutablePath());
STARTUPINFO StartupInfo2 = {0};
PROCESS_INFORMATION ProcessInfo2;
StartupInfo2.cb = sizeof(STARTUPINFO);
CreateProcess(NULL,CommandLine, NULL, NULL, FALSE,0, NULL, NULL, &StartupInfo2, &ProcessInfo2);
CloseHandle(ProcessInfo2.hProcess);
CloseHandle(ProcessInfo2.hThread);
return;
}
POSITION tpos;
CDocTemplate* pTemp;
int k=0;
tpos=AfxGetApp()->GetFirstDocTemplatePosition( );
for(k=0;k<=n;k++)
if(tpos!=NULL)
pTemp=AfxGetApp()->GetNextDocTemplate(tpos);
if(pTemp!=NULL) pTemp->OpenDocumentFile(NULL);
}
BOOL CFemmApp::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
// TODO: Add your specialized code here and/or call the base class
if (bLinehook!=FALSE) return TRUE;
return CWinApp::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
CString CFemmApp::GetExecutablePath()
{
char szPath[MAX_PATH];
char szDrive[64];
char szDir[MAX_PATH];
GetModuleFileName(NULL, szPath, MAX_PATH);
_splitpath(szPath, szDrive, szDir, NULL, NULL);
return ((CString) szDrive) + szDir;
}
int CFemmApp::HowManyDocs()
{
POSITION tpos,dpos;
CDocTemplate* pTemp;
int k=0;
tpos=AfxGetApp()->GetFirstDocTemplatePosition( );
while(tpos!=NULL)
{
pTemp=AfxGetApp()->GetNextDocTemplate(tpos);
dpos=pTemp->GetFirstDocPosition();
while(dpos!=NULL)
{
pTemp->GetNextDoc(dpos);
k++;
}
}
return k;
}
void CFemmApp::ForceViewPrefReload()
{
// this is a kludge to get all of the views
// to reload their color mappings from disk.
POSITION tpos,dpos,pos;
CDocTemplate* pTemp;
tpos=AfxGetApp()->GetFirstDocTemplatePosition( );
// femme
pTemp=AfxGetApp()->GetNextDocTemplate(tpos);
dpos=pTemp->GetFirstDocPosition();
while(dpos!=NULL)
{
CFemmeDoc *pDoc;
CFemmeView *pView;
pDoc = (CFemmeDoc *)pTemp->GetNextDoc(dpos);
pos=pDoc->GetFirstViewPosition();
pView=(CFemmeView *)pDoc->GetNextView(pos);
pView->ScanPreferences();
pDoc->ScanPreferences();
pView->InvalidateRect(NULL);
}
// beladraw
pTemp=AfxGetApp()->GetNextDocTemplate(tpos);
dpos=pTemp->GetFirstDocPosition();
while(dpos!=NULL)
{
CbeladrawDoc *pDoc;
CbeladrawView *pView;
pDoc = (CbeladrawDoc *)pTemp->GetNextDoc(dpos);
pos=pDoc->GetFirstViewPosition();
pView=(CbeladrawView *)pDoc->GetNextView(pos);
pView->ScanPreferences();
pDoc->ScanPreferences();
pView->InvalidateRect(NULL);
}
// hdraw
pTemp=AfxGetApp()->GetNextDocTemplate(tpos);
dpos=pTemp->GetFirstDocPosition();
while(dpos!=NULL)
{
ChdrawDoc *pDoc;
ChdrawView *pView;
pDoc = (ChdrawDoc *)pTemp->GetNextDoc(dpos);
pos=pDoc->GetFirstViewPosition();
pView=(ChdrawView *)pDoc->GetNextView(pos);
pView->ScanPreferences();
pDoc->ScanPreferences();
pView->InvalidateRect(NULL);
}
// cdraw
pTemp=AfxGetApp()->GetNextDocTemplate(tpos);
dpos=pTemp->GetFirstDocPosition();
while(dpos!=NULL)
{
CcdrawDoc *pDoc;
CcdrawView *pView;
pDoc = (CcdrawDoc *)pTemp->GetNextDoc(dpos);
pos=pDoc->GetFirstViewPosition();
pView=(CcdrawView *)pDoc->GetNextView(pos);
pView->ScanPreferences();
pDoc->ScanPreferences();
pView->InvalidateRect(NULL);
}
// femmview
pTemp=AfxGetApp()->GetNextDocTemplate(tpos);
dpos=pTemp->GetFirstDocPosition();
while(dpos!=NULL)
{
CFemmviewDoc *pDoc;
CFemmviewView *pView;
pDoc = (CFemmviewDoc *)pTemp->GetNextDoc(dpos);
pos=pDoc->GetFirstViewPosition();
pView=(CFemmviewView *)pDoc->GetNextView(pos);
pView->ScanPreferences();
pDoc->ScanPreferences();
pView->InvalidateRect(NULL);
}
// belaview
pTemp=AfxGetApp()->GetNextDocTemplate(tpos);
dpos=pTemp->GetFirstDocPosition();
while(dpos!=NULL)
{
CbelaviewDoc *pDoc;
CbelaviewView *pView;
pDoc = (CbelaviewDoc *)pTemp->GetNextDoc(dpos);
pos=pDoc->GetFirstViewPosition();
pView=(CbelaviewView *)pDoc->GetNextView(pos);
pView->ScanPreferences();
pDoc->ScanPreferences();
pView->InvalidateRect(NULL);
}
// hview
pTemp=AfxGetApp()->GetNextDocTemplate(tpos);
dpos=pTemp->GetFirstDocPosition();
while(dpos!=NULL)
{
ChviewDoc *pDoc;
ChviewView *pView;
pDoc = (ChviewDoc *)pTemp->GetNextDoc(dpos);
pos=pDoc->GetFirstViewPosition();
pView=(ChviewView *)pDoc->GetNextView(pos);
pView->ScanPreferences();
pDoc->ScanPreferences();
pView->InvalidateRect(NULL);
}
// cview
pTemp=AfxGetApp()->GetNextDocTemplate(tpos);
dpos=pTemp->GetFirstDocPosition();
while(dpos!=NULL)
{
CcviewDoc *pDoc;
CcviewView *pView;
pDoc = (CcviewDoc *)pTemp->GetNextDoc(dpos);
pos=pDoc->GetFirstViewPosition();
pView=(CcviewView *)pDoc->GetNextView(pos);
pView->ScanPreferences();
pDoc->ScanPreferences();
pView->InvalidateRect(NULL);
}
// general prefs
ScanPrefs();
bShowOutputWindow=d_bShowOutputWindow;
}
void CFemmApp::OnFileNew()
{
CNewDocDlg dlg;
if(dlg.DoModal()==IDOK) CreateNewDocument(dlg.doctype);
}
char* StripKey(char *c);
void CFemmApp::ScanPrefs()
{
FILE *fp;
CString fname = ((CFemmApp *)AfxGetApp())->GetExecutablePath() + "femm.cfg";
fp=fopen(fname,"rt");
if (fp!=NULL)
{
BOOL flag=FALSE;
char s[1024];
char q[1024];
char *v;
// parse the file
while (fgets(s,1024,fp)!=NULL)
{
sscanf(s,"%s",q);
if( _strnicmp(q,"<ShowConsole>",13)==0)
{
v=StripKey(s);
sscanf(v,"%i",&d_luaconsole);
q[0]=NULL;
}
if( _strnicmp(q,"<SeparatePlots>",15)==0)
{
v=StripKey(s);
sscanf(v,"%i",&d_sepplot);
q[0]=NULL;
}
if( _strnicmp(q,"<ShowOutputWindow>",18)==0)
{
v=StripKey(s);
sscanf(v,"%i",&d_bShowOutputWindow);
q[0]=NULL;
}
if( _strnicmp(q,"<SmartMesh>",18)==0)
{
v=StripKey(s);
sscanf(v,"%i",&d_SmartMesh);
q[0]=NULL;
}
if( _strnicmp(q,"<DefaultType>",13)==0)
{
v=StripKey(s);
sscanf(v,"%i",&d_defdoc);
q[0]=NULL;
}
}
fclose(fp);
}
}
int CFemmApp::lua_showpointprops(lua_State *L)
{
CMainFrame * pfrm;
pfrm=(CMainFrame *)AfxGetApp()->GetMainWnd();
pfrm->m_dlgBar.ShowWindow(SW_SHOWNOACTIVATE);
return 0;
}
int CFemmApp::lua_hidepointprops(lua_State *L)
{
CMainFrame * pfrm;
pfrm=(CMainFrame *)AfxGetApp()->GetMainWnd();
pfrm->m_dlgBar.ShowWindow(SW_HIDE);
return 0;
}
// override of LoadStdProfileSettings so that I can get
// the suffix in the MRU files list.
AFX_STATIC_DATA const TCHAR _afxFileSection[] = _T("Recent File List");
AFX_STATIC_DATA const TCHAR _afxFileEntry[] = _T("File%d");
AFX_STATIC_DATA const TCHAR _afxPreviewSection[] = _T("Settings");
AFX_STATIC_DATA const TCHAR _afxPreviewEntry[] = _T("PreviewPages");
void CFemmApp::LoadStdProfileSettings(UINT nMaxMRU)
{
ASSERT_VALID(this);
ASSERT(m_pRecentFileList == NULL);
if (nMaxMRU != 0)
{
// create file MRU since nMaxMRU not zero
// using MyCRecentFileList override
m_pRecentFileList = new MyCRecentFileList(0, _afxFileSection, _afxFileEntry, nMaxMRU);
m_pRecentFileList->ReadList();
}
// 0 by default means not set
m_nNumPreviewPages = GetProfileInt(_afxPreviewSection, _afxPreviewEntry, 0);
}
#ifdef MATHLINK
int CFemmApp::lua_to_mathematica(lua_State *L)
{
if (((CFemmApp *)AfxGetApp())->bMathLink==FALSE) return 0;
int n = lua_gettop(L);
MLPutFunction(alink, "List", 1);
for(int k=1;k<=n;k++)
{
MLPutFunction(alink, "Sequence", 2);
if(lua_type(L,k)==LUA_TNUMBER){
CComplex z=lua_tonumber(L,k);
if (Im(z)==0) MLPutReal(alink,Re(z));
else{
MLPutFunction(alink, "Complex", 2);
MLPutReal(alink, Re(z));
MLPutReal(alink, Im(z));
}
}
else{
CString s=lua_tostring(L,k);
MLPutString(alink,s);
}
}
MLPutFunction(alink, "Sequence", 0);
MLEndPacket(alink);
return 0;
}
int CFemmApp::lua_open_mathlink(lua_State *L)
{
if (((CFemmApp *)AfxGetApp())->bMathLink==FALSE)
{
mathenv = MLInitialize(0);
alink = MLOpen(__argc,__argv);
if(alink==NULL) MsgBox("problem opening a MathLink link\n");
else ((CFemmApp *)AfxGetApp())->bMathLink=TRUE;
}
return 0;
}
int CFemmApp::lua_close_mathlink(lua_State *L)
{
if (((CFemmApp *)AfxGetApp())->bMathLink==TRUE)
{
MLClose(alink);
MLDeinitialize(mathenv);
((CFemmApp *)AfxGetApp())->bMathLink=FALSE;
}
return 0;
}
#endif
BOOL CFemmApp::MOCheckIfAlreadyOpen(CString p)
{
POSITION tpos,dpos;
CDocTemplate* pTemp;
CFemmviewDoc* pDoc;
CString DocTitle,ThisTitle,ThisTitleAlt;
DocTitle=p;
DocTitle.MakeLower();
// get pointer to document template for FemmviewDoc
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->GetPathName();
ThisTitle.MakeLower();
ThisTitleAlt="\"" + ThisTitle +"\"";
if((ThisTitle==DocTitle) || (ThisTitleAlt==DocTitle))
{
lua_pushstring(lua,pDoc->GetTitle());
pDoc->lua_switchfocus(lua);
pDoc->lua_reload((lua_State *) NULL);
// Alternate idea here is:
// pDoc->OnReload();
return TRUE;
}
}
return FALSE;
}
BOOL CFemmApp::EOCheckIfAlreadyOpen(CString p)
{
POSITION tpos,dpos;
CDocTemplate* pTemp;
CbelaviewDoc* pDoc;
CString DocTitle,ThisTitle,ThisTitleAlt;
DocTitle=p;
DocTitle.MakeLower();
// get pointer to document template for FemmviewDoc
tpos=AfxGetApp()->GetFirstDocTemplatePosition( );
for(int i=0;i<6;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=(CbelaviewDoc *)pTemp->GetNextDoc(dpos);
ThisTitle=pDoc->GetPathName();
ThisTitle.MakeLower();
ThisTitleAlt="\"" + ThisTitle +"\"";
if((ThisTitle==DocTitle) || (ThisTitleAlt==DocTitle))
{
lua_pushstring(lua,pDoc->GetTitle());
pDoc->lua_switchfocus(lua);
pDoc->lua_reload((lua_State *) NULL);
// Alternate idea here is:
// pDoc->OnReload();
return TRUE;
}
}
return FALSE;
}
BOOL CFemmApp::HOCheckIfAlreadyOpen(CString p)
{
POSITION tpos,dpos;
CDocTemplate* pTemp;
ChviewDoc* pDoc;
CString DocTitle,ThisTitle,ThisTitleAlt;
DocTitle=p;
DocTitle.MakeLower();
// get pointer to document template for FemmviewDoc
tpos=AfxGetApp()->GetFirstDocTemplatePosition( );
for(int i=0;i<7;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=(ChviewDoc *)pTemp->GetNextDoc(dpos);
ThisTitle=pDoc->GetPathName();
ThisTitle.MakeLower();
ThisTitleAlt="\"" + ThisTitle +"\"";
if((ThisTitle==DocTitle) || (ThisTitleAlt==DocTitle))
{
lua_pushstring(lua,pDoc->GetTitle());
pDoc->lua_switchfocus(lua);
pDoc->lua_reload((lua_State *) NULL);
// Alternate idea here is:
// pDoc->OnReload();
return TRUE;
}
}
return FALSE;
}
BOOL CFemmApp::COCheckIfAlreadyOpen(CString p)
{
POSITION tpos,dpos;
CDocTemplate* pTemp;
CcviewDoc* pDoc;
CString DocTitle,ThisTitle,ThisTitleAlt;
DocTitle=p;
DocTitle.MakeLower();
// get pointer to document template for FemmviewDoc
tpos=AfxGetApp()->GetFirstDocTemplatePosition( );
for(int i=0;i<8;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=(CcviewDoc *)pTemp->GetNextDoc(dpos);
ThisTitle=pDoc->GetPathName();
ThisTitle.MakeLower();
ThisTitleAlt="\"" + ThisTitle +"\"";
if((ThisTitle==DocTitle) || (ThisTitleAlt==DocTitle))
{
lua_pushstring(lua,pDoc->GetTitle());
pDoc->lua_switchfocus(lua);
pDoc->lua_reload((lua_State *) NULL);
// Alternate idea here is:
// pDoc->OnReload();
return TRUE;
}
}
return FALSE;
}
int CFemmApp::lua_to_filelink(lua_State *L)
{
FILE *fp;
CString LuaResult,s;
int n = lua_gettop(L);
do{
fp=fopen(((CFemmApp*) AfxGetApp())->OFile,"wt");
} while(fp==NULL);
if(n==0) LuaResult="[]\n";
else{
LuaResult="[";
for(int k=1;k<=n;k++)
{
s=lua_tostring(L,k);
if(k!=n) LuaResult = LuaResult + s + ",";
else LuaResult = LuaResult + s + "]\n";
}
}
fprintf(fp,"%s", (const char *) LuaResult);
fclose(fp);
return 0;
}
void CFemmApp::OnFileOpen()
{
CWinApp::OnFileOpen(); // Use just this line to recoup the default behavior;
}
int CFemmApp::lua_compatibilitymode(lua_State *L)
{
if (lua_gettop(L)!=0) ((CFemmApp*) AfxGetApp())->CompatibilityMode=(int) lua_todouble(L,1);
return 0;
}
int CFemmApp::lua_setcurrentdirectory(lua_State *L)
{
if (lua_gettop(L)!=0)
{
CString temp;
temp.Format("%s",lua_tostring(L,1));
SetCurrentDirectory(temp);
}
return 0;
}
int CFemmApp::lua_smartmesh(lua_State *L)
{
// crowbar smartmesh off for entire program for the entire session
if (lua_gettop(L)!=0) ((CFemmApp*) AfxGetApp())->session_SmartMesh = (int)lua_todouble(L,1);
return 0;
}
int CFemmApp::lua_Complex(lua_State *L)
{
int n;
CComplex y;
n=lua_gettop(L);
if (n==2)
y=lua_tonumber(L,1)+I*lua_tonumber(L,2);
else if (n==1)
y=lua_tonumber(L,1);
else y=0;
lua_pushnumber(L,y);
return 1;
}
int CFemmApp::lua_makeplot(lua_State *L)
{
CXYPlot xyplot;
int k;
int nTables=0;
int nStrings=0;
int n=lua_gettop(L);
for(k=1;k<=n;k++)
{
if (lua_istable(L,k)){
nTables++;
}
if (lua_isstring(L,k)){
nStrings++;
}
}
MsgBox("Tables = %i\nStrings = %i",nTables,nStrings);
return 0;
}