|
From: <got...@us...> - 2010-02-20 17:01:13
|
Revision: 605
http://scstudio.svn.sourceforge.net/scstudio/?rev=605&view=rev
Author: gotthardp
Date: 2010-02-20 17:01:05 +0000 (Sat, 20 Feb 2010)
Log Message:
-----------
New feature: MonteCarlo simulations integrated into the Visio add-on.
Modified Paths:
--------------
trunk/src/CMakeLists.txt
trunk/src/data/CMakeLists.txt
trunk/src/montecarlo/CMakeLists.txt
trunk/src/montecarlo/montecarlo.cpp
trunk/src/montecarlo/montecarlo.h
trunk/src/view/visio/addon/addon.cpp
trunk/src/view/visio/addon/addon.h
trunk/src/view/visio/addon/dllmodule.rc
trunk/src/view/visio/addon/document.cpp
trunk/src/view/visio/addon/document.h
trunk/src/view/visio/addon/document_simulation.cpp
trunk/src/view/visio/addon/stdafx.h
trunk/src/view/visio/build-setup.bat
trunk/src/view/visio/scstudio.nsi
trunk/tests/montecarlo/montecarlo_test.cpp
Added Paths:
-----------
trunk/FindExcel.cmake
trunk/src/config.h.in
trunk/src/data/simulator.h
trunk/src/montecarlo/module.cpp
Property Changed:
----------------
trunk/src/
Added: trunk/FindExcel.cmake
===================================================================
--- trunk/FindExcel.cmake (rev 0)
+++ trunk/FindExcel.cmake 2010-02-20 17:01:05 UTC (rev 605)
@@ -0,0 +1,23 @@
+FIND_FILE(EXCEL_MSO
+ NAMES mso.dll
+ PATHS
+ "C:/Program Files/Common Files/Microsoft Shared/Office11"
+ DOC "Microsoft Shared Objects, path to mso.dll")
+
+FIND_FILE(EXCEL_VBA
+ NAMES vbe6ext.olb
+ PATHS
+ "C:/Program Files/Common Files/Microsoft Shared/VBA/VBA6"
+ DOC "Microsoft VBA Objects, path to vbe6ext.olb")
+
+FIND_FILE(EXCEL_EXECUTABLE
+ NAMES excel.exe
+ PATHS
+ "C:/Program Files/Microsoft Office/OFFICE11"
+ DOC "Microsoft Excel Application, path to excel.exe")
+
+IF(EXCEL_MSO AND EXCEL_VBA AND EXCEL_EXECUTABLE)
+ SET(EXCEL_FOUND 1)
+ELSE()
+ SET(EXCEL_FOUND 0)
+ENDIF()
Property changes on: trunk/FindExcel.cmake
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Property changes on: trunk/src
___________________________________________________________________
Modified: svn:ignore
- CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
*.vcproj.*
config.h
Modified: trunk/src/CMakeLists.txt
===================================================================
--- trunk/src/CMakeLists.txt 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/CMakeLists.txt 2010-02-20 17:01:05 UTC (rev 605)
@@ -3,4 +3,12 @@
ADD_SUBDIRECTORY(membership)
ADD_SUBDIRECTORY(montecarlo)
+IF (WIN32)
+ FIND_PACKAGE(Excel)
+ENDIF(WIN32)
+
+CONFIGURE_FILE(
+ ${CMAKE_CURRENT_SOURCE_DIR}/config.h.in
+ ${CMAKE_CURRENT_BINARY_DIR}/config.h)
+
# $Id$
Added: trunk/src/config.h.in
===================================================================
--- trunk/src/config.h.in (rev 0)
+++ trunk/src/config.h.in 2010-02-20 17:01:05 UTC (rev 605)
@@ -0,0 +1,6 @@
+#define EXCEL_FOUND @EXCEL_FOUND@
+#if(EXCEL_FOUND)
+#define EXCEL_MSO "@EXCEL_MSO@"
+#define EXCEL_VBA "@EXCEL_VBA@"
+#define EXCEL_EXECUTABLE "@EXCEL_EXECUTABLE@"
+#endif
Property changes on: trunk/src/config.h.in
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/src/data/CMakeLists.txt
===================================================================
--- trunk/src/data/CMakeLists.txt 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/data/CMakeLists.txt 2010-02-20 17:01:05 UTC (rev 605)
@@ -15,6 +15,7 @@
formatter.h
checker.h
searcher.h
+ simulator.h
transformer.h
session_attribute.cpp
session_attribute.h
Added: trunk/src/data/simulator.h
===================================================================
--- trunk/src/data/simulator.h (rev 0)
+++ trunk/src/data/simulator.h 2010-02-20 17:01:05 UTC (rev 605)
@@ -0,0 +1,77 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2009 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#ifndef _SIMULATOR_H
+#define _SIMULATOR_H
+
+#include <boost/shared_ptr.hpp>
+
+#include "data/msc.h"
+#include "data/reporter.h"
+
+#if defined(_MSC_VER)
+// FIXME: to be removed once the Simulator has some implementation in a .cpp file
+#pragma warning(disable: 4275)
+#endif
+
+class SimulationListener;
+typedef boost::shared_ptr<SimulationListener> SimulationListenerPtr;
+
+class Simulator : public Reporter
+{
+public:
+ virtual ~Simulator() {}
+ typedef std::map<std::string, double> MeasurementsMap;
+
+ void set_process_count(int i)
+ { m_process_count = i; }
+
+ void set_listener(SimulationListener* listener)
+ { m_listener = listener; }
+
+ //! Start simulation and measurement calculation.
+ virtual void start(const MscPtr& msc) = 0;
+ //! Continue simulation.
+ virtual void next() = 0;
+ //! Stop simulation.
+ virtual void stop() = 0;
+
+ virtual bool is_running() const = 0;
+
+protected:
+ int m_process_count;
+ SimulationListener* m_listener;
+};
+
+typedef boost::shared_ptr<Simulator> SimulatorPtr;
+
+class SimulationListener
+{
+public:
+ virtual ~SimulationListener() {}
+
+ virtual void on_result(const Simulator::MeasurementsMap& measurements) = 0;
+ virtual void on_error(const std::string& what) = 0;
+};
+
+//! module initialization function
+typedef Simulator* (*FInitSimulator)();
+
+#endif /* _SIMULATOR_H */
+
+// $Id$
Property changes on: trunk/src/data/simulator.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/src/montecarlo/CMakeLists.txt
===================================================================
--- trunk/src/montecarlo/CMakeLists.txt 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/montecarlo/CMakeLists.txt 2010-02-20 17:01:05 UTC (rev 605)
@@ -1,6 +1,6 @@
ADD_LIBRARY(scmontecarlo SHARED
export.h
-# module.cpp
+ module.cpp
montecarlo.cpp
montecarlo.h
)
Added: trunk/src/montecarlo/module.cpp
===================================================================
--- trunk/src/montecarlo/module.cpp (rev 0)
+++ trunk/src/montecarlo/module.cpp 2010-02-20 17:01:05 UTC (rev 605)
@@ -0,0 +1,30 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2010 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#include "data/simulator.h"
+#include "montecarlo/montecarlo.h"
+
+// module initialization function
+// note: the Visio add-on searches for a function of this name
+extern "C" SCMONTECARLO_EXPORT
+Simulator* init_simulator()
+{
+ return new MonteCarlo();
+}
+
+// $Id$
Property changes on: trunk/src/montecarlo/module.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/src/montecarlo/montecarlo.cpp
===================================================================
--- trunk/src/montecarlo/montecarlo.cpp 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/montecarlo/montecarlo.cpp 2010-02-20 17:01:05 UTC (rev 605)
@@ -174,6 +174,8 @@
MonteCarlo::MonteCarlo()
{
+ m_stoprequested = true;
+ m_callback_active = false;
m_process_count = 1;
}
@@ -220,43 +222,75 @@
}
// the trace is accepted
- // copy calculated measurements to the result set
- boost::mutex::scoped_lock l(m_mutex);
+ // process the calculated measurements by the listener
+ boost::unique_lock<boost::mutex> lock(m_mutex);
- m_measurements = measurements;
- m_stoprequested = true;
+ if(m_listener)
+ {
+ m_callback_active = true;
+ m_listener->on_result(measurements);
+ // wait for next() or stop() command
+ while(m_callback_active)
+ m_callback_condition.wait(lock);
+ }
+
return 0; // accepted
}
-const MonteCarlo::MeasurementsMap& MonteCarlo::run(const MscPtr& msc)
+void MonteCarlo::start(const MscPtr& msc)
{
- std::vector<boost::shared_ptr<boost::thread> > threads;
- m_stoprequested = false;
+ m_measurements.clear();
boost::variate_generator<boost::mt19937, boost::uniform_int<> > seed(
boost::mt19937((boost::int32_t)time(NULL)),
boost::uniform_int<>(0, INT_MAX));
- if(m_process_count > 1)
+ m_stoprequested = false;
+ m_callback_active = false;
+ // execute threads
+ for(int i = 0; i < m_process_count; i++)
{
- threads.resize(m_process_count-1);
- // execute additional threads
- for(int i = 0; i < m_process_count-1; i++)
- threads[i].reset(new boost::thread(boost::bind(&MonteCarlo::thread_main, this, seed(), msc)));
+ ThreadPtr thread(new boost::thread(boost::bind(&MonteCarlo::thread_main, this, seed(), msc)));
+#ifdef WIN32
+ HANDLE th = thread->native_handle();
+ // be nice and keep visio alive
+ SetThreadPriority(th, THREAD_PRIORITY_BELOW_NORMAL);
+#endif
+ m_threads.push_back(thread);
}
+}
- // do also simulation execution
- thread_main(seed(), msc);
+void MonteCarlo::next()
+{
+ // critical section protected by m_mutex
+ {
+ boost::lock_guard<boost::mutex> lock(m_mutex);
+ m_callback_active = false;
+ }
+ // wake up the threads
+ m_callback_condition.notify_one();
+}
- if(m_process_count > 1)
+void MonteCarlo::stop()
+{
+ // critical section protected by m_mutex
{
- // wait for the executed threads
- for(int i = 0; i < m_process_count-1; i++)
- threads[i]->join();
+ boost::lock_guard<boost::mutex> lock(m_mutex);
+ m_stoprequested = true;
+ m_callback_active = false;
}
+ // wake up the threads
+ m_callback_condition.notify_one();
- return m_measurements;
+ // wait for the executed threads
+ for(std::vector<ThreadPtr>::const_iterator tpos = m_threads.begin();
+ tpos != m_threads.end(); tpos++)
+ {
+ (*tpos)->join();
+ }
+
+ m_threads.clear();
}
void MonteCarlo::thread_main(unsigned int seed, const MscPtr& msc)
@@ -266,7 +300,40 @@
boost::mt19937 seeder(seed);
while(!m_stoprequested)
- do_sample(seeder, msc);
+ {
+ try
+ {
+ do_sample(seeder, msc);
+ }
+ catch(std::exception& exc)
+ {
+ boost::unique_lock<boost::mutex> lock(m_mutex);
+
+ if(m_listener)
+ {
+ m_callback_active = true;
+ m_listener->on_error(exc.what());
+
+ // wait for next() or stop() command
+ while(m_callback_active)
+ m_callback_condition.wait(lock);
+ }
+ }
+ catch(...)
+ {
+ boost::unique_lock<boost::mutex> lock(m_mutex);
+
+ if(m_listener)
+ {
+ m_callback_active = true;
+ m_listener->on_error("unexpected exception");
+
+ // wait for next() or stop() command
+ while(m_callback_active)
+ m_callback_condition.wait(lock);
+ }
+ }
+ }
}
// $Id$
Modified: trunk/src/montecarlo/montecarlo.h
===================================================================
--- trunk/src/montecarlo/montecarlo.h 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/montecarlo/montecarlo.h 2010-02-20 17:01:05 UTC (rev 605)
@@ -20,9 +20,10 @@
#include <boost/thread.hpp>
#include "data/msc.h"
+#include "data/simulator.h"
#include "montecarlo/export.h"
-class SCMONTECARLO_EXPORT MonteCarlo
+class SCMONTECARLO_EXPORT MonteCarlo : public Simulator
{
public:
@@ -57,21 +58,28 @@
MonteCarlo();
- void set_process_count(int i)
- { m_process_count = i; }
-
int do_sample(boost::mt19937& seeder, const MscPtr& msc);
- typedef std::map<std::string, double> MeasurementsMap;
- const MeasurementsMap& run(const MscPtr& msc);
+ //! Start simulation and measurement calculation.
+ virtual void start(const MscPtr& msc);
+ //! Continue simulation.
+ virtual void next();
+ //! Stop simulation.
+ virtual void stop();
+ //! Returns true if the simulation is started.
+ virtual bool is_running() const
+ { return !m_stoprequested; }
void thread_main(unsigned int seed, const MscPtr& msc);
private:
- int m_process_count;
+ volatile bool m_stoprequested;
+ typedef boost::shared_ptr<boost::thread> ThreadPtr;
+ std::vector<ThreadPtr> m_threads;
- volatile bool m_stoprequested;
boost::mutex m_mutex;
+ boost::condition_variable m_callback_condition;
+ bool m_callback_active;
MeasurementsMap m_measurements;
};
Modified: trunk/src/view/visio/addon/addon.cpp
===================================================================
--- trunk/src/view/visio/addon/addon.cpp 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/view/visio/addon/addon.cpp 2010-02-20 17:01:05 UTC (rev 605)
@@ -278,9 +278,12 @@
case CDocumentMonitor::MENU_FIND_FLOW:
TRACE("CStudioAddon::Run() menu item 'Check--Drawing--Find Flow'");
return pDocumentMonitor->OnMenuFindFlow(vsoApp);
- case CDocumentMonitor::MENU_SIMULATION:
- TRACE("CStudioAddon::Run() menu item 'Check--Start/Stop Simulation'");
- return pDocumentMonitor->OnMenuSimulation(vsoApp);
+ case CDocumentMonitor::MENU_SIMULATION_START:
+ TRACE("CStudioAddon::Run() menu item 'Check--Start Simulation'");
+ return pDocumentMonitor->OnMenuSimulationStart(vsoApp);
+ case CDocumentMonitor::MENU_SIMULATION_STOP:
+ TRACE("CStudioAddon::Run() menu item 'Check--Stop Simulation'");
+ return pDocumentMonitor->OnMenuSimulationStop(vsoApp);
case CDocumentMonitor::MENU_VERIFY:
TRACE("CStudioAddon::Run() menu item 'Check--Verify'");
return pDocumentMonitor->OnMenuVerify(vsoApp);
@@ -376,6 +379,11 @@
TRACE("CStudioAddon::HandleVisioEvent() visEvtConnectionsDeleted");
break;
+ case visEvtApp|visEvtMarker:
+ TRACE("CStudioAddon::HandleVisioEvent() visEvtMarker");
+ HandleMarker(pSubjectObj);
+ break;
+
default:
TRACE("CStudioAddon::HandleVisioEvent() unexpected event id="
<< std::ios::hex << event);
@@ -447,6 +455,21 @@
}
}
+void CStudioAddon::HandleMarker(Visio::IVApplicationPtr vsoApp)
+{
+ _bstr_t contextString = vsoApp->GetEventInfo(Visio::visEvtIdMostRecent);
+ TRACE("CStudioAddon::HandleMarker() " << contextString);
+
+ CDocumentMonitor *pDocumentMonitor = GetDocumentMonitor(vsoApp, vsoApp->ActiveDocument);
+ if(pDocumentMonitor)
+ {
+ if(_stricmp((const char *)contextString, "SimulationResult") == 0)
+ pDocumentMonitor->OnSimulationResult();
+ else if(_stricmp((const char *)contextString, "SimulationError") == 0)
+ pDocumentMonitor->OnSimulationError();
+ }
+}
+
void CStudioAddon::RegisterPersistentEvents(Visio::IVDocumentPtr vsoDocument)
{
Visio::IVEventPtr vsoDocumentCreateEvent = NULL;
@@ -519,7 +542,6 @@
pDocumentMonitor = new CDocumentMonitor(this, vsoApp, vsoDocument);
pDocumentMonitor->InitMenu(vsoApp, vsoDocument);
pDocumentMonitor->InitToolbar(vsoApp, vsoDocument);
- pDocumentMonitor->InitAccelerators(vsoApp, vsoDocument);
// register BeforeDocumentClose
vsoEvent = vsoDocumentEventList->AddAdvise(visEvtBeforeDocumentClose, varSink, _T(""), _T(""));
Modified: trunk/src/view/visio/addon/addon.h
===================================================================
--- trunk/src/view/visio/addon/addon.h 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/view/visio/addon/addon.h 2010-02-20 17:01:05 UTC (rev 605)
@@ -48,6 +48,7 @@
void HandleCellChanged(Visio::IVCellPtr vsoCell);
void HandleConnectionsAdded(Visio::IVConnectsPtr vsoConnects);
+ void HandleMarker(Visio::IVApplicationPtr vsoApp);
void RegisterPersistentEvents(Visio::IVDocumentPtr vsoDocument);
CDocumentMonitor *GetDocumentMonitor(Visio::IVApplicationPtr vsoApp, Visio::IVDocumentPtr vsoDocument);
Modified: trunk/src/view/visio/addon/dllmodule.rc
===================================================================
--- trunk/src/view/visio/addon/dllmodule.rc 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/view/visio/addon/dllmodule.rc 2010-02-20 17:01:05 UTC (rev 605)
@@ -96,8 +96,8 @@
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 0,3,32,0
- PRODUCTVERSION 0,3,32,0
+ FILEVERSION 0,3,34,0
+ PRODUCTVERSION 0,3,34,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x9L
@@ -114,13 +114,13 @@
BEGIN
VALUE "CompanyName", "Masaryk University Brno"
VALUE "FileDescription", "Microsoft Visio add-on for design and verification of Message Sequence Charts (MSC)."
- VALUE "FileVersion", "0.3.32"
+ VALUE "FileVersion", "0.3.34"
VALUE "InternalName", "scstudio.vsl"
VALUE "LegalCopyright", "(c) Petr Gotthard. All rights reserved."
VALUE "OriginalFilename", "scstudio.vsl"
VALUE "PrivateBuild", "$Revision$"
VALUE "ProductName", "Sequence Chart Studio"
- VALUE "ProductVersion", "0.3.32"
+ VALUE "ProductVersion", "0.3.34"
END
END
BLOCK "VarFileInfo"
Modified: trunk/src/view/visio/addon/document.cpp
===================================================================
--- trunk/src/view/visio/addon/document.cpp 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/view/visio/addon/document.cpp 2010-02-20 17:01:05 UTC (rev 605)
@@ -77,6 +77,7 @@
m_formatters.clear();
m_checkers.clear();
m_membership = SearcherPtr(); // NULL
+ m_simulator = SimulatorPtr(); // NULL
m_transformers.clear();
// close extension modules
for(std::vector<HINSTANCE>::const_iterator mpos = m_open_modules.begin();
@@ -147,11 +148,13 @@
(FInitCheckers)GetProcAddress(module, "init_checkers");
FInitMembership init_membership =
(FInitMembership)GetProcAddress(module, "init_membership");
+ FInitSimulator init_simulator =
+ (FInitSimulator)GetProcAddress(module, "init_simulator");
FInitTransformers init_transformers =
(FInitTransformers)GetProcAddress(module, "init_transformers");
if(init_formatters == NULL && init_checkers == NULL
- && init_membership == NULL && init_transformers == NULL)
+ && init_membership == NULL && init_simulator == NULL && init_transformers == NULL)
{
DisplayException(m_vsoApp, basic_stringize<TCHAR>()
<< _T("Cannot open module '") << *npos << _T("'"), MB_OK | MB_ICONEXCLAMATION);
@@ -192,6 +195,17 @@
if(init_membership != NULL)
m_membership = boost::shared_ptr<Searcher>(init_membership());
+ if(init_simulator != NULL)
+ {
+ m_simulator = boost::shared_ptr<Simulator>(init_simulator());
+
+ SYSTEM_INFO info;
+ GetSystemInfo(&info);
+ m_simulator->set_process_count(info.dwNumberOfProcessors);
+
+ m_simulator->set_listener(this);
+ }
+
if(init_transformers != NULL)
{
Transformer **transformers = init_transformers();
@@ -320,6 +334,8 @@
void CDocumentMonitor::InitMenu(Visio::IVApplicationPtr vsoApp, Visio::IVDocumentPtr vsoDocument)
{
Visio::IVUIObjectPtr vsoMenus = getMostCustomMenus(vsoApp, vsoDocument);
+
+ // step 1: create custom menu
Visio::IVMenuSetPtr menuSet = vsoMenus->MenuSets->ItemAtID[Visio::visUIObjSetDrawing];
Visio::IVMenuPtr menu = menuSet->Menus->AddAt(5);
@@ -405,13 +421,25 @@
vslIconFile = vslFileName+_T(",1");
itemFindFlow->IconFileName(vslIconFile.c_str());
- Visio::IVMenuItemPtr itemSimulation = menu->MenuItems->Add();
- itemSimulation->Caption = "&Start Simulation";
- itemSimulation->AddOnName = ADDON_NAME;
- itemSimulation->AddOnArgs = stringize() << L"/event=" << MENU_SIMULATION;
+ m_simulationStartMenuItem = menu->MenuItems->Add();
+ m_simulationStartMenuItem->Caption = "&Start Simulation";
+ m_simulationStartMenuItem->AddOnName = ADDON_NAME;
+ m_simulationStartMenuItem->AddOnArgs = stringize() << L"/event=" << MENU_SIMULATION_START;
+ // enable only if simulator is available
+ m_simulationStartMenuItem->Enabled = m_simulator != NULL;
vslIconFile = vslFileName+_T(",4");
- itemSimulation->IconFileName(vslIconFile.c_str());
+ m_simulationStartMenuItem->IconFileName(vslIconFile.c_str());
+ m_simulationStopMenuItem = menu->MenuItems->Add();
+ m_simulationStopMenuItem->Caption = "&Stop Simulation";
+ m_simulationStopMenuItem->AddOnName = ADDON_NAME;
+ m_simulationStopMenuItem->AddOnArgs = stringize() << L"/event=" << MENU_SIMULATION_STOP;
+ m_simulationStopMenuItem->Visible = false;
+ // enable only if simulator is available
+ m_simulationStopMenuItem->Enabled = m_simulator != NULL;
+ vslIconFile = vslFileName+_T(",5");
+ m_simulationStopMenuItem->IconFileName(vslIconFile.c_str());
+
Visio::IVMenuItemPtr itemVerify = menu->MenuItems->Add();
itemVerify->Caption = "&Verify";
itemVerify->AddOnName = ADDON_NAME;
@@ -425,6 +453,24 @@
itemOptions->AddOnName = ADDON_NAME;
itemOptions->AddOnArgs = stringize() << L"/event=" << MENU_OPTIONS;
+ // step 2: create accelerators
+ // note: the accelerators must be created in this custom menu set
+ Visio::IVAccelTablePtr accelTable = vsoMenus->AccelTables->ItemAtID[Visio::visUIObjSetDrawing];
+
+ Visio::IVAccelItemPtr accelItem1 = accelTable->AccelItems->Add();
+ accelItem1->AddOnName = ADDON_NAME;
+ accelItem1->AddOnArgs = stringize() << L"/event=" << MENU_SELECT_ALL_INSTANCES;
+ accelItem1->Key = 'I';
+ accelItem1->Control = true;
+ accelItem1->Alt = true;
+
+ Visio::IVAccelItemPtr accelItem2 = accelTable->AccelItems->Add();
+ accelItem2->AddOnName = ADDON_NAME;
+ accelItem2->AddOnArgs = stringize() << L"/event=" << MENU_SELECT_ALL_MESSAGES;
+ accelItem2->Key = 'M';
+ accelItem2->Control = true;
+ accelItem2->Alt = true;
+
vsoDocument->SetCustomMenus(vsoMenus);
}
@@ -466,13 +512,25 @@
vslIconFile = vslFileName+_T(",1");
itemFindFlow->IconFileName(vslIconFile.c_str());
- Visio::IVToolbarItemPtr itemSimulation = toolbar->ToolbarItems->Add();
- itemSimulation->Caption = "Start Simulation";
- itemSimulation->AddOnName = ADDON_NAME;
- itemSimulation->AddOnArgs = stringize() << L"/event=" << MENU_SIMULATION;
+ m_simulationStartToolbarItem = toolbar->ToolbarItems->Add();
+ m_simulationStartToolbarItem->Caption = "Start Simulation";
+ m_simulationStartToolbarItem->AddOnName = ADDON_NAME;
+ m_simulationStartToolbarItem->AddOnArgs = stringize() << L"/event=" << MENU_SIMULATION_START;
+ // enable only if simulator is available
+ m_simulationStartToolbarItem->Enabled = m_simulator != NULL;
vslIconFile = vslFileName+_T(",4");
- itemSimulation->IconFileName(vslIconFile.c_str());
+ m_simulationStartToolbarItem->IconFileName(vslIconFile.c_str());
+ m_simulationStopToolbarItem = toolbar->ToolbarItems->Add();
+ m_simulationStopToolbarItem->Caption = "Stop Simulation";
+ m_simulationStopToolbarItem->AddOnName = ADDON_NAME;
+ m_simulationStopToolbarItem->AddOnArgs = stringize() << L"/event=" << MENU_SIMULATION_STOP;
+ m_simulationStopToolbarItem->Visible = false;
+ // enable only if simulator is available
+ m_simulationStopToolbarItem->Enabled = m_simulator != NULL;
+ vslIconFile = vslFileName+_T(",5");
+ m_simulationStopToolbarItem->IconFileName(vslIconFile.c_str());
+
Visio::IVToolbarItemPtr itemVerify = toolbar->ToolbarItems->Add();
itemVerify->Caption = "Verify";
itemVerify->AddOnName = ADDON_NAME;
@@ -484,28 +542,6 @@
vsoDocument->SetCustomToolbars(vsoToolbars);
}
-void CDocumentMonitor::InitAccelerators(Visio::IVApplicationPtr vsoApp, Visio::IVDocumentPtr vsoDocument)
-{
- Visio::IVUIObjectPtr vsoMenus = getMostCustomMenus(vsoApp, vsoDocument);
- Visio::IVAccelTablePtr accelTable = vsoMenus->AccelTables->ItemAtID[Visio::visUIObjSetDrawing];
-
- Visio::IVAccelItemPtr accelItem1 = accelTable->AccelItems->Add();
- accelItem1->AddOnName = ADDON_NAME;
- accelItem1->AddOnArgs = stringize() << L"/event=" << MENU_SELECT_ALL_INSTANCES;
- accelItem1->Key = 'I';
- accelItem1->Control = true;
- accelItem1->Alt = true;
-
- Visio::IVAccelItemPtr accelItem2 = accelTable->AccelItems->Add();
- accelItem2->AddOnName = ADDON_NAME;
- accelItem2->AddOnArgs = stringize() << L"/event=" << MENU_SELECT_ALL_MESSAGES;
- accelItem2->Key = 'M';
- accelItem2->Control = true;
- accelItem2->Alt = true;
-
- vsoDocument->SetCustomMenus(vsoMenus);
-}
-
TransformerPtrList::const_iterator CDocumentMonitor::find_transformer(const std::wstring& name) const
{
for(TransformerPtrList::const_iterator cpos = m_transformers.begin();
Modified: trunk/src/view/visio/addon/document.h
===================================================================
--- trunk/src/view/visio/addon/document.h 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/view/visio/addon/document.h 2010-02-20 17:01:05 UTC (rev 605)
@@ -21,6 +21,7 @@
#include "data/formatter.h"
#include "data/checker.h"
#include "data/searcher.h"
+#include "data/simulator.h"
#include "data/transformer.h"
//! template used to create new documents
@@ -32,7 +33,7 @@
typedef std::vector<CheckerPtr> CheckerPtrList;
typedef std::vector<TransformerPtr> TransformerPtrList;
-class CDocumentMonitor
+class CDocumentMonitor : public SimulationListener
{
public:
CDocumentMonitor(CStudioAddon *addon,
@@ -44,7 +45,6 @@
void InitMenu(Visio::IVApplicationPtr vsoApp, Visio::IVDocumentPtr vsoDocument);
void InitToolbar(Visio::IVApplicationPtr vsoApp, Visio::IVDocumentPtr vsoDocument);
- void InitAccelerators(Visio::IVApplicationPtr vsoApp, Visio::IVDocumentPtr vsoDocument);
enum MenuItems
{
@@ -53,7 +53,8 @@
MENU_EXPORT,
MENU_REPAINT,
MENU_FIND_FLOW,
- MENU_SIMULATION,
+ MENU_SIMULATION_START,
+ MENU_SIMULATION_STOP,
MENU_VERIFY,
MENU_OPTIONS,
MENU_SELECT_ALL_MESSAGES,
@@ -68,7 +69,8 @@
VAORC OnMenuSelectAllInstances(Visio::IVApplicationPtr vsoApp);
VAORC OnMenuSelectAllMessages(Visio::IVApplicationPtr vsoApp);
VAORC OnMenuFindFlow(Visio::IVApplicationPtr vsoApp);
- VAORC OnMenuSimulation(Visio::IVApplicationPtr vsoApp);
+ VAORC OnMenuSimulationStart(Visio::IVApplicationPtr vsoApp);
+ VAORC OnMenuSimulationStop(Visio::IVApplicationPtr vsoApp);
VAORC OnMenuVerify(Visio::IVApplicationPtr vsoApp);
void ShowReportView();
@@ -86,6 +88,9 @@
Visio::IVShapePtr FindShape(const _bstr_t& id);
int SelectShapes(const std::vector<_bstr_t>& ids);
+ void OnSimulationResult();
+ void OnSimulationError();
+
// event objects for this document
Visio::IVEventPtr m_vsoPageAddedEvent;
Visio::IVEventPtr m_vsoBeforeDocumentClosedEvent;
@@ -109,7 +114,32 @@
MscPtr run_transformers(MscPtr& msc, const TransformerPtrList& transformer_list);
+ Simulator::MeasurementsMap m_marker_measurements;
+ virtual void on_result(const Simulator::MeasurementsMap& measurements)
+ {
+ m_marker_measurements = measurements;
+ m_vsoApp->QueueMarkerEvent("SimulationResult");
+ }
+
+ std::string m_marker_error;
+ virtual void on_error(const std::string& what)
+ {
+ m_marker_error = what;
+ m_vsoApp->QueueMarkerEvent("SimulationError");
+ }
+
+#if(EXCEL_FOUND)
+ Excel::_ApplicationPtr m_excelApp;
+ Excel::_WorksheetPtr m_outputSheet;
+
+ typedef std::map<std::string, int> OutputColumns;
+ OutputColumns m_outputColumns;
+
+ int m_outputNextRow;
+#endif // EXCEL_FOUND
+
SearcherPtr m_membership;
+ SimulatorPtr m_simulator;
CStudioAddon *m_addon;
Visio::IVApplicationPtr m_vsoApp;
@@ -121,6 +151,11 @@
CReportView *m_reportView;
ConfigProvider *m_configProvider;
+ Visio::IVMenuItemPtr m_simulationStartMenuItem;
+ Visio::IVMenuItemPtr m_simulationStopMenuItem;
+ Visio::IVToolbarItemPtr m_simulationStartToolbarItem;
+ Visio::IVToolbarItemPtr m_simulationStopToolbarItem;
+
void selectAll(Visio::IVApplicationPtr vsoApp, bool select_instances);
Visio::IVUIObjectPtr getMostCustomMenus(Visio::IVApplicationPtr vsoApp, Visio::IVDocumentPtr vsoDocument);
Visio::IVUIObjectPtr getMostCustomToolbars(Visio::IVApplicationPtr vsoApp, Visio::IVDocumentPtr vsoDocument);
Modified: trunk/src/view/visio/addon/document_simulation.cpp
===================================================================
--- trunk/src/view/visio/addon/document_simulation.cpp 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/view/visio/addon/document_simulation.cpp 2010-02-20 17:01:05 UTC (rev 605)
@@ -17,17 +17,22 @@
*/
#include "stdafx.h"
+#include "addon.h"
#include "dllmodule.h"
#include "document.h"
#include "extract.h"
#include "data/msc.h"
-VAORC CDocumentMonitor::OnMenuSimulation(Visio::IVApplicationPtr vsoApp)
+static const int EXCEL_MAX_ROWS = 65536;
+static const int EXCEL_MAX_COLUMNS = 256;
+
+VAORC CDocumentMonitor::OnMenuSimulationStart(Visio::IVApplicationPtr vsoApp)
{
// clear the verification report
m_reportView->Reset();
+ // step 1: extract the drawing to be simulated
CDrawingExtractor extractor(m_reportView);
Visio::IVPagePtr vsoPage = vsoApp->GetActivePage();
@@ -35,11 +40,135 @@
if(msc == NULL)
{
m_reportView->Print(RS_ERROR,
- stringize() << "Verification failed. Graphical errors in the drawing.");
+ stringize() << "Simulation failed. Graphical errors in the drawing.");
return VAORC_FAILURE;
}
+#if(EXCEL_FOUND)
+ // step 2: initialize the connection to excel
+ if(FAILED(m_excelApp.GetActiveObject("Excel.Application")))
+ {
+ m_reportView->Print(RS_ERROR,
+ stringize() << "Simulation failed. Open Microsoft Excel to receive simulation results.");
+ return VAORC_FAILURE;
+ }
+
+ // we may be connected to a hidden application
+ m_excelApp->Visible = true;
+
+ Excel::_WorkbookPtr workbook = m_excelApp->ActiveWorkbook;
+ // if no workbook is active, create a new workbook
+ if(workbook == NULL)
+ workbook = m_excelApp->Workbooks->Add();
+
+ m_outputSheet = workbook->ActiveSheet;
+ // if no sheet is active, create a new sheet
+ if(m_outputSheet == NULL)
+ m_outputSheet = workbook->Sheets->Add();
+
+ m_outputColumns.clear();
+ // extract column names and search for the first empty column
+ int next_column;
+ for(next_column = 1; next_column < EXCEL_MAX_COLUMNS; next_column++)
+ {
+ _bstr_t name = m_outputSheet->Cells->Item[1][next_column];
+ if(name.length() == 0)
+ break;
+
+ m_outputColumns[(const char *)name] = next_column;
+ }
+
+ // search for the first empty data row
+ for(m_outputNextRow = 2; m_outputNextRow < EXCEL_MAX_ROWS; m_outputNextRow++)
+ {
+ int datalen = 0;
+ // calculate length of all fields in this row
+ for(int column = 1; column < next_column; column++)
+ {
+ _bstr_t value = m_outputSheet->Cells->Item[m_outputNextRow][column];
+ datalen += value.length();
+ }
+
+ if(datalen == 0)
+ break;
+ }
+#endif // EXCEL_FOUND
+
+ // step 3: start the simulation
+ m_simulator->start(msc);
+
+ // step 4: reconfigure menu
+ m_simulationStartMenuItem->Visible = false;
+ m_simulationStopMenuItem->Visible = true;
+ m_vsoDocument->CustomMenus->UpdateUI();
+ m_simulationStartToolbarItem->Visible = false;
+ m_simulationStopToolbarItem->Visible = true;
+ m_vsoDocument->CustomToolbars->UpdateUI();
+
return VAORC_SUCCESS;
}
+VAORC CDocumentMonitor::OnMenuSimulationStop(Visio::IVApplicationPtr vsoApp)
+{
+ // step 1: stop the simulation
+ m_simulator->stop();
+
+ // step 2: disconnect the sheet
+ m_outputSheet = NULL;
+ m_excelApp = NULL;
+
+ // step 3: reconfigure menu
+ m_simulationStartMenuItem->Visible = true;
+ m_simulationStopMenuItem->Visible = false;
+ m_vsoDocument->CustomMenus->UpdateUI();
+ m_simulationStartToolbarItem->Visible = true;
+ m_simulationStopToolbarItem->Visible = false;
+ m_vsoDocument->CustomToolbars->UpdateUI();
+
+ return VAORC_SUCCESS;
+}
+
+void CDocumentMonitor::OnSimulationResult()
+{
+#if(EXCEL_FOUND)
+ for(Simulator::MeasurementsMap::const_iterator mpos = m_marker_measurements.begin();
+ mpos != m_marker_measurements.end(); mpos++)
+ {
+ int column;
+
+ // check the column
+ OutputColumns::const_iterator icol = m_outputColumns.find(mpos->first);
+ if(icol == m_outputColumns.end())
+ {
+ column = m_outputColumns.size()+1;
+ m_outputColumns[mpos->first] = column;
+
+ m_outputSheet->Cells->Item[1][column] = mpos->first.c_str();
+ }
+ else
+ column = icol->second;
+
+ m_outputSheet->Cells->Item[m_outputNextRow][column] = mpos->second;
+ }
+ m_outputNextRow++;
+#else
+ for(Simulator::MeasurementsMap::const_iterator mpos = m_marker_measurements.begin();
+ mpos != m_marker_measurements.end(); mpos++)
+ {
+ m_reportView->Print(RS_REPORT,
+ stringize() << mpos->first.c_str() << " = " << mpos->second);
+ }
+#endif // EXCEL_FOUND
+
+ OnMenuSimulationStop(m_vsoApp);
+}
+
+void CDocumentMonitor::OnSimulationError()
+{
+ OnMenuSimulationStop(m_vsoApp);
+
+ m_reportView->Print(RS_ERROR,
+ stringize() << "Simulation failed. " << m_marker_error.c_str());
+}
+
// $Id$
Modified: trunk/src/view/visio/addon/stdafx.h
===================================================================
--- trunk/src/view/visio/addon/stdafx.h 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/view/visio/addon/stdafx.h 2010-02-20 17:01:05 UTC (rev 605)
@@ -33,6 +33,7 @@
#include "resource.h"
+#include "config.h"
#include <Vaddon.h>
#include <Visiwrap.h>
@@ -43,3 +44,25 @@
// Import the Visio type library with named GUIDs for the type library entries.
// The namespace is "Visio".
#import "Visio.tlb" named_guids
+
+#if(EXCEL_FOUND)
+
+// Import Office type library
+#import EXCEL_MSO \
+ rename("DocumentProperties", "DocumentPropertiesXL") \
+ rename("RGB", "RBGXL")
+
+// Import VBA type library
+#import EXCEL_VBA
+
+// Import Excel type library
+#import EXCEL_EXECUTABLE \
+ rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") \
+ rename("DocumentProperties", "DocumentPropertiesXL") \
+ rename("ReplaceText", "ReplaceTextXL") \
+ rename("CopyFile", "CopyFileXL") \
+ exclude("IFont", "IPicture") no_dual_interfaces
+
+#endif // EXCEL_FOUND
+
+// $Id$
Modified: trunk/src/view/visio/build-setup.bat
===================================================================
--- trunk/src/view/visio/build-setup.bat 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/view/visio/build-setup.bat 2010-02-20 17:01:05 UTC (rev 605)
@@ -1,3 +1,3 @@
-set VERSION=0.3.32
+set VERSION=0.3.34
"C:\Program Files\NSIS\makensis" /DVERSION=%VERSION% scstudio.nsi
"C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\signtool.exe" sign /a scstudio-setup-%VERSION%.exe
Modified: trunk/src/view/visio/scstudio.nsi
===================================================================
--- trunk/src/view/visio/scstudio.nsi 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/src/view/visio/scstudio.nsi 2010-02-20 17:01:05 UTC (rev 605)
@@ -173,6 +173,7 @@
WriteRegStr HKCU '${RegModulesPath}' 'sc_engmann' 'scengmann.dll'
WriteRegStr HKCU '${RegModulesPath}' 'sc_modelchecking' 'scmodelchecking.dll'
WriteRegStr HKCU '${RegModulesPath}' 'sc_membership' 'scmembership.dll'
+ WriteRegStr HKCU '${RegModulesPath}' 'sc_montecarlo' 'scmontecarlo.dll'
WriteRegStr HKCU '${RegModulesPath}' 'sc_beautify' 'scbeautify.dll'
; register stencils
WriteRegStr HKCU '${RegStencilsPath}' 'bmsc' 'Basic MSC.vsx'
Modified: trunk/tests/montecarlo/montecarlo_test.cpp
===================================================================
--- trunk/tests/montecarlo/montecarlo_test.cpp 2010-02-20 15:51:54 UTC (rev 604)
+++ trunk/tests/montecarlo/montecarlo_test.cpp 2010-02-20 17:01:05 UTC (rev 605)
@@ -21,6 +21,37 @@
#include "data/Z120/z120.h"
#include "montecarlo/montecarlo.h"
+class TestSimulator : public SimulationListener
+{
+public:
+ TestSimulator()
+ {
+ m_simulator.set_listener(this);
+ m_was_result = false;
+ }
+
+ virtual void on_result(const Simulator::MeasurementsMap& measurements)
+ {
+ // print the measurements
+ for(MonteCarlo::MeasurementsMap::const_iterator mpos = measurements.begin();
+ mpos != measurements.end(); mpos++)
+ {
+ std::cout << mpos->first << " = " << mpos->second << std::endl;
+ }
+
+ m_was_result = true;
+ }
+
+ virtual void on_error(const std::string& what)
+ {
+ std::cerr << "EXCEPTION: Simulation failed: " << what << std::endl;
+ m_was_result = true;
+ }
+
+ MonteCarlo m_simulator;
+ bool m_was_result;
+};
+
int main(int argc, char** argv)
{
if(argc < 2)
@@ -46,26 +77,14 @@
return 1;
}
- try
- {
- MonteCarlo simulator;
+ TestSimulator test;
- // run the simulation
- const MonteCarlo::MeasurementsMap& measurements = simulator.run(msc[0]);
+ test.m_simulator.start(msc[0]);
+ // wait until simulation finishes
+ while(!test.m_was_result)
+ boost::this_thread::sleep(boost::posix_time::milliseconds(100));
- // print the measurements
- for(MonteCarlo::MeasurementsMap::const_iterator mpos = measurements.begin();
- mpos != measurements.end(); mpos++)
- {
- std::cout << mpos->first << " = " << mpos->second << std::endl;
- }
- }
- catch(std::exception& exc)
- {
- std::cerr << "EXCEPTION: Simulation failed: " << exc.what() << std::endl;
- return 2;
- }
-
+ test.m_simulator.stop();
return 0;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|