-// Copyright (C) 2018-2020 CEA/DEN, EDF R&D
+// Copyright (C) 2018-2024 CEA, EDF
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
#include "FeaturesPlugin_BoundingBox.h"
-#include <Config_PropManager.h>
-
-#include <FeaturesPlugin_CreateBoundingBox.h>
-
-#include <GeomAlgoAPI_BoundingBox.h>
-
#include <ModelAPI_AttributeSelection.h>
#include <ModelAPI_AttributeDoubleArray.h>
-#include <ModelAPI_AttributeBoolean.h>
#include <ModelAPI_AttributeString.h>
+#include <ModelAPI_AttributeBoolean.h>
+
#include <ModelAPI_Data.h>
#include <ModelAPI_Session.h>
#include <ModelAPI_Validator.h>
+#include <GeomAlgoAPI_BoundingBox.h>
+
+#include <Config_PropManager.h>
+#include <ModelAPI_ResultBody.h>
+
#include <iomanip>
#include <sstream>
data()->addAttribute(X_MAX_COORD_ID(), ModelAPI_AttributeString::typeId());
data()->addAttribute(Y_MAX_COORD_ID(), ModelAPI_AttributeString::typeId());
data()->addAttribute(Z_MAX_COORD_ID(), ModelAPI_AttributeString::typeId());
- data()->addAttribute(CREATEBOX_ID(), ModelAPI_AttributeBoolean::typeId());
+ data()->addAttribute(COMPUTE_ID(), ModelAPI_AttributeBoolean::typeId());
ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), X_MIN_COORD_ID());
ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), Y_MIN_COORD_ID());
ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), X_MAX_COORD_ID());
ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), Y_MAX_COORD_ID());
ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), Z_MAX_COORD_ID());
- ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), CREATEBOX_ID());
- ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), RESULT_VALUES_ID());
-
+ ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), COMPUTE_ID());
+ ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), OBJECT_ID());
data()->addAttribute(RESULT_VALUES_ID(), ModelAPI_AttributeDoubleArray::typeId());
data()->realArray(RESULT_VALUES_ID())->setSize(6);
-
+ data()->boolean(COMPUTE_ID())->setValue(true);
}
//=================================================================================================
void FeaturesPlugin_BoundingBox::execute()
{
- updateValues();
- createBoxByTwoPoints();
+ if (!updateValues())
+ return;
- if (boolean(CREATEBOX_ID())->value()) {
- if (!myCreateFeature.get())
- createBox();
- updateBox();
- } else {
- if (myCreateFeature.get()) {
- myCreateFeature->eraseResults();
- SessionPtr aSession = ModelAPI_Session::get();
- DocumentPtr aDoc = aSession->activeDocument();
- aDoc->removeFeature(myCreateFeature);
- myCreateFeature.reset();
- }
- }
-}
-
-//=================================================================================================
-void FeaturesPlugin_BoundingBox::attributeChanged(const std::string& theID)
-{
- if (theID == OBJECT_ID()) {
- if (myCreateFeature.get())
- updateBox();
- }
+ createBoxByTwoPoints();
}
//=================================================================================================
-AttributePtr FeaturesPlugin_BoundingBox::attributResultValues()
+void FeaturesPlugin_BoundingBox::attributeChanged(const std::string&)
{
- return attribute(RESULT_VALUES_ID());
}
//=================================================================================================
-void FeaturesPlugin_BoundingBox::updateValues()
+bool FeaturesPlugin_BoundingBox::updateValues()
{
AttributeSelectionPtr aSelection = selection(OBJECT_ID());
- if (aSelection->isInitialized()) {
- AttributeDoubleArrayPtr aValues =
+ AttributeDoubleArrayPtr aValues =
std::dynamic_pointer_cast<ModelAPI_AttributeDoubleArray>(attribute(RESULT_VALUES_ID()));
+
+ if (aSelection->isInitialized()) {
std::stringstream streamxmin;
std::stringstream streamymin;
std::stringstream streamzmin;
aShape = aSelection->context()->shape();
}
+ AttributeBooleanPtr anIsCompute = boolean(COMPUTE_ID());
+ if (!anIsCompute->value()) {
+ myShape = aShape;
+ anIsCompute->setValue(true);
+ }
+
if (aShape && !aShape->isEqual(myShape)) {
- double aXmin, aXmax, aYmin,aYmax,aZmin,aZmax;
- std::string aError;
+ double aXmin, aXmax, aYmin, aYmax, aZmin, aZmax;
+ std::string anError;
if (!GetBoundingBox(aShape,
- true,
aXmin, aXmax,
- aYmin,aYmax,
- aZmin,aZmax,
- aError))
- setError("Error in bounding box calculation :" + aError);
-
+ aYmin, aYmax,
+ aZmin, aZmax,
+ anError)) {
+ setError("Error in bounding box calculation :" + anError);
+ return false;
+ }
myShape = aShape;
streamxmin << std::setprecision(14) << aXmin;
aValues->setValue(0, aXmin);
aValues->setValue(4, aZmin);
streamzmax << std::setprecision(14) << aZmax;
aValues->setValue(5, aZmax);
- string(X_MIN_COORD_ID() )->setValue( "X = " + streamxmin.str() );
- string(Y_MIN_COORD_ID() )->setValue( "Y = " + streamymin.str() );
- string(Z_MIN_COORD_ID() )->setValue( "Z = " + streamzmin.str() );
- string(X_MAX_COORD_ID() )->setValue( "X = " + streamxmax.str() );
- string(Y_MAX_COORD_ID() )->setValue( "Y = " + streamymax.str() );
- string(Z_MAX_COORD_ID() )->setValue( "Z = " + streamzmax.str() );
+ } else {
+ streamxmin << std::setprecision(14) << aValues->value(0);
+ streamxmax << std::setprecision(14) << aValues->value(1);
+ streamymin << std::setprecision(14) << aValues->value(2);
+ streamymax << std::setprecision(14) << aValues->value(3);
+ streamzmin << std::setprecision(14) << aValues->value(4);
+ streamzmax << std::setprecision(14) << aValues->value(5);
}
- }
-}
-
-//=================================================================================================
-void FeaturesPlugin_BoundingBox::createBox()
-{
- SessionPtr aSession = ModelAPI_Session::get();
- DocumentPtr aDoc = aSession->activeDocument();
-
- if (aDoc.get()) {
- myCreateFeature = aDoc->addFeature(FeaturesPlugin_CreateBoundingBox::ID());
+ string(X_MIN_COORD_ID() )->setValue( "X = " + streamxmin.str() );
+ string(Y_MIN_COORD_ID() )->setValue( "Y = " + streamymin.str() );
+ string(Z_MIN_COORD_ID() )->setValue( "Z = " + streamzmin.str() );
+ string(X_MAX_COORD_ID() )->setValue( "X = " + streamxmax.str() );
+ string(Y_MAX_COORD_ID() )->setValue( "Y = " + streamymax.str() );
+ string(Z_MAX_COORD_ID() )->setValue( "Z = " + streamzmax.str() );
}
+ return true;
}
//=================================================================================================
-void FeaturesPlugin_BoundingBox::updateBox()
+AttributePtr FeaturesPlugin_BoundingBox::attributResultValues()
{
- myCreateFeature->boolean(FeaturesPlugin_CreateBoundingBox::COMPUTE_ID())->setValue(false);
- myCreateFeature->selection(FeaturesPlugin_CreateBoundingBox::OBJECT_ID())
- ->setValue(selection(OBJECT_ID())->context(),
- selection(OBJECT_ID())->value());
-
- AttributeDoubleArrayPtr aValuesFeatures =
- std::dynamic_pointer_cast<ModelAPI_AttributeDoubleArray>
- (myCreateFeature->attribute(RESULT_VALUES_ID()));
- AttributeDoubleArrayPtr aValues =
- std::dynamic_pointer_cast<ModelAPI_AttributeDoubleArray>(attribute(RESULT_VALUES_ID()));
- for (int anI=0; anI < 6; anI++)
- aValuesFeatures->setValue(anI,aValues->value(anI));
-
- myCreateFeature->execute();
- myCreateFeature->boolean(FeaturesPlugin_CreateBoundingBox::COMPUTE_ID())->setValue(true);
+ return attribute(RESULT_VALUES_ID());
}