예제 #1
0
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);
	}
}
예제 #2
0
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);
}
예제 #3
0
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;
	}
}