diff --git a/.gitignore b/.gitignore
index 3db51d20..f8b4791f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -54,3 +54,125 @@ vle.output/cmake/doxygen-modeling.conf.in.bak
vle.output/cmake/doxygen-sources.conf.in.bak
vle.output/doc/html/
vle.output/plugins/
+
+ext.muparser/buildvle/
+test/
+vle.examples/buildvle/
+vle.examples/cmake/FindGVLE.cmake
+vle.examples/cmake/FindGVLE_DEPS.cmake
+vle.examples/cmake/FindVLE.cmake
+vle.examples/cmake/FindVLE_DEPS.cmake
+vle.examples/cmake/VleCheckAndDeclareGeneratedModelsConfig.cmake
+vle.examples/data/file.dat
+vle.examples/doc/file.doc
+vle.examples/exp/empty.vpz
+vle.examples/src/Simple.cpp
+vle.examples/test/test.cpp
+vle.extension.celldevs/buildvle/
+vle.extension.celldevs/cmake/FindGVLE.cmake
+vle.extension.celldevs/cmake/FindGVLE_DEPS.cmake
+vle.extension.celldevs/cmake/FindVLE.cmake
+vle.extension.celldevs/cmake/FindVLE_DEPS.cmake
+vle.extension.celldevs/cmake/VleCheckAndDeclareGeneratedModelsConfig.cmake
+vle.extension.celldevs/data/file.dat
+vle.extension.celldevs/doc/file.doc
+vle.extension.celldevs/exp/empty.vpz
+vle.extension.celldevs/src/Simple.cpp
+vle.extension.cellqss/buildvle/
+vle.extension.cellqss/cmake/FindGVLE.cmake
+vle.extension.cellqss/cmake/FindGVLE_DEPS.cmake
+vle.extension.cellqss/cmake/FindVLE.cmake
+vle.extension.cellqss/cmake/FindVLE_DEPS.cmake
+vle.extension.cellqss/cmake/VleCheckAndDeclareGeneratedModelsConfig.cmake
+vle.extension.cellqss/data/file.dat
+vle.extension.cellqss/doc/file.doc
+vle.extension.cellqss/exp/empty.vpz
+vle.extension.cellqss/src/Simple.cpp
+e.extension.decision/buildvle/
+vle.extension.decision/cmake/FindGVLE.cmake
+vle.extension.decision/cmake/FindGVLE_DEPS.cmake
+vle.extension.decision/cmake/FindVLE.cmake
+vle.extension.decision/cmake/FindVLE_DEPS.cmake
+vle.extension.decision/cmake/VleCheckAndDeclareGeneratedModelsConfig.cmake
+vle.extension.decision/data/file.dat
+vle.extension.decision/doc/file.doc
+vle.extension.decision/exp/empty.vpz
+vle.extension.decision/src/Simple.cpp
+vle.extension.decision/src/vle/gvle/modeling/decision/.metadata/
+vle.extension.decision/src/vle/gvle/modeling/decision/DecisionDrawingArea.cpp~
+vle.extension.decision/src/vle/gvle/modeling/decision/DecisionDrawingArea.hpp~
+vle.extension.decision/src/vle/gvle/modeling/decision/build/
+vle.extension.difference-equation/buildvle/
+vle.extension.difference-equation/cmake/FindGVLE.cmake
+vle.extension.difference-equation/cmake/FindGVLE_DEPS.cmake
+vle.extension.difference-equation/cmake/FindVLE.cmake
+vle.extension.difference-equation/cmake/FindVLE_DEPS.cmake
+vle.extension.difference-equation/cmake/VleCheckAndDeclareGeneratedModelsConfig.cmake
+vle.extension.difference-equation/data/file.dat
+vle.extension.difference-equation/doc/file.doc
+vle.extension.difference-equation/exp/empty.vpz
+vle.extension.difference-equation/src/Simple.cpp
+vle.extension.difference-equation/test/test.cpp
+vle.extension.differential-equation/CMakeLists.txt~
+vle.extension.differential-equation/buildvle/
+vle.extension.differential-equation/cmake/FindGVLE.cmake
+vle.extension.differential-equation/cmake/FindGVLE_DEPS.cmake
+vle.extension.differential-equation/cmake/FindVLE.cmake
+vle.extension.differential-equation/cmake/FindVLE_DEPS.cmake
+vle.extension.differential-equation/cmake/VleCheckAndDeclareGeneratedModelsConfig.cmake
+vle.extension.differential-equation/data/
+vle.extension.differential-equation/doc/file.doc
+vle.extension.differential-equation/exp/empty.vpz
+vle.extension.differential-equation/src/Simple.cpp
+vle.extension.differential-equation/test/test.cpp
+vle.extension.differential-equation/test/test_Euler.cpp~
+vle.extension.differential-equation/test/test_Euler_perturbation.cpp~
+vle.extension.dsdevs/buildvle/
+vle.extension.dsdevs/cmake/FindGVLE.cmake
+vle.extension.dsdevs/cmake/FindGVLE_DEPS.cmake
+vle.extension.dsdevs/cmake/FindVLE.cmake
+vle.extension.dsdevs/cmake/FindVLE_DEPS.cmake
+vle.extension.dsdevs/cmake/VleCheckAndDeclareGeneratedModelsConfig.cmake
+vle.extension.dsdevs/data/file.dat
+vle.extension.dsdevs/doc/file.doc
+vle.extension.dsdevs/exp/empty.vpz
+vle.extension.dsdevs/src/Simple.cpp
+vle.extension.fsa/buildvle/
+vle.extension.fsa/cmake/FindGVLE.cmake
+vle.extension.fsa/cmake/FindGVLE_DEPS.cmake
+vle.extension.fsa/cmake/FindVLE.cmake
+vle.extension.fsa/cmake/FindVLE_DEPS.cmake
+vle.extension.fsa/cmake/VleCheckAndDeclareGeneratedModelsConfig.cmake
+vle.extension.fsa/data/file.dat
+vle.extension.fsa/doc/file.doc
+vle.extension.fsa/exp/empty.vpz
+vle.extension.fsa/src/Simple.cpp
+vle.extension.petrinet/buildvle/
+vle.extension.petrinet/cmake/FindGVLE.cmake
+vle.extension.petrinet/cmake/FindGVLE_DEPS.cmake
+vle.extension.petrinet/cmake/FindVLE.cmake
+vle.extension.petrinet/cmake/FindVLE_DEPS.cmake
+vle.extension.petrinet/cmake/VleCheckAndDeclareGeneratedModelsConfig.cmake
+vle.extension.petrinet/src/Simple.cpp
+vle.forrester/buildvle/
+vle.forrester/cmake/FindGVLE.cmake
+vle.forrester/cmake/FindGVLE_DEPS.cmake
+vle.forrester/cmake/FindVLE.cmake
+vle.forrester/cmake/FindVLE_DEPS.cmake
+vle.forrester/cmake/VleCheckAndDeclareGeneratedModelsConfig.cmake
+vle.forrester/data/
+vle.forrester/doc/
+vle.forrester/exp/
+vle.forrester/src/Simple.cpp
+vle.forrester/test/
+vle.output/buildvle/
+vle.output/cmake/FindGVLE.cmake
+vle.output/cmake/FindGVLE_DEPS.cmake
+vle.output/cmake/FindVLE.cmake
+vle.output/cmake/FindVLE_DEPS.cmake
+vle.output/cmake/VleCheckAndDeclareGeneratedModelsConfig.cmake
+vle.output/data/file.dat
+vle.output/doc/file.doc
+vle.output/exp/empty.vpz
+vle.output/src/Simple.cpp
+vle.output/test/test.cpp
diff --git a/vle.extension.decision/src/vle/gvle/modeling/decision/CMakeLists.txt b/vle.extension.decision/src/vle/gvle/modeling/decision/CMakeLists.txt
index 178755f2..5a1ded7e 100644
--- a/vle.extension.decision/src/vle/gvle/modeling/decision/CMakeLists.txt
+++ b/vle.extension.decision/src/vle/gvle/modeling/decision/CMakeLists.txt
@@ -1,6 +1,7 @@
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src ${VLE_INCLUDE_DIRS}
${GVLE_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS}
- ${GTKSOURCEVIEWMM_INCLUDE_DIRS})
+ ${GTKSOURCEVIEWMM_INCLUDE_DIRS}
+)
LINK_DIRECTORIES(${VLE_LIBRARY_DIRS} ${GVLE_LIBRARY_DIRS}
${GTKSOURCEVIEWMM_LIBRARY_DIRS})
diff --git a/vle.extension.decision/src/vle/gvle/modeling/decision/Decision.cpp b/vle.extension.decision/src/vle/gvle/modeling/decision/Decision.cpp
index 7317c1e9..03a58161 100644
--- a/vle.extension.decision/src/vle/gvle/modeling/decision/Decision.cpp
+++ b/vle.extension.decision/src/vle/gvle/modeling/decision/Decision.cpp
@@ -88,6 +88,57 @@ std::string ActivityModel::toString() const
% mName % mX % mY % mWidth % mHeight).str();
}
+const Glib::ustring ActivityModel::card(Decision* decision) const
+{
+ Glib::ustring card;
+
+ card = "" + name() + "";
+ card += "\nRules:";
+
+ std::map < std::string, strings_t >*
+ tmpRules = decision->getRule();
+ int j = getRules().size() - 1;
+ for (int i = 0; i <= j;
+ i++) {
+ card += "\n- " + getRules().at(i);
+
+ int k, l;
+ k = 0;
+ l = tmpRules->operator[]
+ (getRules().at(i)).size() - 1;
+ for (; k <= l; k++) {
+ if (k == 0) {
+ card += ", pred(s).:\n\t- " +
+ tmpRules->operator[]
+ (getRules().at(i)).at(k);
+ }
+ else {
+ card += "\n\t- " + tmpRules->operator[]
+ (getRules().at(i)).at(k);
+ }
+ }
+ }
+
+ if (getRelativeDate()) {
+ card += "\nR. Minstart: " +
+ minstart();
+ card += "\nR. Maxfinish: " +
+ maxfinish();
+ }
+ else {
+ double x = vle::utils::convert < double >
+ (minstart(), true);
+ card += "\nMinstart: " +
+ utils::DateTime::toJulianDayNumber(x);
+ x = vle::utils::convert < double >
+ (maxfinish(), true);
+ card += "\nMaxfinish: " +
+ utils::DateTime::toJulianDayNumber(x);
+ }
+
+ return card;
+}
+
void Decision::displace(ActivityModel* activityModel, int deltax, int deltay)
{
activityModel->displace(deltax, deltay);
diff --git a/vle.extension.decision/src/vle/gvle/modeling/decision/Decision.hpp b/vle.extension.decision/src/vle/gvle/modeling/decision/Decision.hpp
index 8c06882a..ebbc860d 100644
--- a/vle.extension.decision/src/vle/gvle/modeling/decision/Decision.hpp
+++ b/vle.extension.decision/src/vle/gvle/modeling/decision/Decision.hpp
@@ -50,6 +50,8 @@ namespace decision {
typedef std::vector < std::string > strings_t;
typedef std::map < std::string, std::string > buffers_t;
+class Decision;
+
struct point_t
{
int x;
@@ -228,6 +230,18 @@ public :
oy + (mPoints[0].y - oy) * ratioy;
}
+/**
+ * @brief Return the PrecedenceConstraintModel card : the description displayed in a tooltip
+ * @return the PrecedenceConstraintModel card
+ */
+ const Glib::ustring card()
+ {
+ Glib::ustring card = "Type: " + cType();
+ card += "\nMintimelag: " + actTlMin();
+ card += "\nMaxtimelag: " + actTlMax();
+ return card;
+ }
+
private :
std::string mSource;
std::string mDestination;
@@ -361,6 +375,13 @@ class ActivityModel
return mName;
}
+/**
+ * @brief Return the ActivityModel card : the description displayed in a tooltip
+ * @param decision to display rules
+ * @return the ActivityModel card
+ */
+ const Glib::ustring card(Decision* decision) const;
+
/**
* @brief Set the name of the ActivityModel
* @param the new name of the ActivityModel
@@ -735,22 +756,22 @@ class Decision
* mKnowledgeBase or false if an error occured
*/
- bool fillKnowledgeBase(std::string fileName) {
- if (mActivitiesModel.size() > 0) {
- std::ifstream fileStream(fileName.c_str(), ios::in);
+ bool fillKnowledgeBase(std::string fileName) {
+ if (mActivitiesModel.size() > 0) {
+ std::ifstream fileStream(fileName.c_str(), ios::in);
- if (fileStream.is_open()) {
- mKnowledgeBase->plan().fill(fileStream);
- return true;
+ if (fileStream.is_open()) {
+ mKnowledgeBase->plan().fill(fileStream);
+ return true;
+ }
+ else {
+ return false;
+ }
}
else {
- return false;
+ return true;
}
}
- else {
- return true;
- }
-}
/**
* @brief Return the KnowledgeBase of the class decision.
diff --git a/vle.extension.decision/src/vle/gvle/modeling/decision/DecisionDrawingArea.cpp b/vle.extension.decision/src/vle/gvle/modeling/decision/DecisionDrawingArea.cpp
index 4e365377..78a99510 100644
--- a/vle.extension.decision/src/vle/gvle/modeling/decision/DecisionDrawingArea.cpp
+++ b/vle.extension.decision/src/vle/gvle/modeling/decision/DecisionDrawingArea.cpp
@@ -27,10 +27,6 @@
#include
-#ifndef M_PI
-#define M_PI 3.14159265358979323846
-#endif
-
namespace vle {
namespace gvle {
namespace modeling {
@@ -41,55 +37,223 @@ const guint DecisionDrawingArea::HEADER_HEIGHT = 20;
const guint DecisionDrawingArea::ACTIVITY_NAME_HEIGHT = 20;
const guint DecisionDrawingArea::ACTIVITY_HEIGHT = 50;
const guint DecisionDrawingArea::ACTIVITY_WIDTH = 50;
-
+/*
+const double DecisionDrawingArea::ZOOM_FACTOR_SUP = 0.5;
+const double DecisionDrawingArea::ZOOM_FACTOR_INF = 0.1;
+const double DecisionDrawingArea::ZOOM_MIN = 0.5;
+const double DecisionDrawingArea::ZOOM_MAX = 4.0;
+*/
DecisionDrawingArea::DecisionDrawingArea(
- BaseObjectType* cobject,
- const Glib::RefPtr < Gtk::Builder >& xml) :
- Gtk::DrawingArea(cobject),
- mXml(xml),
- mIsRealized(false),
- mNeedRedraw(true),
- mDecision(0),
- mState(SELECT_MODE),
- mHeight(300 + 2 * OFFSET),
- mWidth(400 + 2 * OFFSET),
- mMaxHeight(0),
- mMaxWidth(0),
- mPreviousX(-1),
- mPreviousY(-1),
- mDecisionResize(false)
+ BaseObjectType* cobject,
+ const Glib::RefPtr < Gtk::Builder >& xml) :
+ Gtk::DrawingArea(cobject),
+ mXml(xml),
+ mIsRealized(false), mNeedRedraw(true),
+ mDecision(0),
+ mState(SELECT_MODE),
+ mHeight(300 + 2 * OFFSET), mWidth(400 + 2 * OFFSET),
+ mMaxHeight(0), mMaxWidth(0),
+ mPreviousX(-1), mPreviousY(-1),
+ mDecisionResize(false)
+ //mZoom(1.0)
{
set_events(Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_MOTION_MASK |
- Gdk::BUTTON1_MOTION_MASK | Gdk::BUTTON2_MOTION_MASK |
- Gdk::BUTTON3_MOTION_MASK | Gdk::BUTTON_PRESS_MASK |
- Gdk::BUTTON_RELEASE_MASK);
+ Gdk::BUTTON1_MOTION_MASK | Gdk::BUTTON2_MOTION_MASK |
+ Gdk::BUTTON3_MOTION_MASK | Gdk::BUTTON_PRESS_MASK |
+ Gdk::BUTTON_RELEASE_MASK);
+
mStartSelectRect.invalid();
mEndSelectRect.invalid();
initMenuPopupModels();
+ set_has_tooltip();
+
+ m_cntSignalQueryTooltip =
+ signal_query_tooltip().connect(sigc::mem_fun(*this,
+ &DecisionDrawingArea::onQueryTooltip));
+}
+
+void DecisionDrawingArea::setState(int state)
+{
+ mState = state;
+ mCurrentActivitiesModel.clear();
+}
+
+void DecisionDrawingArea::setDecision(Decision* decision)
+{
+ mDecision = decision;
+ mWidth = mDecision->width() + 2 * OFFSET;
+ mHeight = mDecision->height() + 2 * OFFSET;
+ queueRedraw();
}
void DecisionDrawingArea::initMenuPopupModels()
{
Gtk::Menu::MenuList& menulist(mMenuPopup.items());
+
menulist.push_back(Gtk::Menu_Helpers::MenuElem(_("_Copy"),
- sigc::mem_fun(*this, &DecisionDrawingArea::copy)));
+ sigc::mem_fun(*this, &DecisionDrawingArea::copy)));
+
menulist.push_back(Gtk::Menu_Helpers::MenuElem(_("_Paste"),
- sigc::mem_fun(*this, &DecisionDrawingArea::paste)));
+ sigc::mem_fun(*this, &DecisionDrawingArea::paste)));
+
menulist.push_back(Gtk::Menu_Helpers::MenuElem(_("_Delete"),
- sigc::mem_fun(*this, &DecisionDrawingArea::deleteElmts)));
+ sigc::mem_fun(*this, &DecisionDrawingArea::deleteElmts)));
mMenuPopup.accelerate(*this);
}
+void DecisionDrawingArea::copy()
+{
+ if (!mCurrentActivitiesModel.empty()) {
+ mCopiedActivitiesModel = mCurrentActivitiesModel;
+ }
+}
+
+void DecisionDrawingArea::paste()
+{
+ std::map < std::string, std::string > generatedNames;
+
+ for (std::vector < ActivityModel* >::iterator it =
+ mCopiedActivitiesModel.begin();
+ it != mCopiedActivitiesModel.end(); ++it) {
+ int number = 1;
+ std::ostringstream oss;
+ oss << number;
+ std::string sNb = oss.str();
+
+ while (mDecision->existActivityModel((*it)->name() + /*"_" +*/ sNb)) {
+ number++;
+ oss.str("");
+ oss << number;
+ sNb = oss.str();
+ }
+
+ generatedNames[(*it)->name()] = (*it)->name() + /*"_" +*/ sNb;
+
+ mDecision->addActivityModel((*it)->name() + /*"_" +*/ sNb,
+ (*it)->x() + OFFSET, (*it)->y() + OFFSET, ACTIVITY_WIDTH,
+ ACTIVITY_HEIGHT);
+
+ ActivityModel* newActivity = mDecision->activityModel((*it)->name()
+ + /*"_" +*/ sNb);
+
+ newActivity->setRules((*it)->getRules());
+ newActivity->setOutputFunc((*it)->getOutputFunc());
+ newActivity->setAckFunc((*it)->getAckFunc());
+ checkSize(newActivity, newActivity->name());
+
+ newActivity->minstart((*it)->minstart());
+ newActivity->maxfinish((*it)->maxfinish());
+
+ int newWidth = (*it)->x() + OFFSET + newActivity->width() + OFFSET;
+ int newHeight = (*it)->y() + OFFSET + newActivity->height() +OFFSET;
+
+ if (newWidth > mDecision->width() || newHeight > mDecision->height()) {
+ mDecision->width(newWidth);
+ mDecision->height(newHeight);
+ mWidth = mDecision->width() + 2 * OFFSET;
+ mHeight = mDecision->height() + 2 * OFFSET;
+ mBuffer = Gdk::Pixmap::create(mWin, mWidth, mHeight, -1);
+ set_size_request(mWidth, mHeight);
+ }
+ }
+
+ for (std::vector < ActivityModel* >::iterator it =
+ mCopiedActivitiesModel.begin();
+ it != mCopiedActivitiesModel.end(); ++it) {
+
+ // Precedence constraints management
+ for (std::vector < ActivityModel* >::iterator it2 =
+ mCopiedActivitiesModel.begin();
+ it2 != mCopiedActivitiesModel.end(); ++it2) {
+
+ PrecedenceConstraintModel* tmpConstraint =
+ new PrecedenceConstraintModel();
+
+ if (mDecision->getPrecedenceConstraint((*it)->name(),
+ (*it2)->name(), tmpConstraint)) {
+ // Change precedence constraints coordinates, use anchors
+ tmpConstraint->displaceSource(OFFSET, OFFSET);
+ tmpConstraint->displaceDestination(OFFSET, OFFSET);
+
+ points_t pts;
+ point_t newAnchorSource = searchAnchor(
+ mDecision->activityModel(
+ generatedNames[tmpConstraint->source()]),
+ tmpConstraint->points().at(0).x,
+ tmpConstraint->points().at(0).y);
+
+ pts.push_back(newAnchorSource);
+
+ point_t newAnchorDest = searchAnchor(
+ mDecision->activityModel(
+ generatedNames[tmpConstraint->destination()]),
+ tmpConstraint->points().at(1).x,
+ tmpConstraint->points().at(1).y);
+
+ pts.push_back(newAnchorDest);
+ tmpConstraint->points(pts);
+
+ tmpConstraint->setSource(
+ generatedNames[tmpConstraint->source()]);
+
+ tmpConstraint->setDestination(
+ generatedNames[ tmpConstraint->destination()]);
+
+ mDecision->addPrecedenceConstraint(tmpConstraint);
+ }
+ else {
+ delete tmpConstraint;
+ }
+ }
+ }
+
+ mCopiedActivitiesModel.clear();
+ queueRedraw();
+}
+
+void DecisionDrawingArea::deleteElmts()
+{
+ if (!mCurrentActivitiesModel.empty()) {
+ std::string question = boost::lexical_cast
+ ((int)mCurrentActivitiesModel.size());
+
+ if (mCurrentActivitiesModel.size() == 1 && Question(_(
+ "Are you sure you want to delete this activity?"))) {
+ mDecision->removeActivityModel(
+ *mCurrentActivitiesModel.begin());
+ mCopiedActivitiesModel.clear();
+ mCurrentActivitiesModel.clear();
+ mCurrentPrecedenceConstraints.clear();
+ queueRedraw();
+ }
+ else if (mCurrentActivitiesModel.size() > 1 &&
+ Question(_("Are you sure you want to delete these ")
+ + question + _(" activities?"))) {
+
+ for (std::vector < ActivityModel* >::iterator it =
+ mCurrentActivitiesModel.begin();
+ it != mCurrentActivitiesModel.end(); ++it) {
+ mDecision->removeActivityModel(*it);
+ }
+ mCopiedActivitiesModel.clear();
+ mCurrentActivitiesModel.clear();
+ mCurrentPrecedenceConstraints.clear();
+ queueRedraw();
+ }
+ }
+}
+
bool DecisionDrawingArea::addActivity(guint x, guint y)
{
NewActivityDialog dialog(mXml, mDecision, *mDecision->getRule(),
- *mDecision->getOutputFunc(), *mDecision->getAckFunc());
+ *mDecision->getOutputFunc(), *mDecision->getAckFunc());
if (dialog.run() == Gtk::RESPONSE_ACCEPT) {
mDecision->addActivityModel(dialog.name(),
- x, y, ACTIVITY_WIDTH, ACTIVITY_HEIGHT);
+ x, y, ACTIVITY_WIDTH, ACTIVITY_HEIGHT);
+
ActivityModel* newActivity = mDecision->activityModel(dialog.name());
newActivity->setRules(dialog.getActRule());
newActivity->setOutputFunc(dialog.getActOut());
@@ -126,21 +290,22 @@ int DecisionDrawingArea::checkSize(ActivityModel* activityModel,
if ((activityModel->width() < textExtents.width + 2 * OFFSET) ||
(activityModel->width() > textExtents.width + 2 * OFFSET)) {
+
if ((textExtents.width + 2 * OFFSET) < ACTIVITY_WIDTH) {
mDecision->resizeActivityModel(activityModel, ACTIVITY_WIDTH,
- activityModel->height());
+ activityModel->height());
}
else {
mDecision->resizeActivityModel(activityModel, textExtents.width +
- 2 * OFFSET, activityModel->height());
+ 2 * OFFSET, activityModel->height());
}
}
return textExtents.height + OFFSET;
}
void DecisionDrawingArea::displaceActivitiesModel(int oldx, int oldy,
- int newx, int newy,
- bool& xok, bool& yok)
+ int newx, int newy,
+ bool& xok, bool& yok)
{
int oldWidth, oldHeight;
oldWidth = mDecision->width() + 2 * OFFSET;
@@ -154,8 +319,8 @@ void DecisionDrawingArea::displaceActivitiesModel(int oldx, int oldy,
yok = false;
if (deltax != 0 or deltay != 0) {
for (std::vector < ActivityModel* >::const_iterator it =
- mCurrentActivitiesModel.begin();
- it != mCurrentActivitiesModel.end(); ++it) {
+ mCurrentActivitiesModel.begin();
+ it != mCurrentActivitiesModel.end(); ++it) {
int _deltax = deltax;
int _deltay = deltay;
@@ -164,6 +329,7 @@ void DecisionDrawingArea::displaceActivitiesModel(int oldx, int oldy,
} else {
xok = true;
}
+
if ((*it)->y() + deltay < (int)(2 * OFFSET + HEADER_HEIGHT)) {
_deltay = 0;
} else {
@@ -172,22 +338,22 @@ void DecisionDrawingArea::displaceActivitiesModel(int oldx, int oldy,
mDecision->displace(*it, _deltax, _deltay);
- {
- int newWidth = (*it)->x() + (*it)->width();
- int newHeight = (*it)->y() + (*it)->height();
+ int newWidth = (*it)->x() + (*it)->width();
+ int newHeight = (*it)->y() + (*it)->height();
- if (newWidth > mDecision->width()) {
- mDecision->width(newWidth);
- mWidth = mDecision->width() + 2 * OFFSET;
- change = true;
- }
- if (newHeight > mDecision->height()) {
- mDecision->height(newHeight);
- mHeight = mDecision->height() + 2 * OFFSET;
- change = true;
- }
+ if (newWidth > mDecision->width()) {
+ mDecision->width(newWidth);
+ mWidth = mDecision->width() + 2 * OFFSET;
+ change = true;
+ }
+
+ if (newHeight > mDecision->height()) {
+ mDecision->height(newHeight);
+ mHeight = mDecision->height() + 2 * OFFSET;
+ change = true;
}
}
+
} else {
xok = true;
yok = true;
@@ -209,6 +375,7 @@ void DecisionDrawingArea::draw()
drawName();
drawActivitiesModel();
drawPrecedenceConstraints();
+ //drawZoomFrame();
if (mMouse.valid() and mBegin.valid()) {
mContext->set_source_rgb(1., 0., 0.);
@@ -226,8 +393,8 @@ void DecisionDrawingArea::draw()
mContext->move_to(0, 0);
mContext->set_line_width(2.0);
mContext->rectangle(mStartSelectRect.x, mStartSelectRect.y,
- mEndSelectRect.x - mStartSelectRect.x,
- mEndSelectRect.y - mStartSelectRect.y);
+ mEndSelectRect.x - mStartSelectRect.x,
+ mEndSelectRect.y - mStartSelectRect.y);
mContext->stroke();
}
@@ -236,6 +403,18 @@ void DecisionDrawingArea::draw()
}
}
+/*void DecisionDrawingArea::drawZoomFrame()
+{
+ if (mState == ZOOM_MODE) {
+ std::cout << "drawZoomFrame" << endl;
+ setColor(Settings::settings().getForegroundColor());
+ mContext->rectangle(mStartSelectRect.x, mStartSelectRect.y,
+ mEndSelectRect.x - mStartSelectRect.x,
+ mEndSelectRect.y - mStartSelectRect.y);
+ mContext->stroke();
+ }
+}
+*/
void DecisionDrawingArea::drawBackground()
{
setColor(Settings::settings().getBackgroundColor());
@@ -247,16 +426,17 @@ void DecisionDrawingArea::drawBackground()
void DecisionDrawingArea::drawName()
{
mContext->select_font_face(Settings::settings().getFont(),
- Cairo::FONT_SLANT_NORMAL,
- Cairo::FONT_WEIGHT_NORMAL);
+ Cairo::FONT_SLANT_NORMAL,
+ Cairo::FONT_WEIGHT_NORMAL);
mContext->set_font_size(Settings::settings().getFontSize());
Cairo::TextExtents textExtents;
mContext->get_text_extents(mDecision->name(), textExtents);
mContext->move_to(
- (mDecision->width() - textExtents.width) / 2 + OFFSET,
- OFFSET + (HEADER_HEIGHT + textExtents.height) / 2);
+ (mDecision->width() - textExtents.width) / 2 + OFFSET,
+ OFFSET + (HEADER_HEIGHT + textExtents.height) / 2);
+
mContext->show_text(mDecision->name());
mContext->stroke();
}
@@ -267,9 +447,11 @@ void DecisionDrawingArea::drawRectangle()
float maxWidth, maxHeight;
maxWidth = maxHeight = 0;
+
for (activitiesModel_t::const_iterator it =
- mDecision->activitiesModel().begin();
- it != mDecision->activitiesModel().end(); ++it) {
+ mDecision->activitiesModel().begin();
+ it != mDecision->activitiesModel().end(); ++it) {
+
if ((it->second->x() + it->second->width()) > maxWidth) {
maxWidth = it->second->x() + it->second->width();
}
@@ -299,35 +481,33 @@ void DecisionDrawingArea::drawRectangle()
}
drawRoundedRectangle(OFFSET, OFFSET, mDecision->width(),
- mDecision->height(), 1.0, 20, 1., 1., 1.);
+ mDecision->height(), 1.0, 20, 1., 1., 1.);
mContext->move_to(OFFSET, OFFSET + HEADER_HEIGHT);
mContext->line_to(
- mDecision->width() + OFFSET, OFFSET + HEADER_HEIGHT);
+ mDecision->width() + OFFSET, OFFSET + HEADER_HEIGHT);
mContext->stroke();
}
void DecisionDrawingArea::drawRoundedRectangle(guint x, guint y,
- guint width, guint height,
- double aspect,
- double corner_radius,
- double red,
- double green,
- double blue)
+ guint width, guint height,
+ double aspect, double corner_radius,
+ double red, double green, double blue)
{
double radius = corner_radius / aspect;
double degrees = M_PI / 180.0;
mContext->set_line_width(Settings::settings().getLineWidth());
mContext->begin_new_sub_path();
+
mContext->arc(x + width - radius, y + radius, radius,
- -90 * degrees, 0 * degrees);
+ -90 * degrees, 0 * degrees);
mContext->arc(x + width - radius, y + height - radius,
- radius, 0 * degrees, 90 * degrees);
+ radius, 0 * degrees, 90 * degrees);
mContext->arc(x + radius, y + height - radius, radius,
- 90 * degrees, 180 * degrees);
+ 90 * degrees, 180 * degrees);
mContext->arc(x + radius, y + radius, radius,
- 180 * degrees, 270 * degrees);
+ 180 * degrees, 270 * degrees);
mContext->close_path();
mContext->set_source_rgb(red, green, blue);
@@ -341,16 +521,16 @@ void DecisionDrawingArea::drawActivityModel(ActivityModel* activityModel)
setColor(Settings::settings().getSelectedColor());
if (std::find(mCurrentActivitiesModel.begin(),
- mCurrentActivitiesModel.end(), activityModel) !=
- mCurrentActivitiesModel.end()) {
+ mCurrentActivitiesModel.end(), activityModel) !=
+ mCurrentActivitiesModel.end()) {
drawRoundedRectangle(activityModel->x(), activityModel->y(),
- activityModel->width(), activityModel->height(),
- 1.0, 10, 0.44, 0.86, 0.58);
+ activityModel->width(), activityModel->height(),
+ 1.0, 10, 0.44, 0.86, 0.58);
}
else {
drawRoundedRectangle(activityModel->x(), activityModel->y(),
- activityModel->width(), activityModel->height(),
- 1.0, 10, 1., 1., 0.75);
+ activityModel->width(), activityModel->height(),
+ 1.0, 10, 1., 1., 0.75);
}
mContext->stroke();
@@ -361,7 +541,7 @@ void DecisionDrawingArea::drawActivityModel(ActivityModel* activityModel)
mContext->move_to(activityModel->x() + OFFSET, pos);
if (mState == ADD_CONSTRAINT_MODE && !mCurrentActivitiesModel.empty() &&
- activityModel == *mCurrentActivitiesModel.begin()) {
+ activityModel == *mCurrentActivitiesModel.begin()) {
drawAnchors(activityModel);
}
}
@@ -370,17 +550,18 @@ void DecisionDrawingArea::drawActivityModelName(ActivityModel* activityModel)
{
setColor(Settings::settings().getForegroundColor());
mContext->select_font_face(Settings::settings().getFont(),
- Cairo::FONT_SLANT_NORMAL,
- Cairo::FONT_WEIGHT_NORMAL);
+ Cairo::FONT_SLANT_NORMAL, Cairo::FONT_WEIGHT_NORMAL);
mContext->set_font_size(Settings::settings().getFontSize());
Cairo::TextExtents textExtents;
mContext->get_text_extents(activityModel->name(), textExtents);
- mContext->move_to(
- activityModel->x() + (activityModel->width() - textExtents.width) / 2,
- activityModel->y() + (ACTIVITY_NAME_HEIGHT +
- textExtents.height) / 2);
+
+ mContext->move_to(activityModel->x() +
+ (activityModel->width() - textExtents.width) / 2,
+ activityModel->y() +
+ (ACTIVITY_NAME_HEIGHT + textExtents.height) / 2);
+
mContext->show_text(activityModel->name());
mContext->stroke();
}
@@ -390,9 +571,10 @@ void DecisionDrawingArea::drawActivitiesModel()
if (!mCurrentActivitiesModel.empty()) {
ActivityModel* actSelect = NULL;
std::string nomSelect = mCurrentActivitiesModel.at(0)->name();
+
for (activitiesModel_t::const_iterator it =
- mDecision->activitiesModel().begin();
- it != mDecision->activitiesModel().end(); ++it) {
+ mDecision->activitiesModel().begin();
+ it != mDecision->activitiesModel().end(); ++it) {
if (it->second->name() == nomSelect) {
actSelect = it->second;
}
@@ -407,8 +589,8 @@ void DecisionDrawingArea::drawActivitiesModel()
}
else {
for (activitiesModel_t::const_iterator it =
- mDecision->activitiesModel().begin();
- it != mDecision->activitiesModel().end(); ++it) {
+ mDecision->activitiesModel().begin();
+ it != mDecision->activitiesModel().end(); ++it) {
drawActivityModel(it->second);
}
}
@@ -417,15 +599,16 @@ void DecisionDrawingArea::drawActivitiesModel()
void DecisionDrawingArea::drawPrecedenceConstraints()
{
mContext->set_source_rgb(0., 0., 0.);
+
for (precedenceConstraints_t::const_iterator
- it = mDecision->precedenceConstraints().begin();
- it != mDecision->precedenceConstraints().end(); ++it) {
+ it = mDecision->precedenceConstraints().begin();
+ it != mDecision->precedenceConstraints().end(); ++it) {
drawPrecedenceConstraint(*it);
}
}
void DecisionDrawingArea::drawPrecedenceConstraint(
- PrecedenceConstraintModel* precedenceConstraint) {
+ PrecedenceConstraintModel* precedenceConstraint) {
points_t::const_iterator it = precedenceConstraint->points().begin();
double xs = it->x;
double ys = it->y;
@@ -433,9 +616,11 @@ void DecisionDrawingArea::drawPrecedenceConstraint(
double yd = it->y;
mContext->move_to(xs, ys);
+
while (it != precedenceConstraint->points().end()) {
mContext->line_to(xd, yd);
++it;
+
if (it != precedenceConstraint->points().end()) {
xs = xd;
ys = yd;
@@ -508,31 +693,32 @@ bool DecisionDrawingArea::modifyCurrentActivityModel()
ActivityModel* activityModel = *mCurrentActivitiesModel.begin();
std::string oldName = activityModel->name();
ActivityDialog dialog(mXml, mDecision, activityModel,
- *mDecision->getRule(),*mDecision->getOutputFunc(),
- *mDecision->getAckFunc());
+ *mDecision->getRule(),*mDecision->getOutputFunc(),
+ *mDecision->getAckFunc());
if (dialog.run() == Gtk::RESPONSE_ACCEPT) {
activityModel->name(dialog.name());
activityModel->setRules(dialog.getActRule());
activityModel->setOutputFunc(dialog.getActOut());
activityModel->setAckFunc(dialog.getActAck());
+
if (!dialog.minstart().empty() && !dialog.maxfinish().empty()) {
activityModel->minstart(dialog.minstart());
activityModel->maxfinish(dialog.maxfinish());
}
+
if (oldName != dialog.name()) {
- mDecision->changeActivityModelName(oldName,
- dialog.name());
+ mDecision->changeActivityModelName(oldName, dialog.name());
}
activityModel->setRelativeDate(dialog.isRelativeDate());
checkSize(activityModel, activityModel->name());
int newWidth = activityModel->x() + activityModel->width() + OFFSET;
- int newHeight = activityModel->y() +
- activityModel->height() + OFFSET;
+ int newHeight = activityModel->y() + activityModel->height() + OFFSET;
if (newWidth > mDecision->width() ||
- newHeight > mDecision->height()) {
+ newHeight > mDecision->height()) {
+
if (newWidth > mDecision->width()) {
mDecision->width(newWidth);
mWidth = mDecision->width() + 2 * OFFSET;
@@ -542,6 +728,7 @@ bool DecisionDrawingArea::modifyCurrentActivityModel()
mDecision->height(newHeight);
mHeight = mDecision->height() + 2 * OFFSET;
}
+
mBuffer = Gdk::Pixmap::create(mWin, mWidth, mHeight, -1);
}
@@ -555,9 +742,10 @@ bool DecisionDrawingArea::modifyCurrentPrecedenceConstraint()
{
if (mCurrentPrecedenceConstraint != 0) {
PrecedenceConstraintDialog dialog(mXml, *mCurrentPrecedenceConstraint);
+
if (dialog.run() == Gtk::RESPONSE_ACCEPT) {
mDecision->updatePrecedenceConstraint(
- dialog.getPrecedenceConstraint());
+ dialog.getPrecedenceConstraint());
return true;
}
}
@@ -572,7 +760,7 @@ point_t DecisionDrawingArea::searchAnchor(const ActivityModel* activityModel,
double min = std::numeric_limits < double >::max();
for (points_t::const_iterator it = anchors.begin(); it != anchors.end();
- ++it) {
+ ++it) {
double deltax = (double)x - it->x;
double deltay = (double)y - it->y;
double dst = std::sqrt(deltax * deltax + deltay * deltay);
@@ -596,7 +784,7 @@ bool DecisionDrawingArea::on_button_press_event(GdkEventButton* event)
case SELECT_MODE:
if (event->type == GDK_BUTTON_PRESS and event->button == 1) {
if (selectActivityModel(event->x, event->y,
- event->state & GDK_CONTROL_MASK)) {
+ event->state & GDK_CONTROL_MASK)) {
queueRedraw();
}
}
@@ -622,8 +810,7 @@ bool DecisionDrawingArea::on_button_press_event(GdkEventButton* event)
break;
case DELETE_MODE:
if (selectActivityModel(event->x, event->y, false)) {
- if (Question(
- _("Are you sure you want to delete this activity?"))) {
+ if (Question(_("Are you sure you want to delete this activity?"))) {
mDecision->removeActivityModel(
*mCurrentActivitiesModel.begin());
mCurrentActivitiesModel.clear();
@@ -633,21 +820,29 @@ bool DecisionDrawingArea::on_button_press_event(GdkEventButton* event)
}
}
else if (selectPrecedenceConstraint(event->x, event->y)) {
- if (Question(
- _("Are you sure you want to delete this constraint?"))) {
+ if (Question(_("Are you sure you want to delete this constraint?"))) {
mDecision->removePrecedenceConstraint(
- *mCurrentPrecedenceConstraint);
+ *mCurrentPrecedenceConstraint);
mCurrentPrecedenceConstraints.clear();
queueRedraw();
}
}
break;
+ /*case ZOOM_MODE:
+ if (event->type == GDK_BUTTON_PRESS and event->button == 1) {
+ if (selectActivityModel(event->x, event->y,
+ event->state & GDK_CONTROL_MASK)) {
+ queueRedraw();
+ }
+ }
+ break;*/
case ADD_CONSTRAINT_MODE:
if (event->type == GDK_BUTTON_PRESS and event->button == 1) {
if (not (event->state & GDK_CONTROL_MASK) and
- selectActivityModel(event->x, event->y, false)) {
+ selectActivityModel(event->x, event->y, false)) {
+
mBegin = searchAnchor(*mCurrentActivitiesModel.begin(),
- event->x, event->y);
+ event->x, event->y);
mStartPoint.x = event->x;
mStartPoint.y = event->y;
mStartActivity = mCurrentActivitiesModel.front();
@@ -661,8 +856,73 @@ bool DecisionDrawingArea::on_button_press_event(GdkEventButton* event)
return true;
}
+
+
+
+
+
+
+
+
+
+/*
+void PluginDecision::onZoom(int button)
+{
+ switch (button) {
+ case 2:
+ addCoefZoom();
+ break;
+ case 3:
+ delCoefZoom();
+ break;
+ }
+ newSize();
+}
+
+
+void DecisionDrawingArea::addCoefZoom()
+{
+ mZoom = (mZoom >= ZOOM_MAX) ? ZOOM_MAX : mZoom + ZOOM_FACTOR_SUP;
+ mContext->set_font_size(Settings::settings().getFontSize() * mZoom);
+ newSize();
+}
+
+void DecisionDrawingArea::delCoefZoom()
+{
+ if (mZoom > 1.0)
+ mZoom = mZoom - ZOOM_FACTOR_SUP;
+ else
+ mZoom = (mZoom <= ZOOM_MIN) ? ZOOM_MIN : mZoom - ZOOM_FACTOR_INF;
+ mContext->set_font_size(Settings::settings().getFontSize() * mZoom);
+ newSize();
+}
+
+void DecisionDrawingArea::newSize()
+{
+ int tWidth = (int)(mWidth * mZoom);
+ int tHeight = (int)(mHeight * mZoom);
+ set_size_request(tWidth, tHeight);
+ mBuffer = Gdk::Pixmap::create(mWin, tWidth, tHeight, -1);
+ queueRedraw();
+}
+*/
+
+
+
+
+
+
+
+
+
+
+
+
bool DecisionDrawingArea::on_button_release_event(GdkEventButton* event)
{
+ // mMouse.x = (int)(event->x / mZoom);
+ // mMouse.y = (int)(event->y / mZoom);
+
switch (mState) {
case SELECT_MODE:
mPreviousX = -1;
@@ -675,45 +935,46 @@ bool DecisionDrawingArea::on_button_release_event(GdkEventButton* event)
// 4 cas
if (mStartSelectRect.x > mEndSelectRect.x && mStartSelectRect.y
- < mEndSelectRect.y) {
+ < mEndSelectRect.y) {
for (activitiesModel_t::const_iterator it = mDecision->
- activitiesModel().begin();
- it != mDecision->activitiesModel().end(); ++it) {
+ activitiesModel().begin();
+ it != mDecision->activitiesModel().end(); ++it) {
if (it->second->select(mEndSelectRect.x, mStartSelectRect.y,
- mStartSelectRect.x, mEndSelectRect.y)) {
+ mStartSelectRect.x, mEndSelectRect.y)) {
mCurrentActivitiesModel.push_back(it->second);
}
}
}
else if (mStartSelectRect.x > mEndSelectRect.x && mStartSelectRect.y
- > mEndSelectRect.y) {
+ > mEndSelectRect.y) {
for (activitiesModel_t::const_iterator it = mDecision->
- activitiesModel().begin();
- it != mDecision->activitiesModel().end(); ++it) {
+ activitiesModel().begin();
+ it != mDecision->activitiesModel().end(); ++it) {
if (it->second->select(mEndSelectRect.x, mEndSelectRect.y,
- mStartSelectRect.x, mStartSelectRect.y)) {
- mCurrentActivitiesModel.push_back(it->second);
+ mStartSelectRect.x, mStartSelectRect.y)) {
+ mCurrentActivitiesModel.push_back(it->second);
}
}
}
else if (mStartSelectRect.x < mEndSelectRect.x && mStartSelectRect.y
- > mEndSelectRect.y) {
+ > mEndSelectRect.y) {
for (activitiesModel_t::const_iterator it = mDecision->
- activitiesModel().begin();
- it != mDecision->activitiesModel().end(); ++it) {
+ activitiesModel().begin();
+ it != mDecision->activitiesModel().end(); ++it) {
+
if (it->second->select(mStartSelectRect.x, mEndSelectRect.y,
- mEndSelectRect.x, mStartSelectRect.y)) {
+ mEndSelectRect.x, mStartSelectRect.y)) {
mCurrentActivitiesModel.push_back(it->second);
}
}
}
else {
for (activitiesModel_t::const_iterator it = mDecision->
- activitiesModel().begin();
- it != mDecision->activitiesModel().end(); ++it) {
+ activitiesModel().begin();
+ it != mDecision->activitiesModel().end(); ++it) {
if (it->second->select(mStartSelectRect.x,
- mStartSelectRect.y,
- mEndSelectRect.x, mEndSelectRect.y)) {
+ mStartSelectRect.y,
+ mEndSelectRect.x, mEndSelectRect.y)) {
mCurrentActivitiesModel.push_back(it->second);
}
}
@@ -726,22 +987,21 @@ bool DecisionDrawingArea::on_button_release_event(GdkEventButton* event)
case ADD_CONSTRAINT_MODE:
if (event->button == 1) {
if (not mCurrentActivitiesModel.empty() and mStartPoint.x !=
- event->x
- and mStartPoint.y != event->y) {
+ event->x and mStartPoint.y != event->y) {
+
if (selectActivityModel(event->x, event->y, false)) {
if (mStartActivity->name() !=
mCurrentActivitiesModel.at(0)->name()) {
points_t pts;
pts.push_back(mBegin);
point_t anchor = searchAnchor(
- mCurrentActivitiesModel.at(0),
- event->x,
- event->y);
+ mCurrentActivitiesModel.at(0),
+ event->x, event->y);
pts.push_back(anchor);
mDecision->addPrecedenceConstraint(
- mStartActivity->name(),
- mCurrentActivitiesModel.at(0)->name(), pts);
+ mStartActivity->name(),
+ mCurrentActivitiesModel.at(0)->name(), pts);
}
}
}
@@ -754,6 +1014,39 @@ bool DecisionDrawingArea::on_button_release_event(GdkEventButton* event)
queueRedraw();
}
break;
+
+ /*case ZOOM_MODE:
+ if (event->button == 1) {
+ // to not zoom in case of very small selection.
+ if (std::max(mMouse.x, mPrecMouse.x) -
+ std::min(mMouse.x, mPrecMouse.x) > 5 &&
+ std::max(mMouse.y, mPrecMouse.y) -
+ std::min(mMouse.y, mPrecMouse.y) > 5) {
+ selectZoom(std::min(mMouse.get_x(), mPrecMouse.get_x()),
+ std::min(mMouse.get_y(), mPrecMouse.get_y()),
+ std::max(mMouse.get_x(), mPrecMouse.get_x()),
+ std::max(mMouse.get_y(), mPrecMouse.get_y()));
+ queueRedraw();
+ }
+ mPrecMouse.set_x(-1);
+ mPrecMouse.set_y(-1);
+
+ } else
+ onZoom(event->button);*/
+ break;
+
+ /*case ZOOM_MODE:
+ mPreviousX = -1;
+ mPreviousY = -1;
+ mDecisionResize = false;
+
+ if (mStartSelectRect.valid()) {
+ mCurrentActivitiesModel.clear();
+ mStartSelectRect.invalid();
+ queueRedraw();
+ }
+ break;*/
+
default:
break;
}
@@ -799,6 +1092,38 @@ bool DecisionDrawingArea::on_expose_event(GdkEventExpose*)
return true;
}
+bool DecisionDrawingArea::onQueryTooltip(int wx,int wy, bool /* keyboard_tooltip */,
+ const Glib::RefPtr& tooltip)
+{
+ Glib::ustring card;
+ bool found = false;
+ activitiesModel_t::const_reverse_iterator it;
+
+ for (it = mDecision->activitiesModel().rbegin();
+ it != mDecision->activitiesModel().rend() && found == false;) {
+ found = it->second->select(wx, wy);
+ if (!found) {
+ ++it;
+ }
+ }
+
+ if (found) {
+ card = it->second->card(mDecision);
+ tooltip->set_markup(card);
+ return true;
+ }
+ else if (selectPrecedenceConstraint(wx, wy)) {
+ card = mCurrentPrecedenceConstraint->card();
+ // set_tooltip_markup(card);
+ tooltip->set_markup(card);
+ return true;
+ }
+ else {
+ return false;
+ }
+
+}
+
bool DecisionDrawingArea::on_motion_notify_event(GdkEventMotion* event)
{
int button;
@@ -813,15 +1138,15 @@ bool DecisionDrawingArea::on_motion_notify_event(GdkEventMotion* event)
switch (mState) {
case SELECT_MODE:
- if (button == 1) {
+ if (button == 1) { // left clic
if (not mCurrentActivitiesModel.empty()) {
bool xok, yok;
displaceActivitiesModel(
- mPreviousX == -1 ? event->x : mPreviousX,
- mPreviousY == -1 ? event->y : mPreviousY,
- event->x, event->y, xok, yok);
+ mPreviousX == -1 ? event->x : mPreviousX,
+ mPreviousY == -1 ? event->y : mPreviousY,
+ event->x, event->y, xok, yok);
if (xok) {
mPreviousX = event->x;
}
@@ -842,100 +1167,67 @@ bool DecisionDrawingArea::on_motion_notify_event(GdkEventMotion* event)
}
}
}
- else if (button == 0) {
- bool found = false;
- activitiesModel_t::const_reverse_iterator it;
- for (it = mDecision->activitiesModel().rbegin();
- it != mDecision->activitiesModel().rend() && found == false;) {
- found = it->second->select(event->x, event->y);
- if (!found) {
- ++it;
- }
- }
- if (found) {
- // Prepare tooltip text
- std::string tooltipText = "" + it->second->name() + "";
- tooltipText += "\nRules:";
-
- std::map < std::string, strings_t >*
- tmpRules = mDecision->getRule();
- int j = it->second->getRules().size() - 1;
- for (int i = 0; i <= j;
- i++) {
- tooltipText += "\n- " + it->second->getRules().at(i);
-
- int k, l;
- k = 0;
- l = tmpRules->operator[]
- (it->second->getRules().at(i)).size() - 1;
- for (; k <= l; k++) {
- if (k == 0) {
- tooltipText += ", pred(s).:\n\t- " +
- tmpRules->operator[]
- (it->second->getRules().at(i)).at(k);
- }
- else {
- tooltipText += "\n\t- " + tmpRules->operator[]
- (it->second->getRules().at(i)).at(k);
- }
- }
- }
-
- if (it->second->getRelativeDate()) {
- tooltipText += "\nR. Minstart: " +
- it->second->minstart();
- tooltipText += "\nR. Maxfinish: " +
- it->second->maxfinish();
- }
- else {
- double x = vle::utils::convert < double >
- (it->second->minstart(), true);
- tooltipText += "\nMinstart: " +
- utils::DateTime::toJulianDayNumber(x);
- x = vle::utils::convert < double >
- (it->second->maxfinish(), true);
- tooltipText += "\nMaxfinish: " +
- utils::DateTime::toJulianDayNumber(x);
- }
- this->set_tooltip_markup(tooltipText);
- }
- else if (selectPrecedenceConstraint(event->x, event->y)) {
- // Seek precedence constraint
- std::string tooltipText;
- tooltipText = "Type: " + mCurrentPrecedenceConstraint->cType();
- tooltipText += "\nMintimelag: " +
- mCurrentPrecedenceConstraint->actTlMin();
- tooltipText += "\nMaxtimelag: " +
- mCurrentPrecedenceConstraint->actTlMax();
- this->set_tooltip_markup(tooltipText);
- }
- else {
- this->set_tooltip_text("");
- }
- }
break;
+
case ADD_CONSTRAINT_MODE:
if (button == 1) {
if (mBegin.valid()) {
+
if (selectActivityModel(event->x, event->y, false)) {
mEnd = searchAnchor(mCurrentActivitiesModel.front(),
- event->x, event->y);
+ event->x, event->y);
}
}
}
+
if (button == 0) {
mCurrentActivitiesModel.clear();
}
+
mMouse.x = event->x;
mMouse.y = event->y;
queueRedraw();
break;
+
+ /*case ZOOM_MODE:
+ if (button == 1) { // left clic
+ if (not mCurrentActivitiesModel.empty()) {
+
+ bool xok, yok;
+
+ displaceActivitiesModel(
+ mPreviousX == -1 ? event->x : mPreviousX,
+ mPreviousY == -1 ? event->y : mPreviousY,
+ event->x, event->y, xok, yok);
+ if (xok) {
+ mPreviousX = event->x;
+ }
+ if (yok) {
+ mPreviousY = event->y;
+ }
+ queueRedraw();
+ }
+ else {
+ point_t tmp(event->x, event->y);
+
+ if (mStartSelectRect.valid()) {
+ mEndSelectRect = tmp;
+ queueRedraw();
+ }
+ else {
+ mStartSelectRect = tmp;
+ }
+ }
+ }
+ break;*/
+
default:
break;
}
return true;
}
+
void DecisionDrawingArea::on_realize()
{
Gtk::DrawingArea::on_realize();
@@ -945,13 +1237,19 @@ void DecisionDrawingArea::on_realize()
queueRedraw();
}
+void DecisionDrawingArea::queueRedraw()
+{
+ mNeedRedraw = true;
+ queue_draw();
+}
+
void DecisionDrawingArea::drawAnchors(ActivityModel* activityModel)
{
const points_t& points = activityModel->anchors();
mContext->set_source_rgb(0., 0., 1.);
for (points_t::const_iterator it = points.begin(); it != points.end();
- ++it) {
+ ++it) {
mContext->rectangle(it->x - 2, it->y - 2, 5, 5);
mContext->fill();
}
@@ -963,7 +1261,7 @@ bool DecisionDrawingArea::selectActivityModel(guint x, guint y, bool ctrl)
activitiesModel_t::const_reverse_iterator it;
for (it = mDecision->activitiesModel().rbegin();
- it != mDecision->activitiesModel().rend() && found == false;) {
+ it != mDecision->activitiesModel().rend() && found == false;) {
found = it->second->select(x,y);
if (!found) {
++it;
@@ -985,8 +1283,8 @@ bool DecisionDrawingArea::selectActivityModel(guint x, guint y, bool ctrl)
}
if (std::find(mCurrentActivitiesModel.begin(),
- mCurrentActivitiesModel.end(),
- it->second) == mCurrentActivitiesModel.end()) {
+ mCurrentActivitiesModel.end(),
+ it->second) == mCurrentActivitiesModel.end()) {
mCurrentActivitiesModel.push_back(it->second);
}
} else {
@@ -999,7 +1297,7 @@ bool DecisionDrawingArea::selectActivityModel(guint x, guint y, bool ctrl)
bool DecisionDrawingArea::selectPrecedenceConstraint(guint mx, guint my)
{
std::vector < PrecedenceConstraintModel* > ::const_iterator itt =
- mDecision->precedenceConstraints().begin();
+ mDecision->precedenceConstraints().begin();
bool found = false;
while (itt != mDecision->precedenceConstraints().end() and not found) {
@@ -1009,6 +1307,7 @@ bool DecisionDrawingArea::selectPrecedenceConstraint(guint mx, guint my)
xs2 = it->x;
ys2 = it->y;
++it;
+
while (it != (*itt)->points().end() and not found) {
int xs, ys, xd, yd;
@@ -1029,18 +1328,20 @@ bool DecisionDrawingArea::selectPrecedenceConstraint(guint mx, guint my)
}
double h = -1;
- if (std::min(xs,
- xd) <= (int)mx and (int)mx <= std::max(xs, xd)
- and std::min(ys, yd) <= (int)my
- and (int)my <= std::max(ys, yd)) {
+ if (std::min(xs, xd) <= (int)mx and (int)mx <= std::max(xs, xd)
+ and std::min(ys, yd) <= (int)my
+ and (int)my <= std::max(ys, yd)) {
+
const double a = (ys - yd) / (double)(xs - xd);
const double b = ys - a * xs;
h = std::abs((my - (a * mx) - b) / std::sqrt(1 + a * a));
+
if (h <= 10) {
mCurrentPrecedenceConstraint = (*itt);
found = true;
}
}
+
if (not found) {
xs2 = it->x;
ys2 = it->y;
@@ -1057,8 +1358,7 @@ bool DecisionDrawingArea::selectPrecedenceConstraint(guint mx, guint my)
void DecisionDrawingArea::setColor(const Gdk::Color& color)
{
mContext->set_source_rgb(color.get_red_p(),
- color.get_green_p(),
- color.get_blue_p());
+ color.get_green_p(), color.get_blue_p());
}
}
diff --git a/vle.extension.decision/src/vle/gvle/modeling/decision/DecisionDrawingArea.hpp b/vle.extension.decision/src/vle/gvle/modeling/decision/DecisionDrawingArea.hpp
index 812d7d21..aecf7d7a 100644
--- a/vle.extension.decision/src/vle/gvle/modeling/decision/DecisionDrawingArea.hpp
+++ b/vle.extension.decision/src/vle/gvle/modeling/decision/DecisionDrawingArea.hpp
@@ -39,6 +39,10 @@
#include
#include
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
namespace vle {
namespace gvle {
namespace modeling {
@@ -56,7 +60,8 @@ class DecisionDrawingArea : public Gtk::DrawingArea
SELECT_MODE,
ADD_ACTIVITY_MODE,
ADD_CONSTRAINT_MODE,
- DELETE_MODE
+ DELETE_MODE,
+ ZOOM_MODE
};
/**
@@ -65,7 +70,7 @@ class DecisionDrawingArea : public Gtk::DrawingArea
* @param a reference to the gtk builder
*/
DecisionDrawingArea(BaseObjectType* cobject,
- const Glib::RefPtr < Gtk::Builder >& xml);
+ const Glib::RefPtr < Gtk::Builder >& xml);
/**
* @brief class destructor
@@ -76,23 +81,13 @@ class DecisionDrawingArea : public Gtk::DrawingArea
* @brief set the mouse cursor state
* @param state of the cursor
*/
- void setState(int state)
- {
- mState = state;
- mCurrentActivitiesModel.clear();
- }
+ void setState(int state);
/**
* @brief This function set the Decision model of the class
* @param a decision model
*/
- void setDecision(Decision* decision)
- {
- mDecision = decision;
- mWidth = mDecision->width() + 2 * OFFSET;
- mHeight = mDecision->height() + 2 * OFFSET;
- queueRedraw();
- }
+ void setDecision(Decision* decision);
private:
/**
@@ -102,6 +97,21 @@ class DecisionDrawingArea : public Gtk::DrawingArea
*/
bool addActivity(guint x, guint y);
+/**
+ * @brief
+ */
+// void addCoefZoom();
+
+/**
+ * @brief
+ */
+// void delCoefZoom();
+
+/**
+ * @brief
+ */
+ void newSize();
+
/**
* @brief This function check the size of the activity (text length for
* example)
@@ -121,7 +131,7 @@ class DecisionDrawingArea : public Gtk::DrawingArea
* @param valid y
*/
void displaceActivitiesModel(int oldx, int oldy, int newx, int newy,
- bool& xok, bool& yok);
+ bool& xok, bool& yok);
/**
* @brief This function draw all the diagram
@@ -156,8 +166,8 @@ class DecisionDrawingArea : public Gtk::DrawingArea
* @param the value of blue
*/
void drawRoundedRectangle(guint x, guint y, guint width, guint height,
- double aspect, double radius, double red,
- double green, double blue);
+ double aspect, double radius, double red,
+ double green, double blue);
/**
* @brief draw an activity
@@ -186,7 +196,7 @@ class DecisionDrawingArea : public Gtk::DrawingArea
* @param a pointer to the constraint to build
*/
void drawPrecedenceConstraint(
- PrecedenceConstraintModel* precedenceConstraint);
+ PrecedenceConstraintModel* precedenceConstraint);
/**
* @brief This function search the anchors where the precedence
@@ -246,6 +256,13 @@ class DecisionDrawingArea : public Gtk::DrawingArea
*/
bool on_expose_event(GdkEventExpose* event);
+/**
+ * @brief
+ * @param
+ * @return
+ */
+ bool onQueryTooltip(int wx,int wy, bool /* keyboard_tooltip */,
+ const Glib::RefPtr& tooltip);
/**
* @brief This function is called when an event is detected.
* @param the event
@@ -261,11 +278,7 @@ class DecisionDrawingArea : public Gtk::DrawingArea
/**
* @brief This function indicate that the diagram need to be redraw.
*/
- void queueRedraw()
- {
- mNeedRedraw = true;
- queue_draw();
- }
+ void queueRedraw();
/**
* @brief Set the color of an element
@@ -300,151 +313,31 @@ class DecisionDrawingArea : public Gtk::DrawingArea
/**
* @brief This function fill a vector with copied activities.
*/
- void copy()
- {
- if (!mCurrentActivitiesModel.empty())
- {
- mCopiedActivitiesModel = mCurrentActivitiesModel;
- }
- }
+ void copy();
/**
* @brief This function paste the copied activities.
*/
- void paste()
- {
- std::map < std::string, std::string > generatedNames;
- for (std::vector < ActivityModel* >::iterator it =
- mCopiedActivitiesModel.begin();
- it != mCopiedActivitiesModel.end(); ++it) {
- int number = 1;
- std::ostringstream oss;
- oss << number;
- std::string sNb = oss.str();
- while (mDecision->existActivityModel((*it)->name() +
- /*"_" +*/ sNb)) {
- number++;
- oss.str("");
- oss << number;
- sNb = oss.str();
- }
-
- generatedNames[(*it)->name()] = (*it)->name() + /*"_" +*/ sNb;
-
- mDecision->addActivityModel((*it)->name() + /*"_" +*/ sNb,
- (*it)->x() + OFFSET, (*it)->y() + OFFSET, ACTIVITY_WIDTH,
- ACTIVITY_HEIGHT);
- ActivityModel* newActivity = mDecision->activityModel((*it)->name()
- + /*"_" +*/ sNb);
- newActivity->setRules((*it)->getRules());
- newActivity->setOutputFunc((*it)->getOutputFunc());
- newActivity->setAckFunc((*it)->getAckFunc());
- checkSize(newActivity, newActivity->name());
-
- newActivity->minstart((*it)->minstart());
- newActivity->maxfinish((*it)->maxfinish());
-
- int newWidth = (*it)->x() + OFFSET + newActivity->width() + OFFSET;
- int newHeight = (*it)->y() + OFFSET + newActivity->height() +OFFSET;
-
- if (newWidth > mDecision->width() ||
- newHeight > mDecision->height()) {
- mDecision->width(newWidth);
- mDecision->height(newHeight);
- mWidth = mDecision->width() + 2 * OFFSET;
- mHeight = mDecision->height() + 2 * OFFSET;
- mBuffer = Gdk::Pixmap::create(mWin, mWidth, mHeight, -1);
- set_size_request(mWidth, mHeight);
- }
- }
-
- for (std::vector < ActivityModel* >::iterator it =
- mCopiedActivitiesModel.begin();
- it != mCopiedActivitiesModel.end(); ++it) {
- // Precedence constraints management
- for (std::vector < ActivityModel* >::iterator it2 =
- mCopiedActivitiesModel.begin();
- it2 != mCopiedActivitiesModel.end(); ++it2) {
- PrecedenceConstraintModel* tmpConstraint =
- new PrecedenceConstraintModel();
- if (mDecision->getPrecedenceConstraint((*it)->name(),
- (*it2)->name(), tmpConstraint)) {
- // Change precedence constraints coordinates, use anchors
- tmpConstraint->displaceSource(OFFSET, OFFSET);
- tmpConstraint->displaceDestination(OFFSET, OFFSET);
-
- points_t pts;
- point_t newAnchorSource = searchAnchor(
- mDecision->activityModel(
- generatedNames[tmpConstraint->source()]),
- tmpConstraint->points().at(0).x,
- tmpConstraint->points().at(0).y);
- pts.push_back(newAnchorSource);
-
- point_t newAnchorDest = searchAnchor(
- mDecision->activityModel(
- generatedNames[tmpConstraint->destination()]),
- tmpConstraint->points().at(1).x,
- tmpConstraint->points().at(1).y);
- pts.push_back(newAnchorDest);
- tmpConstraint->points(pts);
-
- tmpConstraint->setSource(
- generatedNames[tmpConstraint->source()]);
- tmpConstraint->setDestination(
- generatedNames[ tmpConstraint->destination()]);
- mDecision->addPrecedenceConstraint(tmpConstraint);
- }
- else {
- delete tmpConstraint;
- }
- }
- }
-
- mCopiedActivitiesModel.clear();
- queueRedraw();
- }
+ void paste();
/**
* @brief This function delete the selected activities.
*/
- void deleteElmts()
- {
- if (!mCurrentActivitiesModel.empty()) {
- std::string question = boost::lexical_cast
- ((int)mCurrentActivitiesModel.size());
-
- if (mCurrentActivitiesModel.size() == 1 && Question(_(
- "Are you sure you want to delete this activity?"))) {
- mDecision->removeActivityModel(
- *mCurrentActivitiesModel.begin());
- mCopiedActivitiesModel.clear();
- mCurrentActivitiesModel.clear();
- mCurrentPrecedenceConstraints.clear();
- queueRedraw();
- }
- else if (mCurrentActivitiesModel.size() > 1 &&
- Question(_("Are you sure you want to delete these ")
- + question + _(" activities?"))) {
- for (std::vector < ActivityModel* >::iterator it =
- mCurrentActivitiesModel.begin();
- it != mCurrentActivitiesModel.end(); ++it) {
- mDecision->removeActivityModel(*it);
- }
- mCopiedActivitiesModel.clear();
- mCurrentActivitiesModel.clear();
- mCurrentPrecedenceConstraints.clear();
- queueRedraw();
- }
- }
- }
+ void deleteElmts();
+
+// void drawZoomFrame();
static const guint OFFSET;
static const guint HEADER_HEIGHT;
static const guint ACTIVITY_NAME_HEIGHT;
static const guint ACTIVITY_HEIGHT;
static const guint ACTIVITY_WIDTH;
-
+/*
+ static const double ZOOM_FACTOR_SUP;
+ static const double ZOOM_FACTOR_INF;
+ static const double ZOOM_MIN;
+ static const double ZOOM_MAX;
+*/
Glib::RefPtr < Gtk::Builder > mXml;
Glib::RefPtr < Gdk::Pixmap > mBuffer;
@@ -462,6 +355,10 @@ class DecisionDrawingArea : public Gtk::DrawingArea
float mMaxHeight;
float mMaxWidth;
+// double mZoom;
+
+ sigc::connection m_cntSignalQueryTooltip;
+
std::vector < ActivityModel* > mCurrentActivitiesModel;
std::vector < PrecedenceConstraintModel* > mCurrentPrecedenceConstraints;
diff --git a/vle.extension.decision/src/vle/gvle/modeling/decision/Plugin.cpp b/vle.extension.decision/src/vle/gvle/modeling/decision/Plugin.cpp
index b343c74a..3eab0ab7 100644
--- a/vle.extension.decision/src/vle/gvle/modeling/decision/Plugin.cpp
+++ b/vle.extension.decision/src/vle/gvle/modeling/decision/Plugin.cpp
@@ -198,16 +198,17 @@ const Glib::ustring PluginDecision::UI_DEFINITION =
" "
" "
" "
+ //" "
" "
"";
PluginDecision::PluginDecision(const std::string& package,
- const std::string& library)
- : ModelingPlugin(package, library), mDialog(0), mDecision(0)
+ const std::string& library)
+ : ModelingPlugin(package, library), mDialog(0), mDecision(0)
{
std::string glade =
- utils::Path::path().getExternalPackagePluginGvleModelingFile(
- getPackage(), "decision.glade");
+ utils::Path::path().getExternalPackagePluginGvleModelingFile(
+ getPackage(), "decision.glade");
mXml = Gtk::Builder::create();
mXml->add_from_file(glade.c_str());
@@ -229,34 +230,43 @@ PluginDecision::PluginDecision(const std::string& package,
mXml->get_widget("imagemenuitem4", mSaveAsMenu);
mList.push_back(mIncludeButton->signal_clicked().connect(
- sigc::mem_fun(*this,
+ sigc::mem_fun(*this,
&PluginDecision::onIncludeSource)));
+
mList.push_back(mFactButton->signal_clicked().connect(
- sigc::mem_fun(*this,
+ sigc::mem_fun(*this,
&PluginDecision::onUserFact)));
+
mList.push_back(mPredicateButton->signal_clicked().connect(
- sigc::mem_fun(*this,
+ sigc::mem_fun(*this,
&PluginDecision::onUserPredicate)));
+
mList.push_back(mRuleButton->signal_clicked().connect(
- sigc::mem_fun(*this,
+ sigc::mem_fun(*this,
&PluginDecision::onUserRule)));
+
mList.push_back(mOutputButton->signal_clicked().connect(
- sigc::mem_fun(*this,
+ sigc::mem_fun(*this,
&PluginDecision::onUserOutputFunction)));
+
mList.push_back(mAckButton->signal_clicked().connect(
- sigc::mem_fun(*this,
+ sigc::mem_fun(*this,
&PluginDecision::onUserAckFunction)));
+
mList.push_back(mHierPredsButton->signal_clicked().connect(
- sigc::mem_fun(*this,
+ sigc::mem_fun(*this,
&PluginDecision::onUserHierPredicate)));
+
// Menu bar
mList.push_back(mOpenMenu->signal_activate().connect(
- sigc::mem_fun(*this,
+ sigc::mem_fun(*this,
&PluginDecision::onUserOpenMenu)));
+
mList.push_back(mChooseFileNameMenu->signal_activate().connect(
- sigc::mem_fun(*this, &PluginDecision::onChooseFileName)));
+ sigc::mem_fun(*this, &PluginDecision::onChooseFileName)));
+
mList.push_back(mSaveAsMenu->signal_activate().connect(
- sigc::mem_fun(*this, &PluginDecision::onUserSaveAsMenu)));
+ sigc::mem_fun(*this, &PluginDecision::onUserSaveAsMenu)));
{
Gtk::HBox* hbox;
mXml->get_widget("StatechartHBox", hbox);
@@ -267,7 +277,7 @@ PluginDecision::PluginDecision(const std::string& package,
mDialog->add_accel_group(mUIManager->get_accel_group());
createUI();
mToolbar = dynamic_cast < Gtk::Toolbar* > (
- mUIManager->get_widget("/Toolbar"));
+ mUIManager->get_widget("/Toolbar"));
mToolbar->set_toolbar_style(Gtk::TOOLBAR_BOTH);
mToolbar->set_orientation(Gtk::ORIENTATION_VERTICAL);
mToolbar->set_size_request(100, 50);
@@ -291,8 +301,8 @@ void PluginDecision::createUI()
mUIManager->add_ui_from_string(UI_DEFINITION);
} catch (const Glib::Error& ex) {
throw utils::InternalError(fmt(
- _("Decision modeling plugin building menus failed: %1%")) %
- ex.what());
+ _("Decision modeling plugin building menus failed: %1%")) %
+ ex.what());
}
#else
std::auto_ptr < Glib::Error > ex;
@@ -300,7 +310,7 @@ void PluginDecision::createUI()
if (ex.get()) {
throw utils::InternalError(fmt(
_("Decision modeling plugin building menus failed: %1%")) %
- ex->what());
+ ex->what());
}
#endif
}
@@ -321,6 +331,17 @@ void PluginDecision::onDelete()
mView->setState(DecisionDrawingArea::DELETE_MODE);
}
+void PluginDecision::onHelp()
+{
+ std::cout << "help" << endl;
+}
+/*
+void PluginDecision::onZoom()
+{
+ std::cout << "zoom" << endl;
+ mView->setState(DecisionDrawingArea::ZOOM_MODE);
+}
+*/
void PluginDecision::onSelect()
{
mView->setState(DecisionDrawingArea::SELECT_MODE);
@@ -332,14 +353,14 @@ void PluginDecision::onAddConstraint()
}
bool PluginDecision::create(vpz::AtomicModel& model,
- vpz::Dynamic& /*dynamic*/,
- vpz::Conditions& conditions,
- vpz::Observables& observables,
- const std::string& classname,
- const std::string& namespace_)
+ vpz::Dynamic& /*dynamic*/,
+ vpz::Conditions& conditions,
+ vpz::Observables& observables,
+ const std::string& classname,
+ const std::string& namespace_)
{
mPlanFileName = utils::Path::path().getPackageDataDir() + "/" +
- classname + ".txt";
+ classname + ".txt";
mPlanFile = classname;
mClassname = classname;
mNamespace = namespace_;
@@ -374,38 +395,44 @@ void PluginDecision::createActions()
Gtk::RadioAction::Group toolsGroup;
mActionGroup->add(
- Gtk::RadioAction::create(toolsGroup, "Select", Gtk::Stock::INDEX,
- _("Select"),
- _("Select activity (F1)")),
- Gtk::AccelKey("F1"), sigc::mem_fun(this, &PluginDecision::onSelect));
+ Gtk::RadioAction::create(toolsGroup, "Select",
+ Gtk::Stock::INDEX, _("Select"),
+ _("Select activity (F1)")), Gtk::AccelKey("F1"),
+ sigc::mem_fun(this, &PluginDecision::onSelect));
+
mActionGroup->add(
- Gtk::RadioAction::create(toolsGroup, "AddState", Gtk::Stock::ADD,
- _("Add activity"),
- _("Add activity (F2)")),
- Gtk::AccelKey("F2"),
- sigc::mem_fun(this, &PluginDecision::onAddActivity));
+ Gtk::RadioAction::create(toolsGroup, "AddState",
+ Gtk::Stock::ADD, _("Add activity"),
+ _("Add activity (F2)")), Gtk::AccelKey("F2"),
+ sigc::mem_fun(this, &PluginDecision::onAddActivity));
+
mActionGroup->add(
- Gtk::RadioAction::create(toolsGroup, "AddConstraint",
- Gtk::Stock::DISCONNECT,
- _("Add constraint"),
- _("Add constraint (F3)")),
- Gtk::AccelKey("F3"),
- sigc::mem_fun(this, &PluginDecision::onAddConstraint));
+ Gtk::RadioAction::create(toolsGroup, "AddConstraint",
+ Gtk::Stock::DISCONNECT, _("Add constraint"),
+ _("Add constraint (F3)")), Gtk::AccelKey("F3"),
+ sigc::mem_fun(this, &PluginDecision::onAddConstraint));
+
mActionGroup->add(
- Gtk::RadioAction::create(toolsGroup, "Delete", Gtk::Stock::DELETE,
- _("Delete"),
- _("Delete activity (F4)")),
- Gtk::AccelKey("F4"),
- sigc::mem_fun(this, &PluginDecision::onDelete));
+ Gtk::RadioAction::create(toolsGroup, "Delete",
+ Gtk::Stock::DELETE, _("Delete activity"),
+ _("Delete activity (F4)")), Gtk::AccelKey("F4"),
+ sigc::mem_fun(this, &PluginDecision::onDelete));
+
mActionGroup->add(
- Gtk::RadioAction::create(toolsGroup, "Help", Gtk::Stock::HELP,
- _("Help"), _("Help (F5)")),
- Gtk::AccelKey("F5"),
- sigc::mem_fun(this, &PluginDecision::onAddActivity));
+ Gtk::RadioAction::create(toolsGroup, "Help",
+ Gtk::Stock::HELP, _("Help"),
+ _("Help (F5)")), Gtk::AccelKey("F5"),
+ sigc::mem_fun(this, &PluginDecision::onHelp));
+
+ /*mActionGroup->add(
+ Gtk::RadioAction::create(toolsGroup, "Zoom",
+ Gtk::Stock::ZOOM_FIT, _("Zoom"),
+ _("Zoom (F6)")), Gtk::AccelKey("F6"),
+ sigc::mem_fun(this, &PluginDecision::onZoom));*/
}
void PluginDecision::generateSource(const std::string& classname,
- const std::string& namespace_)
+ const std::string& namespace_)
{
utils::Template tpl_(TEMPLATE_DEFINITION);
@@ -422,22 +449,22 @@ void PluginDecision::generateSource(const std::string& classname,
// Personalised parameters
std::string constructor;
for (std::map < std::string, std::string > ::iterator it = mParam.begin();
- it != mParam.end();
- ++it) {
+ it != mParam.end();
+ ++it) {
// Implements the parameterized constructor
constructor += "if (evts.exist(\"" + it->first + "\"))\n";
constructor += it->first + " = " + "evts.getDouble(\"" + it->first
- + "\");\n";
+ + "\");\n";
constructor += "else\n";
constructor += "throw vle::utils::ModellingError(\"Parameter" +
- it->first + "not found\");\n\n";
+ it->first + "not found\");\n\n";
}
tpl_.stringSymbol().append("constructor", constructor);
std::string definition;
for (std::map < std::string, std::string > ::iterator it = mParam.begin();
- it != mParam.end();
- ++it) {
+ it != mParam.end();
+ ++it) {
definition += "double " + it->first + ";\n";
}
tpl_.stringSymbol().append("definition", definition);
@@ -445,30 +472,31 @@ void PluginDecision::generateSource(const std::string& classname,
// facts
tpl_.listSymbol().append("facts");
for (std::vector < std::string > ::const_iterator it = mFactName.begin();
- it != mFactName.end(); ++it) {
+ it != mFactName.end(); ++it) {
tpl_.listSymbol().append("facts", *it);
}
// facts functions (specials tags)
tpl_.listSymbol().append("factsFunctionList");
for (std::vector < std::string > ::const_iterator it = mFactName.begin();
- it != mFactName.end(); ++it) {
+ it != mFactName.end(); ++it) {
tpl_.listSymbol().append("factsFunctionList", "{{factsFunctionTags"
- + *it + "}}" );
+ + *it + "}}" );
}
// facts attributes (specials tags)
tpl_.listSymbol().append("factsAttributeList");
for (std::vector < std::string > ::const_iterator it = mFactName.begin();
- it != mFactName.end(); ++it) {
+ it != mFactName.end(); ++it) {
tpl_.listSymbol().append("factsAttributeList", "{{factsAttributeTags"
- + *it + "}}" );
+ + *it + "}}" );
}
// Facts init list
tpl_.listSymbol().append("factsInitList");
for (std::vector < std::string > ::const_iterator it = mFactName.begin();
- it != mFactName.end(); ++it) {
+ it != mFactName.end(); ++it) {
+
std::string factinit;
if ( mFactInit.find(*it) != mFactInit.end() ) {
factinit = ",\n";
@@ -483,154 +511,157 @@ void PluginDecision::generateSource(const std::string& classname,
// addFacts list
tpl_.listSymbol().append("addFactsList");
for (std::vector < std::string > ::const_iterator it = mFactName.begin();
- it != mFactName.end(); ++it) {
+ it != mFactName.end(); ++it) {
std::string esp8 = " ";
std::string esp12 = esp8 + " ";
+
if (it == mFactName.begin() && it == (mFactName.end() - 1)) {
- tpl_.listSymbol().append("addFactsList", "\n" + esp8 +
- "addFacts(this) +=\n" + esp12 + ""\
- "F(\"" + *it + "\", &" + classname + "::" + *it + ");\n");
+ tpl_.listSymbol().append("addFactsList", "\n" + esp8 +
+ "addFacts(this) +=\n" + esp12 + ""\
+ "F(\"" + *it + "\", &" + classname + "::" + *it + ");\n");
}
else if (it == mFactName.begin()) {
tpl_.listSymbol().append("addFactsList", "\n" + esp8 +
- "addFacts(this) +=\n" + esp12 + ""\
- "F(\"" + *it + "\", &" + classname + "::" + *it + "),\n");
+ "addFacts(this) +=\n" + esp12 + ""\
+ "F(\"" + *it + "\", &" + classname + "::" + *it + "),\n");
}
else if (it == (mFactName.end() - 1) ) {
tpl_.listSymbol().append("addFactsList", esp12 + "F(\"" + *it +
- "\", &" + classname + "::" + *it + ");\n" );
+ "\", &" + classname + "::" + *it + ");\n" );
}
else {
tpl_.listSymbol().append("addFactsList", esp12 + "F(\"" + *it +
- "\", &" + classname + "::" + *it + "),\n" );
+ "\", &" + classname + "::" + *it + "),\n" );
}
}
// output functions
tpl_.listSymbol().append("outputFunctions");
for (std::vector < std::string > ::const_iterator it =
- mOutputFunctionName.begin();
- it != mOutputFunctionName.end(); ++it) {
+ mOutputFunctionName.begin();
+ it != mOutputFunctionName.end(); ++it) {
tpl_.listSymbol().append("outputFunctions", *it);
}
// output functions (specials tags)
tpl_.listSymbol().append("outputFunctionList");
for (std::vector < std::string > ::const_iterator it =
- mOutputFunctionName.begin();
- it != mOutputFunctionName.end(); ++it) {
+ mOutputFunctionName.begin();
+ it != mOutputFunctionName.end(); ++it) {
tpl_.listSymbol().append("outputFunctionList", "{{outputFunctionTags"
- + *it + "}}");
+ + *it + "}}");
}
// add output functions list
tpl_.listSymbol().append("addOutputFunctionList");
for (std::vector < std::string > ::const_iterator it =
- mOutputFunctionName.begin();
- it != mOutputFunctionName.end(); ++it) {
+ mOutputFunctionName.begin();
+ it != mOutputFunctionName.end(); ++it) {
std::string esp8 = " ";
std::string esp12 = esp8 + " ";
if (it == mOutputFunctionName.begin() && it ==
- (mOutputFunctionName.end() - 1)) {
+ (mOutputFunctionName.end() - 1)) {
tpl_.listSymbol().append("addOutputFunctionList", "\n" + esp8 +
- "addOutputFunctions(this) +=\n" + esp12 + ""\
- "O(\"" + *it + "\", &" + classname + "::" + *it + ");\n");
+ "addOutputFunctions(this) +=\n" + esp12 + ""\
+ "O(\"" + *it + "\", &" + classname + "::" + *it + ");\n");
}
else if (it == mOutputFunctionName.begin()) {
tpl_.listSymbol().append("addOutputFunctionList", "\n" + esp8 +
- "addOutputFunctions(this) +=\n" + esp12 + ""\
- "O(\"" + *it + "\", &" + classname + "::" + *it + "),\n");
+ "addOutputFunctions(this) +=\n" + esp12 + "O(\"" +
+ *it + "\", &" + classname + "::" + *it + "),\n");
}
else if (it == (mOutputFunctionName.end() - 1) ) {
- tpl_.listSymbol().append("addOutputFunctionList", esp12 + "O(\""
- + *it + "\", &" + classname + "::" + *it + ");\n");
+ tpl_.listSymbol().append("addOutputFunctionList", esp12 + "O(\"" +
+ *it + "\", &" + classname + "::" + *it + ");\n");
}
else {
tpl_.listSymbol().append("addOutputFunctionList", esp12 + "O(\""
- + *it + "\", &" + classname + "::" + *it + "),\n");
+ + *it + "\", &" + classname + "::" + *it + "),\n");
}
}
// acknowledge functions
tpl_.listSymbol().append("ackFunctions");
for (std::vector < std::string > ::const_iterator it =
- mAckFunctionName.begin();
- it != mAckFunctionName.end(); ++it) {
+ mAckFunctionName.begin();
+ it != mAckFunctionName.end(); ++it) {
tpl_.listSymbol().append("ackFunctions", *it);
}
// acknowledge functions (specials tags)
tpl_.listSymbol().append("ackFunctionList");
for (std::vector < std::string > ::const_iterator it =
- mAckFunctionName.begin();
- it != mAckFunctionName.end(); ++it) {
+ mAckFunctionName.begin();
+ it != mAckFunctionName.end(); ++it) {
tpl_.listSymbol().append("ackFunctionList", "{{ackFunctionTags"
- + *it + "}}");
+ + *it + "}}");
}
// add acknowledge functions list
tpl_.listSymbol().append("addAckFunctionList");
for (std::vector < std::string > ::const_iterator it =
- mAckFunctionName.begin();
- it != mAckFunctionName.end(); ++it) {
+ mAckFunctionName.begin();
+ it != mAckFunctionName.end(); ++it) {
std::string esp8 = " ";
std::string esp12 = esp8 + " ";
if (it == mAckFunctionName.begin() && it ==
- (mAckFunctionName.end() - 1)) {
+ (mAckFunctionName.end() - 1)) {
tpl_.listSymbol().append("addAckFunctionList", "\n" + esp8 +
- "addAcknowledgeFunctions(this) +=\n" + esp12 + ""\
- "A(\"" + *it + "\", &" + classname + "::" + *it + ");\n");
+ "addAcknowledgeFunctions(this) +=\n" + esp12 + ""\
+ "A(\"" + *it + "\", &" + classname + "::" + *it + ");\n");
}
else if (it == mAckFunctionName.begin()) {
- tpl_.listSymbol().append("addAckFunctionList", "\n" + esp8 +
- "addAcknowledgeFunctions(this) +=\n" + esp12 + ""\
- "A(\"" + *it + "\", &" + classname + "::" + *it + "),\n");
+ tpl_.listSymbol().append("addAckFunctionList", "\n" + esp8 +
+ "addAcknowledgeFunctions(this) +=\n" + esp12 + ""\
+ "A(\"" + *it + "\", &" + classname + "::" + *it + "),\n");
}
else if (it == (mAckFunctionName.end() - 1) ) {
- tpl_.listSymbol().append("addAckFunctionList", esp12 + "A(\""
- + *it + "\", &" + classname + "::" + *it + ");\n");
+ tpl_.listSymbol().append("addAckFunctionList", esp12 + "A(\""
+ + *it + "\", &" + classname + "::" + *it + ");\n");
}
else {
- tpl_.listSymbol().append("addAckFunctionList", esp12 + "A(\""
- + *it + "\", &" + classname + "::" + *it + "),\n");
+ tpl_.listSymbol().append("addAckFunctionList", esp12 + "A(\""
+ + *it + "\", &" + classname + "::" + *it + "),\n");
}
}
// predicates
tpl_.listSymbol().append("predicates");
for (std::vector < std::string > ::const_iterator it =
- mPredicateName.begin();
- it != mPredicateName.end(); ++it) {
+ mPredicateName.begin();
+ it != mPredicateName.end(); ++it) {
tpl_.listSymbol().append("predicates", *it);
}
// predicates functions (specials tags)
tpl_.listSymbol().append("predicatesFunctionList");
for (std::vector < std::string > ::const_iterator it =
- mPredicateName.begin();
- it != mPredicateName.end(); ++it) {
+ mPredicateName.begin();
+ it != mPredicateName.end(); ++it) {
tpl_.listSymbol().append("predicatesFunctionList",
- "{{predicatesFunctionTags" + *it + "}}" );
+ "{{predicatesFunctionTags" + *it + "}}" );
}
// addPredicates list
tpl_.listSymbol().append("addPredicatesList");
if (!mPred.empty() || !mPredicateName.empty()) {
for (std::vector < std::string > ::const_iterator it =
- mPredicateName.begin();
- it != mPredicateName.end(); ++it) {
+ mPredicateName.begin();
+ it != mPredicateName.end(); ++it) {
+
std::string esp8 = " ";
std::string esp12 = esp8 + " ";
+
if (it == mPredicateName.begin()) {
tpl_.listSymbol().append("addPredicatesList", "\n" + esp8 +
- "addPredicates(this) +=\n" + esp12
- + "P(\"" + *it + "\", &" + classname +
- "::" + *it + ")");
+ "addPredicates(this) +=\n" + esp12
+ + "P(\"" + *it + "\", &" + classname +
+ "::" + *it + ")");
}
else {
tpl_.listSymbol().append("addPredicatesList", ",\n" + esp12
- + "P(\"" + *it
- + "\", &" + classname + "::" + *it + ")" );
+ + "P(\"" + *it
+ + "\", &" + classname + "::" + *it + ")" );
}
}
if (mPred.empty()) {
@@ -638,19 +669,20 @@ void PluginDecision::generateSource(const std::string& classname,
}
else {
for (hierarchicalPred::iterator it = mPred.begin();
- it != mPred.end(); ++it) {
+ it != mPred.end(); ++it) {
std::string esp8 = " ";
std::string esp12 = esp8 + " ";
+
if (it == mPred.begin() && mPredicateName.empty()) {
tpl_.listSymbol().append("addPredicatesList", "\n" + esp8 +
- "addPredicates(this) +=\n" + esp12
- + "P(\"" + it->first + "\", &" + classname +
- "::" + it->first + ")");
+ "addPredicates(this) +=\n" + esp12
+ + "P(\"" + it->first + "\", &" + classname +
+ "::" + it->first + ")");
}
else {
tpl_.listSymbol().append("addPredicatesList", ",\n" +
- esp12 + "P(\"" + it->first
- + "\", &" + classname + "::" + it->first + ")" );
+ esp12 + "P(\"" + it->first + "\", &" +
+ classname + "::" + it->first + ")" );
}
}
tpl_.listSymbol().append("addPredicatesList", ";");
@@ -660,10 +692,10 @@ void PluginDecision::generateSource(const std::string& classname,
// parameters
tpl_.listSymbol().append("parameters");
for (std::map < std::string, std::string > ::const_iterator it =
- mParam.begin();
- it != mParam.end(); ++it) {
+ mParam.begin();
+ it != mParam.end(); ++it) {
tpl_.listSymbol().append("parameters", it->first +
- "," + "double" + "," + it->second);
+ "," + "double" + "," + it->second);
}
// hierPred
@@ -684,10 +716,9 @@ void PluginDecision::generateSource(const std::string& classname,
// hierarchical predicates
std::string hierarchicalPred("/*@@begin:hierarchicalPreds@@\n");
for (hierarchicalPred::iterator it = mPred.begin(); it != mPred.end();
- ++it) {
+ ++it) {
for (strings_t::iterator it2 = it->second.begin();
- it2 != it->second.end();
- it2++) {
+ it2 != it->second.end(); it2++) {
hierarchicalPred += *it2 + ";";
}
}
@@ -705,8 +736,9 @@ void PluginDecision::generateSource(const std::string& classname,
// facts functions (function)
for (std::vector < std::string > ::const_iterator it = mFactName.begin();
- it != mFactName.end(); ++it) {
+ it != mFactName.end(); ++it) {
std::string function;
+
if ( mFactFunction.find(*it) != mFactFunction.end() ) {
function = "void " + *it + "(const vv::Value& value)\n{";
function += "//@@begin:factsFunction" + *it + "@@\n";
@@ -743,38 +775,41 @@ void PluginDecision::generateSource(const std::string& classname,
// output functions (specials tags)
for (std::vector < std::string > ::const_iterator it =
- mOutputFunctionName.begin();
- it != mOutputFunctionName.end(); ++it) {
+ mOutputFunctionName.begin();
+ it != mOutputFunctionName.end(); ++it) {
std::string tag = "outputFunctionTags" + *it;
std::string function = "void " + *it + "(\n"\
- "const std::string& name,\nconst ved::Activity& activity,\n"\
- "vd::ExternalEventList& output) {";
+ "const std::string& name,\nconst ved::Activity& activity,\n"\
+ "vd::ExternalEventList& output) {";
+
function += "//@@begin:outputFunction" + *it +
- "@@\n" + mOutputFunction[*it] + "//@@end:outputFunction" +
- *it + "@@\n}";
+ "@@\n" + mOutputFunction[*it] + "//@@end:outputFunction" +
+ *it + "@@\n}";
tpl_.stringSymbol().append(tag, function);
}
// acknowledge functions (specials tags)
for (std::vector < std::string > ::const_iterator it =
- mAckFunctionName.begin();
- it != mAckFunctionName.end(); ++it) {
+ mAckFunctionName.begin();
+ it != mAckFunctionName.end(); ++it) {
std::string tag = "ackFunctionTags" + *it;
std::string function = "void " + *it + "(const std::string&"\
"/*activityname*/, const ved::Activity& /*activity*/) {";
+
function += "//@@begin:ackFunction" + *it +
- "@@\n" + mAckFunction[*it] + "//@@end:ackFunction" +
- *it + "@@\n}";
+ "@@\n" + mAckFunction[*it] + "//@@end:ackFunction" +
+ *it + "@@\n}";
tpl_.stringSymbol().append(tag, function);
}
// predicates functions (function)
for (std::vector < std::string > ::const_iterator it =
- mPredicateName.begin();
- it != mPredicateName.end(); ++it) {
+ mPredicateName.begin();
+ it != mPredicateName.end(); ++it) {
std::string function;
+
if ( mPredicateFunction.find(*it) != mPredicateFunction.end() ) {
function = "bool " + *it + "() const\n{";
function += "//@@begin:predicatesFunction" + *it + "@@\n";
@@ -820,8 +855,8 @@ bool PluginDecision::modify(vpz::AtomicModel& model,
// name, it uses the one who is in the conditions
if (conditions.exist(conditionPlanName)) {
- mPlanFile =
- conditions.get(conditionPlanName).firstValue("planFile").toString().value();
+ mPlanFile = conditions.get(conditionPlanName).
+ firstValue("planFile").toString().value();
}
mDialog->set_title("Decision - Plugin : " + mPlanFile + ".txt");
@@ -835,84 +870,81 @@ bool PluginDecision::modify(vpz::AtomicModel& model,
// parse the hierarchical predicates informations
std::string hierP = parseFunction(buffer, "@@begin:hierarchicalPreds@@",
- "@@end:hierarchicalPreds@@", "hierarchicalPreds");
+ "@@end:hierarchicalPreds@@", "hierarchicalPreds");
decodePredicates(hierP);
mPlanFileName = utils::Path::path().getPackageDataDir() + "/" +
- mPlanFile + ".txt";
+ mPlanFile + ".txt";
+
+ mInclude.assign(parseFunction(buffer, "//@@begin:include@@",
+ "//@@end:include@@", "include"));
- mInclude.assign(parseFunction(buffer,
- "//@@begin:include@@",
- "//@@end:include@@",
- "include"));
mCustomConstructor.assign(parseFunction(buffer,
- "//@@begin:customconstructor@@",
- "//@@end:customconstructor@@",
- "customconstructeur"));
- mConstructor.assign(parseFunction(buffer,
- "//@@begin:constructor@@",
- "//@@end:constructor@@",
- "constructor"));
- mDefinition.assign(parseFunction(buffer,
- "//@@begin:definition@@",
- "//@@end:definition@@",
- "definition"));
+ "//@@begin:customconstructor@@", "//@@end:customconstructor@@",
+ "customconstructeur"));
+
+ mConstructor.assign(parseFunction(buffer, "//@@begin:constructor@@",
+ "//@@end:constructor@@", "constructor"));
+
+ mDefinition.assign(parseFunction(buffer, "//@@begin:definition@@",
+ "//@@end:definition@@", "definition"));
// parse the facts functions informations
for (std::vector < std::string > ::const_iterator it = mFactName.begin();
- it != mFactName.end(); ++it) {
+ it != mFactName.end(); ++it) {
mFactFunction[*it] = parseFunction(buffer, "//@@begin:factsFunction"
- + *it + "@@", "//@@end:factsFunction" + *it + "@@", "factsFunction"
- + *it);
+ + *it + "@@", "//@@end:factsFunction" + *it
+ + "@@", "factsFunction" + *it);
}
- mMembers.assign(parseFunction(buffer,
- "//@@begin:custommembers@@",
- "//@@end:custommembers@@",
- "custommembers"));
+ mMembers.assign(parseFunction(buffer, "//@@begin:custommembers@@",
+ "//@@end:custommembers@@", "custommembers"));
// parse the facts attributes informations
for (std::vector < std::string > ::const_iterator it = mFactName.begin();
- it != mFactName.end(); ++it) {
+ it != mFactName.end(); ++it) {
mFactAttribute[*it] = parseFunction(buffer, "//@@begin:factsAttribute"
- + *it + "@@", "//@@end:factsAttribute" + *it + "@@",
- "factsAttribute" + *it);
+ + *it + "@@", "//@@end:factsAttribute" + *it + "@@",
+ "factsAttribute" + *it);
}
// parse the facts Init informations
for (std::vector < std::string > ::const_iterator it = mFactName.begin();
- it != mFactName.end(); ++it) {
+ it != mFactName.end(); ++it) {
mFactInit[*it] = parseFunction(buffer, "//@@begin:factsInit"
- + *it + "@@", "//@@end:factsInit" + *it + "@@",
- "factsInit" + *it);
+ + *it + "@@", "//@@end:factsInit" + *it + "@@",
+ "factsInit" + *it);
}
// parse the predicates functions informations
for (std::vector < std::string > ::const_iterator it =
- mPredicateName.begin();
- it != mPredicateName.end(); ++it) {
+ mPredicateName.begin();
+ it != mPredicateName.end(); ++it) {
+
mPredicateFunction[*it] = parseFunction(buffer,
- "//@@begin:predicatesFunction" + *it + "@@",
- "//@@end:predicatesFunction" + *it + "@@", "predicatesFunction"
- + *it);
+ "//@@begin:predicatesFunction" + *it + "@@",
+ "//@@end:predicatesFunction" + *it + "@@",
+ "predicatesFunction" + *it);
}
// parse the output functions informations
for (std::vector < std::string > ::const_iterator it =
- mOutputFunctionName.begin();
- it != mOutputFunctionName.end(); ++it) {
+ mOutputFunctionName.begin();
+ it != mOutputFunctionName.end(); ++it) {
+
mOutputFunction[*it] = parseFunction(buffer, "//@@begin:outputFunction"
- + *it + "@@", "//@@end:outputFunction" + *it +
- "@@", "outputFunction" + *it);
+ + *it + "@@", "//@@end:outputFunction" + *it +
+ "@@", "outputFunction" + *it);
}
// parse the acknowledge functions informations
for (std::vector < std::string > ::const_iterator it =
- mAckFunctionName.begin();
- it != mAckFunctionName.end(); ++it) {
+ mAckFunctionName.begin();
+ it != mAckFunctionName.end(); ++it) {
+
mAckFunction[*it] = parseFunction(buffer, "//@@begin:ackFunction"
- + *it + "@@", "//@@end:ackFunction" + *it +
- "@@", "ackFunction" + *it);
+ + *it + "@@", "//@@end:ackFunction" + *it +
+ "@@", "ackFunction" + *it);
}
mDecision = new Decision(mClassname);
@@ -922,13 +954,14 @@ bool PluginDecision::modify(vpz::AtomicModel& model,
if (!loadPlanFile(mPlanFileName)) {
Gtk::MessageDialog errorDial("Error filling knowledge"\
- "base!\n"\
- "Check correspondence between predicates, acknowledge"\
- "functions and output functions with the C++ class...",
- false,
- Gtk::MESSAGE_ERROR,
- Gtk::BUTTONS_OK,
- true);
+ "base!\n"\
+ "Check correspondence between predicates, acknowledge"\
+ "functions and output functions with the C++ class...",
+ false,
+ Gtk::MESSAGE_ERROR,
+ Gtk::BUTTONS_OK,
+ true);
+
errorDial.set_title("Error !");
errorDial.run();
return false;
@@ -983,31 +1016,33 @@ bool PluginDecision::loadPlanFile(std::string filename)
//KnowledgeBase Inititialisation
mDecision->resetKnowledgeBase();
+
for (std::vector < std::string > ::const_iterator it =
- mPredicateName.begin();
- it != mPredicateName.end(); ++it) {
+ mPredicateName.begin();
+ it != mPredicateName.end(); ++it) {
mDecision->getKnowledgeBase()->predicates().add(*it,
- boost::bind(&PluginDecision::dumyPredicate, this));
+ boost::bind(&PluginDecision::dumyPredicate, this));
}
+
for (hierarchicalPred::const_iterator it =
- mPred.begin();
- it != mPred.end(); ++it) {
+ mPred.begin();
+ it != mPred.end(); ++it) {
mDecision->getKnowledgeBase()->predicates().add(it->first,
- boost::bind(&PluginDecision::dumyPredicate, this));
+ boost::bind(&PluginDecision::dumyPredicate, this));
}
for (std::vector < std::string > ::const_iterator it =
- mOutputFunctionName.begin();
- it != mOutputFunctionName.end(); ++it) {
+ mOutputFunctionName.begin();
+ it != mOutputFunctionName.end(); ++it) {
mDecision->getKnowledgeBase()->outputFunctions().add(*it,
- boost::bind(&PluginDecision::dumyPredicate, this));
+ boost::bind(&PluginDecision::dumyPredicate, this));
}
for (std::vector < std::string > ::const_iterator it =
- mAckFunctionName.begin();
- it != mAckFunctionName.end(); ++it) {
+ mAckFunctionName.begin();
+ it != mAckFunctionName.end(); ++it) {
mDecision->getKnowledgeBase()->acknowledgeFunctions().add(*it,
- boost::bind(&PluginDecision::dumyPredicate, this));
+ boost::bind(&PluginDecision::dumyPredicate, this));
}
// Fill KB with plan
@@ -1017,22 +1052,24 @@ bool PluginDecision::loadPlanFile(std::string filename)
// Get the Activities dates in the KB
for (vle::extension::decision::Activities::const_iterator it =
- mDecision->getKnowledgeBase()->activities().begin();
- it != mDecision->getKnowledgeBase()->activities().end(); ++it)
- {
+ mDecision->getKnowledgeBase()->activities().begin();
+ it != mDecision->getKnowledgeBase()->activities().end(); ++it) {
+
mDecision->activityModel(it->first)->minstart(
- utils::toScientificString(it->second.minstart()));
+ utils::toScientificString(it->second.minstart()));
+
mDecision->activityModel(it->first)->maxfinish(
- utils::toScientificString(it->second.maxfinish()));
+ utils::toScientificString(it->second.maxfinish()));
}
// Get the Rules atached to an activity in the KB
for (vle::extension::decision::Activities::const_iterator it =
- mDecision->getKnowledgeBase()->activities().begin();
- it != mDecision->getKnowledgeBase()->activities().end(); ++it) {
+ mDecision->getKnowledgeBase()->activities().begin();
+ it != mDecision->getKnowledgeBase()->activities().end(); ++it) {
+
for (vle::extension::decision::Rules::const_iterator it2 =
- it->second.rules().begin();
- it2 != it->second.rules().end(); ++it2) {
+ it->second.rules().begin();
+ it2 != it->second.rules().end(); ++it2) {
mDecision->activityModel(it->first)->addRule(it2->first);
}
}
@@ -1051,20 +1088,22 @@ void PluginDecision::writePlanFile(std::string filename)
// width & height
templateSave.stringSymbol().append("width",
- boost::lexical_cast < std::string > (
- mDecision->width()));
+ boost::lexical_cast < std::string > (mDecision->width()));
+
templateSave.stringSymbol().append("height",
- boost::lexical_cast < std::string > (
- mDecision->height()));
+ boost::lexical_cast < std::string > (mDecision->height()));
// activities
templateSave.listSymbol().append("activities");
+
for (activitiesModel_t::const_iterator it = mDecision->
- activitiesModel().begin(); it !=
- mDecision->activitiesModel().end(); ++it) {
+ activitiesModel().begin(); it !=
+ mDecision->activitiesModel().end(); ++it) {
+
std::string outputFunc = "";
std::string ackFunc = "";
std::string relDate = "";
+
if (!it->second->getOutputFunc().empty()) {
outputFunc = it->second->getOutputFunc().at(0);
}
@@ -1075,17 +1114,19 @@ void PluginDecision::writePlanFile(std::string filename)
relDate = "R";
}
templateSave.listSymbol().append("activities", it->second->toString() +
- "," + outputFunc + "," + ackFunc + "," + relDate);
+ "," + outputFunc + "," + ackFunc + "," + relDate);
}
//ruleAndPred
templateSave.listSymbol().append("ruleAndPred");
for (std::map < std::string, strings_t > ::const_iterator it =
- mRule.begin(); it != mRule.end(); ++it ) {
+ mRule.begin(); it != mRule.end(); ++it ) {
+
std::string writeRule;
writeRule = it->first;
+
for (strings_t::const_iterator it2 = it->second.begin() ;
- it2 != it->second.end() ; ++it2) {
+ it2 != it->second.end() ; ++it2) {
writeRule += "," + *it2;
}
templateSave.listSymbol().append("ruleAndPred", writeRule);
@@ -1093,19 +1134,21 @@ void PluginDecision::writePlanFile(std::string filename)
// rulesTag
if ( mRule.size() != 0 ) {
- std::string rulesList = "rules { # liste des règles\n" \
- "{{for i in rulesList}}" \
- " rule {\n" \
- " id = \"{{rulesList^i}}\n" \
- " }\n" \
- "{{end for}}}";
+ std::string rulesList = "rules { # liste des règles\n" \
+ "{{for i in rulesList}}" \
+ " rule {\n" \
+ " id = \"{{rulesList^i}}\n" \
+ " }\n" \
+ "{{end for}}}";
+
templateSave.stringSymbol().append("rules", rulesList);
// rulesList
templateSave.listSymbol().append("rulesList");
for (std::map < std::string, strings_t > ::const_iterator it =
- mRule.begin(); it != mRule.end(); ++it ) {
+ mRule.begin(); it != mRule.end(); ++it ) {
std::string writeRule;
+
if ( !mRule[it->first].empty() ) {
writeRule = it->first + "\";\n predicates = ";
}
@@ -1114,7 +1157,7 @@ void PluginDecision::writePlanFile(std::string filename)
}
for (strings_t::const_iterator it2 = it->second.begin() ;
- it2 != it->second.end() ; ++it2) {
+ it2 != it->second.end() ; ++it2) {
if (it2 == (it->second.end() - 1)) {
writeRule += "\"" + *it2 + "\";";
}
@@ -1133,27 +1176,30 @@ void PluginDecision::writePlanFile(std::string filename)
// activitiesList
templateSave.listSymbol().append("activitiesList");
for (activitiesModel_t::const_iterator it = mDecision->
- activitiesModel().begin(); it != mDecision->
- activitiesModel().end(); ++it) {
+ activitiesModel().begin(); it != mDecision->
+ activitiesModel().end(); ++it) {
+
std::string esp16 = " ";
std::string actListElem;
+
if (it->second->getRelativeDate()) {
- actListElem = it->second->name() +
- "\";\n temporal {\n" + esp16 + "minstart = +" +
- it->second->minstart() + ";\n" + esp16 + "maxfinish = +" +
- it->second->maxfinish() + ";\n" + " }\n";
+ actListElem = it->second->name()
+ + "\";\n temporal {\n" + esp16 + "minstart = +"
+ + it->second->minstart() + ";\n" + esp16 + "maxfinish = +"
+ + it->second->maxfinish() + ";\n" + " }\n";
}
else {
- actListElem = it->second->name() +
- "\";\n temporal {\n" + esp16 + "minstart = " +
- it->second->minstart() + ";\n" + esp16 + "maxfinish = " +
- it->second->maxfinish() + ";\n" + " }\n";
+ actListElem = it->second->name()
+ + "\";\n temporal {\n" + esp16 + "minstart = "
+ + it->second->minstart() + ";\n" + esp16 + "maxfinish = "
+ + it->second->maxfinish() + ";\n" + " }\n";
}
//activity rules
strings_t mVect = it->second->getRules();
for (strings_t::const_iterator it2 = mVect.begin();
it2 != mVect.end(); ++it2) {
+
if (it2 == mVect.begin() && it2 == (mVect.end() - 1)) {
actListElem += " rules = \"" + *it2 + "\";";
}
@@ -1170,12 +1216,12 @@ void PluginDecision::writePlanFile(std::string filename)
if (it->second->getAckFunc().size() != 0) {
actListElem += "\n ack = \"" +
- it->second->getAckFunc().at(0) + "\";";
+ it->second->getAckFunc().at(0) + "\";";
}
if (it->second->getOutputFunc().size() != 0) {
actListElem += "\n output = \"" +
- it->second->getOutputFunc().at(0) + "\";";
+ it->second->getOutputFunc().at(0) + "\";";
}
templateSave.listSymbol().append("activitiesList", actListElem);
@@ -1184,56 +1230,61 @@ void PluginDecision::writePlanFile(std::string filename)
// add PrecedenceConstraint tags
templateSave.listSymbol().append("precedencesTag");
for (precedenceConstraints_t::const_iterator it =
- mDecision->precedenceConstraints().begin();
- it != mDecision->precedenceConstraints().end(); ++it) {
- std::string tmpPre = (*it)->cType() + "," + (*it)->source() + "," +
- (*it)->destination() + "," + (*it)->actTlMin() + "," +
- (*it)->actTlMax() + ",";
+ mDecision->precedenceConstraints().begin();
+ it != mDecision->precedenceConstraints().end(); ++it) {
+
+ std::string tmpPre = (*it)->cType() + "," + (*it)->source() + ","
+ + (*it)->destination() + "," + (*it)->actTlMin() + ","
+ + (*it)->actTlMax() + ",";
std::ostringstream oss;
+
oss << (*it)->points().at(0).x << "," << (*it)->points().at(0).y <<
- "," << (*it)->points().at(1).x << "," <<
- (*it)->points().at(1).y;
+ "," << (*it)->points().at(1).x << "," <<
+ (*it)->points().at(1).y;
+
tmpPre += oss.str();
templateSave.listSymbol().append("precedencesTag", tmpPre);
}
// precedences
if (mDecision->precedenceConstraints().size() != 0) {
- std::string precedenceList = "precedences {\n" \
- "{{for i in precedencesList}}" \
- " precedence {\n" \
- " type = {{precedencesList^i}}\n" \
- " }\n" \
- "{{end for}}}";
+
+ std::string precedenceList = "precedences {\n" \
+ "{{for i in precedencesList}}" \
+ " precedence {\n" \
+ " type = {{precedencesList^i}}\n" \
+ " }\n" \
+ "{{end for}}}";
+
templateSave.stringSymbol().append("precedences", precedenceList);
// precedencesList
templateSave.listSymbol().append("precedencesList");
for (precedenceConstraints_t::const_iterator it =
- mDecision->precedenceConstraints().begin();
- it != mDecision->precedenceConstraints().end(); ++it ) {
+ mDecision->precedenceConstraints().begin();
+ it != mDecision->precedenceConstraints().end(); ++it ) {
std::string writeConstraint;
- writeConstraint = (*it)->cType() + ";\n first = \"" +
- (*it)->source() + "\";\n";
+ writeConstraint = (*it)->cType() + ";\n first = \""
+ + (*it)->source() + "\";\n";
writeConstraint += " second = \"" + (*it)->destination();
writeConstraint += "\";";
if (!(*it)->actTlMin().empty()) {
- writeConstraint += "\n mintimelag = " +
- (*it)->actTlMin() + ";";
+ writeConstraint += "\n mintimelag = "
+ + (*it)->actTlMin() + ";";
}
if (!(*it)->actTlMax().empty()) {
- writeConstraint += "\n maxtimelag = " +
- (*it)->actTlMax() + ";";
+ writeConstraint += "\n maxtimelag = "
+ + (*it)->actTlMax() + ";";
}
templateSave.listSymbol().append("precedencesList",
- writeConstraint);
+ writeConstraint);
}
}
else {
templateSave.stringSymbol().append("precedences",
- "# Pas de contraintes de précédence.");
+ "# Pas de contraintes de précédence.");
}
std::ostringstream outPlan;
@@ -1248,12 +1299,13 @@ void PluginDecision::writePlanFile(std::string filename)
}
void PluginDecision::generateConditions(vpz::AtomicModel& model,
- vpz::Conditions& pConditions)
+ vpz::Conditions& pConditions)
{
std::string conditionPlanName((fmt("condDecisionPlan_%1%") %
- model.getName()).str());
+ model.getName()).str());
+
std::string conditionParametersName((fmt("condDecisionParameters_%1%") %
- model.getName()).str());
+ model.getName()).str());
if (pConditions.exist(conditionPlanName)) {
pConditions.del(conditionPlanName);
@@ -1271,8 +1323,7 @@ void PluginDecision::generateConditions(vpz::AtomicModel& model,
// Parameters
vpz::Condition parameters(conditionParametersName);
for (std::map < std::string, std::string > ::const_iterator it =
- mParam.begin();
- it != mParam.end(); ++it) {
+ mParam.begin(); it != mParam.end(); ++it) {
std::istringstream iss(it->second);
double nb;
iss >> nb;
@@ -1285,31 +1336,32 @@ void PluginDecision::generateConditions(vpz::AtomicModel& model,
}
void PluginDecision::generateObservables(vpz::AtomicModel& model,
- vpz::Observables& observables) {
+ vpz::Observables& observables) {
+
std::string observableName((fmt("obs_Decision_%1%") %
- model.getName()).str());
+ model.getName()).str());
if (observables.exist(observableName)) {
vpz::Observable& observable(observables.get(observableName));
// suppresses the activities and rules deleted
for (vpz::Observable::iterator it = observable.begin();
- it != observable.end();
- ++it) {
+ it != observable.end(); ++it) {
bool found = false;
for (activitiesModel_t::const_iterator it2 = mDecision->
- activitiesModel().begin(); it2 !=
- mDecision->activitiesModel().end() && found == false;
- ++it2) {
+ activitiesModel().begin(); it2 !=
+ mDecision->activitiesModel().end() && found == false;
+ ++it2) {
+
if (it->first == "Activity_" + it2->second->name()) {
found = true;
}
}
for (std::map < std::string, strings_t > ::const_iterator it2 =
- mRule.begin()
- ; it2 != mRule.end() && found == false; ++it2) {
+ mRule.begin()
+ ; it2 != mRule.end() && found == false; ++it2) {
if ("Rules_" + it2->first == it->first) {
found = true;
}
@@ -1322,9 +1374,9 @@ void PluginDecision::generateObservables(vpz::AtomicModel& model,
// check all Activities (Activity_Name)
for (activitiesModel_t::const_iterator it = mDecision->
- activitiesModel().begin(); it !=
- mDecision->activitiesModel().end();
- ++it) {
+ activitiesModel().begin(); it !=
+ mDecision->activitiesModel().end(); ++it) {
+
if (!observable.exist("Activity_" + it->second->name())) {
observable.add("Activity_" + it->second->name());
}
@@ -1332,8 +1384,8 @@ void PluginDecision::generateObservables(vpz::AtomicModel& model,
// check all Rules (Rules_Name)
for (std::map < std::string, strings_t > ::const_iterator it =
- mRule.begin()
- ; it != mRule.end(); ++it) {
+ mRule.begin(); it != mRule.end(); ++it) {
+
if (!observable.exist("Rules_" + it->first)) {
observable.add("Rules_" + it->first);
}
@@ -1350,16 +1402,15 @@ void PluginDecision::generateObservables(vpz::AtomicModel& model,
vpz::Observable observable(observableName);
// add all Activities (Activity_Name)
for (activitiesModel_t::const_iterator it = mDecision->
- activitiesModel().begin(); it !=
- mDecision->activitiesModel().end();
- ++it) {
+ activitiesModel().begin(); it !=
+ mDecision->activitiesModel().end(); ++it) {
+
observable.add("Activity_" + it->second->name());
}
// add all Rules (Rules_Name)
for (std::map < std::string, strings_t > ::const_iterator it =
- mRule.begin()
- ; it != mRule.end(); ++it) {
+ mRule.begin(); it != mRule.end(); ++it) {
observable.add("Rules_" + it->first);
}
@@ -1379,14 +1430,14 @@ void PluginDecision::generateObservables(vpz::AtomicModel& model,
// facts
for (std::vector < std::string > ::const_iterator it = mFactName.begin();
- it != mFactName.end(); ++it) {
+ it != mFactName.end(); ++it) {
model.addInputPort(*it);
}
// output functions
for (std::vector < std::string > ::const_iterator it =
- mOutputFunctionName.begin();
- it != mOutputFunctionName.end(); ++it) {
+ mOutputFunctionName.begin();
+ it != mOutputFunctionName.end(); ++it) {
model.addOutputPort(*it);
}
}
@@ -1405,10 +1456,10 @@ void PluginDecision::parseConf(const strings_t& lst,
void PluginDecision::onIncludeSource()
{
SourceDialog dialog(mXml,
- mParam,
- mInclude,
- mCustomConstructor,
- mMembers);
+ mParam,
+ mInclude,
+ mCustomConstructor,
+ mMembers);
if (dialog.run() == Gtk::RESPONSE_ACCEPT) {
mInclude.assign(dialog.getIncludes());
@@ -1441,13 +1492,14 @@ void PluginDecision::onUserPredicate()
// Delete the deleted predicates in the Rule vector
for (std::map < std::string, strings_t > ::const_iterator it =
- mRule.begin()
- ; it != mRule.end(); ++it) {
+ mRule.begin(); it != mRule.end(); ++it) {
+
for (strings_t::iterator it2 = mRule[it->first].begin();
- it2 != mRule[it->first].end(); ) {
+ it2 != mRule[it->first].end(); ) {
+
if (mPred.find(*it2) == mPred.end() &&
- find(mPredicateName.begin(), mPredicateName.end(),
- *it2) == mPredicateName.end()) {
+ find(mPredicateName.begin(), mPredicateName.end(),
+ *it2) == mPredicateName.end()) {
it2 = mRule[it->first].erase(it2);
}
else {
@@ -1460,26 +1512,29 @@ void PluginDecision::onUserPredicate()
void PluginDecision::onUserHierPredicate() {
std::vector < std::string > vectorParam;
+
for (std::map < std::string, std::string > ::iterator it =
- mParam.begin(); it != mParam.end(); ++it) {
+ mParam.begin(); it != mParam.end(); ++it) {
vectorParam.push_back(it->first);
}
+
EditorDialog dialog(mXml,
- mPred,
- mFactName,
- vectorParam,
- mPredicateName);
+ mPred,
+ mFactName,
+ vectorParam,
+ mPredicateName);
+
if (dialog.run() == Gtk::RESPONSE_ACCEPT) {
mPred = dialog.getPred();
// Delete the deleted predicates in the Rule vector
for (std::map < std::string, strings_t > ::const_iterator it =
- mRule.begin()
- ; it != mRule.end(); ++it) {
+ mRule.begin(); it != mRule.end(); ++it) {
+
for (strings_t::iterator it2 = mRule[it->first].begin();
- it2 != it->second.end(); ) {
+ it2 != it->second.end(); ) {
if (mPred.find(*it2) == mPred.end() &&
- find(mPredicateName.begin(), mPredicateName.end(),
- *it2) == mPredicateName.end()) {
+ find(mPredicateName.begin(), mPredicateName.end(),
+ *it2) == mPredicateName.end()) {
it2 = mRule[it->first].erase(it2);
}
else {
@@ -1499,14 +1554,15 @@ void PluginDecision::onUserRule()
// Delete the deleted rules in the activities
for (activitiesModel_t::const_iterator it = mDecision->
- activitiesModel().begin(); it != mDecision->
- activitiesModel().end(); ++it) {
+ activitiesModel().begin(); it != mDecision->
+ activitiesModel().end(); ++it) {
+
//activity rules
strings_t mVect = it->second->getRules();
// Check in the activities rule vector if all rules exist
for (strings_t::iterator it2 = mVect.begin();
- it2 != mVect.end(); ) {
+ it2 != mVect.end(); ) {
if (mRule.find(*it2) == mRule.end()) {
it2 = mVect.erase(it2);
}
@@ -1530,14 +1586,15 @@ void PluginDecision::onUserOutputFunction()
// Check for deleted output functions in activities
for (activitiesModel_t::const_iterator it = mDecision->
- activitiesModel().begin(); it !=
- mDecision->activitiesModel().end(); ++it) {
+ activitiesModel().begin(); it !=
+ mDecision->activitiesModel().end(); ++it) {
+
if (!it->second->getOutputFunc().empty()) {
bool find = false;
for (strings_t::const_iterator it2 =
- mOutputFunctionName.begin()
- ; it2 != mOutputFunctionName.end() && find == false;
- ++it2) {
+ mOutputFunctionName.begin();
+ it2 != mOutputFunctionName.end() && find == false;
+ ++it2) {
if (it->second->getOutputFunc().at(0) == *it2) {
find = true;
}
@@ -1561,14 +1618,14 @@ void PluginDecision::onUserAckFunction()
// Check for deleted acknowledge functions in activities
for (activitiesModel_t::const_iterator it = mDecision->
- activitiesModel().begin(); it !=
- mDecision->activitiesModel().end(); ++it) {
+ activitiesModel().begin(); it !=
+ mDecision->activitiesModel().end(); ++it) {
if (!it->second->getAckFunc().empty()) {
bool find = false;
- for (strings_t::const_iterator it2 =
- mAckFunctionName.begin()
- ; it2 != mAckFunctionName.end() && find == false;
- ++it2) {
+ for (strings_t::const_iterator it2 = mAckFunctionName.begin();
+ it2 != mAckFunctionName.end() && find == false;
+ ++it2) {
+
if (it->second->getAckFunc().at(0) == *it2) {
find = true;
}
@@ -1582,9 +1639,9 @@ void PluginDecision::onUserAckFunction()
}
std::string PluginDecision::parseFunction(const std::string& buffer,
- const std::string& begin,
- const std::string& end,
- const std::string& name)
+ const std::string& begin,
+ const std::string& end,
+ const std::string& name)
{
boost::regex tagbegin(begin, boost::regex::grep);
boost::regex tagend(end, boost::regex::grep);
@@ -1607,10 +1664,10 @@ std::string PluginDecision::parseFunction(const std::string& buffer,
}
void PluginDecision::parseFunction(const std::string& buffer,
- const std::string& begin,
- const std::string& end,
- strings_t& names,
- strings_t& buffers)
+ const std::string& begin,
+ const std::string& end,
+ strings_t& names,
+ strings_t& buffers)
{
boost::regex tagbegin(begin, boost::regex::grep);
boost::regex tagend(end, boost::regex::grep);
@@ -1638,8 +1695,9 @@ void PluginDecision::parseActivities(const strings_t& lst)
boost::trim(activities_lst);
if ( !activities_lst.empty() ) {
boost::split(activities, activities_lst, boost::is_any_of("|"));
+
for (strings_t::const_iterator it = activities.begin();
- it != activities.end(); ++it) {
+ it != activities.end(); ++it) {
if (not it->empty()) {
mDecision->addActivityModel(*it);
}
@@ -1656,7 +1714,7 @@ void PluginDecision::parseFacts(const strings_t& lst)
if ( !facts_lst.empty() ) {
boost::split(facts, facts_lst, boost::is_any_of("|"));
for (strings_t::const_iterator it = facts.begin();
- it != facts.end(); ++it) {
+ it != facts.end(); ++it) {
if (not it->empty()) {
mFactName.push_back(*it);
}
@@ -1672,8 +1730,9 @@ void PluginDecision::parsePredicates(const strings_t& lst)
boost::trim(facts_lst);
if ( !facts_lst.empty() ) {
boost::split(facts, facts_lst, boost::is_any_of("|"));
+
for (strings_t::const_iterator it = facts.begin();
- it != facts.end(); ++it) {
+ it != facts.end(); ++it) {
if (not it->empty()) {
mPredicateName.push_back(*it);
}
@@ -1690,7 +1749,7 @@ void PluginDecision::parseOutputFunctions(const strings_t& lst)
if ( !facts_lst.empty() ) {
boost::split(facts, facts_lst, boost::is_any_of("|"));
for (strings_t::const_iterator it = facts.begin();
- it != facts.end(); ++it) {
+ it != facts.end(); ++it) {
if (not it->empty()) {
mOutputFunctionName.push_back(*it);
}
@@ -1707,7 +1766,7 @@ void PluginDecision::parseAckFunctions(const strings_t& lst)
if ( !facts_lst.empty() ) {
boost::split(facts, facts_lst, boost::is_any_of("|"));
for (strings_t::const_iterator it = facts.begin();
- it != facts.end(); ++it) {
+ it != facts.end(); ++it) {
if (not it->empty()) {
mAckFunctionName.push_back(*it);
}
@@ -1716,11 +1775,11 @@ void PluginDecision::parseAckFunctions(const strings_t& lst)
}
void PluginDecision::parseParameters(vpz::AtomicModel& model,
- const strings_t& lst,
- vpz::Conditions& pConditions)
+ const strings_t& lst,
+ vpz::Conditions& pConditions)
{
std::string conditionParametersName((fmt("condDecisionParameters_%1%") %
- model.getName()).str());
+ model.getName()).str());
std::string rules_lst(lst[7], 3, lst[7].size() - 3);
strings_t rules;
@@ -1729,7 +1788,7 @@ void PluginDecision::parseParameters(vpz::AtomicModel& model,
if ( !rules_lst.empty() ) {
boost::split(rules, rules_lst, boost::is_any_of("|"));
for (strings_t::const_iterator it = rules.begin();
- it != rules.end(); ++it) {
+ it != rules.end(); ++it) {
if (!(*it).empty()) {
strings_t rule;
boost::split(rule, *it, boost::is_any_of(","));
@@ -1739,9 +1798,9 @@ void PluginDecision::parseParameters(vpz::AtomicModel& model,
}
// Update the tagged parameters with the values of the conditions
if (pConditions.exist(conditionParametersName)) {
- for (vpz::ConditionValues::iterator it = pConditions.get(conditionParametersName).begin();
- it != pConditions.get(conditionParametersName).end();
- ++it) {
+ for (vpz::ConditionValues::iterator it
+ = pConditions.get(conditionParametersName).begin();
+ it != pConditions.get(conditionParametersName).end(); ++it) {
if (mParam.find(it->first) != mParam.end()) {
mParam.erase(it->first);
std::ostringstream oss;
@@ -1761,13 +1820,13 @@ void PluginDecision::parseRulesAndPred(const strings_t& lst)
if ( !rules_lst.empty() ) {
boost::split(rules, rules_lst, boost::is_any_of("|"));
for (strings_t::const_iterator it = rules.begin();
- it != rules.end(); ++it) {
+ it != rules.end(); ++it) {
if (*it != "") {
strings_t rule;
boost::split(rule, *it, boost::is_any_of(","));
std::vector < std::string > vectPred;
for (strings_t::const_iterator it2 = (rule.begin()+1);
- it2 != rule.end(); ++it2) {
+ it2 != rule.end(); ++it2) {
vectPred.push_back(*it2);
}
mRule[*rule.begin()] = vectPred;
@@ -1784,8 +1843,9 @@ void PluginDecision::parsePrecedenceConstraints(const strings_t& lst)
boost::trim(constraints_lst);
if ( !constraints_lst.empty() ) {
boost::split(constraints, constraints_lst, boost::is_any_of("|"));
+
for (strings_t::const_iterator it = constraints.begin();
- it != constraints.end(); ++it) {
+ it != constraints.end(); ++it) {
if (*it != "") {
strings_t constraint;
boost::split(constraint, *it, boost::is_any_of(","));
@@ -1804,8 +1864,8 @@ void PluginDecision::parsePrecedenceConstraints(const strings_t& lst)
points.push_back(point);
mDecision->addPrecedenceConstraint(constraint.at(0),
- constraint.at(1), constraint.at(2), points,
- constraint.at(3), constraint.at(4));
+ constraint.at(1), constraint.at(2), points,
+ constraint.at(3), constraint.at(4));
}
}
}
@@ -1824,8 +1884,9 @@ void PluginDecision::decodePredicates(std::string& pPred)
if (!pPred.empty()) {
boost::split(preds, pPred, boost::is_any_of(";"));
+
for (strings_t::iterator it = preds.begin(); it != preds.end();
- ++it) {
+ ++it) {
if (!(*it).empty()) {
strings_t parameters;
boost::split(parameters, *it, boost::is_any_of("|"));
@@ -1836,10 +1897,103 @@ void PluginDecision::decodePredicates(std::string& pPred)
}
}
+strings_t::iterator* PluginDecision::generatePred(std::string *pPred,
+ strings_t::iterator *it,
+ strings_t *vPred, int pRowNumber, std::string pLog)
+{
+ if (*it == vPred->end()) {
+ return it;
+ }
+
+ bool firstRound = true;
+
+ do {
+ strings_t parameters;
+ boost::split(parameters, *(*it), boost::is_any_of("|"));
+
+ Glib::ustring pred = parameters.at(0);
+ std::string log = parameters.at(1);
+ Glib::ustring fact = parameters.at(2);
+ std::string op = parameters.at(3);
+ Glib::ustring par = parameters.at(4);
+
+ std::istringstream iss(parameters.at(5));
+ int rowType;
+ iss >> rowType;
+ Glib::ustring predName = parameters.at(6);
+
+ std::istringstream iss2(parameters.at(7));
+ int rowNumber;
+ iss2 >> rowNumber;
+
+ if (!log.empty() && rowNumber > pRowNumber) {
+ if (*it != vPred->end()) {
+ ++(*it);
+ }
+
+ std::string tmpLog("");
+
+ if (pLog == "OR") {
+ tmpLog = " || ";
+ }
+
+ else if (pLog == "AND") {
+ tmpLog = " && ";
+ }
+
+ if (firstRound == true) {
+ *pPred += "(";
+ generatePred(pPred, it, vPred, rowNumber, log);
+ *pPred += ")";
+ firstRound = false;
+ }
+ else {
+ *pPred += tmpLog + "(";
+ generatePred(pPred, it, vPred, rowNumber, log);
+ *pPred += ")";
+ }
+ }
+ else if (!log.empty()) {
+ return it;
+ }
+
+ if (log.empty() && rowNumber > pRowNumber) {
+ if (firstRound == true) {
+ *pPred += "var" + fact + op + par;
+
+ if (*it != vPred->end()) {
+ ++(*it);
+ }
+ firstRound = false;
+ }
+ else {
+ if (pLog == "OR") {
+ *pPred += " || var" + fact + op + par;
+ }
+ else if (pLog == "AND") {
+ *pPred += " && var" + fact + op + par;
+ }
+ else {
+ *pPred += "var" + fact + op + par;
+ }
+ if (*it != vPred->end()) {
+ ++(*it);
+ }
+ }
+ }
+ else if (log.empty()) {
+ return it;
+ }
+
+ } while (*it != vPred->end());
+
+ return it;
+}
+
void PluginDecision::onUserOpenMenu()
{
Gtk::FileChooserDialog fileChooserDial(*mDialog, "Select a plan file",
- Gtk::FILE_CHOOSER_ACTION_OPEN);
+ Gtk::FILE_CHOOSER_ACTION_OPEN);
//Add response buttons the the dialog:
fileChooserDial.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
@@ -1855,9 +2009,10 @@ void PluginDecision::onUserOpenMenu()
// Convert path in filename
boost::filesystem::path my_path(mPlanFile);
mPlanFile = my_path.filename().string();
+
if (mPlanFile.find_last_of(".") != std::string::npos) {
mPlanFile = mPlanFile.erase(mPlanFile.find_last_of("."),
- mPlanFile.substr(mPlanFile.find_last_of(".")).size());
+ mPlanFile.substr(mPlanFile.find_last_of(".")).size());
}
mDecision->resetDecision();
@@ -1870,7 +2025,7 @@ void PluginDecision::onUserOpenMenu()
void PluginDecision::onUserSaveAsMenu()
{
Gtk::FileChooserDialog fileChooserDial(*mDialog, "Save a plan file as :",
- Gtk::FILE_CHOOSER_ACTION_SAVE);
+ Gtk::FILE_CHOOSER_ACTION_SAVE);
//Add response buttons the the dialog:
fileChooserDial.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
@@ -1891,9 +2046,10 @@ void PluginDecision::onUserSaveAsMenu()
// Convert path in filename
boost::filesystem::path my_path(mPlanFile);
mPlanFile = my_path.filename().string();
+
if (mPlanFile.find_last_of(".") != std::string::npos) {
mPlanFile = mPlanFile.erase(mPlanFile.find_last_of("."),
- mPlanFile.substr(mPlanFile.find_last_of(".")).size());
+ mPlanFile.substr(mPlanFile.find_last_of(".")).size());
}
mDialog->set_title("Decision - Plugin : " + mPlanFile + ".txt");
@@ -1909,9 +2065,10 @@ void PluginDecision::onChooseFileName()
box.get_size(width, height);
box.resize(400, h);
std::string name = boost::trim_copy(box.run());
+
if (box.valid() and !name.empty()) {
mPlanFileName = utils::Path::path().getPackageDataDir() +
- "/" + name + ".txt";
+ "/" + name + ".txt";
mPlanFile = name;
mDialog->set_title("Decision - Plugin : " + mPlanFile + ".txt");
}
diff --git a/vle.extension.decision/src/vle/gvle/modeling/decision/Plugin.hpp b/vle.extension.decision/src/vle/gvle/modeling/decision/Plugin.hpp
index 6d60fd4a..3a39743e 100644
--- a/vle.extension.decision/src/vle/gvle/modeling/decision/Plugin.hpp
+++ b/vle.extension.decision/src/vle/gvle/modeling/decision/Plugin.hpp
@@ -111,11 +111,11 @@ class PluginDecision : public ModelingPlugin
* @return return a boolean, true if the user clicked on "Valider" or false
*/
virtual bool create(vpz::AtomicModel& model,
- vpz::Dynamic& dynamic,
- vpz::Conditions& conditions,
- vpz::Observables& observables,
- const std::string& classname,
- const std::string& namespace_);
+ vpz::Dynamic& dynamic,
+ vpz::Conditions& conditions,
+ vpz::Observables& observables,
+ const std::string& classname,
+ const std::string& namespace_);
/**
* @brief This fonction show the plugin window and wait
@@ -127,11 +127,11 @@ class PluginDecision : public ModelingPlugin
* on "Valider" or false
*/
virtual bool modify(vpz::AtomicModel& model,
- vpz::Dynamic& dynamic,
- vpz::Conditions& conditions,
- vpz::Observables& observables,
- const std::string& conf,
- const std::string& buffer);
+ vpz::Dynamic& dynamic,
+ vpz::Conditions& conditions,
+ vpz::Observables& observables,
+ const std::string& conf,
+ const std::string& buffer);
/**
* @brief Load the plan file into the model.
@@ -189,7 +189,7 @@ class PluginDecision : public ModelingPlugin
* @param reference to the namespace
*/
void generateSource(const std::string& classname,
- const std::string& namespace_);
+ const std::string& namespace_);
/**
* @brief Generate the observables
@@ -197,10 +197,10 @@ class PluginDecision : public ModelingPlugin
* @param reference to the observables of the vpz
*/
void generateObservables(vpz::AtomicModel& mModel,
- vpz::Observables& mObservables);
+ vpz::Observables& mObservables);
void generateConditions(vpz::AtomicModel& model,
- vpz::Conditions& pConditions);
+ vpz::Conditions& pConditions);
/**
* @brief Generate the ports
* @param reference to the model of the vpz
@@ -217,6 +217,16 @@ class PluginDecision : public ModelingPlugin
*/
void onDelete();
+/**
+ * @brief Set the DecisionDrawingArea in help mode.
+ */
+ void onHelp();
+
+/**
+ * @brief Set the DecisionDrawingArea in zoom mode.
+ */
+ void onZoom();
+
/**
* @brief Set the DecisionDrawingArea in select mode.
*/
@@ -257,8 +267,19 @@ class PluginDecision : public ModelingPlugin
*/
void onUserOpenMenu();
+/**
+ * @brief
+ */
void onChooseFileName();
+
+/**
+ * @brief
+ */
void onUserSaveAsMenu();
+
+/**
+ * @brief This function start the file chooser dialog.
+ */
void onUserHierPredicate();
/**
@@ -273,7 +294,7 @@ class PluginDecision : public ModelingPlugin
* @param namespace
*/
void parseConf(const strings_t& lst, std::string& classname,
- std::string& namespace_);
+ std::string& namespace_);
/**
* @brief Parse function into the buffer
@@ -286,10 +307,10 @@ class PluginDecision : public ModelingPlugin
* into a string vector
*/
void parseFunction(const std::string& buffer,
- const std::string& begin,
- const std::string& end,
- strings_t& names,
- strings_t& buffers);
+ const std::string& begin,
+ const std::string& end,
+ strings_t& names,
+ strings_t& buffers);
/**
* @brief Parse function into the buffer
@@ -302,9 +323,9 @@ class PluginDecision : public ModelingPlugin
* @return Return the values between param 2 and 3 with the tag in param 4.
*/
std::string parseFunction(const std::string& buffer,
- const std::string& begin,
- const std::string& end,
- const std::string& name);
+ const std::string& begin,
+ const std::string& end,
+ const std::string& name);
/**
* @brief Parse activities into the buffer.
@@ -351,8 +372,8 @@ class PluginDecision : public ModelingPlugin
void parsePlanFileName(const strings_t& lst);
void parseParameters(vpz::AtomicModel& model,
- const strings_t& lst,
- vpz::Conditions& pConditions);
+ const strings_t& lst,
+ vpz::Conditions& pConditions);
void decodePredicates(std::string&);
/**
@@ -363,93 +384,9 @@ class PluginDecision : public ModelingPlugin
return true;
}
-strings_t::iterator* generatePred(std::string *pPred,
- strings_t::iterator *it,
- strings_t *vPred, int pRowNumber, std::string pLog) {
- if (*it == vPred->end()) {
- return it;
- }
-
- bool firstRound = true;
- do {
- strings_t parameters;
- boost::split(parameters, *(*it), boost::is_any_of("|"));
-
- Glib::ustring pred = parameters.at(0);
- std::string log = parameters.at(1);
- Glib::ustring fact = parameters.at(2);
- std::string op = parameters.at(3);
- Glib::ustring par = parameters.at(4);
-
- std::istringstream iss(parameters.at(5));
- int rowType;
- iss >> rowType;
- Glib::ustring predName = parameters.at(6);
-
- std::istringstream iss2(parameters.at(7));
- int rowNumber;
- iss2 >> rowNumber;
-
- if (!log.empty() && rowNumber > pRowNumber) {
- if (*it != vPred->end()) {
- ++(*it);
- }
- std::string tmpLog("");
- if (pLog == "OR") {
- tmpLog = " || ";
- }
- else if (pLog == "AND") {
- tmpLog = " && ";
- }
-
- if (firstRound == true) {
- *pPred += "(";
- generatePred(pPred, it, vPred, rowNumber, log);
- *pPred += ")";
- firstRound = false;
- }
- else {
- *pPred += tmpLog + "(";
- generatePred(pPred, it, vPred, rowNumber, log);
- *pPred += ")";
- }
- }
- else if (!log.empty()) {
- return it;
- }
-
- if (log.empty() && rowNumber > pRowNumber) {
- if (firstRound == true) {
- *pPred += "var" + fact + op + par;
-
- if (*it != vPred->end()) {
- ++(*it);
- }
- firstRound = false;
- }
- else {
- if (pLog == "OR") {
- *pPred += " || var" + fact + op + par;
- }
- else if (pLog == "AND") {
- *pPred += " && var" + fact + op + par;
- }
- else {
- *pPred += "var" + fact + op + par;
- }
- if (*it != vPred->end()) {
- ++(*it);
- }
- }
- }
- else if (log.empty()) {
- return it;
- }
-
- } while (*it != vPred->end());
-
- return it;
-}
+ strings_t::iterator* generatePred(std::string *pPred,
+ strings_t::iterator *it,
+ strings_t *vPred, int pRowNumber, std::string pLog);
static const Glib::ustring UI_DEFINITION;
static const std::string TEMPLATE_DEFINITION;
diff --git a/vle.extension.differential-equation/CMakeLists.txt b/vle.extension.differential-equation/CMakeLists.txt
index 621a9c5f..bbb55703 100644
--- a/vle.extension.differential-equation/CMakeLists.txt
+++ b/vle.extension.differential-equation/CMakeLists.txt
@@ -115,9 +115,9 @@ ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY(exp)
ADD_SUBDIRECTORY(cmake)
-IF (Boost_UNIT_TEST_FRAMEWORK_FOUND AND WITH_TEST)
- ADD_SUBDIRECTORY(test)
-ENDIF (Boost_UNIT_TEST_FRAMEWORK_FOUND AND WITH_TEST)
+#IF (Boost_UNIT_TEST_FRAMEWORK_FOUND AND WITH_TEST)
+# ADD_SUBDIRECTORY(test)
+#ENDIF (Boost_UNIT_TEST_FRAMEWORK_FOUND AND WITH_TEST)
##
## CPack configuration
diff --git a/vle.extension.differential-equation/test/test_Euler.cpp b/vle.extension.differential-equation/test/test_Euler.cpp
index 33afc763..b14bd1c5 100644
--- a/vle.extension.differential-equation/test/test_Euler.cpp
+++ b/vle.extension.differential-equation/test/test_Euler.cpp
@@ -43,6 +43,8 @@
#include
#include
+#include
+#include
namespace vz = vle::vpz;
namespace vu = vle::utils;
diff --git a/vle.extension.differential-equation/test/test_Euler_perturbation.cpp b/vle.extension.differential-equation/test/test_Euler_perturbation.cpp
index 45d7d553..bd2c5d8e 100644
--- a/vle.extension.differential-equation/test/test_Euler_perturbation.cpp
+++ b/vle.extension.differential-equation/test/test_Euler_perturbation.cpp
@@ -23,6 +23,8 @@
*/
#include "test_common.hpp"
+#include
+#include
/******************
* Test of perturbation
diff --git a/vle.forrester/src/vle/forrester/Plugin.cpp b/vle.forrester/src/vle/forrester/Plugin.cpp
index 8120fa3d..47883f9e 100644
--- a/vle.forrester/src/vle/forrester/Plugin.cpp
+++ b/vle.forrester/src/vle/forrester/Plugin.cpp
@@ -119,6 +119,9 @@ const std::string PluginForrester::TEMPLATE_DEFINITION =
"{{for i in conditionalFlowVariableCompute}} " \
" {{conditionalFlowVariableCompute^i}}\n" \
"{{end for}}" \
+ "{{for i in FlowVariableCompute}} " \
+ " {{FlowVariableCompute^i}}\n" \
+ "{{end for}}" \
"{{for i in equations}} " \
" {{equations^i}}\n" \
"{{end for}}" \
@@ -138,9 +141,24 @@ const std::string PluginForrester::TEMPLATE_DEFINITION =
"{{for i in variableDeclaration}}" \
" {{variableDeclaration^i}}\n" \
"{{end for}}" \
+ "{{for i in FlowVariableDeclaration}}" \
+ " {{FlowVariableDeclaration^i}}\n" \
+ "{{end for}}" \
"{{for i in conditionalFlowVariableDeclaration}}" \
" {{conditionalFlowVariableDeclaration^i}}\n" \
"{{end for}}" \
+ "virtual vv::Value* observation(\n" \
+ " const vd::ObservationEvent& event) const\n" \
+ "{\n" \
+ " const std::string& port = event.getPortName();\n" \
+ "{{for i in flowObservation}}" \
+ " {{flowObservation^i}}\n" \
+ "{{end for}}" \
+ "{{for i in variableObservation}}" \
+ " {{variableObservation^i}}\n" \
+ "{{end for}}" \
+ " return ve::DifferentialEquation::observation(event);\n" \
+ "}\n" \
"};\n\n" \
"} // namespace {{namespace}}\n\n" \
"DECLARE_DYNAMICS({{namespace}}::{{classname}})\n\n";
@@ -311,11 +329,15 @@ void PluginForrester::generateSource(const std::string& classname,
tpl_.listSymbol().append("definitionVar");
tpl_.listSymbol().append("definitionParameters");
tpl_.listSymbol().append("definitionExoVariables");
+ tpl_.listSymbol().append("FlowVariableDeclaration");
tpl_.listSymbol().append("conditionalFlowVariableDeclaration");
tpl_.listSymbol().append("conditionalFlowVariableCompute");
+ tpl_.listSymbol().append("FlowVariableCompute");
tpl_.listSymbol().append("Variables");
tpl_.listSymbol().append("variableCompute");
tpl_.listSymbol().append("variableDeclaration");
+ tpl_.listSymbol().append("flowObservation");
+ tpl_.listSymbol().append("variableObservation");
std::ostringstream out;
tpl_.process(out);
@@ -339,10 +361,7 @@ std::string PluginForrester::generateEquation(const Compartment * comp)
if (negative != "")
negative += " + ";
- if(item->isConditionnal())
- negative += item->getName() + "ConditionalFlow";
- else
- negative += finalExpression;
+ negative += item->getName();
}
if ((*it)->getDestination()->getOwner() == comp) {
@@ -354,10 +373,8 @@ std::string PluginForrester::generateEquation(const Compartment * comp)
if (positive != "")
positive += " + ";
- if(item->isConditionnal())
- positive += item->getName() + "ConditionalFlow";
- else
- positive += finalExpression;
+
+ positive += item->getName();
}
}
}
diff --git a/vle.forrester/src/vle/forrester/graphicalItems/Flow.cpp b/vle.forrester/src/vle/forrester/graphicalItems/Flow.cpp
index 7c2d369e..71b86916 100644
--- a/vle.forrester/src/vle/forrester/graphicalItems/Flow.cpp
+++ b/vle.forrester/src/vle/forrester/graphicalItems/Flow.cpp
@@ -260,23 +260,39 @@ void Flow::resize(int _width, int _height)
setWidth(_width);
}
+void Flow::generateObservable (vpz::Observable& obs) const {
+ obs.add(mName);
+}
+
void Flow::generateSource (utils::Template& tpl_) const {
std::string finalPredicate(mPredicate);
std::string finalTrueValue(mTrueValue);
std::string finalFalseValue(mFalseValue);
+ std::string finalExpression(mValue);
generateParenthesis(finalPredicate);
generateParenthesis(finalTrueValue);
generateParenthesis(finalFalseValue);
+ generateParenthesis(finalExpression);
+ generateStdPrefix(finalExpression);
tpl_.listSymbol().append("flows", toString());
if(mConditionnality) {
tpl_.listSymbol().append("conditionalFlowVariableDeclaration",
- "double " + mName + "ConditionalFlow;");
+ "double " + mName + ";");
tpl_.listSymbol().append("conditionalFlowVariableCompute",
- mName + "ConditionalFlow = ("+ finalPredicate +")? " + finalTrueValue
- + " : " + finalFalseValue + ";");
+ mName + " = ("+ finalPredicate +")? " +
+ finalTrueValue + " : " +
+ finalFalseValue + ";");
+ } else {
+ tpl_.listSymbol().append("FlowVariableDeclaration",
+ "double " + mName + ";");
+ tpl_.listSymbol().append("FlowVariableCompute",
+ mName + " = " + finalExpression + ";");
}
+ tpl_.listSymbol().append("flowObservation", "if (port == \""
+ + mName +
+ "\" ) return new vv::Double(" + mName + ");");
}
std::string Flow::tooltipText() {
diff --git a/vle.forrester/src/vle/forrester/graphicalItems/Flow.hpp b/vle.forrester/src/vle/forrester/graphicalItems/Flow.hpp
index 9052f0b4..3f40bae4 100644
--- a/vle.forrester/src/vle/forrester/graphicalItems/Flow.hpp
+++ b/vle.forrester/src/vle/forrester/graphicalItems/Flow.hpp
@@ -136,8 +136,7 @@ class Flow : public GraphicalItem
void generatePorts (vpz::AtomicModel&) const
{}
- void generateObservable (vpz::Observable&) const
- {}
+ void generateObservable (vpz::Observable&) const;
void generateSource (utils::Template& tpl_) const;
void generateParenthesis(std::string&) const;
void generateStdPrefix(std::string&)const;
diff --git a/vle.forrester/src/vle/forrester/graphicalItems/Variable.cpp b/vle.forrester/src/vle/forrester/graphicalItems/Variable.cpp
index d222132d..417aa733 100644
--- a/vle.forrester/src/vle/forrester/graphicalItems/Variable.cpp
+++ b/vle.forrester/src/vle/forrester/graphicalItems/Variable.cpp
@@ -176,16 +176,19 @@ void Variable::generatePorts (vpz::AtomicModel&) const
}
-void Variable::generateObservable (vpz::Observable&) const
+void Variable::generateObservable (vpz::Observable& obs) const
{
-
+ obs.add(mName);
}
void Variable::generateSource (utils::Template& tpl_) const
{
tpl_.listSymbol().append("Variables", toString());
- tpl_.listSymbol().append("variableCompute", mName+" = "+mValue+";");
- tpl_.listSymbol().append("variableDeclaration", "double "+mName+";");
+ tpl_.listSymbol().append("variableCompute", mName+" = "+ mValue + ";");
+ tpl_.listSymbol().append("variableDeclaration", "double " + mName + ";");
+ tpl_.listSymbol().append("variableObservation", "if (port == \""
+ + mName +
+ "\" ) return new vv::Double(" + mName + ");");
}
std::string Variable::tooltipText()