223 lines
5.8 KiB
C++
223 lines
5.8 KiB
C++
// ActiveFEMM.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "femm.h"
|
|
#include "lua.h"
|
|
#include "luadebug.h"
|
|
#include "luaconsoledlg.h"
|
|
#include "ActiveFEMM.h"
|
|
#include "mainfrm.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
|
|
extern lua_State *lua;
|
|
extern BOOL bLinehook;
|
|
extern BOOL lua_byebye;
|
|
extern HANDLE hProc;
|
|
extern int m_luaWindowStatus;
|
|
extern CFemmApp theApp;
|
|
|
|
CString LuaResult;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// ActiveFEMM
|
|
|
|
IMPLEMENT_DYNCREATE(ActiveFEMM, CCmdTarget)
|
|
|
|
ActiveFEMM::ActiveFEMM()
|
|
{
|
|
EnableAutomation();
|
|
EnableTypeLib();
|
|
|
|
// To keep the application running as long as an OLE automation
|
|
// object is active, the constructor calls AfxOleLockApp.
|
|
|
|
AfxOleLockApp();
|
|
|
|
lua_register(lua,"actxprint", lua_to_string);
|
|
lua_register(lua,"lua2matlab",lua_to_matlab);
|
|
}
|
|
|
|
ActiveFEMM::~ActiveFEMM()
|
|
{
|
|
// To terminate the application when all objects created with
|
|
// with OLE automation, the destructor calls AfxOleUnlockApp.
|
|
|
|
AfxOleUnlockApp();
|
|
}
|
|
|
|
|
|
void ActiveFEMM::OnFinalRelease()
|
|
{
|
|
// When the last reference for an automation object is released
|
|
// OnFinalRelease is called. The base class will automatically
|
|
// deletes the object. Add additional cleanup required for your
|
|
// object before calling the base class.
|
|
|
|
// We have to close things in a funny way so that FEMM shuts down
|
|
// the way that it expects to. First, the call to AfxOleSetUserCtrl
|
|
// makes it so that the the application won't get closed when the
|
|
// base class version of OnFinalRelease gets called.
|
|
AfxOleSetUserCtrl(TRUE);
|
|
|
|
// Then, post a message to the main window requesting a shutdown.
|
|
// This is the way that FEMM likes to shut down. Since the message
|
|
// has been posted rather than sent, it will be acted upon after
|
|
// ActiveFEMM has shut itself down.
|
|
AfxGetMainWnd()->PostMessage(WM_CLOSE);
|
|
|
|
// Then, call the base class to shut down ActiveFEMM
|
|
CCmdTarget::OnFinalRelease();
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(ActiveFEMM, CCmdTarget)
|
|
//{{AFX_MSG_MAP(ActiveFEMM)
|
|
// NOTE - the ClassWizard will add and remove mapping macros here.
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
BEGIN_DISPATCH_MAP(ActiveFEMM, CCmdTarget)
|
|
//{{AFX_DISPATCH_MAP(ActiveFEMM)
|
|
DISP_FUNCTION(ActiveFEMM, "call2femm", call2femm, VT_BSTR, VTS_BSTR)
|
|
DISP_FUNCTION(ActiveFEMM, "mlab2femm", mlab2femm, VT_BSTR, VTS_BSTR)
|
|
//}}AFX_DISPATCH_MAP
|
|
END_DISPATCH_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Type library ID and version
|
|
// {04EF434A-1A91-495A-85AA-C625602B4AF4}
|
|
static const GUID _tlid =
|
|
{ 0x04EF434A, 0x1A91, 0x495A, { 0x85, 0xAA, 0xC6, 0x25, 0x60, 0x2B, 0x4A, 0xF4 } };
|
|
const WORD _wVerMajor = 1;
|
|
const WORD _wVerMinor = 0;
|
|
IMPLEMENT_OLETYPELIB(ActiveFEMM, _tlid, _wVerMajor, _wVerMinor)
|
|
|
|
|
|
|
|
|
|
// Note: we add support for IID_IActiveFEMM to support typesafe binding
|
|
// from VBA. This IID must match the GUID that is attached to the
|
|
// dispinterface in the .ODL file.
|
|
|
|
// {E08185B4-FEDF-4B1B-A88D-D40C97625060}
|
|
static const IID IID_IActiveFEMM =
|
|
{ 0xe08185b4, 0xfedf, 0x4b1b, { 0xa8, 0x8d, 0xd4, 0xc, 0x97, 0x62, 0x50, 0x60 } };
|
|
|
|
BEGIN_INTERFACE_MAP(ActiveFEMM, CCmdTarget)
|
|
INTERFACE_PART(ActiveFEMM, IID_IActiveFEMM, Dispatch)
|
|
END_INTERFACE_MAP()
|
|
|
|
// {0A35D5BD-DCA9-4C39-9512-1D89A1A37047}
|
|
IMPLEMENT_OLECREATE2(ActiveFEMM, "femm.ActiveFEMM", 0xa35d5bd, 0xdca9, 0x4c39, 0x95, 0x12, 0x1d, 0x89, 0xa1, 0xa3, 0x70, 0x47)
|
|
|
|
BOOL ActiveFEMM::GetDispatchIID(IID* pIID)
|
|
{
|
|
*pIID = IID_IActiveFEMM;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// ActiveFEMM message handlers
|
|
|
|
BSTR ActiveFEMM::call2femm(LPCTSTR luacmd)
|
|
{
|
|
// executes the line contained in luacmd
|
|
// and returns a string containing the results
|
|
// of the command with the results separated
|
|
// by newline characters.
|
|
CString strToLua;
|
|
|
|
theApp.MatlabLoveNote.Empty();
|
|
strToLua=luacmd;
|
|
strToLua="actxprint(" + strToLua +")";
|
|
DoLuaCmd(strToLua);
|
|
|
|
// Returns the result of errors that are trapped
|
|
// via message boxes during a normal UI session
|
|
if(theApp.MatlabLoveNote.GetLength()>0)
|
|
{
|
|
LuaResult.Format("error: %s",theApp.MatlabLoveNote);
|
|
}
|
|
return LuaResult.AllocSysString();
|
|
}
|
|
|
|
BSTR ActiveFEMM::mlab2femm(LPCTSTR luacmd)
|
|
{
|
|
// executes the line contained in luacmd
|
|
// and returns a string containing the results
|
|
// of the command formatted in matlab format.
|
|
// One would expect that all the results are
|
|
// real numbers, in which case we can eval()
|
|
// the result in matlab to get a vector of numbers.
|
|
CString strToLua;
|
|
|
|
theApp.MatlabLoveNote.Empty();
|
|
strToLua=luacmd;
|
|
strToLua="lua2matlab(" + strToLua +")";
|
|
DoLuaCmd(strToLua);
|
|
|
|
// Returns the result of errors that are trapped
|
|
// via message boxes during a normal UI session
|
|
if(theApp.MatlabLoveNote.GetLength()>0)
|
|
{
|
|
LuaResult.Format("error: %s",theApp.MatlabLoveNote);
|
|
}
|
|
|
|
return LuaResult.AllocSysString();
|
|
}
|
|
|
|
void ActiveFEMM::DoLuaCmd(CString strToLua)
|
|
{
|
|
LuaResult.Empty();
|
|
if(m_luaWindowStatus==SW_SHOW) bLinehook=NormalLua;
|
|
else bLinehook=HiddenLua;
|
|
theApp.bActiveX=TRUE;
|
|
if (lua_dostring(lua,strToLua)!=0) LuaResult=theApp.LuaErrmsg;
|
|
theApp.bActiveX=FALSE;
|
|
lua_byebye=FALSE;
|
|
bLinehook=FALSE;
|
|
}
|
|
|
|
int ActiveFEMM::lua_to_string(lua_State *L)
|
|
{
|
|
CString s;
|
|
|
|
int n = lua_gettop(L);
|
|
LuaResult="";
|
|
|
|
for(int k=1;k<=n;k++)
|
|
{
|
|
s=lua_tostring(L,k);
|
|
LuaResult = LuaResult + s +"\n";
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int ActiveFEMM::lua_to_matlab(lua_State *L)
|
|
{
|
|
CString s;
|
|
|
|
int n = lua_gettop(L);
|
|
if(n>0){
|
|
LuaResult="[ ";
|
|
for(int k=1;k<=n;k++)
|
|
{
|
|
s=lua_tostring(L,k);
|
|
LuaResult = LuaResult + s + " ";
|
|
}
|
|
LuaResult += "]";
|
|
}
|
|
else LuaResult.Empty();
|
|
|
|
return 0;
|
|
}
|