From d44b322aacc23cd85eb4ba0aea67be18b18c6b02 Mon Sep 17 00:00:00 2001 From: SONOLET Aymeric Date: Tue, 21 Nov 2023 16:34:44 +0100 Subject: [PATCH] style: using black, refactoring and removing useless import --- .../ConnectorPlugin_PublishToStudyFeature.py | 437 ++++++++++-------- 1 file changed, 256 insertions(+), 181 deletions(-) diff --git a/src/ConnectorPlugin/ConnectorPlugin_PublishToStudyFeature.py b/src/ConnectorPlugin/ConnectorPlugin_PublishToStudyFeature.py index c1dc8749e..98bcdd5b5 100644 --- a/src/ConnectorPlugin/ConnectorPlugin_PublishToStudyFeature.py +++ b/src/ConnectorPlugin/ConnectorPlugin_PublishToStudyFeature.py @@ -21,25 +21,27 @@ # ExportFeature class definition import ModelAPI -import ExchangeAPI import EventsAPI -from GeomAPI import * +import GeomAPI import GeomAlgoAPI +import SHAPERSTUDY_ORB +import SHAPERSTUDY_utils + import salome from salome.shaper import model -import SHAPERSTUDY_ORB -import SHAPERSTUDY_utils ## @ingroup Plugins # Feature to export all shapes and groups into the GEOM module class PublishToStudyFeature(ModelAPI.ModelAPI_Feature): + """ + Feature to export all shapes into SHAPERSTUDY module. + """ ## The constructor. def __init__(self): ModelAPI.ModelAPI_Feature.__init__(self) - pass @staticmethod ## Export kind. Static. @@ -65,208 +67,281 @@ class PublishToStudyFeature(ModelAPI.ModelAPI_Feature): # check that the PartSet document current feature is the last to avoid problems with all # features update if aPartSet.size(model.ModelAPI_Feature.group()) > 0: - aLastFeature = ModelAPI.objectToFeature(aPartSet.object(model.ModelAPI_Feature.group(), aPartSet.size(model.ModelAPI_Feature.group()) - 1)) - aCurrentFeature = aPartSet.currentFeature(True) - if aLastFeature.data().featureId() != aCurrentFeature.data().featureId(): - EventsAPI.Events_InfoMessage("PublishToStudy", "Not all PartSet parts are up-to-date, nothing is published. Please, make the last PartSet feature as current.", self).send() - return + aLastFeature = ModelAPI.objectToFeature( + aPartSet.object( + model.ModelAPI_Feature.group(), + aPartSet.size(model.ModelAPI_Feature.group()) - 1, + ) + ) + aCurrentFeature = aPartSet.currentFeature(True) + if aLastFeature.data().featureId() != aCurrentFeature.data().featureId(): + EventsAPI.Events_InfoMessage( + "PublishToStudy", + "Not all PartSet parts are up-to-date, nothing is published. Please, make the last PartSet feature as current.", + self, + ).send() + return # find a shaper-study component salome.salome_init(embedded=True) - aComponent = SHAPERSTUDY_utils.findOrCreateComponent() anEngine = SHAPERSTUDY_utils.getEngine() # collect all processed internal entries to break the link of unprocessed later allProcessed = [] # iterate all parts and all results to publish them in SHAPER_STUDY for aPartId in range(aPartSet.size(model.ModelAPI_ResultPart.group())): - aPartObject = aPartSet.object(model.ModelAPI_ResultPart.group(), aPartId) - aPartRes = ModelAPI.modelAPI_ResultPart(ModelAPI.modelAPI_Result(aPartObject)) - aPartDoc = aPartRes.partDoc() - if aPartDoc is None and aPartObject is not None: - EventsAPI.Events_InfoMessage("PublishToStudy", "To publish to SHAPER-STUDY, activate Parts in SHAPER", self).send() - break - aPartFeatureId = aPartSet.feature(aPartRes.original()).data().featureId() - # Collects all features of exported results to find results of the same features and extend id. - # Map from feature index to index of result. If index is zero (initial), no surrfix to entry is added. - aFeaturesIndices = {} - for aResId in range(aPartDoc.size(model.ModelAPI_ResultBody.group())): - aResObject = aPartDoc.object(model.ModelAPI_ResultBody.group(), aResId) - aRes = model.objectToResult(aResObject) - #do not export images - if aRes.hasTexture() is True: - continue - aResFeatureId = str(aPartDoc.feature(aRes).data().featureId()) - if aResFeatureId in aFeaturesIndices: - aFeaturesIndices[aResFeatureId] += 1 - aResFeatureId += ":" + str(aFeaturesIndices[aResFeatureId]) - else: - aFeaturesIndices[aResFeatureId] = 0 - aSSEntry = str(aPartFeatureId) + ":" + aResFeatureId - aSShape = anEngine.FindOrCreateShape(aSSEntry) - aSShape.SetShapeByStream(aRes.shape().getShapeStream(False)) - if not aSShape.GetSO(): # publish in case it is a new shape - anEngine.AddInStudy(aSShape, aRes.data().name(), None) - else: # restore a red reference if it was deleted - aDone, aSO2 = aSShape.GetSO().FindSubObject(1) - if aDone: - aDone, aRef = aSO2.ReferencedObject() - if not aDone: - aBuilder = SHAPERSTUDY_utils.getStudy().NewBuilder() - aBuilder.Addreference(aSO2, aSShape.GetSO()) - allProcessed.append(aSSEntry) - # Groups - self.processGroups(aRes, anEngine, aPartFeatureId, aSShape, False) - # Fields - self.processGroups(aRes, anEngine, aPartFeatureId, aSShape, True) + aPartObject = aPartSet.object(model.ModelAPI_ResultPart.group(), aPartId) + aPartRes = ModelAPI.modelAPI_ResultPart( + ModelAPI.modelAPI_Result(aPartObject) + ) + aPartDoc = aPartRes.partDoc() + if aPartDoc is None and aPartObject is not None: + EventsAPI.Events_InfoMessage( + "PublishToStudy", + "To publish to SHAPER-STUDY, activate Parts in SHAPER", + self, + ).send() + break + aPartFeatureId = aPartSet.feature(aPartRes.original()).data().featureId() + # Collects all features of exported results to find results of the same features and extend id. + # Map from feature index to index of result. If index is zero (initial), no surrfix to entry is added. + allProcessed += fromFeatureToRes(aPartDoc, anEngine, aPartFeatureId) # process all SHAPER-STUDY shapes to find dead + aComponent = SHAPERSTUDY_utils.findOrCreateComponent() aSOIter = SHAPERSTUDY_utils.getStudy().NewChildIterator(aComponent) - while aSOIter.More(): - aSO = aSOIter.Value() - aSOIter.Next() # here because there is continue inside the loop - anIOR = aSO.GetIOR() - if len(anIOR): - anObj = salome.orb.string_to_object(anIOR) - if isinstance(anObj, SHAPERSTUDY_ORB._objref_SHAPER_Object): - anEntry = anObj.GetEntry() - if len(anEntry) == 0: - continue; - elif anEntry not in allProcessed: # found a removed shape: make it dead for the moment - # remove the reference - red node - aRes, aSO2 = aSO.FindSubObject(1) - if aRes: - aRes, aRef = aSO2.ReferencedObject() - if aRes: + processAllSO(aSOIter, allProcessed) + + +def fromFeatureToRes(thePartDoc, theEngine, thePartFeatureId): + """ + Collects all features of exported results to find results of the same + features and extend id. Map from feature index to index of result. If + index is zero (initial), no surrfix to entry is added. + + Parameters + ------ + thePartDoc: + SHAPER PartRes Document + theEngine: + CORBA Engine + thePartFeatureId: + part feature Id + + Returns + ------- + list: + the list of processed ShaperStudy entries + """ + processed = [] + aFeaturesIndices = {} + for aResId in range(thePartDoc.size(model.ModelAPI_ResultBody.group())): + aResObject = thePartDoc.object(model.ModelAPI_ResultBody.group(), aResId) + aRes = model.objectToResult(aResObject) + # do not export images + if aRes.hasTexture() is True: + continue + aResFeatureId = str(thePartDoc.feature(aRes).data().featureId()) + if aResFeatureId in aFeaturesIndices: + aFeaturesIndices[aResFeatureId] += 1 + aResFeatureId += ":" + str(aFeaturesIndices[aResFeatureId]) + else: + aFeaturesIndices[aResFeatureId] = 0 + aSSEntry = str(thePartFeatureId) + ":" + aResFeatureId + aSShape = theEngine.FindOrCreateShape(aSSEntry) + aSShape.SetShapeByStream(aRes.shape().getShapeStream(False)) + if not aSShape.GetSO(): # publish in case it is a new shape + theEngine.AddInStudy(aSShape, aRes.data().name(), None) + else: # restore a red reference if it was deleted + aDone, aSO2 = aSShape.GetSO().FindSubObject(1) + if aDone: + aDone, _ = aSO2.ReferencedObject() + if not aDone: aBuilder = SHAPERSTUDY_utils.getStudy().NewBuilder() - aBuilder.RemoveReference(aSO2) - # if the object is not marked as dead, mark it (#3201) to make all entries unique - aDeadEntry = anObj.GetEntry() - if not aDeadEntry.startswith("dead"): - anIndex = aSO.Tag() - anObj.SetEntry("dead0" + str(anIndex) + "_" + aDeadEntry) + aBuilder.Addreference(aSO2, aSShape.GetSO()) + processed.append(aSSEntry) + # Groups + processGroups(aRes, theEngine, thePartFeatureId, aSShape, False) + # Fields + processGroups(aRes, theEngine, thePartFeatureId, aSShape, True) + return processed - # also for groups - aGrSOIter = SHAPERSTUDY_utils.getStudy().NewChildIterator(aSO) - while aGrSOIter.More(): - aGroupSO = aGrSOIter.Value() - aGrSOIter.Next() - anIOR = aGroupSO.GetIOR() - if len(anIOR): - aGroup = salome.orb.string_to_object(anIOR) - if isinstance(aGroup, SHAPERSTUDY_ORB._objref_SHAPER_Group) or \ - isinstance(aGroup, SHAPERSTUDY_ORB._objref_SHAPER_Field): - if not aGroup.GetEntry().startswith("dead"): - aDeadGroupEntry = "dead0" + str(anIndex) + "_" + aGroup.GetEntry() - aGroup.SetEntry(aDeadGroupEntry) - # Part of the "execute" method: processes the Groups of theRes result publication. - # If theFields is true, the same is performed for Fields. - def processGroups(self, theRes, theEngine, thePartFeatureId, theStudyShape, theFields): - allGroupsProcessed = [] - allRefGroups = [] - if theFields: +# Part of the "execute" method: processes the Groups of theRes result publication. +# If theFields is true, the same is performed for Fields. +def processGroups(theRes, theEngine, thePartFeatureId, theStudyShape, theFields): + allGroupsProcessed = [] + allRefGroups = [] + if theFields: allRefGroups.append(ModelAPI.referencedFeatures(theRes, "Field", True)) - else: + else: allRefGroups.append(ModelAPI.referencedFeatures(theRes, "Group", True)) allRefGroups.append(ModelAPI.referencedFeatures(theRes, "Shared_faces", True)) - aResShape = theRes.shape() - aMapOfShape = GeomAPI_IndexedMapOfShape(aResShape) - for aRefGroups in allRefGroups: + aResShape = theRes.shape() + aMapOfShape = GeomAlgoAPI.GeomAPI_IndexedMapOfShape(aResShape) + for aRefGroups in allRefGroups: for aRef in aRefGroups: - aGroupIndices = [] - aGroupHasIndex = {} - if theFields: - aSelList = aRef.selectionList("selected") - else: - aSelList = aRef.selectionList("group_list") - aSelType = GeomAPI_Shape.shapeTypeByStr(aSelList.selectionType()) - for aGroupRes in aRef.results(): - aShape = aGroupRes.shape() - anExplorer = GeomAPI_ShapeExplorer(aShape, aSelType) - while anExplorer.more(): - anId = aMapOfShape.FindIndexEqualLocations(anExplorer.current()) - if anId > 0 and not anId in aGroupHasIndex: - aGroupIndices.append(anId) - aGroupHasIndex[anId] = 0 - anExplorer.next() - if len(aGroupIndices): # create group - aGroupFeatureId = aRef.data().featureId() + aGroupIndices = [] + aGroupHasIndex = {} if theFields: - aFieldOp = theEngine.GetIFieldOperations() - aGroupEntry = "field" + str(thePartFeatureId) + ":" + str(aGroupFeatureId) - aGroup = aFieldOp.FindField(theStudyShape, aGroupEntry) + aSelList = aRef.selectionList("selected") else: - aGroupOp = theEngine.GetIGroupOperations() - aGroupEntry = "group" + str(thePartFeatureId) + ":" + str(aGroupFeatureId) - aGroup = aGroupOp.FindGroup(theStudyShape, aGroupEntry) - if not aGroup: # create a new - if theFields: - aGroup = aFieldOp.CreateFieldByType(theStudyShape, aSelType) - else: - aGroup = aGroupOp.CreateGroup(theStudyShape, aSelType) - aGroup.SetEntry(aGroupEntry) - theEngine.AddInStudy(aGroup, aRef.firstResult().data().name(), theStudyShape) - aGroup.SetSelection(aGroupIndices) - if theFields: - self.fillField(aGroup, aRef, theEngine, aGroupIndices) - # a group takes shape from the main result - #aGroup.SetShapeByStream(aRef.firstResult().shape().getShapeStream(False)) # group shape - allGroupsProcessed.append(aGroupEntry) - # check all existing groups: if some does not processed, remove it from the tree - aSOIter = SHAPERSTUDY_utils.getStudy().NewChildIterator(theStudyShape.GetSO()) - while aSOIter.More(): + aSelList = aRef.selectionList("group_list") + aSelType = GeomAPI.GeomAPI_Shape.shapeTypeByStr(aSelList.selectionType()) + for aGroupRes in aRef.results(): + aShape = aGroupRes.shape() + anExplorer = GeomAPI.GeomAPI_ShapeExplorer(aShape, aSelType) + while anExplorer.more(): + anId = aMapOfShape.FindIndexEqualLocations(anExplorer.current()) + if anId > 0 and anId not in aGroupHasIndex: + aGroupIndices.append(anId) + aGroupHasIndex[anId] = 0 + anExplorer.next() + if len(aGroupIndices) > 0: # create group + aGroupFeatureId = aRef.data().featureId() + if theFields: + aFieldOp = theEngine.GetIFieldOperations() + aGroupEntry = ( + "field" + str(thePartFeatureId) + ":" + str(aGroupFeatureId) + ) + aGroup = aFieldOp.FindField(theStudyShape, aGroupEntry) + else: + aGroupOp = theEngine.GetIGroupOperations() + aGroupEntry = ( + "group" + str(thePartFeatureId) + ":" + str(aGroupFeatureId) + ) + aGroup = aGroupOp.FindGroup(theStudyShape, aGroupEntry) + if not aGroup: # create a new + if theFields: + aGroup = aFieldOp.CreateFieldByType(theStudyShape, aSelType) + else: + aGroup = aGroupOp.CreateGroup(theStudyShape, aSelType) + aGroup.SetEntry(aGroupEntry) + theEngine.AddInStudy( + aGroup, aRef.firstResult().data().name(), theStudyShape + ) + aGroup.SetSelection(aGroupIndices) + if theFields: + fillField(aGroup, aRef, theEngine, aGroupIndices) + # a group takes shape from the main result + # aGroup.SetShapeByStream(aRef.firstResult().shape().getShapeStream(False)) # group shape + allGroupsProcessed.append(aGroupEntry) + # check all existing groups: if some does not processed, remove it from the tree + aSOIter = SHAPERSTUDY_utils.getStudy().NewChildIterator(theStudyShape.GetSO()) + while aSOIter.More(): aSO = aSOIter.Value() anIOR = aSO.GetIOR() - if len(anIOR): - anObj = salome.orb.string_to_object(anIOR) - if (theFields and isinstance(anObj, SHAPERSTUDY_ORB._objref_SHAPER_Field)) or \ - (not theFields and type(anObj) == SHAPERSTUDY_ORB._objref_SHAPER_Group): - anEntry = anObj.GetEntry() - if anEntry not in allGroupsProcessed: # found a removed group => remove - aBuilder = SHAPERSTUDY_utils.getStudy().NewBuilder() - aBuilder.RemoveObject(anObj.GetSO()) + if len(anIOR) > 0: + anObj = salome.orb.string_to_object(anIOR) + if ( + theFields and isinstance(anObj, SHAPERSTUDY_ORB._objref_SHAPER_Field) + ) or ( + not theFields and type(anObj) == SHAPERSTUDY_ORB._objref_SHAPER_Group + ): + anEntry = anObj.GetEntry() + if anEntry not in allGroupsProcessed: # found a removed group => remove + aBuilder = SHAPERSTUDY_utils.getStudy().NewBuilder() + aBuilder.RemoveObject(anObj.GetSO()) aSOIter.Next() - # Part of the "execute" method: theFiled fields filling. - def fillField(self, theField, theFeature, theEngine, theSelectionIndices): - aTables = theFeature.tables("values") - aValType = aTables.type() # type of the values - aValTypeToSet = aValType - if aValType == 3: # strings do not supported by SMESH, so, make them empty boolean table + +# Part of the "execute" method: theFiled fields filling. +def fillField(theField, theFeature, theEngine, theSelectionIndices): + aTables = theFeature.tables("values") + aValType = aTables.type() # type of the values + aValTypeToSet = aValType + if ( + aValType == 3 + ): # strings do not supported by SMESH, so, make them empty boolean table aValTypeToSet = 0 - theField.SetValuesType(aValTypeToSet) - aNumSteps = aTables.tables() # number of steps is number of tables - aSteps = [] - for aVal in range(aNumSteps): + theField.SetValuesType(aValTypeToSet) + aNumSteps = aTables.tables() # number of steps is number of tables + aSteps = [] + for aVal in range(aNumSteps): aSteps.append(aVal + 1) - theField.SetSteps(aSteps) - aCompNames = [] - aCompNamesAttr = theFeature.stringArray("components_names") - for anIndex in range(aCompNamesAttr.size()): + theField.SetSteps(aSteps) + aCompNames = [] + aCompNamesAttr = theFeature.stringArray("components_names") + for anIndex in range(aCompNamesAttr.size()): aCompNames.append(aCompNamesAttr.value(anIndex)) - theField.SetComponents(aCompNames) - # prepare the sub-shapes indices: all values for all sub-shapes must be defined - aShapeOp = theEngine.GetIShapesOperations() - allIndices = aShapeOp.GetAllSubShapesIDs(theField.GetShape(), theField.GetSelectionType(), False) - # define steps - theField.ClearFieldSteps() - for aVal in range(aNumSteps): + theField.SetComponents(aCompNames) + # prepare the sub-shapes indices: all values for all sub-shapes must be defined + aShapeOp = theEngine.GetIShapesOperations() + allIndices = aShapeOp.GetAllSubShapesIDs( + theField.GetShape(), theField.GetSelectionType(), False + ) + # define steps + theField.ClearFieldSteps() + for aVal in range(aNumSteps): aVals = [] for aCol in range(aTables.columns()): - #for aRow in range(aTables.rows()): - for anIndex in allIndices: - if anIndex in theSelectionIndices: - aRow = theSelectionIndices.index(anIndex) + 1 # starting from the first line - else: - aRow = 0 # default value - aStrVal = aTables.valueStr(aRow, aCol, aVal) - if aValType == 0: # boolean - if aStrVal == "True": - aVals.append(1) - else: - aVals.append(0) - elif aValType == 1: # int - aVals.append(int(aStrVal)) - elif aValType == 2: # double - aVals.append(float(aStrVal)) - theField.AddFieldStep(theFeature.intArray("stamps").value(aVal), aVal + 1, aVals) + # for aRow in range(aTables.rows()): + for anIndex in allIndices: + if anIndex in theSelectionIndices: + aRow = ( + theSelectionIndices.index(anIndex) + 1 + ) # starting from the first line + else: + aRow = 0 # default value + aStrVal = aTables.valueStr(aRow, aCol, aVal) + if aValType == 0: # boolean + if aStrVal == "True": + aVals.append(1) + else: + aVals.append(0) + elif aValType == 1: # int + aVals.append(int(aStrVal)) + elif aValType == 2: # double + aVals.append(float(aStrVal)) + theField.AddFieldStep( + theFeature.intArray("stamps").value(aVal), aVal + 1, aVals + ) + + +def processAllSO(theSOIter, theAllProcessed): + while theSOIter.More(): + aSO = theSOIter.Value() + theSOIter.Next() # here because there is continue inside the loop + anIOR = aSO.GetIOR() + if len(anIOR) > 0: + anObj = salome.orb.string_to_object(anIOR) + if isinstance(anObj, SHAPERSTUDY_ORB._objref_SHAPER_Object): + anEntry = anObj.GetEntry() + if len(anEntry) == 0: + continue + if ( + anEntry not in theAllProcessed + ): # found a removed shape: make it dead for the moment + # remove the reference - red node + aRes, aSO2 = aSO.FindSubObject(1) + if aRes: + aRes, _ = aSO2.ReferencedObject() + if aRes: + aBuilder = SHAPERSTUDY_utils.getStudy().NewBuilder() + aBuilder.RemoveReference(aSO2) + # if the object is not marked as dead, mark it (#3201) to make all entries unique + aDeadEntry = anObj.GetEntry() + if not aDeadEntry.startswith("dead"): + anIndex = aSO.Tag() + anObj.SetEntry("dead0" + str(anIndex) + "_" + aDeadEntry) + + # also for groups + aGrSOIter = SHAPERSTUDY_utils.getStudy().NewChildIterator(aSO) + while aGrSOIter.More(): + aGroupSO = aGrSOIter.Value() + aGrSOIter.Next() + anIOR = aGroupSO.GetIOR() + if len(anIOR): + aGroup = salome.orb.string_to_object(anIOR) + if isinstance( + aGroup, SHAPERSTUDY_ORB._objref_SHAPER_Group + ) or isinstance( + aGroup, SHAPERSTUDY_ORB._objref_SHAPER_Field + ): + if not aGroup.GetEntry().startswith("dead"): + aDeadGroupEntry = ( + "dead0" + + str(anIndex) + + "_" + + aGroup.GetEntry() + ) + aGroup.SetEntry(aDeadGroupEntry) -- 2.39.2