X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_Tools.cpp;h=7c9fced2b12acf88f2c79c362310e5d9e69f4d57;hb=86c435d69e7b27d36c037ed028d79d8f32f021ac;hp=2c9114380671d1afaae6b284b6c06b2437cb9f11;hpb=8f09d362a50ccbc085841c24af2e755121e458ba;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_Tools.cpp b/src/ModuleBase/ModuleBase_Tools.cpp index 2c9114380..7c9fced2b 100755 --- a/src/ModuleBase/ModuleBase_Tools.cpp +++ b/src/ModuleBase/ModuleBase_Tools.cpp @@ -7,17 +7,23 @@ #include "ModuleBase_Tools.h" #include -#include -#include #include #include -#include +#include +#include +#include +#include #include +#include #include +#include + #include #include +#include + #include #include #include @@ -26,6 +32,9 @@ #include +const double tolerance = 1e-7; + + namespace ModuleBase_Tools { //****************************************************************** @@ -126,7 +135,7 @@ void setSpinText(ModuleBase_ParamSpinBox* theSpin, const QString& theText) void setSpinValue(QDoubleSpinBox* theSpin, double theValue) { - if (theSpin->value() == theValue) + if (fabs(theSpin->value() - theValue) < tolerance) return; bool isBlocked = theSpin->blockSignals(true); theSpin->setValue(theValue); @@ -135,8 +144,8 @@ void setSpinValue(QDoubleSpinBox* theSpin, double theValue) void setSpinValue(ModuleBase_ParamSpinBox* theSpin, double theValue) { - //if (theSpin->value() == theValue) - // return; + if (fabs(theSpin->value() - theValue) < tolerance) + return; bool isBlocked = theSpin->blockSignals(true); theSpin->setValue(theValue); theSpin->blockSignals(isBlocked); @@ -159,6 +168,8 @@ QString objectInfo(const ObjectPtr& theObj, const bool isUseAttributesInfo) aFeatureStr.append("[disabled]"); if (aRes->isConcealed()) aFeatureStr.append("[concealed]"); + if (ModelAPI_Tools::hasSubResults(aRes)) + aFeatureStr.append("[hasSubResults]"); aFeature = ModelAPI_Feature::feature(aRes); } @@ -214,6 +225,7 @@ TopAbs_ShapeEnum shapeType(const QString& theType) MyShapeTypes["shell"] = TopAbs_SHELL; MyShapeTypes["solid"] = TopAbs_SOLID; MyShapeTypes["solids"] = TopAbs_SOLID; + MyShapeTypes["objects"] = TopAbs_SHAPE; } QString aType = theType.toLower(); if (MyShapeTypes.contains(aType)) @@ -222,14 +234,6 @@ TopAbs_ShapeEnum shapeType(const QString& theType) return TopAbs_SHAPE; } -bool isSubResult(ObjectPtr theObject) -{ - bool aSubResult = false; - - //ResultCompSolidPtr aCompsolidResult = std::dynamic_pointer_cast(aResult); - return aSubResult; -} - void checkObjects(const QObjectPtrList& theObjects, bool& hasResult, bool& hasFeature, bool& hasParameter, bool& hasSubFeature) { hasResult = false; @@ -241,14 +245,11 @@ void checkObjects(const QObjectPtrList& theObjects, bool& hasResult, bool& hasFe ResultPtr aResult = std::dynamic_pointer_cast(aObj); ResultParameterPtr aConstruction = std::dynamic_pointer_cast(aResult); - bool aSubResult = isSubResult(aResult); - - /// results of compsolids are not processed in SHOW/HIDE/WIREFRAME operations - hasResult = (aResult.get() != NULL && !aSubResult); - hasFeature = (aFeature.get() != NULL); - hasParameter = (aConstruction.get() != NULL); + hasResult |= (aResult.get() != NULL); + hasFeature |= (aFeature.get() != NULL); + hasParameter |= (aConstruction.get() != NULL); if (hasFeature) - hasSubFeature = (ModelAPI_Tools::compositeOwner(aFeature) != NULL); + hasSubFeature |= (ModelAPI_Tools::compositeOwner(aFeature) != NULL); if (hasFeature && hasResult && hasParameter && hasSubFeature) break; } @@ -257,10 +258,69 @@ void checkObjects(const QObjectPtrList& theObjects, bool& hasResult, bool& hasFe void setDefaultDeviationCoefficient(const TopoDS_Shape& theShape, const Handle(Prs3d_Drawer)& theDrawer) { - if (!theShape.IsNull() && theShape.ShapeType() == TopAbs_EDGE) + if (theShape.IsNull()) + return; + TopAbs_ShapeEnum aType = theShape.ShapeType(); + if ((aType == TopAbs_EDGE) || (aType == TopAbs_WIRE)) theDrawer->SetDeviationCoefficient(1.e-4); } +Quantity_Color color(const std::string& theSection, + const std::string& theName, + const std::string& theDefault) +{ + std::vector aColor = Config_PropManager::color(theSection, theName, theDefault); + return Quantity_Color(aColor[0] / 255., aColor[1] / 255., aColor[2] / 255., Quantity_TOC_RGB); +} + +ObjectPtr getObject(const AttributePtr& theAttribute) +{ + ObjectPtr anObject; + std::string anAttrType = theAttribute->attributeType(); + if (anAttrType == ModelAPI_AttributeRefAttr::typeId()) { + AttributeRefAttrPtr anAttr = std::dynamic_pointer_cast(theAttribute); + if (anAttr != NULL && anAttr->isObject()) + anObject = anAttr->object(); + } + if (anAttrType == ModelAPI_AttributeSelection::typeId()) { + AttributeSelectionPtr anAttr = std::dynamic_pointer_cast(theAttribute); + if (anAttr != NULL) + anObject = anAttr->context(); + } + if (anAttrType == ModelAPI_AttributeReference::typeId()) { + AttributeReferencePtr anAttr = std::dynamic_pointer_cast(theAttribute); + if (anAttr.get() != NULL) + anObject = anAttr->value(); + } + return anObject; +} + +TopAbs_ShapeEnum getCompoundSubType(const TopoDS_Shape& theShape) +{ + TopAbs_ShapeEnum aShapeType = theShape.ShapeType(); + + // for compounds check sub-shapes: it may be compound of needed type: + // Booleans may produce compounds of Solids + if (aShapeType == TopAbs_COMPOUND) { + for(TopoDS_Iterator aSubs(theShape); aSubs.More(); aSubs.Next()) { + if (!aSubs.Value().IsNull()) { + TopAbs_ShapeEnum aSubType = aSubs.Value().ShapeType(); + if (aSubType == TopAbs_COMPOUND) { // compound of compound(s) + aShapeType = TopAbs_COMPOUND; + break; + } + if (aShapeType == TopAbs_COMPOUND) { + aShapeType = aSubType; + } else if (aShapeType != aSubType) { // compound of shapes of different types + aShapeType = TopAbs_COMPOUND; + break; + } + } + } + } + return aShapeType; } +} // namespace ModuleBase_Tools +