void Editor::removeBox(unsigned int boxId) { if (m_boxIdToContainingCSP.find(boxId) != m_boxIdToContainingCSP.end()) { CSP* containingCSP = m_boxIdToContainingCSP[boxId]; ConstrainedBox* currentBox = containingCSP->getBoxById(boxId); ConstrainedBox* mother = currentBox->mother(); std::vector<unsigned int> boxesId; std::vector<unsigned int> relationId; std::vector<unsigned int> triggerId; CSP* boxCSP = currentBox->getCSP(); if (boxCSP != NULL) { boxCSP->getAllBoxesId(boxesId); for (unsigned int i = 0; i < boxesId.size(); ++i) { removeBox(boxesId[i]); } } containingCSP->getAllBoxesId(boxesId); if (boxesId.size() == 0) { unsigned int motherHierarchyRelationId = mother->getHierarchyRelationId(); if (motherHierarchyRelationId != NO_ID) { if (m_boxIdToContainingCSP.find(mother->getId()) != m_boxIdToContainingCSP.end()) { CSP* motherCSP = m_boxIdToContainingCSP[mother->getId()]; motherCSP->removeTemporalRelation(motherHierarchyRelationId); } } } containingCSP->removeBox(boxId, relationId, triggerId); for (unsigned int i = 0; i < relationId.size(); ++i) { removeTemporalRelation(relationId[i]); } for (unsigned int i = 0; i < triggerId.size(); ++i) { removeTriggerPoint(triggerId[i]); } m_boxIdToContainingCSP.erase(boxId); } }
void CSPold::removeBox(unsigned int boxId, std::vector<unsigned int>& relationsRemoved, std::vector<unsigned int>& triggersRemoved) { ConstrainedBox* cedBox = getBoxById(boxId); relationsRemoved.clear(); triggersRemoved.clear(); /* remove cedBox from the boxes hierarchy */ // for (vector<ConstrainedBox*>::iterator it = cedBox->children()->begin() ; it != cedBox->children()->end() ; it++) // { // removeBoundingRelation((*it)->boundingRelation()); // (*it)->setMother(cedBox->mother(), addBoundingRelation(cedBox->mother(), (*it))); // } if (cedBox->mother()) { // removeBoundingRelation(cedBox->boundingRelation()); // cedBox->mother()->removeChild(cedBox); } /* remove temporal constraints implicating cedBox */ vector<BinaryTemporalRelation*> *relToRemove = links(cedBox); for (vector<BinaryTemporalRelation*>::iterator it = relToRemove->begin() ; it != relToRemove->end() ; it++) { unsigned int relationId = (*it)->getId(); relationsRemoved.push_back(relationId); removeTemporalRelation((*it)); delete (*it); } relToRemove->clear(); delete relToRemove; vector<unsigned int>* controlPointID = new vector <unsigned int>; cedBox->getAllControlPointsId(controlPointID); for (unsigned int i = 0 ; i < controlPointID->size() ; ++i) { ControlPoint* currentControlPoint = cedBox->getControlPoint(controlPointID->at(i)); if(currentControlPoint->getTriggerPoint() != NULL) { TriggerPoint* currentTriggerPoint = currentControlPoint->getTriggerPoint(); triggersRemoved.push_back(currentTriggerPoint->getTriggerId()); currentTriggerPoint->removeRelatedControlPoint(); } relToRemove = links(currentControlPoint); for (vector<BinaryTemporalRelation*>::iterator it = relToRemove->begin() ; it != relToRemove->end() ; it++) { removeTemporalRelation((*it)); delete (*it); } _solver->removeIntVar(currentControlPoint->beginID()); _solver->removeIntVar(currentControlPoint->lengthID()); } /* remove related variables from the solver */ _solver->removeIntVar(cedBox->beginID()); _solver->removeIntVar(cedBox->lengthID()); /* remove cedBox from the constrained objects' list of the CSPold */ _cedEntities->erase(boxId); }
bool Editor::performMoving(unsigned int boxId, int x, int y, vector<unsigned int>& movedBoxes, int maxModification) { CSP* containingCSP = m_boxIdToContainingCSP[boxId]; ConstrainedBox* currentBox = containingCSP->getBoxById(boxId); ConstrainedBox* motherBox = currentBox->mother(); // if ((x > motherBox->lengthValue()) || (y > motherBox->lengthValue())) { // return false; // } containingCSP->changeAllBoxMaxSceneWidth(motherBox->lengthValue()); CSP* boxCSP = currentBox->getCSP(); int previousX = getBeginValue(boxId); int previousY = getEndValue(boxId); if (boxCSP != NULL) { std::vector<unsigned int> boxesId; boxCSP->getAllBoxesId(boxesId); if (boxesId.size() != 0) { unsigned int maxValue = 0; for (unsigned int i = 0; i < boxesId.size(); ++i) { unsigned int currentChildBoxEnd = boxCSP->getEndValue(boxesId[i]); if(currentChildBoxEnd > maxValue) { maxValue = currentChildBoxEnd; } } if ((unsigned int)(y - x) < maxValue) { return false; } } } int modificationX = abs(previousX - x); int modificationY = abs(previousY - y); if (maxModification < modificationX) { maxModification = modificationX; } if (maxModification < modificationY) { maxModification = modificationY; } unsigned int hierarchyRelation = currentBox->getHierarchyRelationId(); if (hierarchyRelation != NO_ID) { containingCSP->removeTemporalRelation(hierarchyRelation); } std::vector<unsigned int> hierarchyRelationMovedBoxes; if(containingCSP->performMoving(boxId, x, y, movedBoxes, maxModification)) { if (hierarchyRelation != NO_ID) { containingCSP->addAntPostRelation(hierarchyRelation, boxId, BEGIN_CONTROL_POINT_INDEX, boxId, END_CONTROL_POINT_INDEX, ANTPOST_ANTERIORITY, currentBox->lengthValue(), currentBox->lengthValue(), hierarchyRelationMovedBoxes, false); } movedBoxes.clear(); getAllBoxesId(movedBoxes); return true; } else { // put back the CSP into its previous state. containingCSP->performMoving(boxId, previousX, previousY, movedBoxes, maxModification); movedBoxes.clear(); getAllBoxesId(movedBoxes); return false; } }