From 2103aeeb4a587622176f8ccf1a9fb95794632e76 Mon Sep 17 00:00:00 2001 From: asozinov Date: Wed, 25 Jan 2023 11:18:11 +0300 Subject: [PATCH] Fix problems Add documentation Update tests --- .../PartSet_WidgetConstraintSuggestion.cpp | 110 +++++++++++------- .../PartSet_WidgetConstraintSuggestion.h | 25 ++-- .../SAMConverter_ConvertPrimitives.py | 33 ++++-- .../SAMConverter_ConvertSketch.py | 42 +++---- .../SAMConverter_SuggestConstraintsFeature.py | 28 ++--- src/SAMConverter/SAMConverter_msg_en.ts | 4 +- src/SAMConverter/SAMConverter_msg_fr.ts | 4 +- .../Test/TestSAMConverter_Angle.py | 24 ++++ src/SAMConverter/Test/TestSAMConverter_Arc.py | 24 ++++ .../Test/TestSAMConverter_Circle.py | 24 ++++ .../Test/TestSAMConverter_Constraints.py | 27 ++++- .../Test/TestSAMConverter_Distance.py | 24 ++++ .../Test/TestSAMConverter_Geometrical.py | 32 ++++- .../TestSAMConverter_HorisontalDistance.py | 24 ++++ .../Test/TestSAMConverter_Length.py | 28 ++++- .../Test/TestSAMConverter_Line.py | 24 ++++ .../Test/TestSAMConverter_Point.py | 24 ++++ .../Test/TestSAMConverter_Primitives.py | 24 ++++ .../Test/TestSAMConverter_Radius.py | 24 ++++ .../Test/TestSAMConverter_Sketch.py | 80 +++++++++++++ .../Test/TestSAMConverter_VerticalDistance.py | 24 ++++ .../Test/data/plaque_trouee_sam_sc2.py | 4 +- src/SAMConverter/doc/images/GUI_input.png | Bin 0 -> 5484 bytes src/SAMConverter/doc/images/GUI_suggest.png | Bin 0 -> 21792 bytes .../doc/suggestConstraintsFeature.rst | 49 +++++++- src/SAMConverter/plugin-SAM.xml | 2 +- 26 files changed, 598 insertions(+), 110 deletions(-) create mode 100644 src/SAMConverter/doc/images/GUI_input.png create mode 100644 src/SAMConverter/doc/images/GUI_suggest.png diff --git a/src/PartSet/PartSet_WidgetConstraintSuggestion.cpp b/src/PartSet/PartSet_WidgetConstraintSuggestion.cpp index 6be1455eb..8167f8048 100644 --- a/src/PartSet/PartSet_WidgetConstraintSuggestion.cpp +++ b/src/PartSet/PartSet_WidgetConstraintSuggestion.cpp @@ -24,35 +24,19 @@ #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 @@ -79,7 +63,7 @@ namespace PartSet_WidgetConstraintSuggestion::PartSet_WidgetConstraintSuggestion(QWidget* theParent, ModuleBase_IWorkshop* theWorkshop, const Config_WidgetAPI* theData) -: ModuleBase_ModelWidget(theParent, theData), myWorkshop(theWorkshop) +: ModuleBase_ModelWidget(theParent, theData), myWorkshop(theWorkshop), myStackDepth(0) { isFirst = true; myMain = new QVBoxLayout(this); @@ -109,38 +93,41 @@ PartSet_WidgetConstraintSuggestion::PartSet_WidgetConstraintSuggestion(QWidget* theData->getProperty("can_create_external"), true); } -void PartSet_WidgetConstraintSuggestion::ModifyScrollArea() +void PartSet_WidgetConstraintSuggestion::modifyScrollArea() { + QString input = myNumSuggest->text(); + if (input.isEmpty()) + return; + clearScrollAreaContent(); myFeature->data()->string("action")->setValue("Predict"); + // Triggered operation execute for suggestion feature emit valuesChanged(); - updateObject(myFeature); - AttributeStringArrayPtr score = myFeature->data()->stringArray("scores"); - AttributeStringArrayPtr sugg = myFeature->data()->stringArray("suggestions"); - AttributeStringArrayPtr prim = myFeature->data()->stringArray("primitives"); - AttributeStringArrayPtr cons = myFeature->data()->stringArray("constraints"); + AttributeStringArrayPtr aScores = myFeature->data()->stringArray("scores"); + AttributeStringArrayPtr aSuggestions = myFeature->data()->stringArray("suggestions"); + AttributeStringArrayPtr aPrimitives = myFeature->data()->stringArray("primitives"); + AttributeStringArrayPtr aConstraints = myFeature->data()->stringArray("constraints"); QGridLayout* aGroupLay = dynamic_cast(myGroupBox->layout()); - - int aCount = std::min(sugg->size(), myNumSuggest->text().toInt()); + int aCount = std::min(aSuggestions->size(), input.toInt()); for (int i = 1; i <= aCount; ++i) { QGroupBox* aPoleGroupBox = new QGroupBox("", myGroupBox); int ind = i - 1; - Suggestion aCurRecord = Suggestion{ sugg->value(ind), - cons->value(ind), - {prim->value(2 * ind), prim->value(2 * ind + 1)}, - atof(score->value(ind).c_str()), - isNeedInoutParameter(cons->value(ind)) }; + Suggestion aCurRecord; + aCurRecord.suggestionName = aSuggestions->value(ind); + aCurRecord.constraint = aConstraints->value(ind); + aCurRecord.primitives = { aPrimitives->value(2 * ind), aPrimitives->value(2 * ind + 1) }; + aCurRecord.score = aScores->value(ind).c_str(); + aCurRecord.needParameter = isNeedInoutParameter(aConstraints->value(ind)); QString aPoleStr = translate("Suggestion %1 (score = %2)"); - aPoleStr = aPoleStr.arg(i).arg(aCurRecord.score); - + aPoleStr = aPoleStr.arg(i).arg(QString::fromStdString(aCurRecord.score)); QGridLayout* aPoleLay = new QGridLayout(aPoleGroupBox); ModuleBase_Tools::adjustMargins(aPoleLay); @@ -176,6 +163,11 @@ void PartSet_WidgetConstraintSuggestion::ModifyScrollArea() void PartSet_WidgetConstraintSuggestion::createSecondWidget() { + QString input = myNumSuggest->text(); + if (input.isEmpty()) + return; + + myInitialDoF = mySketch->string("SolverDOF")->value(); myScrollArea = new QScrollArea(this); myScrollArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); myScrollArea->setWidgetResizable(true); @@ -192,21 +184,22 @@ void PartSet_WidgetConstraintSuggestion::createSecondWidget() aGroupLay->setSpacing(4); aBoxLay->addWidget(myGroupBox); - ModifyScrollArea(); + modifyScrollArea(); myScrollArea->setWidget(aContainer); QHBoxLayout* aHBoxLay = new QHBoxLayout(this); QString aDoFStr = translate("Original DoF: %1, New DoF: %2"); - aDoFStr = aDoFStr.arg(5).arg(6); - QLabel* aDoFLabel = new QLabel(aDoFStr, this); + auto aDOF = onShowDOF(); + aDoFStr = aDoFStr.arg(QString::fromStdString(aDOF.first)).arg(QString::fromStdString(aDOF.second)); + myDoFLabel = new QLabel(aDoFStr, this); myUndoButton = new QPushButton(QIcon(":icons/plane_view.png"), translate("Go Back"), this); connect(myUndoButton, SIGNAL(clicked(bool)), this, SLOT(onGoBack())); myUndoButton->setEnabled(false); - aHBoxLay->addWidget(aDoFLabel); + aHBoxLay->addWidget(myDoFLabel); aHBoxLay->addWidget(myUndoButton); myMain->addLayout(aHBoxLay); @@ -220,7 +213,7 @@ void PartSet_WidgetConstraintSuggestion::createSecondWidget() connect(anApplyPlusBut, SIGNAL(clicked(bool)), this, SLOT(onApplyAndContinue())); QPushButton* aCloseBut = new QPushButton(QIcon(":icons/plane_view.png"), translate("Cancel")); - connect(aCloseBut, SIGNAL(clicked(bool)), this, SLOT(clearScrollAreaContent())); + connect(aCloseBut, SIGNAL(clicked(bool)), this, SLOT(onFinishOperarion())); aButLay->addWidget(anApplyBut); aButLay->addWidget(anApplyPlusBut); aButLay->addWidget(aCloseBut); @@ -265,23 +258,43 @@ bool PartSet_WidgetConstraintSuggestion::processEscape() return isProcessed; } +std::pair PartSet_WidgetConstraintSuggestion::onShowDOF() +{ + AttributeStringPtr aDOFStr = mySketch->string("SolverDOF"); + return { myInitialDoF, aDOFStr->value() }; +} + // slot +void PartSet_WidgetConstraintSuggestion::onFinishOperarion() +{ + XGUI_Workshop* aWorkshop = XGUI_Tools::workshop(myWorkshop); + aWorkshop->operationMgr()->commitOperation(); +} + void PartSet_WidgetConstraintSuggestion::onLaunchSuggest() { + // If launch call first time - create second widget, otherwise modify only scroll area if (isFirst) { createSecondWidget(); } else { - ModifyScrollArea(); + modifyScrollArea(); } } void PartSet_WidgetConstraintSuggestion::onGoBack() { + --myStackDepth; + if (myStackDepth == 0) + { + myUndoButton->setEnabled(false); + } + SessionPtr aMgr = ModelAPI_Session::get(); aMgr->undo(); + emit valuesChanged(); updateObject(myFeature); } @@ -309,13 +322,28 @@ void PartSet_WidgetConstraintSuggestion::onApplyConstraints(bool theNeedClose) ++i; } + // Triggered operation execute for suggestion feature (Apply constraints) emit valuesChanged(); updateObject(myFeature); - if (!theNeedClose) + + if (theNeedClose) + { + // Close operation + onFinishOperarion(); + } + else { + // Modify scroll area contents + ++myStackDepth; clearScrollAreaContent(); - ModifyScrollArea(); + modifyScrollArea(); + + // Update DoF value + QString aDoFStr = translate("Original DoF: %1, New DoF: %2"); + auto aDOF = onShowDOF(); + aDoFStr = aDoFStr.arg(QString::fromStdString(aDOF.first)).arg(QString::fromStdString(aDOF.second)); + myDoFLabel->setText(aDoFStr); } } diff --git a/src/PartSet/PartSet_WidgetConstraintSuggestion.h b/src/PartSet/PartSet_WidgetConstraintSuggestion.h index 03088199e..e26a966b3 100644 --- a/src/PartSet/PartSet_WidgetConstraintSuggestion.h +++ b/src/PartSet/PartSet_WidgetConstraintSuggestion.h @@ -34,6 +34,7 @@ class QVBoxLayout; class QScrollArea; class QLineEdit; class QCheckBox; +class QLabel; class QPushButton; struct Suggestion @@ -41,7 +42,7 @@ struct Suggestion std::string suggestionName; std::string constraint; std::pair primitives; - double score; + std::string score; bool needParameter; QLineEdit* parameterInput; @@ -99,15 +100,21 @@ private: /// Create widget with predicted constraints and control button void createSecondWidget(); - /// Chenge predicted constraints - void ModifyScrollArea(); + /// Change predicted constraints + void modifyScrollArea(); /// Apply user selected constraints void onApplyConstraints(bool theNeedClose); + /// Return DoF after init macro and after apply constraints + std::pair onShowDOF(); + private slots: /// A slots called after buttons press + /// Finish macro + void onFinishOperarion(); + // Launch predict constraints void onLaunchSuggest(); @@ -129,16 +136,18 @@ protected: private: QWidget* myGroupBox; ///< the parent group box for all intenal widgets QVBoxLayout* myMain; ///< the main widget - QScrollArea* myScrollArea; - std::vector mySuggestions; + QScrollArea* myScrollArea; ///< Scroll area with predicted constraints + std::vector mySuggestions; ///< Predicted constraints PartSet_ExternalObjectsMgr* myExternalObjectMgr; ///< reference to external objects manager - QLineEdit* myNumSuggest; + QLineEdit* myNumSuggest; ///< Input number of suggestion QPushButton* myUndoButton; + QLabel* myDoFLabel; // Show current DoF and DoF after apply constraints - /// it is important during restart operation CompositeFeaturePtr mySketch; - bool isFirst; + std::string myInitialDoF; + int myStackDepth; // number of applies + bool isFirst; // First call of launch method or not }; #endif diff --git a/src/SAMConverter/SAMConverter_ConvertPrimitives.py b/src/SAMConverter/SAMConverter_ConvertPrimitives.py index 4abb0e6ca..89f54a165 100644 --- a/src/SAMConverter/SAMConverter_ConvertPrimitives.py +++ b/src/SAMConverter/SAMConverter_ConvertPrimitives.py @@ -1,4 +1,4 @@ -from sam.catalog_primitive import Arc, Line, Circle, Point +from sam.catalog_primitive import Arc, Line, Circle, Point, Projection, Intersection import math @@ -28,7 +28,7 @@ class ShapertoSAMPrimitive: return ShapertoSAMPrimitive.convert_line(entity) if entity_type == 'SketchProjection': return ShapertoSAMPrimitive.convert_projection(entity) - if entity_type == 'SketchIntersection': + if entity_type == 'SketchIntersectionPoint': return ShapertoSAMPrimitive.convert_intersection(entity) return None, {} @@ -78,16 +78,31 @@ class ShapertoSAMPrimitive: # Not need convert to SAM def convert_intersection(entity): - return None, {} + feat = SketchAPI_IntersectionPoint(entity) + interFeat = feat.intersectionPoints() + + intersection_objects = [] + for obj in interFeat: + obj_entity = SketchAPI_SketchEntity(obj) + convert = ShapertoSAMPrimitive.convert(obj_entity) + intersection_objects.append(convert) + inter = Intersection(intersection_objects) + return inter, {} # Not need convert to SAM def convert_projection(entity): - feature_feat = entity.feature() - feat = ModelAPI.objectToFeature(feature_feat) - attr = feat.refattr("ProjectedFeature") + feat = SketchAPI_Projection(entity) + prFeat = feat.projectedFeature() + crFeat = feat.createdFeature() - proj_feat = ModelAPI_Feature.feature(attr.object()) + proj_feat = ModelAPI_Feature.feature(prFeat.object()) proj_entity = SketchAPI_SketchEntity(proj_feat) - entity_type = proj_entity.getKind() + convert = ShapertoSAMPrimitive.convert(proj_entity) + proj = Projection(convert) - return None, {} + return proj, {} + + def is_intersection_or_projection(entity): + if isinstance(entity, Projection) or isinstance(entity, Intersection): + return True + return False diff --git a/src/SAMConverter/SAMConverter_ConvertSketch.py b/src/SAMConverter/SAMConverter_ConvertSketch.py index c2d0983ea..3713a6110 100644 --- a/src/SAMConverter/SAMConverter_ConvertSketch.py +++ b/src/SAMConverter/SAMConverter_ConvertSketch.py @@ -14,27 +14,7 @@ def convert_sketch(sketch: object): exchange_sketch = Sketch() mapping = {} - # Add the primitives - for sub in sketch.features().list(): - feat = ModelAPI.objectToFeature(sub) - - if feat is not None : - entity = SketchAPI_SketchEntity(feat) - entity_type = entity.getKind() - - convert, update_mapping = ShapertoSAMPrimitive.convert(entity) - if convert is not None: - mapping[entity.name()] = convert - - mapping.update(update_mapping) - - if convert is not None: - exchange_sketch.add(convert) - dictionary.update({convert : entity}) - - logger.debug(f'Mapping; {mapping}') - - # Add the constraints + # Add the elements sketchFeature = featureToCompositeFeature(sketch.feature()) n = sketchFeature.numberOfSubs() for i in range(n): @@ -63,5 +43,25 @@ def convert_sketch(sketch: object): convert = ShapertoSAMConstraints.convert(sketch_entity, refs) exchange_sketch.add(convert) dictionary.update({convert : entity}) + else: + feat = ModelAPI.objectToFeature(entity) + + if feat is not None : + sketch_entity = SketchAPI_SketchEntity(entity) + entity_type = entity.getKind() + entity_name = entity.name() + + convert, update_mapping = ShapertoSAMPrimitive.convert(sketch_entity) + if convert is not None: + # Projection and Intersection object not add in map + if ShapertoSAMPrimitive.is_intersection_or_projection(convert): + continue + mapping[sketch_entity.name()] = convert + + mapping.update(update_mapping) + + if convert is not None: + exchange_sketch.add(convert) + dictionary.update({convert : sketch_entity}) return exchange_sketch, dictionary diff --git a/src/SAMConverter/SAMConverter_SuggestConstraintsFeature.py b/src/SAMConverter/SAMConverter_SuggestConstraintsFeature.py index f8f7ce09a..b26355c4c 100644 --- a/src/SAMConverter/SAMConverter_SuggestConstraintsFeature.py +++ b/src/SAMConverter/SAMConverter_SuggestConstraintsFeature.py @@ -292,31 +292,31 @@ class SuggestConstraintsFeature(ModelAPI.ModelAPI_Feature): if constraint == "ANGLE": self.Sketch.setAngle(shape1, shape2, parameter) elif constraint == "DISTANCE": - self.Sketch.setDistance(shape1, shape2, parameter) + self.Sketch.setDistance(shape1, shape2, parameter) elif constraint == "LENGTH": - self.Sketch.setLength(shape1, parameter) + self.Sketch.setLength(shape1, parameter) elif constraint == "HORIZONTAL_DISTANCE": - self.Sketch.setHorizontalDistance(shape1, shape2, parameter) + self.Sketch.setHorizontalDistance(shape1, shape2, parameter) elif constraint == "VERTICAL_DISTANCE": - self.Sketch.setVerticalDistance(shape1, shape2, parameter) + self.Sketch.setVerticalDistance(shape1, shape2, parameter) elif constraint == "RADIUS": - self.Sketch.setRadius(shape1, parameter) - elif constraint == "COINCIDENT": - self.Sketch.setCoincident(shape1, shape2) + self.Sketch.setRadius(shape1, parameter) + elif constraint == "COINCIDENCE": + self.Sketch.setCoincident(shape1, shape2) elif constraint == "EQUAL": - self.Sketch.setEqual(shape1, shape2) + self.Sketch.setEqual(shape1, shape2) elif constraint == "HORIZONTAL": - self.Sketch.setHorizontal(shape1) + self.Sketch.setHorizontal(shape1) elif constraint == "VERTICAL": - self.Sketch.setVertical(shape1) + self.Sketch.setVertical(shape1) elif constraint == "MIDPOINT": - self.Sketch.setMiddlePoint(shape1, shape2) + self.Sketch.setMiddlePoint(shape1, shape2) elif constraint == "TANGENT": - self.Sketch.setTangent(shape1, shape) + self.Sketch.setTangent(shape1, shape) elif constraint == "PARALLEL": - self.Sketch.setParallel(shape1, shape2) + self.Sketch.setParallel(shape1, shape2) elif constraint == "PERPENDICULAR": - self.Sketch.setPerpendicular(shape1, shape2) + self.Sketch.setPerpendicular(shape1, shape2) else: return False; diff --git a/src/SAMConverter/SAMConverter_msg_en.ts b/src/SAMConverter/SAMConverter_msg_en.ts index 66956f9f8..994b03169 100644 --- a/src/SAMConverter/SAMConverter_msg_en.ts +++ b/src/SAMConverter/SAMConverter_msg_en.ts @@ -88,8 +88,8 @@ Radius - COINCIDENT - Coincident + COINCIDENCE + Coincidence EQUAL diff --git a/src/SAMConverter/SAMConverter_msg_fr.ts b/src/SAMConverter/SAMConverter_msg_fr.ts index 382539335..504551d5b 100644 --- a/src/SAMConverter/SAMConverter_msg_fr.ts +++ b/src/SAMConverter/SAMConverter_msg_fr.ts @@ -88,8 +88,8 @@ Rayon - COINCIDENT - Coïncident + COINCIDENCE + Coincidence EQUAL diff --git a/src/SAMConverter/Test/TestSAMConverter_Angle.py b/src/SAMConverter/Test/TestSAMConverter_Angle.py index bd4e3969d..3c58a9e98 100644 --- a/src/SAMConverter/Test/TestSAMConverter_Angle.py +++ b/src/SAMConverter/Test/TestSAMConverter_Angle.py @@ -1,3 +1,27 @@ +# Copyright (C) 2018-2022 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +""" + TestSAMConverter_Angle.py + Script for Shaper Suggestions. Create angle constraints in SHAPER and convert to SAM +""" + import unittest import salome diff --git a/src/SAMConverter/Test/TestSAMConverter_Arc.py b/src/SAMConverter/Test/TestSAMConverter_Arc.py index 69e61baca..cdc453922 100644 --- a/src/SAMConverter/Test/TestSAMConverter_Arc.py +++ b/src/SAMConverter/Test/TestSAMConverter_Arc.py @@ -1,3 +1,27 @@ +# Copyright (C) 2018-2022 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +""" + TestSAMConverter_Arc.py + Script for Shaper Suggestions. Create Arc in SHAPER and converted to SAM format +""" + import unittest import salome diff --git a/src/SAMConverter/Test/TestSAMConverter_Circle.py b/src/SAMConverter/Test/TestSAMConverter_Circle.py index 6aed96aa4..87ce6f88f 100644 --- a/src/SAMConverter/Test/TestSAMConverter_Circle.py +++ b/src/SAMConverter/Test/TestSAMConverter_Circle.py @@ -1,3 +1,27 @@ +# Copyright (C) 2018-2022 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +""" + TestSAMConverter_Circle.py + Script for Shaper Suggestions. Create Circle in SHAPER and converted to SAM format +""" + import unittest import salome diff --git a/src/SAMConverter/Test/TestSAMConverter_Constraints.py b/src/SAMConverter/Test/TestSAMConverter_Constraints.py index 0782f8b7e..ff758b902 100644 --- a/src/SAMConverter/Test/TestSAMConverter_Constraints.py +++ b/src/SAMConverter/Test/TestSAMConverter_Constraints.py @@ -1,3 +1,27 @@ +# Copyright (C) 2018-2022 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +""" + TestSAMConverter_Constraints.py + Test case for Shaper Suggestions. Check, that constraints are converted to SAM +""" + from TestSAMConverter_Angle import TestConvertAngle from TestSAMConverter_Distance import TestConvertDistance from TestSAMConverter_Geometrical import TestConvertGeometrical @@ -8,7 +32,6 @@ from TestSAMConverter_VerticalDistance import TestConvertVerticalDistance ### convert angle test angle_test = TestConvertAngle() -#angle_test.test_convert_angle() angle_test.test_convert_angle_Line_Line() ### convert distance test @@ -39,8 +62,10 @@ geom_test.test_convert_perpendicular() geom_test.test_convert_tangent() geom_test.test_convert_vertical() +### convert length len_test = TestConvertLength() len_test.test_convert_length() +### convert radius rad_test = TestConvertRadius() rad_test.test_convert_radius() diff --git a/src/SAMConverter/Test/TestSAMConverter_Distance.py b/src/SAMConverter/Test/TestSAMConverter_Distance.py index 1d7b3a7c2..f50836abf 100644 --- a/src/SAMConverter/Test/TestSAMConverter_Distance.py +++ b/src/SAMConverter/Test/TestSAMConverter_Distance.py @@ -1,3 +1,27 @@ +# Copyright (C) 2018-2022 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +""" + TestSAMConverter_Distance.py + Script for Shaper Suggestions. Create distance constraints in SHAPER and convert to SAM +""" + import unittest import salome diff --git a/src/SAMConverter/Test/TestSAMConverter_Geometrical.py b/src/SAMConverter/Test/TestSAMConverter_Geometrical.py index 57621716e..f4880c9e6 100644 --- a/src/SAMConverter/Test/TestSAMConverter_Geometrical.py +++ b/src/SAMConverter/Test/TestSAMConverter_Geometrical.py @@ -1,3 +1,27 @@ +# Copyright (C) 2018-2022 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +""" + TestSAMConverter_Geometrical.py + Script for Shaper Suggestions. Create geometrical constraints in SHAPER and convert to SAM +""" + import unittest import salome @@ -82,7 +106,7 @@ class TestConvertGeometrical(unittest.TestCase): # Check references # - Verify the line 1 information - #TODO: The coordinates may differ from expected, but length of line is equal + #TODO: The coordinates may differ from expected, but length of lines is equal #self.assertAlmostEqual(sam_line1.pnt1.x, 3.678, delta = 10e-3) #self.assertEqual(sam_line1.pnt1.y, 0.) #self.assertAlmostEqual(sam_line1.pnt2.x, 10.846, delta=10e-3) @@ -160,7 +184,7 @@ class TestConvertGeometrical(unittest.TestCase): ### Create Sketch Sketch_1 = model.addSketch(partSet, model.defaultPlane("XOY")) - ### Create SketchCircle + ### Create SketchLine SketchLine_1 = Sketch_1.addLine(3.9, 0, 8, 0) SketchLine_2 = Sketch_1.addLine(-3.9, 1., 8, 0.5) SketchCoincident = Sketch_1.setParallel(SketchLine_1.endPoint(), SketchLine_2.startPoint()) @@ -185,7 +209,7 @@ class TestConvertGeometrical(unittest.TestCase): ### Create Sketch Sketch_1 = model.addSketch(partSet, model.defaultPlane("XOY")) - ### Create SketchCircle + ### Create Line SketchLine_1 = Sketch_1.addLine(3.9, 0, 8, 0) SketchLine_2 = Sketch_1.addLine(-3.9, 1., 8, 0.5) SketchCoincident = Sketch_1.setPerpendicular(SketchLine_1.endPoint(), SketchLine_2.startPoint()) @@ -211,7 +235,7 @@ class TestConvertGeometrical(unittest.TestCase): ### Create Sketch Sketch_1 = model.addSketch(partSet, model.defaultPlane("XOY")) - ### Create SketchCircle + ### Create SketchLine and SketchCircle SketchLine_1 = Sketch_1.addLine(3.9, 0, 8, 0) SketchCircle_1 = Sketch_1.addCircle(-17.41591725155751, 16.35177358773851, 29.02191596082682) constraint = Sketch_1.setTangent(SketchLine_1.result(), SketchCircle_1.center()) diff --git a/src/SAMConverter/Test/TestSAMConverter_HorisontalDistance.py b/src/SAMConverter/Test/TestSAMConverter_HorisontalDistance.py index c1f075469..a5ac69aa3 100644 --- a/src/SAMConverter/Test/TestSAMConverter_HorisontalDistance.py +++ b/src/SAMConverter/Test/TestSAMConverter_HorisontalDistance.py @@ -1,3 +1,27 @@ +# Copyright (C) 2018-2022 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +""" + TestSAMConverter_HorizontalDistance.py + Script for Shaper Suggestions. Create horizontal distance constraints in SHAPER and convert to SAM +""" + import unittest import salome diff --git a/src/SAMConverter/Test/TestSAMConverter_Length.py b/src/SAMConverter/Test/TestSAMConverter_Length.py index 6f1e7549f..2e4795ec2 100644 --- a/src/SAMConverter/Test/TestSAMConverter_Length.py +++ b/src/SAMConverter/Test/TestSAMConverter_Length.py @@ -1,3 +1,27 @@ +# Copyright (C) 2018-2022 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +""" + TestSAMConverter_Length.py + Script for Shaper Suggestions. Create length constraints in SHAPER and convert to SAM +""" + import unittest import salome @@ -41,8 +65,8 @@ class TestConvertLength(unittest.TestCase): ref_sam_line = sam_length.references[0] # Check that it is the same instance object self.assertEqual(sam_line, ref_sam_line) #TODO: X coordinate may differ from expected, but length is correct - #self.assertAlmostEqual(ref_sam_line.pnt1.x, 0.828, delta=10e-4) # - temporarily commented line + #self.assertAlmostEqual(ref_sam_line.pnt1.x, 0.828, delta=10e-4) self.assertEqual(ref_sam_line.pnt1.y, 0.) - #self.assertAlmostEqual(ref_sam_line.pnt2.x, 10.828, delta=10e-4) # - temporarily commented line + #self.assertAlmostEqual(ref_sam_line.pnt2.x, 10.828, delta=10e-4) self.assertEqual(ref_sam_line.pnt2.y, 0.) self.assertEqual(ref_sam_line.is_construction(), False) diff --git a/src/SAMConverter/Test/TestSAMConverter_Line.py b/src/SAMConverter/Test/TestSAMConverter_Line.py index 2355c3955..66049691e 100644 --- a/src/SAMConverter/Test/TestSAMConverter_Line.py +++ b/src/SAMConverter/Test/TestSAMConverter_Line.py @@ -1,3 +1,27 @@ +# Copyright (C) 2018-2022 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +""" + TestSAMConverter_Line.py + Script for Shaper Suggestions. Create Line in SHAPER and converted to SAM format +""" + import unittest import salome diff --git a/src/SAMConverter/Test/TestSAMConverter_Point.py b/src/SAMConverter/Test/TestSAMConverter_Point.py index ad551b0f1..58a071f69 100644 --- a/src/SAMConverter/Test/TestSAMConverter_Point.py +++ b/src/SAMConverter/Test/TestSAMConverter_Point.py @@ -1,3 +1,27 @@ +# Copyright (C) 2018-2022 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +""" + TestSAMConverter_Point.py + Script for Shaper Suggestions. Create Point in SHAPER and converted to SAM format +""" + import unittest import salome diff --git a/src/SAMConverter/Test/TestSAMConverter_Primitives.py b/src/SAMConverter/Test/TestSAMConverter_Primitives.py index f8010871d..7ae6bf8bc 100644 --- a/src/SAMConverter/Test/TestSAMConverter_Primitives.py +++ b/src/SAMConverter/Test/TestSAMConverter_Primitives.py @@ -1,3 +1,27 @@ +# Copyright (C) 2018-2022 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +""" + TestSAMConverter_Primitives.py + Test case for Shaper Suggestions. Check, that primitives are converted to SAM +""" + from TestSAMConverter_Arc import TestConvertArc from TestSAMConverter_Circle import TestConvertCircle from TestSAMConverter_Line import TestConvertLine diff --git a/src/SAMConverter/Test/TestSAMConverter_Radius.py b/src/SAMConverter/Test/TestSAMConverter_Radius.py index 1deb20421..8c21580fc 100644 --- a/src/SAMConverter/Test/TestSAMConverter_Radius.py +++ b/src/SAMConverter/Test/TestSAMConverter_Radius.py @@ -1,3 +1,27 @@ +# Copyright (C) 2018-2022 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +""" + TestSAMConverter_Radius.py + Script for Shaper Suggestions. Create radius constraints in SHAPER and convert to SAM +""" + import unittest import salome diff --git a/src/SAMConverter/Test/TestSAMConverter_Sketch.py b/src/SAMConverter/Test/TestSAMConverter_Sketch.py index 8b1378917..db9258f77 100644 --- a/src/SAMConverter/Test/TestSAMConverter_Sketch.py +++ b/src/SAMConverter/Test/TestSAMConverter_Sketch.py @@ -1 +1,81 @@ +# Copyright (C) 2018-2022 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" + TestSAMConverter_Sketch.py + Test for Shaper Suggestions. Create sketch and convert to SAM +""" + +import unittest + +import sys +sys.path.append('sam') + +from SketchAPI import * + +from salome.shaper import model + +from SAMConverter_Logger import logger +from SAMConverter_ConvertConstraints import * +from SAMConverter_ConvertPrimitives import * +from SAMConverter_ConvertSketch import * + +def test_dictionary_valid(self, sketch_object_list, dictionary): + pass + +class TestConvertSketch(unittest.TestCase): + def test_convert_sketch(self): + model.begin() + partSet = model.moduleDocument() + Part_1_doc = Part_1.document() + + Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOZ")) + SketchLine_1 = Sketch_1.addLine(-63.64626647144947, -47.23125588837745, 136.169699463004, -47.23125588837745) + SketchLine_2 = Sketch_1.addLine(136.169699463004, -47.23125588837745, 62.41368892788446, 40.66773464226762) + SketchCoincident_1 = Sketch_1.setCoincident(SketchLine_1.endPoint(), SketchLine_2.startPoint()) + SketchArc_1 = Sketch_1.addArc(62.41368892788446, 40.66773464226762, 32.98907152399877, 34.82035141257017, 90.21490052120313, 29.39419775522445, True) + SketchCoincident_2 = Sketch_1.setCoincident(SketchLine_2.endPoint(), SketchArc_1.center()) + SketchCircle_1 = Sketch_1.addCircle(-63.64626647144947, -47.23125588837745, 35) + SketchCoincident_3 = Sketch_1.setCoincident(SketchLine_1.startPoint(), SketchCircle_1.center()) + SketchHorizontal_1 = Sketch_1.setHorizontal(SketchLine_1.result()) + SketchAngle_1 = Sketch_1.setAngle(SketchLine_1.result(), SketchLine_2.result(), 50, type = "Direct") + SketchRadius_1 = Sketch_1.setRadius(SketchCircle_1.results()[1], 35) + SketchRadius_2 = Sketch_1.setRadius(SketchArc_1.results()[1], 30) + model.do() + model.end() + + object_list = [] + object_list.append(SketchLine_1) + object_list.append(SketchLine_2) + object_list.append(SketchCoincident_1) + object_list.append(SketchArc_1) + object_list.append(SketchCoincident_2) + object_list.append(SketchCircle_1) + object_list.append(SketchCoincident_3) + object_list.append(SketchHorizontal_1) + object_list.append(SketchAngle_1) + object_list.append(SketchRadius_1) + object_list.append(SketchRadius_2) + + exchange_elements, dictionary = SAMConverter_ConvertSketch.convert_sketch(Sketch_1) + + + +sketch_test = TestConvertSketch() +sketch_test.test_convert_sketch() diff --git a/src/SAMConverter/Test/TestSAMConverter_VerticalDistance.py b/src/SAMConverter/Test/TestSAMConverter_VerticalDistance.py index 97e2388ad..444ec83f6 100644 --- a/src/SAMConverter/Test/TestSAMConverter_VerticalDistance.py +++ b/src/SAMConverter/Test/TestSAMConverter_VerticalDistance.py @@ -1,3 +1,27 @@ +# Copyright (C) 2018-2022 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +""" + TestSAMConverter_VerticalDistance.py + Script for Shaper Suggestions. Create vertical distance constraints in SHAPER and convert to SAM +""" + import unittest import salome diff --git a/src/SAMConverter/Test/data/plaque_trouee_sam_sc2.py b/src/SAMConverter/Test/data/plaque_trouee_sam_sc2.py index b654ad78b..d44ff68f2 100644 --- a/src/SAMConverter/Test/data/plaque_trouee_sam_sc2.py +++ b/src/SAMConverter/Test/data/plaque_trouee_sam_sc2.py @@ -26,12 +26,14 @@ plaque_trouee_sam.add(line_4) line_5 = Line(status_construction=False, pnt1 = [0.0, 0.0], pnt2= [0.0, 100.0]) plaque_trouee_sam.add(line_5) +plaque_trouee_sam.add(Coincident(references = [line_1.pnt1, line_5])) line_6 = Line(status_construction=False, pnt1 = [0.0, 0.0], pnt2= [100.0, 0.0]) plaque_trouee_sam.add(line_6) arc= Arc(status_construction=False, center=[0., 0.], radius=10.0, angles=[0., 90.]) plaque_trouee_sam.add(arc) +plaque_trouee_sam.add(Coincident(references = [line_4.pnt1, line_6])) plaque_trouee_sam.add(Coincident(references = [line_4.pnt1, line_6])) # plaque_trouee_sam.add(Vertical(references = [line_1])) @@ -39,8 +41,6 @@ plaque_trouee_sam.add(Coincident(references = [line_4.pnt1, line_6])) # plaque_trouee_sam.add(Horizontal(references = [line_4])) # plaque_trouee_sam.add(Horizontal(references = [line_2])) -plaque_trouee_sam.add(Coincident(references = [line_1.pnt1, line_5])) -plaque_trouee_sam.add(Coincident(references = [line_4.pnt1, line_6])) # plaque_trouee_sam.add(Length(references = [line_3], length = L)) # plaque_trouee_sam.add(Length(references = [line_2], length = H)) diff --git a/src/SAMConverter/doc/images/GUI_input.png b/src/SAMConverter/doc/images/GUI_input.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb19c6d3ae769a286aa5e7186fd5f4c75fdff4f GIT binary patch literal 5484 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 literal 0 HcmV?d00001 diff --git a/src/SAMConverter/doc/images/GUI_suggest.png b/src/SAMConverter/doc/images/GUI_suggest.png new file mode 100644 index 0000000000000000000000000000000000000000..b20f2b805a2b9d3d540fb554e4a9751a63a93366 GIT binary patch literal 21792 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 Z1E$te^?uhlMG@c{WT0oNi_> Suggest Constraints* item or +#. click **Suggest Constraints** button in Sketch toolbar. + +**Note** +To make a prediction of constraints an AI Inference Engine should be pointed. +For that one should set **SHAPER_SKETCH_CONSTRAINT_SUGGESTION_AI** variable to a full path to python script, where AIEngine class with method Predict is defined. +Method Predict have to accept one argument which is a SAM model. +If **SHAPER_SKETCH_CONSTRAINT_SUGGESTION_AI** is not set or set to an empty string, "Suggest Constraints" feature will be disabled. + +Property panel contains from 2 part +Initial part + +.. figure:: images/GUI_input.png + :align: center + +Input fields: + +- **Line** - field for input number of suggestions + +After press buttons *Launch* show second part of widget: + +.. figure:: images/GUI_suggest.png + :align: center + +Widget content: + +- **List** contains list of predicted constraints. Each element of the list contains: + + - *Constraint* + - *Primitive* or *Primitives* to which the constraint applies + - *Score* + - *Checkbox* for select the constraints to be applied + - *Line* for constraints that require a parameter(angle, length, etc) + +- Information about remaining Degree of Liberty (DoF) and new DoF if the selected constraints are applied. + +- **Apply** button applies the selected restrictions and completes the operation +- **Apply and continue** button applies the selected restrictions and show new predicted constraints. Old list of constraints will be cleared. +- **Close** button ends the operation without applying the selected restrictionsю +- **Go Back** button is undo operation like "Ctrl + Z" + +**Remark** +if two constraints are applied together, they will also be cancelled together. Result """""" diff --git a/src/SAMConverter/plugin-SAM.xml b/src/SAMConverter/plugin-SAM.xml index 3fd614c14..b7b37fb2e 100644 --- a/src/SAMConverter/plugin-SAM.xml +++ b/src/SAMConverter/plugin-SAM.xml @@ -6,7 +6,7 @@ title="Suggest constraints" tooltip="Suggest constraints using a Machine Learning model" icon="icons/SAM/suggest_constraints.png" - helpfile="SAMConverter/suggestConstraintsFeature.html"> + helpfile="suggestConstraintsFeature.html"> -- 2.39.2