X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_Sketch.cpp;h=4de9585ee05cc0d914186d692e08254624155f13;hb=e0d688a112785530d96489dec8ec7d620b294ef0;hp=2117bc8b0f1b12a109aaa9ccfdee818e09fc144c;hpb=61c8d0d8d485404fbdd8a2b6b623c790e56d606c;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Sketch.cpp b/src/SketchPlugin/SketchPlugin_Sketch.cpp old mode 100644 new mode 100755 index 2117bc8b0..4de9585ee --- a/src/SketchPlugin/SketchPlugin_Sketch.cpp +++ b/src/SketchPlugin/SketchPlugin_Sketch.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -38,8 +39,6 @@ #include #include -using namespace std; - SketchPlugin_Sketch::SketchPlugin_Sketch() { } @@ -51,12 +50,16 @@ void SketchPlugin_Sketch::initAttributes() data()->addAttribute(SketchPlugin_Sketch::NORM_ID(), GeomDataAPI_Dir::typeId()); data()->addAttribute(SketchPlugin_Sketch::FEATURES_ID(), ModelAPI_AttributeRefList::typeId()); // the selected face, base for the sketcher plane, not obligatory - data()->addAttribute(SketchPlugin_SketchEntity::EXTERNAL_ID(), ModelAPI_AttributeSelection::typeId()); + data()->addAttribute(SketchPlugin_SketchEntity::EXTERNAL_ID(), + ModelAPI_AttributeSelection::typeId()); ModelAPI_Session::get()->validators()->registerNotObligatory( getKind(), SketchPlugin_SketchEntity::EXTERNAL_ID()); data()->addAttribute(SketchPlugin_Sketch::SOLVER_ERROR(), ModelAPI_AttributeString::typeId()); ModelAPI_Session::get()->validators()->registerNotObligatory( getKind(), SketchPlugin_Sketch::SOLVER_ERROR()); + data()->addAttribute(SketchPlugin_Sketch::SOLVER_DOF(), ModelAPI_AttributeString::typeId()); + ModelAPI_Session::get()->validators()->registerNotObligatory( + getKind(), SketchPlugin_Sketch::SOLVER_DOF()); } void SketchPlugin_Sketch::execute() @@ -87,7 +90,7 @@ void SketchPlugin_Sketch::execute() aFeature->setSketch(this); // do not include the external edges into the result if (aFeature->data()->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID())) { - if (aFeature->data()->selection(SketchPlugin_SketchEntity::EXTERNAL_ID())->value()) + if (aFeature->data()->selection(SketchPlugin_SketchEntity::EXTERNAL_ID())->context()) continue; } // do not include the construction entities in the result @@ -110,13 +113,6 @@ void SketchPlugin_Sketch::execute() } } - if (aFeaturesPreview.empty()) { - // no good features for generation of preview => erase result if exists - if (firstResult().get() && !firstResult()->isDisabled()) - removeResults(0, false); - return; - } - // Collect all edges as one big wire std::shared_ptr aBigWire(new GeomAPI_PlanarEdges); std::list >::const_iterator aShapeIt = aFeaturesPreview.begin(); @@ -133,7 +129,12 @@ std::shared_ptr SketchPlugin_Sketch::addFeature(std::string th { std::shared_ptr aNew = document()->addFeature(theID, false); if (aNew) { - std::dynamic_pointer_cast(aNew)->setSketch(this); + // the sketch cannot be specified for the macro-features defined in python + // like SketchRectangle, so we need to check the type of new feature + std::shared_ptr aSketchFeature = + std::dynamic_pointer_cast(aNew); + if (aSketchFeature) + aSketchFeature->setSketch(this); data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->append(aNew); } // set as current also after it becomes sub to set correctly enabled for other sketch subs @@ -146,7 +147,8 @@ void SketchPlugin_Sketch::removeFeature(std::shared_ptr theFea if (!data()->isValid()) // sketch is already removed (case on undo of sketch), sync is not needed return; AttributeRefListPtr aList = reflist(SketchPlugin_Sketch::FEATURES_ID()); - // if the object is last, remove it from the list (needed to skip empty transaction on edit of sketch feature) + // if the object is last, remove it from the list + // (needed to skip empty transaction on edit of sketch feature) if (aList->object(aList->size(true) - 1, true) == theFeature) { aList->remove(theFeature); } else { @@ -183,7 +185,7 @@ int SketchPlugin_Sketch::subFeatureId(const int theIndex) const int aResultIndex = 1; // number of the counted (created) features, started from 1 int aFeatureIndex = -1; // number of the not-empty features in the list for (; anIt != aFeatures.end(); anIt++) { - if (anIt->get()) + if (anIt->get()) aFeatureIndex++; if (aFeatureIndex == theIndex) break; @@ -208,29 +210,14 @@ bool SketchPlugin_Sketch::isSub(ObjectPtr theObject) const } -void SketchPlugin_Sketch::erase() -{ - std::shared_ptr aRefList = std::dynamic_pointer_cast< - ModelAPI_AttributeRefList>(data()->attribute(SketchPlugin_Sketch::FEATURES_ID())); - std::list aFeatures = aRefList->list(); - std::list::const_iterator anIt = aFeatures.begin(); - for (; anIt != aFeatures.end(); anIt++) { - FeaturePtr aFeature = std::dynamic_pointer_cast(*anIt); - if (aFeature) { - // subs are referenced from sketch, but must be removed for sure, so not checkings - document()->removeFeature(aFeature); - } - } - ModelAPI_CompositeFeature::erase(); -} - void SketchPlugin_Sketch::attributeChanged(const std::string& theID) { if (theID == SketchPlugin_SketchEntity::EXTERNAL_ID()) { - std::shared_ptr aSelection = + std::shared_ptr aSelection = data()->selection(SketchPlugin_SketchEntity::EXTERNAL_ID())->value(); if (aSelection) { // update arguments due to the selection value // update the sketch plane - std::shared_ptr aPlane = GeomAlgoAPI_FaceBuilder::plane(aSelection); + std::shared_ptr aFace(new GeomAPI_Face(aSelection)); + std::shared_ptr aPlane = aFace->getPlane(); if (aPlane) { double anA, aB, aC, aD; aPlane->coefficients(anA, aB, aC, aD); @@ -242,7 +229,8 @@ void SketchPlugin_Sketch::attributeChanged(const std::string& theID) { aCoords = aCoords->multiplied(-aD * aCoords->distance(aZero)); std::shared_ptr anOrigPnt(new GeomAPI_Pnt(aCoords)); // X axis is preferable to be dirX on the sketch - static const double tol = 0.1; // here can not be very small value to avoid very close to X normal axis (issue 595) + // here can not be very small value to avoid very close to X normal axis (issue 595) + static const double tol = 0.1; bool isX = fabs(anA) - 1.0 < tol && fabs(aB) < tol && fabs(aC) < tol; std::shared_ptr aTempDir( isX ? new GeomAPI_Dir(0, 1, 0) : new GeomAPI_Dir(1, 0, 0)); @@ -262,7 +250,7 @@ void SketchPlugin_Sketch::attributeChanged(const std::string& theID) { std::shared_ptr aDir = aPlane->direction(); } } - } else if (theID == SketchPlugin_Sketch::NORM_ID() || theID == SketchPlugin_Sketch::DIRX_ID()) { + } else if (theID == NORM_ID() || theID == DIRX_ID() || theID == ORIGIN_ID()) { // send all sub-elements are also updated: all entities become created on different plane static Events_ID anUpdateEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED); std::list aSubs = data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->list(); @@ -287,7 +275,7 @@ void SketchPlugin_Sketch::createPoint2DResult(ModelAPI_Feature* theFeature, std::shared_ptr aCenter(theSketch->to3D(aPoint->x(), aPoint->y())); //std::cout<<"Execute circle "<x()<<" "<y()<<" "<z()< aCenterPointShape = GeomAlgoAPI_PointBuilder::point(aCenter); + std::shared_ptr aCenterPointShape = GeomAlgoAPI_PointBuilder::vertex(aCenter); std::shared_ptr aResult = theFeature->document()->createConstruction( theFeature->data(), theIndex); aResult->setShape(aCenterPointShape); @@ -305,12 +293,18 @@ FeaturePtr SketchPlugin_Sketch::addUniqueNamedCopiedFeature(FeaturePtr theFeatur std::string aUniqueFeatureName = aNewFeature->data()->name(); // all attribute values are copied\pasted to the new feature, name is not an exception theFeature->data()->copyTo(aNewFeature->data()); - // as a name for the feature, the generated unique name is set + // external state should not be copied as a new object is an object of the current sketch + if (theFeature->selection(SketchPlugin_SketchEntity::EXTERNAL_ID()).get()) + theFeature->selection(SketchPlugin_SketchEntity::EXTERNAL_ID())->setValue(ResultPtr(), + GeomShapePtr()); aNewFeature->data()->setName(aUniqueFeatureName); // text expressions could block setValue of some attributes SketchPlugin_Tools::clearExpressions(aNewFeature); // Set copy attribute - aNewFeature->data()->boolean(SketchPlugin_SketchEntity::COPY_ID())->setValue(theIsCopy); + AttributeBooleanPtr anAttr = aNewFeature->data()->boolean(SketchPlugin_SketchEntity::COPY_ID()); + if(anAttr.get()) { + anAttr->setValue(theIsCopy); + } return aNewFeature; }