X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_Tools.cpp;h=13d1d22d69b7298e9d20e35eef91ef5b4e4f4310;hb=f9fd953bf814fad40ae045f6164c7f80229b0872;hp=0f57b4c7b7fedc812fa84c3cc465d9d369d6205f;hpb=a7f44a41bdf29e7bd978ff3b8c8bd514d1223be7;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_Tools.cpp b/src/ModuleBase/ModuleBase_Tools.cpp index 0f57b4c7b..13d1d22d6 100644 --- a/src/ModuleBase/ModuleBase_Tools.cpp +++ b/src/ModuleBase/ModuleBase_Tools.cpp @@ -1,12 +1,30 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + // File: ModuleBase_Tools.cpp // Created: 11 July 2014 // Author: Vitaly Smetannikov #include "ModuleBase_Tools.h" +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + #include #include #include #include +#include + +#include namespace ModuleBase_Tools { @@ -25,7 +43,7 @@ void adjustMargins(QLayout* theLayout) { if(!theLayout) return; - theLayout->setContentsMargins(2, 5, 5, 2); + theLayout->setContentsMargins(2, 5, 2, 5); theLayout->setSpacing(4); } @@ -44,8 +62,7 @@ void zeroMargins(QLayout* theLayout) theLayout->setSpacing(5); } -QPixmap composite(const QString& theAdditionalIcon, const int theXShift, - const int theYShift, const QString& theIcon) +QPixmap composite(const QString& theAdditionalIcon, const QString& theIcon) { QImage anIcon(theIcon); QImage anAditional(theAdditionalIcon); @@ -59,12 +76,12 @@ QPixmap composite(const QString& theAdditionalIcon, const int theXShift, int aWidth = anIcon.width(); int aHeight = anIcon.height(); - int aStartWidthPos = aWidth-anAddWidth-1; - int aStartHeightPos = aHeight-anAddHeight-1; + int aStartWidthPos = aWidth - anAddWidth - 1; + int aStartHeightPos = aHeight - anAddHeight - 1; - for (int i = 0; i < anAddWidth; i++) + for (int i = 0; i < anAddWidth && i + aStartWidthPos < aWidth; i++) { - for (int j = 0; j < anAddHeight; j++) + for (int j = 0; j < anAddHeight && j + aStartHeightPos < aHeight; j++) { if (qAlpha(anAditional.pixel(i, j)) > 0) anIcon.setPixel(i + aStartWidthPos, j + aStartHeightPos, anAditional.pixel(i, j)); @@ -96,6 +113,153 @@ 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 (theSpin->value() == theValue) + return; + bool isBlocked = theSpin->blockSignals(true); + theSpin->setValue(theValue); + theSpin->blockSignals(isBlocked); +} + +void setSpinValue(ModuleBase_ParamSpinBox* theSpin, double theValue) +{ + //if (theSpin->value() == theValue) + // return; + bool isBlocked = theSpin->blockSignals(true); + theSpin->setValue(theValue); + theSpin->blockSignals(isBlocked); +} + +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); + if(aRes.get()) { + 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]"); + + 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()->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(); + QStringList aValues; + for(; anIt != aLast; anIt++) { + AttributePtr anAttr = *anIt; + QString aValue = "not defined"; + std::string aType = anAttr->attributeType(); + if (aType == GeomDataAPI_Point2D::typeId()) { + std::shared_ptr aPoint = std::dynamic_pointer_cast( + anAttr); + if (aPoint.get()) + aValue = QString("(%1, %2)").arg(aPoint->x()).arg(aPoint->y()); + } + else if (aType == ModelAPI_AttributeRefAttr::typeId()) { + } + + aValues.push_back(QString("%1: %2").arg(anAttr->id().c_str()).arg(aValue).toStdString().c_str()); + } + if (!aValues.empty()) + aFeatureStr.append(QString(", attributes: %1").arg(aValues.join(", ").toStdString().c_str())); + } + } + + 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; + } + 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; +} + +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; + 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); + + 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); + if (hasFeature) + hasSubFeature = (ModelAPI_Tools::compositeOwner(aFeature) != NULL); + if (hasFeature && hasResult && hasParameter && hasSubFeature) + break; + } +} + +double defaultDeviationCoefficient() +{ + // this value is chosen by performance check. Test case is an extrusion on sketch circle. + return 1.e-3; +} + }