#include "CurveCreator_Operation.hxx"
#include "CurveCreator_Curve.hxx"
+#include "CurveCreator.hxx"
#include <string>
#include <stdlib.h>
clear();
}
+bool compId(CurveCreator_PosPoint* p1, CurveCreator_PosPoint* p2)
+{
+ return p1->myID < p2->myID;
+}
+
//=======================================================================
// function: Constructor
// purpose:
return isOK;
}
-//=======================================================================
-// function: Constructor
-// purpose:
-//=======================================================================
-bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType,
- const CurveCreator::Coordinates &theCoords,
- const int theIntParam1,
- const int theIntParam2)
-{
- bool isOK = false;
-
- if (theType == CurveCreator_Operation::AddSection ||
- theType == CurveCreator_Operation::InsertPoints ||
- theType == CurveCreator_Operation::SetCoordinates) {
- const int aNbCoords = theCoords.size();
- const size_t aSize =
- 3*sizeof(theIntParam1) + aNbCoords*sizeof(CurveCreator::TypeCoord);
- int *pIntData = (int *)allocate(aSize);
-
- *pIntData++ = theIntParam1;
- *pIntData++ = theIntParam2;
- *pIntData++ = aNbCoords;
-
- CurveCreator::TypeCoord *pRealData = (CurveCreator::TypeCoord *)pIntData;
- int i = 0;
-
- for (; i < aNbCoords; i++) {
- *pRealData++ = theCoords[i];
- }
-
- myType = theType;
- isOK = true;
- }
-
- return isOK;
-}
-
//=======================================================================
// function: Constructor
// purpose:
pIntData = (int*)aStrPtr;
*pIntData++ = aNbCoords;
- CurveCreator::TypeCoord *pRealData = (CurveCreator::TypeCoord *)aStrPtr;
+ CurveCreator::TypeCoord *pRealData = (CurveCreator::TypeCoord *)pIntData;
int i = 0;
for (; i < aNbCoords; i++) {
return false;
}
+bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType,
+ const CurveCreator_ICurve::SectionToPointCoordsList &theParamList1)
+{
+ bool isOK = false;
+
+ if (theType == CurveCreator_Operation::InsertPoints ||
+ theType == CurveCreator_Operation::SetCoordinates ) {
+
+ const int aNbPoints = theParamList1.size();
+
+ CurveCreator_ICurve::SectionToPointCoordsList::const_iterator anIt =
+ theParamList1.begin();
+ const int aNbCoords = anIt->second.size();
+
+ const size_t aSize =
+ sizeof(aNbPoints) + sizeof(aNbCoords) +
+ aNbPoints * (3*sizeof(int) + aNbCoords*sizeof(CurveCreator::TypeCoord));
+ int *pIntData = (int *)allocate(aSize);
+
+ *pIntData++ = aNbPoints;
+ *pIntData++ = aNbCoords;
+ int aSectionId, aPointId;
+ for ( ; anIt != theParamList1.end(); anIt++ ) {
+ aSectionId = anIt->first.first;
+ aPointId = anIt->first.second;
+
+ *pIntData++ = aSectionId;
+ *pIntData++ = aPointId;
+ *pIntData++ = aNbCoords;
+
+ const CurveCreator::Coordinates &aCoords = anIt->second;
+ CurveCreator::TypeCoord *pRealData = (CurveCreator::TypeCoord *)pIntData;
+ for (int i = 0; i < aNbCoords; i++) {
+ *pRealData++ = aCoords[i];
+ }
+ pIntData = (int *)pRealData;
+ }
+
+ myType = theType;
+ isOK = true;
+ }
+
+ return isOK;
+}
+
+bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType,
+ const CurveCreator_ICurve::SectionToPointList &theParamList1)
+{
+ bool isOK = false;
+
+ if (theType == CurveCreator_Operation::RemovePoints) {
+ const int aNbPoints = theParamList1.size();
+
+ CurveCreator_ICurve::SectionToPointList::const_iterator anIt =
+ theParamList1.begin();
+
+ const size_t aSize =
+ sizeof(aNbPoints) +
+ aNbPoints * (2*sizeof(int));
+ int *pIntData = (int *)allocate(aSize);
+
+ *pIntData++ = aNbPoints;
+ int aSectionId, aPointId;
+ for ( ; anIt != theParamList1.end(); anIt++ ) {
+ aSectionId = anIt->first;
+ aPointId = anIt->second;
+
+ *pIntData++ = aSectionId;
+ *pIntData++ = aPointId;
+ }
+
+ myType = theType;
+ isOK = true;
+ }
+
+ return isOK;
+}
+
//=======================================================================
// function: apply
// purpose:
switch (myType) {
case CurveCreator_Operation::AddPoints:
case CurveCreator_Operation::InsertPoints:
+ case CurveCreator_Operation::SetCoordinates:
{
+ int aSectionId, aPointId;
+ CurveCreator::SectionsMap aSectionsMap;
+ CurveCreator::PosPointsList aPoints;
CurveCreator::Coordinates aCoords;
- getCoords(&pInt[2], aCoords);
- std::vector<int> anISections, anIPnts;
- anISections.push_back( pInt[0] );
- anIPnts.push_back( pInt[1] );
- theCurve->addPointsInternal(aCoords, anISections, anIPnts);
+ int nbPoints = pInt[0];
+ int nbCoords = pInt[1];
+ int nbParams = 3+nbCoords;
+ for (int i = 0; i < nbPoints*nbParams; i=i+nbParams) {
+ aCoords.clear();
+ aPoints.clear();
+ getCoords(&pInt[4+i], aCoords);
+ aSectionId = pInt[2+i];
+ aPointId = pInt[3+i];
+ if ( aSectionsMap.find( aSectionId ) != aSectionsMap.end() )
+ aPoints = aSectionsMap[aSectionId];
+ CurveCreator_PosPoint* aPosPoint = new CurveCreator_PosPoint( aPointId, aCoords );
+ aPoints.push_back( aPosPoint );
+ aPoints.sort(compId);
+ aSectionsMap[aSectionId] = aPoints;
+ }
+ switch (myType) {
+ case CurveCreator_Operation::AddPoints:
+ case CurveCreator_Operation::InsertPoints:
+ theCurve->addPointsInternal( aSectionsMap );
+ break;
+ case CurveCreator_Operation::SetCoordinates:
+ theCurve->setPointInternal( aSectionsMap );
+ break;
+ }
}
break;
case CurveCreator_Operation::RemovePoints:
{
- std::vector<int> anISections, anIPnts;
- anISections.push_back( pInt[0] );
- anIPnts.push_back( pInt[1] );
- theCurve->removePointsInternal(anISections, anIPnts);
+ CurveCreator_ICurve::SectionToPointList aListOfSectionsToPoints;
+ int nbPoints = pInt[0];
+ for (int i = 1; i < nbPoints*2; i=i+2) {
+ aListOfSectionsToPoints.push_back(std::make_pair(pInt[i], pInt[i+1]));
+ }
+ theCurve->removePointsInternal(aListOfSectionsToPoints);
}
break;
case CurveCreator_Operation::SetType:
case CurveCreator_Operation::Clear:
theCurve->clearInternal();
break;
- case CurveCreator_Operation::SetCoordinates:
- {
- CurveCreator::Coordinates aCoords;
-
- getCoords(&pInt[2], aCoords);
- theCurve->setPointInternal(pInt[0], pInt[1], aCoords);
- }
- break;
case CurveCreator_Operation::SetClosed:
- theCurve->setClosedInternal((pInt[0] != 0), pInt[1]);
+ theCurve->setClosedInternal(pInt[1], (pInt[0] != 0));
break;
case CurveCreator_Operation::MoveSection:
theCurve->moveSectionInternal(pInt[0], pInt[1]);