-// Copyright (C) 2014-2017 CEA/DEN, EDF R&D
+// Copyright (C) 2014-2019 CEA/DEN, EDF R&D
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
-// See http://www.salome-platform.org/ or
-// email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
#include <PartSet_Tools.h>
#include <SketchPlugin_Line.h>
#include <SketchPlugin_Point.h>
#include <SketchPlugin_Projection.h>
+#include <SketchPlugin_IntersectionPoint.h>
#include <ModuleBase_IWorkshop.h>
#include <ModuleBase_ViewerPrs.h>
AttributeRefAttrPtr aRefAttr = aProjectionFeature->data()->refattr(
SketchPlugin_Projection::PROJECTED_FEATURE_ID());
if (!aRefAttr || !aRefAttr->isInitialized())
+ {
+ // remove external feature if the attribute is not filled
+ std::set<FeaturePtr> aFeatures;
+ aFeatures.insert(aProjectionFeature);
+ ModelAPI_Tools::removeFeaturesAndReferences(aFeatures);
return ResultPtr();
+ }
FeaturePtr aProjection = ModelAPI_Feature::feature(aRefAttr->object());
if (aProjection.get() && aProjection->lastResult().get())
for (aIt = aRefsList.cbegin(); aIt != aRefsList.cend(); ++aIt) {
std::shared_ptr<ModelAPI_Attribute> aAttr = (*aIt);
FeaturePtr aConstrFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aAttr->owner());
- if (aConstrFeature->getKind() == SketchPlugin_ConstraintCoincidence::ID()) {
+ if (aConstrFeature && aConstrFeature->getKind() == SketchPlugin_ConstraintCoincidence::ID()) {
std::shared_ptr<GeomAPI_Pnt2d> a2dPnt =
PartSet_Tools::getPoint(aConstrFeature, SketchPlugin_ConstraintCoincidence::ENTITY_A());
if (a2dPnt.get() && thePoint->isEqual(a2dPnt)) {
return;
static Events_Loop* aLoop = Events_Loop::loop();
- for (int i = 0; i < theComposite->numberOfSubs(); i++) {
+ int aNumberOfSubs = theComposite->numberOfSubs();
+ for (int i = 0; i < aNumberOfSubs; i++) {
FeaturePtr aSubFeature = theComposite->subFeature(i);
static const ModelAPI_EventCreator* aECreator = ModelAPI_EventCreator::get();
aECreator->sendUpdated(aSubFeature, theEventId);
return isAuxiliaryFeature;
}
+bool PartSet_Tools::isIncludeIntoSketchResult(const ObjectPtr& theObject)
+{
+ // check the feature is neither Projection nor IntersectionPoint feature
+ FeaturePtr aFeature = ModelAPI_Feature::feature(theObject);
+ if (aFeature->getKind() == SketchPlugin_Projection::ID() ||
+ aFeature->getKind() == SketchPlugin_IntersectionPoint::ID())
+ return false;
+
+ // go through the references to the feature to check
+ // if it was created by Projection or Intersection
+ const std::set<AttributePtr>& aRefs = theObject->data()->refsToMe();
+ for (std::set<AttributePtr>::const_iterator aRefIt = aRefs.begin();
+ aRefIt != aRefs.end(); ++aRefIt) {
+ AttributePtr anAttr = *aRefIt;
+ std::string anIncludeToResultAttrName;
+ if (anAttr->id() == SketchPlugin_Projection::PROJECTED_FEATURE_ID())
+ anIncludeToResultAttrName = SketchPlugin_Projection::INCLUDE_INTO_RESULT();
+ else if (anAttr->id() == SketchPlugin_IntersectionPoint::INTERSECTION_POINTS_ID())
+ anIncludeToResultAttrName = SketchPlugin_IntersectionPoint::INCLUDE_INTO_RESULT();
+
+ if (!anIncludeToResultAttrName.empty()) {
+ // check "include into result" flag
+ FeaturePtr aParent = ModelAPI_Feature::feature(anAttr->owner());
+ return aParent->boolean(anIncludeToResultAttrName)->value();
+ }
+ }
+ return true;
+}
+
ResultPtr PartSet_Tools::createFixedByExternalCenter(
const ObjectPtr& theObject,
const std::shared_ptr<GeomAPI_Edge>& theEdge,
ModelAPI_AttributeSelection::CenterType theType,
const CompositeFeaturePtr& theSketch,
- bool theTemporary)
+ bool theTemporary,
+ FeaturePtr& theCreatedFeature)
{
ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
if (!aResult.get())
return ResultPtr();
FeaturePtr aProjectionFeature = theSketch->addFeature(SketchPlugin_Projection::ID());
+ theCreatedFeature = aProjectionFeature;
AttributeSelectionPtr anExternalAttr = std::dynamic_pointer_cast<ModelAPI_AttributeSelection>(
aProjectionFeature->attribute(SketchPlugin_Projection::EXTERNAL_FEATURE_ID()));
anExternalAttr->setValueCenter(aResult, theEdge, theType, theTemporary);
return ResultPtr();
}
+
+void PartSet_Tools::getFirstAndLastIndexInFolder(const ObjectPtr& theFolder,
+ int& theFirst, int& theLast)
+{
+ theFirst = -1;
+ theLast = -1;
+
+ DocumentPtr aDoc = theFolder->document();
+ FolderPtr aFolder = std::dynamic_pointer_cast<ModelAPI_Folder>(theFolder);
+ if (!aFolder.get())
+ return;
+
+ AttributeReferencePtr aFirstFeatAttr =
+ aFolder->data()->reference(ModelAPI_Folder::FIRST_FEATURE_ID());
+ if (!aFirstFeatAttr.get())
+ return;
+ FeaturePtr aFirstFeatureInFolder = ModelAPI_Feature::feature(aFirstFeatAttr->value());
+ if (!aFirstFeatureInFolder.get())
+ return;
+
+ FeaturePtr aLastFeatureInFolder = aFolder->lastVisibleFeature();
+ if (!aLastFeatureInFolder.get())
+ return;
+
+ theFirst = aDoc->index(aFirstFeatureInFolder);
+ theLast = aDoc->index(aLastFeatureInFolder);
+}