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()