X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_Tools.cpp;h=baaea0da067c4fdaf64501194818160af6f1a555;hb=3b676e8f67d0b110ecee42985223b99fc181532b;hp=13d1d22d69b7298e9d20e35eef91ef5b4e4f4310;hpb=82d3fff7d0ed2c089da5aa6b106789be076081f3;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 13d1d22d6..baaea0da0 --- a/src/ModuleBase/ModuleBase_Tools.cpp +++ b/src/ModuleBase/ModuleBase_Tools.cpp @@ -5,26 +5,52 @@ // Author: Vitaly Smetannikov #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 #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 { @@ -62,6 +88,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); @@ -126,7 +187,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 +196,28 @@ 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); +} + +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); @@ -159,6 +240,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 +297,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,44 +306,243 @@ 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) +void checkObjects(const QObjectPtrList& theObjects, bool& hasResult, bool& hasFeature, + bool& hasParameter, bool& hasCompositeOwner) { hasResult = false; hasFeature = false; hasParameter = false; - hasSubFeature = false; + hasCompositeOwner = 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); - 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); - if (hasFeature && hasResult && hasParameter && hasSubFeature) + hasCompositeOwner |= (ModelAPI_Tools::compositeOwner(aFeature) != NULL); + if (hasFeature && hasResult && hasParameter && hasCompositeOwner) break; } } -double defaultDeviationCoefficient() +void setDefaultDeviationCoefficient(const TopoDS_Shape& theShape, + const Handle(Prs3d_Drawer)& theDrawer) { - // this value is chosen by performance check. Test case is an extrusion on sketch circle. - return 1.e-3; + 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; +} + +void getParameters(QStringList& theParameters) +{ + theParameters.clear(); + + SessionPtr aSession = ModelAPI_Session::get(); + std::list aDocList; + DocumentPtr anActiveDocument = aSession->activeDocument(); + DocumentPtr aRootDocument = aSession->moduleDocument(); + aDocList.push_back(anActiveDocument); + if (anActiveDocument != aRootDocument) { + aDocList.push_back(aRootDocument); + } + std::string aGroupId = ModelAPI_ResultParameter::group(); + for(std::list::const_iterator it = aDocList.begin(); it != aDocList.end(); ++it) { + DocumentPtr aDocument = *it; + int aSize = aDocument->size(aGroupId); + for (int i = 0; i < aSize; i++) { + ObjectPtr anObject = aDocument->object(aGroupId, i); + std::string aParameterName = anObject->data()->name(); + theParameters.append(aParameterName.c_str()); + } + } +} + +std::string findGreedAttribute(ModuleBase_IWorkshop* theWorkshop, const FeaturePtr& theFeature) +{ + std::string anAttributeId; + + std::string aXmlCfg, aDescription; + theWorkshop->module()->getXMLRepresentation(theFeature->getKind(), aXmlCfg, aDescription); + + ModuleBase_WidgetFactory aFactory(aXmlCfg, theWorkshop); + std::string anAttributeTitle; + aFactory.getGreedAttribute(anAttributeId); + + return anAttributeId; +} + +void setObject(const AttributePtr& theAttribute, const ObjectPtr& theObject, + const GeomShapePtr& theShape, ModuleBase_IWorkshop* theWorkshop, + const bool theTemporarily) +{ + if (!theAttribute.get()) + return; + + std::string aType = theAttribute->attributeType(); + if (aType == ModelAPI_AttributeReference::typeId()) { + AttributeReferencePtr aRef = std::dynamic_pointer_cast(theAttribute); + ObjectPtr aObject = aRef->value(); + if (!(aObject && aObject->isSame(theObject))) { + aRef->setValue(theObject); + } + } else if (aType == ModelAPI_AttributeRefAttr::typeId()) { + AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast(theAttribute); + + AttributePtr anAttribute = theWorkshop->module()->findAttribute(theObject, theShape); + if (anAttribute.get()) + aRefAttr->setAttr(anAttribute); + else { + ObjectPtr aObject = aRefAttr->object(); + if (!(aObject && aObject->isSame(theObject))) { + aRefAttr->setObject(theObject); + } + } + } else if (aType == ModelAPI_AttributeSelection::typeId()) { + AttributeSelectionPtr aSelectAttr = + std::dynamic_pointer_cast(theAttribute); + ResultPtr aResult = std::dynamic_pointer_cast(theObject); + if (aSelectAttr.get() != NULL) { + aSelectAttr->setValue(aResult, theShape, theTemporarily); + } + } + if (aType == ModelAPI_AttributeSelectionList::typeId()) { + AttributeSelectionListPtr aSelectionListAttr = + std::dynamic_pointer_cast(theAttribute); + ResultPtr aResult = std::dynamic_pointer_cast(theObject); + if (!aSelectionListAttr->isInList(aResult, theShape, theTemporarily)) + aSelectionListAttr->append(aResult, theShape, theTemporarily); + } + else if (aType == ModelAPI_AttributeRefList::typeId()) { + AttributeRefListPtr aRefListAttr = std::dynamic_pointer_cast(theAttribute); + if (!aRefListAttr->isInList(theObject)) + aRefListAttr->append(theObject); + } + else if (aType == ModelAPI_AttributeRefAttrList::typeId()) { + AttributeRefAttrListPtr aRefAttrListAttr = std::dynamic_pointer_cast(theAttribute); + AttributePtr anAttribute = theWorkshop->module()->findAttribute(theObject, theShape); + + if (anAttribute.get()) { + if (!aRefAttrListAttr->isInList(anAttribute)) + aRefAttrListAttr->append(anAttribute); + } + else { + if (!aRefAttrListAttr->isInList(theObject)) + aRefAttrListAttr->append(theObject); + } + } +} + +GeomShapePtr getShape(const AttributePtr& theAttribute, ModuleBase_IWorkshop* theWorkshop) +{ + GeomShapePtr aShape; + if (!theAttribute.get()) + return aShape; + + std::string aType = theAttribute->attributeType(); + if (aType == ModelAPI_AttributeReference::typeId()) { + } else if (aType == ModelAPI_AttributeRefAttr::typeId()) { + AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast(theAttribute); + if (aRefAttr.get() && !aRefAttr->isObject()) { + AttributePtr anAttribute = aRefAttr->attr(); + aShape = theWorkshop->module()->findShape(anAttribute); + } + } else if (aType == ModelAPI_AttributeSelection::typeId()) { + AttributeSelectionPtr aSelectAttr = std::dynamic_pointer_cast + (theAttribute); + aShape = aSelectAttr->value(); + } + return aShape; +} + +void flushUpdated(ObjectPtr theObject) +{ + blockUpdateViewer(true); + + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); + + blockUpdateViewer(false); +} + +void blockUpdateViewer(const bool theValue) +{ + // the viewer update should be blocked in order to avoid the temporary feature content + // when the solver processes the feature, the redisplay message can be flushed + // what caused the display in the viewer preliminary states of object + // e.g. fillet feature, angle value change + std::shared_ptr aMsg; + if (theValue) { + aMsg = std::shared_ptr( + new Events_Message(Events_Loop::eventByName(EVENT_UPDATE_VIEWER_BLOCKED))); + } + else { + // the viewer update should be unblocked + aMsg = std::shared_ptr( + new Events_Message(Events_Loop::eventByName(EVENT_UPDATE_VIEWER_UNBLOCKED))); + } + Events_Loop::loop()->send(aMsg); +} + +} // namespace ModuleBase_Tools +