*/
//================================================================================
+void SMESH_MesherHelper::SetSubShape(const int aShID)
+{
+ if ( aShID == myShapeID )
+ return;
+ if ( aShID > 1 )
+ SetSubShape( GetMesh()->GetMeshDS()->IndexToShape( aShID ));
+ else
+ SetSubShape( TopoDS_Shape() );
+}
+
+//================================================================================
+/*!
+ * \brief Set geomerty to make elements on
+ * \param aSh - geomertic shape
+ */
+//================================================================================
+
void SMESH_MesherHelper::SetSubShape(const TopoDS_Shape& aSh)
{
- SMESHDS_Mesh* meshDS = GetMesh()->GetMeshDS();
+ if ( !myShape.IsNull() && !aSh.IsNull() && myShape.IsSame( aSh ))
+ return;
myShape = aSh;
+ mySeamShapeIds.clear();
+
+ if ( myShape.IsNull() ) {
+ myShapeID = -1;
+ return;
+ }
+ SMESHDS_Mesh* meshDS = GetMesh()->GetMeshDS();
myShapeID = meshDS->ShapeToIndex(aSh);
// treatment of periodic faces
}
}
+//================================================================================
+ /*!
+ * \brief Check if inFaceNode argument is necessary for call GetNodeUV(F,..)
+ * \param F - the face
+ * \retval bool - return true if the face is periodic
+ */
+//================================================================================
+
+bool SMESH_MesherHelper::GetNodeUVneedInFaceNode(const TopoDS_Face& F) const
+{
+ if ( F.IsNull() ) return !mySeamShapeIds.empty();
+
+ if ( !F.IsNull() && !myShape.IsNull() && myShape.IsSame( F ))
+ return !mySeamShapeIds.empty();
+
+ Handle(Geom_Surface) aSurface = BRep_Tool::Surface( F );
+ if ( !aSurface.IsNull() )
+ return ( aSurface->IsUPeriodic() || aSurface->IsVPeriodic() );
+
+ return false;
+}
//=======================================================================
//function : IsMedium
* \brief Return node UV on face
* \param F - the face
* \param n - the node
- * \param n2 - a medium node will be placed between n and n2
+ * \param n2 - a node of element being created located inside a face
* \retval gp_XY - resulting UV
*
* Auxilary function called form GetMediumNode()
/// Empty constructor
SMESH_MesherHelper(SMESH_Mesh& theMesh)
- { myMesh=(void *)&theMesh; myCreateQuadratic = false; }
+ { myMesh=(void *)&theMesh; myCreateQuadratic = false; myShapeID=-1;}
SMESH_Mesh* GetMesh() const
{ return (SMESH_Mesh*)myMesh; }
* \brief Return node UV on face
* \param F - the face
* \param n - the node
- * \param n2 - a medium node will be placed between n and n2
+ * \param inFaceNode - a node of element being created located inside a face
* \retval gp_XY - resulting UV
*
* Auxilary function called form GetMediumNode()
*/
gp_XY GetNodeUV(const TopoDS_Face& F,
const SMDS_MeshNode* n,
- const SMDS_MeshNode* n2=0);
+ const SMDS_MeshNode* inFaceNode=0);
+
+ /*!
+ * \brief Check if inFaceNode argument is necessary for call GetNodeUV(F,..)
+ * \param F - the face
+ * \retval bool - return true if the face is periodic
+ *
+ * if F is Null, answer about subshape set through IsQuadraticSubMesh() or
+ * SetSubShape()
+ */
+ bool GetNodeUVneedInFaceNode(const TopoDS_Face& F = TopoDS_Face()) const;
/*!
* \brief Return U on edge
bool force3d = true);
- void SetKeyIsQuadratic(const bool theKey)
- {myCreateQuadratic = theKey;};
+ /*!
+ * \brief Set order of elements to create
+ * \param theBuildQuadratic - to build quadratic or not
+ *
+ * To be used for quadratic elements creation without preceding
+ * IsQuadraticSubMesh() or AddQuadraticEdge() call
+ */
+ void SetKeyIsQuadratic(const bool theBuildQuadratic)
+ { myCreateQuadratic = theBuildQuadratic; }
+ /*!
+ * \brief Set shape to make elements on
+ * \param subShape, subShapeID - shape or its ID (==SMESHDS_Mesh::ShapeToIndex(shape))
+ */
+ void SetSubShape(const int subShapeID);
void SetSubShape(const TopoDS_Shape& subShape);
+ /*!
+ * \brief Return shape or its ID, on which created elements are added
+ * \retval TopoDS_Shape, int - shape or its ID
+ */
+ int GetSubShapeID() { return myShapeID; }
+ TopoDS_Shape GetSubShape() { return myShape; }
+
protected:
/*!