23076: [CEA 1499] Get in python all sub-shapes in error after Compute

This commit is contained in:
eap 2015-07-10 22:34:27 +03:00
parent de00066f64
commit ad4fc4d4c9
2 changed files with 92 additions and 35 deletions

View File

@ -1425,37 +1425,7 @@ class Mesh:
# Treat compute errors # Treat compute errors
computeErrors = self.smeshpyD.GetComputeErrors( self.mesh, geom ) computeErrors = self.smeshpyD.GetComputeErrors( self.mesh, geom )
for err in computeErrors: for err in computeErrors:
shapeText = "" shapeText = " on %s" % self.GetSubShapeName( err.subShapeID )
if self.mesh.HasShapeToMesh():
try:
mainIOR = salome.orb.object_to_string(geom)
for sname in salome.myStudyManager.GetOpenStudies():
s = salome.myStudyManager.GetStudyByName(sname)
if not s: continue
mainSO = s.FindObjectIOR(mainIOR)
if not mainSO: continue
if err.subShapeID == 1:
shapeText = ' on "%s"' % mainSO.GetName()
subIt = s.NewChildIterator(mainSO)
while subIt.More():
subSO = subIt.Value()
subIt.Next()
obj = subSO.GetObject()
if not obj: continue
go = obj._narrow( geomBuilder.GEOM._objref_GEOM_Object )
if not go: continue
ids = go.GetSubShapeIndices()
if len(ids) == 1 and ids[0] == err.subShapeID:
shapeText = ' on "%s"' % subSO.GetName()
break
if not shapeText:
shape = self.geompyD.GetSubShape( geom, [err.subShapeID])
if shape:
shapeText = " on %s #%s" % (shape.GetShapeType(), err.subShapeID)
else:
shapeText = " on subshape #%s" % (err.subShapeID)
except:
shapeText = " on subshape #%s" % (err.subShapeID)
errText = "" errText = ""
stdErrors = ["OK", #COMPERR_OK stdErrors = ["OK", #COMPERR_OK
"Invalid input mesh", #COMPERR_BAD_INPUT_MESH "Invalid input mesh", #COMPERR_BAD_INPUT_MESH
@ -1533,14 +1503,101 @@ class Mesh:
pass pass
return ok return ok
## Return submesh objects list in meshing order ## Return a name of a sub-shape by its ID
# @param subShapeID a unique ID of a sub-shape
# @return a string describing the sub-shape; possible variants:
# - "Face_12" (published sub-shape)
# - FACE #3 (not published sub-shape)
# - sub-shape #3 (invalid sub-shape ID)
# - #3 (error in this function)
def GetSubShapeName(self, subShapeID ):
if not self.mesh.HasShapeToMesh():
return ""
try:
shapeText = ""
mainIOR = salome.orb.object_to_string( self.GetShape() )
for sname in salome.myStudyManager.GetOpenStudies():
s = salome.myStudyManager.GetStudyByName(sname)
if not s: continue
mainSO = s.FindObjectIOR(mainIOR)
if not mainSO: continue
if subShapeID == 1:
shapeText = '"%s"' % mainSO.GetName()
subIt = s.NewChildIterator(mainSO)
while subIt.More():
subSO = subIt.Value()
subIt.Next()
obj = subSO.GetObject()
if not obj: continue
go = obj._narrow( geomBuilder.GEOM._objref_GEOM_Object )
if not go: continue
try:
ids = self.geompyD.GetSubShapeID( self.GetShape(), go )
except:
continue
if ids == subShapeID:
shapeText = '"%s"' % subSO.GetName()
break
if not shapeText:
shape = self.geompyD.GetSubShape( self.GetShape(), [subShapeID])
if shape:
shapeText = '%s #%s' % (shape.GetShapeType(), subShapeID)
else:
shapeText = 'sub-shape #%s' % (subShapeID)
except:
shapeText = "#%s" % (subShapeID)
return shapeText
## Return a list of sub-shapes meshing of which failed, grouped into GEOM groups by
# error of an algorithm
# @param publish if @c True, the returned groups will be published in the study
# @return a list of GEOM groups each named after a failed algorithm
def GetFailedShapes(self, publish=False):
algo2shapes = {}
computeErrors = self.smeshpyD.GetComputeErrors( self.mesh, self.GetShape() )
for err in computeErrors:
shape = self.geompyD.GetSubShape( self.GetShape(), [err.subShapeID])
if not shape: continue
if err.algoName in algo2shapes:
algo2shapes[ err.algoName ].append( shape )
else:
algo2shapes[ err.algoName ] = [ shape ]
pass
groups = []
for algoName, shapes in algo2shapes.items():
while shapes:
groupType = self.smeshpyD.EnumToLong( shapes[0].GetShapeType() )
otherTypeShapes = []
sameTypeShapes = []
group = self.geompyD.CreateGroup( self.geom, groupType )
for shape in shapes:
if shape.GetShapeType() == shapes[0].GetShapeType():
sameTypeShapes.append( shape )
else:
otherTypeShapes.append( shape )
self.geompyD.UnionList( group, sameTypeShapes )
if otherTypeShapes:
group.SetName( "%s %s" % ( algoName, shapes[0].GetShapeType() ))
else:
group.SetName( algoName )
groups.append( group )
shapes = otherTypeShapes
pass
if publish:
for group in groups:
self.geompyD.addToStudyInFather( self.geom, group, group.GetName() )
return groups
## Return sub-mesh objects list in meshing order
# @return list of list of submesh objects # @return list of list of submesh objects
# @ingroup l2_construct # @ingroup l2_construct
def GetMeshOrder(self): def GetMeshOrder(self):
return self.mesh.GetMeshOrder() return self.mesh.GetMeshOrder()
## Return submesh objects list in meshing order ## Set order in which concurrent sub-meshes sould be meshed
# @return list of list of submesh objects # @param list of sub-meshes
# @ingroup l2_construct # @ingroup l2_construct
def SetMeshOrder(self, submeshes): def SetMeshOrder(self, submeshes):
return self.mesh.SetMeshOrder(submeshes) return self.mesh.SetMeshOrder(submeshes)

View File

@ -717,7 +717,7 @@ bool StdMeshers_FaceSide::GetEdgeNodes(size_t i,
{ {
if ( mesh->HasModificationsToDiscard() ) // check nb of nodes on the EDGE sub-mesh if ( mesh->HasModificationsToDiscard() ) // check nb of nodes on the EDGE sub-mesh
{ {
int iQuad = sm->GetElements()->next()->IsQuadratic(); int iQuad = sm->NbElements() ? sm->GetElements()->next()->IsQuadratic() : 0;
int nbExpect = sm->NbElements() - 1 + iQuad * sm->NbElements(); int nbExpect = sm->NbElements() - 1 + iQuad * sm->NbElements();
if ( nbExpect != sm->NbNodes() ) // some nodes are moved from the EDGE by MergeNodes() if ( nbExpect != sm->NbNodes() ) // some nodes are moved from the EDGE by MergeNodes()
{ {