X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_Tools.cpp;h=6cbbe1c80c3361ba65c7009a2b57c7ac62f63f77;hb=8cd56d486b6e96b8814002f9f0f4acadd6cea11b;hp=03569839c1ad20b8b7af4eaf437791ac6acebd1c;hpb=eb57ef7dd9fa2816da36a5a4066bc41ebdea2ad7;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_Tools.cpp b/src/ModuleBase/ModuleBase_Tools.cpp old mode 100644 new mode 100755 index 03569839c..6cbbe1c80 --- a/src/ModuleBase/ModuleBase_Tools.cpp +++ b/src/ModuleBase/ModuleBase_Tools.cpp @@ -6,18 +6,40 @@ #include "ModuleBase_Tools.h" -#include -#include +#include +#include + #include #include +#include +#include +#include +#include +#include +#include +#include + +#include #include +#include + +#include #include #include #include #include #include +#include +#include + +#include + +const double tolerance = 1e-7; + +//#define DEBUG_ACTIVATE_WINDOW +//#define DEBUG_SET_FOCUS namespace ModuleBase_Tools { @@ -55,6 +77,41 @@ void zeroMargins(QLayout* theLayout) theLayout->setSpacing(5); } +void activateWindow(QWidget* theWidget, const QString& theInfo) +{ + theWidget->activateWindow(); + +#ifdef DEBUG_ACTIVATE_WINDOW + qDebug(QString("activateWindow: %1").arg(theInfo).toStdString().c_str()); +#endif +} + +void setFocus(QWidget* theWidget, const QString& theInfo) +{ + theWidget->setFocus(); + +#ifdef DEBUG_SET_FOCUS + qDebug(QString("setFocus: %1").arg(theInfo).toStdString().c_str()); +#endif +} + +void setShadowEffect(QWidget* theWidget, const bool isSetEffect) +{ + if (isSetEffect) { + QGraphicsDropShadowEffect* aGlowEffect = new QGraphicsDropShadowEffect(); + aGlowEffect->setOffset(.0); + aGlowEffect->setBlurRadius(10.0); + aGlowEffect->setColor(QColor(0, 170, 255)); // Light-blue color, #00AAFF + theWidget->setGraphicsEffect(aGlowEffect); + } + else { + QGraphicsEffect* anEffect = theWidget->graphicsEffect(); + if(anEffect) + anEffect->deleteLater(); + theWidget->setGraphicsEffect(NULL); + } +} + QPixmap composite(const QString& theAdditionalIcon, const QString& theIcon) { QImage anIcon(theIcon); @@ -106,8 +163,50 @@ QPixmap lighter(const QString& theIcon, const int theLighterValue) return QPixmap::fromImage(aResult); } +void setSpinText(ModuleBase_ParamSpinBox* theSpin, const QString& theText) +{ + if (theSpin->text() == theText) + return; + // In order to avoid extra text setting because it will + // reset cursor position in control + bool isBlocked = theSpin->blockSignals(true); + theSpin->setText(theText); + theSpin->blockSignals(isBlocked); +} + void setSpinValue(QDoubleSpinBox* theSpin, double theValue) { + if (fabs(theSpin->value() - theValue) < tolerance) + return; + bool isBlocked = theSpin->blockSignals(true); + theSpin->setValue(theValue); + theSpin->blockSignals(isBlocked); +} + +void setSpinValue(ModuleBase_ParamSpinBox* theSpin, double theValue) +{ + if (fabs(theSpin->value() - theValue) < tolerance) + return; + bool isBlocked = theSpin->blockSignals(true); + theSpin->setValue(theValue); + theSpin->blockSignals(isBlocked); +} + +void setSpinText(ModuleBase_ParamIntSpinBox* theSpin, const QString& theText) +{ + // In order to avoid extra text setting because it will + // reset cursor position in control + if (theSpin->text() == theText) + return; + bool isBlocked = theSpin->blockSignals(true); + theSpin->setText(theText); + theSpin->blockSignals(isBlocked); +} + +void setSpinValue(ModuleBase_ParamIntSpinBox* theSpin, int theValue) +{ + if (theSpin->value() == theValue) + return; bool isBlocked = theSpin->blockSignals(true); theSpin->setValue(theValue); theSpin->blockSignals(isBlocked); @@ -115,18 +214,35 @@ void setSpinValue(QDoubleSpinBox* theSpin, double theValue) QString objectInfo(const ObjectPtr& theObj, const bool isUseAttributesInfo) { + QString aFeatureStr = "feature"; + if (!theObj.get()) + return aFeatureStr; + + std::ostringstream aPtrStr; + aPtrStr << "[" << theObj.get() << "]"; + ResultPtr aRes = std::dynamic_pointer_cast(theObj); FeaturePtr aFeature = std::dynamic_pointer_cast(theObj); - QString aFeatureStr = "feature"; if(aRes.get()) { - aFeatureStr.append("(Result)"); + aFeatureStr.append(QString("(result%1)").arg(aPtrStr.str().c_str()).toStdString() .c_str()); + if (aRes->isDisabled()) + aFeatureStr.append("[disabled]"); + if (aRes->isConcealed()) + aFeatureStr.append("[concealed]"); + if (ModelAPI_Tools::hasSubResults(aRes)) + aFeatureStr.append("[hasSubResults]"); + aFeature = ModelAPI_Feature::feature(aRes); } + else + aFeatureStr.append(aPtrStr.str().c_str()); + if (aFeature.get()) { aFeatureStr.append(QString(": %1").arg(aFeature->getKind().c_str()).toStdString().c_str()); - if (aFeature->data().get() && aFeature->data()->isValid()) + if (aFeature->data()->isValid()) { aFeatureStr.append(QString(", name=%1").arg(aFeature->data()->name().c_str()).toStdString() .c_str()); + } if (isUseAttributesInfo) { std::list anAttrs = aFeature->data()->attributes(""); std::list::const_iterator anIt = anAttrs.begin(), aLast = anAttrs.end(); @@ -154,6 +270,118 @@ QString objectInfo(const ObjectPtr& theObj, const bool isUseAttributesInfo) return aFeatureStr; } +typedef QMap ShapeTypes; +static ShapeTypes MyShapeTypes; + +TopAbs_ShapeEnum shapeType(const QString& theType) +{ + if (MyShapeTypes.count() == 0) { + MyShapeTypes["face"] = TopAbs_FACE; + MyShapeTypes["faces"] = TopAbs_FACE; + MyShapeTypes["vertex"] = TopAbs_VERTEX; + MyShapeTypes["vertices"] = TopAbs_VERTEX; + MyShapeTypes["wire"] = TopAbs_WIRE; + MyShapeTypes["edge"] = TopAbs_EDGE; + MyShapeTypes["edges"] = TopAbs_EDGE; + MyShapeTypes["shell"] = TopAbs_SHELL; + MyShapeTypes["solid"] = TopAbs_SOLID; + MyShapeTypes["solids"] = TopAbs_SOLID; + MyShapeTypes["objects"] = TopAbs_SHAPE; + } + QString aType = theType.toLower(); + if (MyShapeTypes.contains(aType)) + return MyShapeTypes[aType]; + Events_Error::send("Shape type defined in XML is not implemented!"); + return TopAbs_SHAPE; +} + +void checkObjects(const QObjectPtrList& theObjects, bool& hasResult, bool& hasFeature, bool& hasParameter, bool& hasSubFeature) +{ + hasResult = false; + hasFeature = false; + hasParameter = false; + hasSubFeature = false; + foreach(ObjectPtr aObj, theObjects) { + FeaturePtr aFeature = std::dynamic_pointer_cast(aObj); + ResultPtr aResult = std::dynamic_pointer_cast(aObj); + ResultParameterPtr aConstruction = std::dynamic_pointer_cast(aResult); + + hasResult |= (aResult.get() != NULL); + hasFeature |= (aFeature.get() != NULL); + hasParameter |= (aConstruction.get() != NULL); + if (hasFeature) + hasSubFeature |= (ModelAPI_Tools::compositeOwner(aFeature) != NULL); + if (hasFeature && hasResult && hasParameter && hasSubFeature) + break; + } +} + +void setDefaultDeviationCoefficient(const TopoDS_Shape& theShape, + const Handle(Prs3d_Drawer)& theDrawer) +{ + 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 +