X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=inline;f=src%2FSketchAPI%2FSketchAPI_Sketch.cpp;h=fa47909741698008bc2db9a56b05277cdd93841e;hb=d53cd037401ca37f75e19e59201e1b816f251c6a;hp=5f60ae2a759e204024cc38743020f35587973c09;hpb=380f01e1fce1a012267d604a1190d04bf4659447;p=modules%2Fshaper.git diff --git a/src/SketchAPI/SketchAPI_Sketch.cpp b/src/SketchAPI/SketchAPI_Sketch.cpp index 5f60ae2a7..fa4790974 100644 --- a/src/SketchAPI/SketchAPI_Sketch.cpp +++ b/src/SketchAPI/SketchAPI_Sketch.cpp @@ -425,6 +425,49 @@ std::shared_ptr SketchAPI_Sketch::addRectangle( return RectanglePtr(new SketchAPI_Rectangle(aFeature, theStartPoint, theEndPoint)); } +static std::shared_ptr pointCoordinates( + const std::pair, ModelHighAPI_RefAttr> & thePoint) +{ + if (thePoint.first) + return thePoint.first; + + AttributePtr anAttr = thePoint.second.attr(); + if (thePoint.second.object()) { + FeaturePtr aFeature = ModelAPI_Feature::feature(thePoint.second.object()); + if (aFeature) + anAttr = aFeature->attribute(SketchPlugin_Point::COORD_ID()); + } + + std::shared_ptr aPntAttr = + std::dynamic_pointer_cast(anAttr); + if (aPntAttr) + return aPntAttr->pnt(); + return std::shared_ptr(); +} + +std::shared_ptr SketchAPI_Sketch::addRectangleCentered( + const std::pair, ModelHighAPI_RefAttr> & theCenter, + const std::pair, ModelHighAPI_RefAttr> & theCorner) +{ + std::shared_ptr aFeature = + compositeFeature()->addFeature(SketchAPI_Rectangle::ID()); + RectanglePtr aRect(new SketchAPI_Rectangle(aFeature)); + fillAttribute("RectangleTypeCentered", aRect->type()); + if (!theCenter.second.isEmpty()) + fillAttribute(theCenter.second, aRect->centerPointRef()); + fillAttribute(pointCoordinates(theCenter), aRect->centerPoint()); + fillAttribute(pointCoordinates(theCorner), aRect->cornerPoint()); + aRect->execute(); + + if (!theCorner.second.isEmpty() && aRect->linesList()->size() > 1) { + // get start point of the last line in rectangle and apply coindidence constraint + FeaturePtr aLine = ModelAPI_Feature::feature(aRect->linesList()->object(3)); + AttributePtr aEndPnt = aLine->attribute(SketchPlugin_Line::START_ID()); + setCoincident(ModelHighAPI_RefAttr(aEndPnt), theCorner.second); + } + return aRect; +} + //-------------------------------------------------------------------------------------- std::shared_ptr SketchAPI_Sketch::addCircle(double theCenterX, double theCenterY, @@ -1588,6 +1631,34 @@ void SketchAPI_Sketch::dump(ModelHighAPI_Dumper& theDumper) const std::list > aFaces; edgesOfSketchFaces(aCompFeat, aFaces); + /// remove faces that must not be dumped + std::vector< std::list>::iterator> aFacesToRemove; + for(auto itFaces = aFaces.begin(); itFaces != aFaces.end(); ++itFaces) + { + auto & facesGroup = *itFaces; + std::vector::iterator> subFacestoRemove; + for(auto itGroup = facesGroup.begin(); itGroup != facesGroup.end(); ++itGroup) + { + FeaturePtr aFeature = ModelAPI_Feature::feature(*itGroup); + if(theDumper.isDumped(aFeature)){ + subFacestoRemove.push_back(itGroup); + } + } + for(auto itGroup :subFacestoRemove){ + facesGroup.erase(itGroup); + } + + if(!facesGroup.size()){ + aFacesToRemove.push_back(itFaces); + } + } + for(auto itFaces :aFacesToRemove){ + aFaces.erase(itFaces); + } + + if(!aFaces.size()) + return; + const std::string& aSketchName = theDumper.name(aBase); std::string aMethodName(".changeFacesOrder"); std::string aSpaceShift(aSketchName.size() + aMethodName.size(), ' ');