X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_Circle.cpp;h=80a6f19e45e449f94cef98bd79d6bbebc74ba6d2;hb=fc72d43b677baa05ae7fd317346fd8b723b799ed;hp=cc8a992bc21e96f554272838a27198b21f7413fe;hpb=1505ea1fd541e828172211dc064560d5e247b2b6;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Circle.cpp b/src/SketchPlugin/SketchPlugin_Circle.cpp index cc8a992bc..80a6f19e4 100644 --- a/src/SketchPlugin/SketchPlugin_Circle.cpp +++ b/src/SketchPlugin/SketchPlugin_Circle.cpp @@ -1,8 +1,21 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> - -// File: SketchPlugin_Circle.cpp -// Created: 26 May 2014 -// Author: Artem ZHIDKOV +// Copyright (C) 2014-2023 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 +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// 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 +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include "SketchPlugin_Circle.h" #include "SketchPlugin_Sketch.h" @@ -29,23 +42,9 @@ const double tolerance = 1e-7; -namespace { - static const std::string& POINT_ID(int theIndex) - { - switch (theIndex) { - case 1: return SketchPlugin_Circle::FIRST_POINT_ID(); - case 2: return SketchPlugin_Circle::SECOND_POINT_ID(); - case 3: return SketchPlugin_Circle::THIRD_POINT_ID(); - } - - static const std::string DUMMY; - return DUMMY; - } -} - SketchPlugin_Circle::SketchPlugin_Circle() - : SketchPlugin_SketchEntity() +: SketchPlugin_SketchEntity() { } @@ -53,136 +52,47 @@ void SketchPlugin_Circle::initDerivedClassAttributes() { data()->addAttribute(CENTER_ID(), GeomDataAPI_Point2D::typeId()); data()->addAttribute(RADIUS_ID(), ModelAPI_AttributeDouble::typeId()); + data()->addAttribute(EXTERNAL_ID(), ModelAPI_AttributeSelection::typeId()); ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), EXTERNAL_ID()); - - data()->addAttribute(CIRCLE_TYPE(), ModelAPI_AttributeString::typeId()); - data()->addAttribute(FIRST_POINT_ID(), GeomDataAPI_Point2D::typeId()); - data()->addAttribute(SECOND_POINT_ID(), GeomDataAPI_Point2D::typeId()); - data()->addAttribute(THIRD_POINT_ID(), GeomDataAPI_Point2D::typeId()); - std::dynamic_pointer_cast( - data()->attribute(CIRCLE_TYPE()))->setValue(CIRCLE_TYPE_CENTER_AND_RADIUS()); } void SketchPlugin_Circle::execute() { SketchPlugin_Sketch* aSketch = sketch(); - if (aSketch) { - std::list > aShapes; - - // compute a circle point in 3D view - std::shared_ptr aCenterAttr = std::dynamic_pointer_cast< - GeomDataAPI_Point2D>(data()->attribute(CENTER_ID())); - AttributeDoublePtr aRadiusAttr = - std::dynamic_pointer_cast(data()->attribute(RADIUS_ID())); - if (aCenterAttr->isInitialized() && aRadiusAttr->isInitialized()) { - std::shared_ptr aCenter(aSketch->to3D(aCenterAttr->x(), aCenterAttr->y())); - //std::cout<<"Execute circle "<x()<<" "<y()<<" "<z()< aNDir = std::dynamic_pointer_cast( - aSketch->data()->attribute(SketchPlugin_Sketch::NORM_ID())); - std::shared_ptr aNormal(new GeomAPI_Dir(aNDir->x(), aNDir->y(), aNDir->z())); - // compute the circle radius - double aRadius = aRadiusAttr->value(); - - std::shared_ptr aCircleShape = GeomAlgoAPI_EdgeBuilder::lineCircle( - aCenter, aNormal, aRadius); - aShapes.push_back(aCircleShape); - std::shared_ptr aConstr2 = document()->createConstruction( - data(), 1); - aConstr2->setShape(aCircleShape); - aConstr2->setIsInHistory(false); - setResult(aConstr2, 1); - } + if(!aSketch) { + return; } -} - -AISObjectPtr SketchPlugin_Circle::getAISObject(AISObjectPtr thePrevious) -{ - SketchPlugin_Sketch* aSketch = sketch(); - if (aSketch && !isFeatureValid()) { - // compute a circle point in 3D view - std::shared_ptr aCenterAttr = std::dynamic_pointer_cast< - GeomDataAPI_Point2D>(data()->attribute(CENTER_ID())); - AttributeDoublePtr aRadiusAttr = - std::dynamic_pointer_cast(attribute(RADIUS_ID())); - if (aCenterAttr->isInitialized() && aRadiusAttr->isInitialized()) { - std::shared_ptr aCenter(aSketch->to3D(aCenterAttr->x(), aCenterAttr->y())); - - // make a visible circle - std::shared_ptr aNDir = std::dynamic_pointer_cast( - aSketch->data()->attribute(SketchPlugin_Sketch::NORM_ID())); - std::shared_ptr aNormal = aNDir->dir(); - - double aRadius = aRadiusAttr->value(); - std::shared_ptr aCircleShape = GeomAlgoAPI_EdgeBuilder::lineCircle( - aCenter, aNormal, aRadius); - if (aCircleShape && aRadius != 0) { - std::list > aShapes; - // make a visible point - std::shared_ptr aCenterPointShape = GeomAlgoAPI_PointBuilder::vertex(aCenter); - aShapes.push_back(aCenterPointShape); - aShapes.push_back(aCircleShape); - std::shared_ptr aCompound = GeomAlgoAPI_CompoundBuilder::compound(aShapes); - AISObjectPtr anAIS = thePrevious; - if (!anAIS) - anAIS = AISObjectPtr(new GeomAPI_AISObject); - anAIS->createShape(aCompound); - anAIS->setWidth(3); - return anAIS; - } - } + // Compute a circle in 3D view. + std::shared_ptr aCenterAttr = + std::dynamic_pointer_cast(data()->attribute(CENTER_ID())); + AttributeDoublePtr aRadiusAttr = real(RADIUS_ID()); + if(!aCenterAttr->isInitialized() || !aRadiusAttr->isInitialized()) { + return; } - return AISObjectPtr(); -} - -bool SketchPlugin_Circle::isFeatureValid() -{ - std::shared_ptr aCenter = - std::dynamic_pointer_cast(attribute(CENTER_ID())); - bool aValid = aCenter->isInitialized(); - std::string aType = std::dynamic_pointer_cast( - data()->attribute(CIRCLE_TYPE()))->value(); - if (aType == CIRCLE_TYPE_THREE_POINTS()) { - std::shared_ptr aFirstPnt = - std::dynamic_pointer_cast(attribute(FIRST_POINT_ID())); - std::shared_ptr aSecondPnt = - std::dynamic_pointer_cast(attribute(SECOND_POINT_ID())); - std::shared_ptr aThirdPnt = - std::dynamic_pointer_cast(attribute(THIRD_POINT_ID())); - aValid = aValid && - aFirstPnt->isInitialized() && - aSecondPnt->isInitialized() && - aThirdPnt->isInitialized(); + double aRadius = aRadiusAttr->value(); + if(aRadius < tolerance) { + return; } - return aValid; -} -void SketchPlugin_Circle::move(double theDeltaX, double theDeltaY) -{ - std::shared_ptr aData = data(); - if (!aData->isValid()) - return; + // Make a visible point. + SketchPlugin_Sketch::createPoint2DResult(this, sketch(), CENTER_ID(), 0); + + // Make a visible circle. + std::shared_ptr aCenter(aSketch->to3D(aCenterAttr->x(), aCenterAttr->y())); + std::shared_ptr aNDir = std::dynamic_pointer_cast( + aSketch->data()->attribute(SketchPlugin_Sketch::NORM_ID())); + std::shared_ptr aNormal(new GeomAPI_Dir(aNDir->x(), aNDir->y(), aNDir->z())); - std::shared_ptr aPoint = std::dynamic_pointer_cast( - aData->attribute(CENTER_ID())); - if (aPoint->isInitialized()) - aPoint->move(theDeltaX, theDeltaY); + std::shared_ptr aCircleShape = + GeomAlgoAPI_EdgeBuilder::lineCircle(aCenter, aNormal, aRadius); - aPoint = std::dynamic_pointer_cast(aData->attribute(FIRST_POINT_ID())); - if (aPoint->isInitialized()) - aPoint->move(theDeltaX, theDeltaY); - aPoint = std::dynamic_pointer_cast(aData->attribute(SECOND_POINT_ID())); - if (aPoint->isInitialized()) - aPoint->move(theDeltaX, theDeltaY); - aPoint = std::dynamic_pointer_cast(aData->attribute(THIRD_POINT_ID())); - if (aPoint->isInitialized()) - aPoint->move(theDeltaX, theDeltaY); + std::shared_ptr aResult = document()->createConstruction(data(), 1); + aResult->setShape(aCircleShape); + aResult->setIsInHistory(false); + setResult(aResult, 1); } bool SketchPlugin_Circle::isFixed() { @@ -203,98 +113,10 @@ void SketchPlugin_Circle::attributeChanged(const std::string& theID) { if (aSelection && !aSelection->isNull() && aSelection->isEdge()) { std::shared_ptr anEdge( new GeomAPI_Edge(aSelection)); std::shared_ptr aCirc = anEdge->circle(); - std::shared_ptr aCenterAttr = + std::shared_ptr aCenterAttr = std::dynamic_pointer_cast(attribute(CENTER_ID())); aCenterAttr->setValue(sketch()->to2D(aCirc->center())); real(RADIUS_ID())->setValue(aCirc->radius()); } } - else if (theID == CENTER_ID() || theID == RADIUS_ID()) { - std::string aType = std::dynamic_pointer_cast( - data()->attribute(CIRCLE_TYPE()))->value(); - if (aType == CIRCLE_TYPE_THREE_POINTS() && lastResult()) // adjust data from the solver - adjustThreePoints(); - } else if (theID == FIRST_POINT_ID() || theID == SECOND_POINT_ID() || theID == THIRD_POINT_ID()) { - // support the center and radius attributes enev in other mode: solver uses them - std::string aType = std::dynamic_pointer_cast( - data()->attribute(CIRCLE_TYPE()))->value(); - if (aType == CIRCLE_TYPE_CENTER_AND_RADIUS()) - return; - data()->blockSendAttributeUpdated(true); // to modify two attributes at once - std::shared_ptr aPoints[3]; - int aNbInitialized = 0; - for (int i = 1; i <= 3; ++i) { - std::shared_ptr aCurPnt = - std::dynamic_pointer_cast(attribute(POINT_ID(i))); - if (aCurPnt->isInitialized()) - aPoints[aNbInitialized++] = aCurPnt->pnt(); - } - - std::shared_ptr aCenterAttr = std::dynamic_pointer_cast< - GeomDataAPI_Point2D>(data()->attribute(CENTER_ID())); - AttributeDoublePtr aRadiusAttr = - std::dynamic_pointer_cast(data()->attribute(RADIUS_ID())); - - if (aNbInitialized == 1) - aCenterAttr->setValue(aPoints[0]->x(), aPoints[0]->y()); - else if (aNbInitialized == 2) { - std::shared_ptr aCoord = - aPoints[0]->xy()->added(aPoints[1]->xy())->multiplied(0.5); - double aRadius = aPoints[0]->distance(aPoints[1]) * 0.5; - aCenterAttr->setValue(aCoord->x(), aCoord->y()); - aRadiusAttr->setValue(aRadius); - } else { - std::shared_ptr aCircle( - new GeomAPI_Circ2d(aPoints[0], aPoints[1], aPoints[2])); - - std::shared_ptr aCenter = aCircle->center(); - if (aCenter) { - double aRadius = aCircle->radius(); - aCenterAttr->setValue(aCenter->x(), aCenter->y()); - aRadiusAttr->setValue(aRadius); - } - } - data()->blockSendAttributeUpdated(false, false); - - } else if (theID == CIRCLE_TYPE()) { // if switched to 3 points mode, adjust the needed attributes - std::string aType = std::dynamic_pointer_cast( - data()->attribute(CIRCLE_TYPE()))->value(); - if (aType == CIRCLE_TYPE_THREE_POINTS()) { - adjustThreePoints(); - } - } -} - -void SketchPlugin_Circle::adjustThreePoints() -{ - std::shared_ptr aCenterAttr = - std::dynamic_pointer_cast(attribute(CENTER_ID())); - if (!aCenterAttr->isInitialized()) - return; - AttributeDoublePtr aRadiusAttr = - std::dynamic_pointer_cast(attribute(RADIUS_ID())); - if (!aRadiusAttr->isInitialized()) - return; - - data()->blockSendAttributeUpdated(true); - std::shared_ptr aFirstPnt = - std::dynamic_pointer_cast(attribute(FIRST_POINT_ID())); - std::shared_ptr aSecondPnt = - std::dynamic_pointer_cast(attribute(SECOND_POINT_ID())); - std::shared_ptr aThirdPnt = - std::dynamic_pointer_cast(attribute(THIRD_POINT_ID())); - double aRadius = aRadiusAttr->value(); - - bool isInitialized = aFirstPnt->isInitialized() && - aSecondPnt->isInitialized() && aThirdPnt->isInitialized(); - - if (!isInitialized || - fabs(aFirstPnt->pnt()->distance(aCenterAttr->pnt()) - aRadius) > tolerance || - fabs(aSecondPnt->pnt()->distance(aCenterAttr->pnt()) - aRadius) > tolerance || - fabs(aThirdPnt->pnt()->distance(aCenterAttr->pnt()) - aRadius) > tolerance) { - aFirstPnt->setValue(aCenterAttr->x() + aRadius, aCenterAttr->y()); - aSecondPnt->setValue(aCenterAttr->x(), aCenterAttr->y() + aRadius); - aThirdPnt->setValue(aCenterAttr->x() - aRadius, aCenterAttr->y()); - } - data()->blockSendAttributeUpdated(false, false); }