-// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
// SMESH SMESH : implementaion of SMESH idl descriptions
// File : StdMeshers_RadialQuadrangle_1D2D.cxx
// Module : SMESH
-// Created : Fri Oct 20 11:37:07 2006
-// Author : Edward AGAPOV (eap)
#include "StdMeshers_RadialQuadrangle_1D2D.hxx"
_compatibleHypothesis.push_back("NumberOfLayers2D");
myNbLayerHypo = 0;
myDistributionHypo = 0;
- _requireDescretBoundary = false;
+ _requireDiscreteBoundary = false;
_supportSubmeshes = true;
}
*/
class TEdgeMarker : public SMESH_subMeshEventListener
{
- TEdgeMarker(): SMESH_subMeshEventListener(/*isDeletable=*/false) {}
+ TEdgeMarker(): SMESH_subMeshEventListener(/*isDeletable=*/false,
+ "StdMeshers_RadialQuadrangle_1D2D::TEdgeMarker") {}
public:
//!< Return static listener
static SMESH_subMeshEventListener* getListener()
bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh,
const TopoDS_Shape& aShape)
{
- TopExp_Explorer exp;
SMESHDS_Mesh * meshDS = aMesh.GetMeshDS();
myHelper = new SMESH_MesherHelper( aMesh );
if ( !computeLayerPositions(P0,P1))
return false;
- exp.Init( CircEdge, TopAbs_VERTEX );
- TopoDS_Vertex V1 = TopoDS::Vertex( exp.Current() );
+ TopoDS_Vertex V1 = myHelper->IthVertex(0, CircEdge );
gp_Pnt2d p2dV = BRep_Tool::Parameters( V1, TopoDS::Face(aShape) );
NC = meshDS->AddNode(P0.X(), P0.Y(), P0.Z());
gp_Pnt P2( NL->X(), NL->Y(), NL->Z() );
P0 = aCirc->Location();
+ // make P1 belong to LinEdge1
+ TopoDS_Vertex V1 = myHelper->IthVertex( 0, LinEdge1 );
+ TopoDS_Vertex V2 = myHelper->IthVertex( 1, LinEdge1 );
+ gp_Pnt PE1 = BRep_Tool::Pnt(V1);
+ gp_Pnt PE2 = BRep_Tool::Pnt(V2);
+ if( ( P1.Distance(PE1) > Precision::Confusion() ) &&
+ ( P1.Distance(PE2) > Precision::Confusion() ) )
+ std::swap( LinEdge1, LinEdge2 );
+
bool linEdge1Computed, linEdge2Computed;
if ( !computeLayerPositions(P0,P1,LinEdge1,&linEdge1Computed))
return false;
Nodes2.resize( myLayerPositions.size()+1 );
// check that both linear edges have same hypotheses
- if ( !computeLayerPositions(P0,P1,LinEdge2, &linEdge2Computed))
+ if ( !computeLayerPositions(P0,P2,LinEdge2, &linEdge2Computed))
return false;
if ( Nodes1.size() != myLayerPositions.size()+1 )
return error("Different hypotheses apply to radial edges");
- exp.Init( LinEdge1, TopAbs_VERTEX );
- TopoDS_Vertex V1 = TopoDS::Vertex( exp.Current() );
- exp.Next();
- TopoDS_Vertex V2 = TopoDS::Vertex( exp.Current() );
- gp_Pnt PE1 = BRep_Tool::Pnt(V1);
- gp_Pnt PE2 = BRep_Tool::Pnt(V2);
- if( ( P1.Distance(PE1) > Precision::Confusion() ) &&
- ( P1.Distance(PE2) > Precision::Confusion() ) )
- {
- std::swap( LinEdge1, LinEdge2 );
- std::swap( linEdge1Computed, linEdge2Computed );
- }
+ // find the central vertex
TopoDS_Vertex VC = V2;
if( ( P1.Distance(PE1) > Precision::Confusion() ) &&
( P2.Distance(PE1) > Precision::Confusion() ) )
// orientation
bool IsForward = ( CircEdge.Orientation()==TopAbs_FORWARD );
+ const double angleSign = ( F.Orientation() == TopAbs_REVERSED ? -1.0 : 1.0 );
// create nodes and mesh elements on face
// find axis of rotation
gp_Ax1 theAxis(P0,gp_Dir(Axis));
aTrsf.SetRotation( theAxis, Angles.Value(i) );
gp_Trsf2d aTrsf2d;
- aTrsf2d.SetRotation( PC, Angles.Value(i) );
+ aTrsf2d.SetRotation( PC, Angles.Value(i) * angleSign );
// create nodes
int j = 1;
for(; j<=Points.Length(); j++) {