+ if (aNorm.get() && aNorm->isInitialized() && anOrigin.get() && anOrigin->isInitialized())
+ return std::shared_ptr<GeomAPI_Ax3>(
+ new GeomAPI_Ax3(anOrigin->pnt(), aDirX->dir(), aNorm->dir()));
+
+ return std::shared_ptr<GeomAPI_Ax3>();
+}
+
+bool SketchPlugin_Sketch::customAction(const std::string& theActionId)
+{
+ bool isOk = false;
+ if (theActionId == ACTION_REMOVE_EXTERNAL())
+ isOk = removeLinksToExternal();
+ else {
+ std::string aMsg = "Error: Feature \"%1\" does not support action \"%2\".";
+ Events_InfoMessage("SketchPlugin_Sketch", aMsg).arg(getKind()).arg(theActionId).send();
+ }
+ return isOk;
+}
+
+static bool isExternalBased(const FeaturePtr theFeature)
+{
+ return theFeature->getKind() == SketchPlugin_Projection::ID() ||
+ theFeature->getKind() == SketchPlugin_IntersectionPoint::ID();
+}
+
+bool SketchPlugin_Sketch::removeLinksToExternal()
+{
+ std::list<FeaturePtr> aRemove;
+ std::list<ObjectPtr> aSubs = reflist(FEATURES_ID())->list();
+ for (std::list<ObjectPtr>::iterator anIt = aSubs.begin(); anIt != aSubs.end(); ++anIt) {
+ FeaturePtr aFeature = ModelAPI_Feature::feature(*anIt);
+ if (!aFeature)
+ continue;
+ if (isExternalBased(aFeature)) {
+ // mark feature as to be removed
+ aRemove.push_back(aFeature);
+ }
+ else {
+ AttributeSelectionPtr anExtAttr =
+ aFeature->selection(SketchPlugin_SketchEntity::EXTERNAL_ID());
+ ResultPtr anExternal = anExtAttr ? anExtAttr->context() : ResultPtr();
+ if (anExternal) {
+ FeaturePtr anExtFeature = ModelAPI_Feature::feature(anExternal);
+ if (anExtFeature && isExternalBased(anExtFeature)) {
+ // make result of projection/intersection as non-external,
+ aFeature->selection(SketchPlugin_SketchEntity::EXTERNAL_ID())->setValue(
+ ObjectPtr(), GeomShapePtr());
+ // set feature auxiliary if the parent is not included into sketch result
+ bool isIncludedToSketchResult = false;
+ if (anExtFeature->getKind() == SketchPlugin_Projection::ID()) {
+ isIncludedToSketchResult = anExtFeature->boolean(
+ SketchPlugin_Projection::INCLUDE_INTO_RESULT())->value();
+ }
+ if (anExtFeature->getKind() == SketchPlugin_IntersectionPoint::ID()) {
+ isIncludedToSketchResult = anExtFeature->boolean(
+ SketchPlugin_IntersectionPoint::INCLUDE_INTO_RESULT())->value();
+ }
+
+ aFeature->boolean(SketchPlugin_SketchEntity::COPY_ID())->setValue(false);
+ aFeature->boolean(SketchPlugin_SketchEntity::AUXILIARY_ID())->setValue(
+ !isIncludedToSketchResult);
+ }
+ }
+ }
+ }
+ for (std::list<FeaturePtr>::iterator anIt = aRemove.begin(); anIt != aRemove.end(); ++anIt)
+ document()->removeFeature(*anIt);
+ return true;
+}
+
+
+static ObjectPtr findAxis(GeomShapePtr theAxisToCompare,
+ ObjectPtr theOX,
+ ObjectPtr theOY,
+ ObjectPtr theOZ)
+{
+ if (theAxisToCompare) {
+ ObjectPtr anAxes[] = { theOX, theOY, theOZ };
+ for (int i = 0; i < 3; ++i) {
+ ResultPtr anAx = std::dynamic_pointer_cast<ModelAPI_Result>(anAxes[i]);
+ if (anAx && theAxisToCompare->isEqual(anAx->shape()))
+ return anAxes[i];
+ }
+ }
+ return ObjectPtr();
+}
+
+static ObjectPtr findAxis(ObjectPtr theAxisToCompare,
+ ObjectPtr theOX,
+ ObjectPtr theOY,
+ ObjectPtr theOZ)
+{
+ if (theAxisToCompare == theOX)
+ return theOX;
+ else if (theAxisToCompare == theOY)
+ return theOY;
+ else if (theAxisToCompare == theOZ)
+ return theOZ;
+ // nothing helped, search by shape
+ ResultPtr anAxis = std::dynamic_pointer_cast<ModelAPI_Result>(theAxisToCompare);
+ return findAxis(anAxis ? anAxis->shape() : GeomShapePtr(), theOX, theOY, theOZ);