+ // Fill lists of coordinates of points composing a feature
+ std::list<double> aX, aY;
+ double aXCoord, aYCoord;
+ std::list<AttributePtr> aPoints =
+ anOriginal->data()->attributes(GeomDataAPI_Point2D::typeId());
+ std::list<AttributePtr>::iterator aPtIt = aPoints.begin();
+ for (; aPtIt != aPoints.end(); ++aPtIt) {
+ AttributePoint2DPtr aPoint2D = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(*aPtIt);
+ if (aPoint2D->isInitialized()) {
+ aXCoord = aPoint2D->x();
+ aYCoord = aPoint2D->y();
+ getRelative(aXCoord, aYCoord, aXCoord, aYCoord);
+ } else
+ aXCoord = aYCoord = 0;
+
+ aX.push_back(aXCoord);
+ aY.push_back(aYCoord);
+ }
+
+ // Calculate positions of copied features
+ for (int i = 0; i < myNumberOfCopies && anObjIt != anObjectList.end(); ++i, ++anObjIt) {
+ aFeature = ModelAPI_Feature::feature(*anObjIt);
+ if (!aFeature)
+ continue;
+
+ if (myIsEventsBlocked)
+ aFeature->data()->blockSendAttributeUpdated(true);
+
+ if (aFeature->getKind() == SketchPlugin_Circle::ID()) // update circle's radius
+ aFeature->real(SketchPlugin_Circle::RADIUS_ID())->setValue(
+ anOriginal->real(SketchPlugin_Circle::RADIUS_ID())->value());
+
+ aPoints = aFeature->data()->attributes(GeomDataAPI_Point2D::typeId());
+ for (aPtIt = aPoints.begin(), aXIt = aX.begin(), aYIt = aY.begin();
+ aPtIt != aPoints.end(); ++aXIt, ++aYIt, ++aPtIt) {
+ if (!(*aPtIt)->isInitialized())
+ continue;
+ transformRelative(*aXIt, *aYIt);
+ getAbsolute(*aXIt, *aYIt, aXCoord, aYCoord);
+
+ AttributePoint2DPtr aPoint2D =
+ std::dynamic_pointer_cast<GeomDataAPI_Point2D>(*aPtIt);
+ aPoint2D->setValue(aXCoord, aYCoord);
+ }
+
+ // update transformed entity if it exists in the storage
+ if (myStorage->entity(aFeature))
+ myStorage->update(aFeature);
+ }
+ }