X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FConstructionPlugin%2FConstructionPlugin_Plane.cpp;h=dc305d29ee3a8c3889ce4c45e3004800d845fdfe;hb=aef9c1a87bc7ca357d8dfe47c56ac5edc9935d35;hp=c95d450ad06d98e3856d29ad7e71d9d5f9e44d3c;hpb=f0c652f8a1717e4afc44eacb1798e567328bfad6;p=modules%2Fshaper.git diff --git a/src/ConstructionPlugin/ConstructionPlugin_Plane.cpp b/src/ConstructionPlugin/ConstructionPlugin_Plane.cpp index c95d450ad..dc305d29e 100644 --- a/src/ConstructionPlugin/ConstructionPlugin_Plane.cpp +++ b/src/ConstructionPlugin/ConstructionPlugin_Plane.cpp @@ -14,11 +14,13 @@ #include #include +#include #include #include #include #include #include +#include #include #include @@ -32,8 +34,9 @@ static GeomShapePtr faceByThreeVertices(const std::shared_ptr theV1, const std::shared_ptr theV2, const std::shared_ptr theV3); -static std::shared_ptr makeRectangularFace(const std::shared_ptr theFace, - const std::shared_ptr thePln); +static std::shared_ptr makeRectangularFace( + const std::shared_ptr theFace, + const std::shared_ptr thePln); //================================================================================================== ConstructionPlugin_Plane::ConstructionPlugin_Plane() @@ -43,8 +46,11 @@ ConstructionPlugin_Plane::ConstructionPlugin_Plane() //================================================================================================== void ConstructionPlugin_Plane::initAttributes() { - data()->addAttribute(ConstructionPlugin_Plane::CREATION_METHOD(), ModelAPI_AttributeString::typeId()); + data()->addAttribute(ConstructionPlugin_Plane::CREATION_METHOD(), + ModelAPI_AttributeString::typeId()); + data()->addAttribute(PLANE(), ModelAPI_AttributeSelection::typeId()); + data()->addAttribute(DISTANCE(), ModelAPI_AttributeDouble::typeId()); // By general equation. data()->addAttribute(A(), ModelAPI_AttributeDouble::typeId()); data()->addAttribute(B(), ModelAPI_AttributeDouble::typeId()); @@ -67,8 +73,6 @@ void ConstructionPlugin_Plane::initAttributes() // By other plane. data()->addAttribute(CREATION_METHOD_BY_OTHER_PLANE_OPTION(), ModelAPI_AttributeString::typeId()); - data()->addAttribute(PLANE(), ModelAPI_AttributeSelection::typeId()); - data()->addAttribute(DISTANCE(), ModelAPI_AttributeDouble::typeId()); data()->addAttribute(REVERSE(), ModelAPI_AttributeBoolean::typeId()); data()->addAttribute(COINCIDENT_POINT(), ModelAPI_AttributeSelection::typeId()); data()->addAttribute(AXIS(), ModelAPI_AttributeSelection::typeId()); @@ -85,7 +89,8 @@ void ConstructionPlugin_Plane::execute() GeomShapePtr aShape; std::string aCreationMethod = string(CREATION_METHOD())->value(); - if(aCreationMethod == CREATION_METHOD_BY_GENERAL_EQUATION()) { + if(aCreationMethod == CREATION_METHOD_BY_GENERAL_EQUATION() || + aCreationMethod == "PlaneByGeneralEquation") { aShape = createByGeneralEquation(); } else if(aCreationMethod == CREATION_METHOD_BY_THREE_POINTS()) { aShape = createByThreePoints(); @@ -102,6 +107,9 @@ void ConstructionPlugin_Plane::execute() } } else if(aCreationMethod == CREATION_METHOD_BY_TWO_PARALLEL_PLANES()) { aShape = createByTwoParallelPlanes(); + } else { + setError("Error: Plane creation method \"" + aCreationMethod + "\" not supported."); + return; } if(!aShape.get()) { @@ -117,11 +125,12 @@ void ConstructionPlugin_Plane::execute() //================================================================================================== bool ConstructionPlugin_Plane::customisePresentation(ResultPtr theResult, AISObjectPtr thePrs, - std::shared_ptr theDefaultPrs) + std::shared_ptr theDefaultPrs) { std::vector aColor; // get color from the attribute of the result - if (theResult.get() != NULL && theResult->data()->attribute(ModelAPI_Result::COLOR_ID()).get() != NULL) { + if (theResult.get() != NULL && + theResult->data()->attribute(ModelAPI_Result::COLOR_ID()).get() != NULL) { AttributeIntArrayPtr aColorAttr = theResult->data()->intArray(ModelAPI_Result::COLOR_ID()); if (aColorAttr.get() && aColorAttr->size()) { aColor.push_back(aColorAttr->value(0)); @@ -130,8 +139,7 @@ bool ConstructionPlugin_Plane::customisePresentation(ResultPtr theResult, AISObj } } if (aColor.empty()) - aColor = Config_PropManager::color("Visualization", "construction_plane_color", - ConstructionPlugin_Plane::DEFAULT_COLOR()); + aColor = Config_PropManager::color("Visualization", "construction_plane_color"); bool isCustomized = false; if (aColor.size() == 3) @@ -156,10 +164,9 @@ std::shared_ptr ConstructionPlugin_Plane::createByGeneralEquation anAttrC->isInitialized() && anAttrD->isInitialized() ) { double aA = anAttrA->value(), aB = anAttrB->value(), aC = anAttrC->value(), aD = anAttrD->value(); - std::shared_ptr aPlane = + std::shared_ptr aPlane = std::shared_ptr(new GeomAPI_Pln(aA, aB, aC, aD)); - std::string kDefaultPlaneSize = "200"; - double aSize = Config_PropManager::integer(SKETCH_TAB_NAME, "planes_size", kDefaultPlaneSize); + double aSize = Config_PropManager::integer(SKETCH_TAB_NAME, "planes_size"); aSize *= 4.; aPlaneFace = GeomAlgoAPI_FaceBuilder::squareFace(aPlane, aSize); } @@ -225,9 +232,11 @@ std::shared_ptr ConstructionPlugin_Plane::createByLineAndPoint() std::shared_ptr aLin = anEdge->line(); std::shared_ptr aPnt = aVertex->point(); std::shared_ptr aNewPln(new GeomAPI_Pln(aPnt, aLin->direction())); - double aSize = aLin->distance(aPnt); - aSize *= 2.0; - aRes = GeomAlgoAPI_FaceBuilder::squareFace(aNewPln, aSize); + double aSize = aLin->distance(aPnt) * 2; + // point may belong to line, so for the face size use maximum distance between point and line + // and the line size (distance between the start and end point) + double aDistance = anEdge->firstPoint()->distance(anEdge->lastPoint()); + aRes = GeomAlgoAPI_FaceBuilder::squareFace(aNewPln, aSize > aDistance ? aSize : aDistance); } else { std::shared_ptr aV1, aV2; GeomAlgoAPI_ShapeTools::findBounds(anEdge, aV1, aV2); @@ -261,7 +270,7 @@ std::shared_ptr ConstructionPlugin_Plane::createByDistanceFromOth std::shared_ptr aFace(new GeomAPI_Face(aShape)); - std::shared_ptr aPln = GeomAlgoAPI_FaceBuilder::plane(aFace); + std::shared_ptr aPln = aFace->getPlane(); std::shared_ptr aOrig = aPln->location(); std::shared_ptr aDir = aPln->direction(); @@ -321,15 +330,25 @@ std::shared_ptr ConstructionPlugin_Plane::createByRotation() } std::shared_ptr anEdge(new GeomAPI_Edge(anAxisShape)); - std::shared_ptr anAxis = std::shared_ptr(new GeomAPI_Ax1(anEdge->line()->location(), - anEdge->line()->direction())); + std::shared_ptr anAxis = + std::shared_ptr(new GeomAPI_Ax1(anEdge->line()->location(), + anEdge->line()->direction())); // Getting angle. double anAngle = real(ANGLE())->value(); GeomAlgoAPI_Rotation aRotationAlgo(aFace, anAxis, anAngle); - std::shared_ptr aRes(new GeomAPI_Face(aRotationAlgo.shape())); + if (!aRotationAlgo.check()) { + setError(aRotationAlgo.getError()); + return GeomShapePtr(); + } + aRotationAlgo.build(); + if (!aRotationAlgo.isDone()) { + setError("Error: Failed to rotate plane"); + return GeomShapePtr(); + } + std::shared_ptr aRes(new GeomAPI_Face(aRotationAlgo.shape())); return aRes; } @@ -354,19 +373,13 @@ std::shared_ptr ConstructionPlugin_Plane::createByTwoParallelPlan std::shared_ptr aFace2(new GeomAPI_Face(aFaceShape2)); std::shared_ptr aPln2 = aFace2->getPlane(); - double aDist = aPln1->distance(aPln2) / 2.0; - - std::shared_ptr aOrig1 = aPln1->location(); - std::shared_ptr aDir1 = aPln1->direction(); + std::shared_ptr anOrig1 = aPln1->location(); + std::shared_ptr aPntOnPln2 = aPln2->project(anOrig1); - aOrig1->translate(aDir1, aDist); - std::shared_ptr aNewPln(new GeomAPI_Pln(aOrig1, aDir1)); + std::shared_ptr aNewOrig(new GeomAPI_Pnt(anOrig1->xyz()->added( + aPntOnPln2->xyz())->multiplied(0.5))); - if((aNewPln->distance(aPln2) - aDist) > 1.e-7) { - aDir1->reverse(); - aOrig1->translate(aDir1, 2.0 * aDist); - aNewPln.reset(new GeomAPI_Pln(aOrig1, aDir1)); - } + std::shared_ptr aNewPln(new GeomAPI_Pln(aNewOrig, aPln1->direction())); std::shared_ptr aRes = makeRectangularFace(aFace1, aNewPln); @@ -378,13 +391,15 @@ GeomShapePtr faceByThreeVertices(const std::shared_ptr theV1, const std::shared_ptr theV2, const std::shared_ptr theV3) { - std::shared_ptr aFace = GeomAlgoAPI_FaceBuilder::planarFaceByThreeVertices(theV1, theV2, theV3); + std::shared_ptr aFace = + GeomAlgoAPI_FaceBuilder::planarFaceByThreeVertices(theV1, theV2, theV3); ListOfShape anObjects; anObjects.push_back(theV1); anObjects.push_back(theV2); anObjects.push_back(theV3); - std::list > aBoundingPoints = GeomAlgoAPI_ShapeTools::getBoundingBox(anObjects, 1.0); + std::list > aBoundingPoints = + GeomAlgoAPI_ShapeTools::getBoundingBox(anObjects, 1.0); GeomShapePtr aRes = GeomAlgoAPI_ShapeTools::fitPlaneToBox(aFace, aBoundingPoints); return aRes; @@ -423,7 +438,8 @@ std::shared_ptr makeRectangularFace(const std::shared_ptr aResFace = GeomAlgoAPI_FaceBuilder::planarFace(thePln, - aMinX2d - aWgap, aMinY2d - aHgap, aMaxX2d - aMinX2d + 2. * aWgap, aMaxY2d - aMinY2d + 2. * aHgap); + aMinX2d - aWgap, aMinY2d - aHgap, aMaxX2d - aMinX2d + 2. * aWgap, + aMaxY2d - aMinY2d + 2. * aHgap); return aResFace; }