For all issues regarding the Forums use, please, refer to the Forum Rules.

Our Solutions

Need professional assistance?
Consider our:

Support Offerings

 

Need to speed up your development?
Have a look at our:

Samples & Tools

 

Need some functionality extending standard OCCT capabilities?
Check out our:

Adv. Components

Related pages

Get Normals of a face --- Working ;)

VINOTHKUMAR THANGAVEL's picture
Forums: 

TopoDS_Shape theShape =​ /* load a shape*/

//required variable declaration

Standard_Boolean bDone = Standard_False;

Standard_Real aU, aV;

Standard_Integer NbAlongU = 1, theNbAlongU = 1, NbAlongV = 1, theNbAlongV=1, theLength = 10;

Standard_Real    NormalLength;

Standard_Boolean ToUseMesh = Standard_False;

Standard_Boolean ToOrient = Standard_True;

//explore faces

for (TopExp_Explorer aFe(theShape, TopAbs_FACE); aFe.More(); aFe.Next())

{

// one face loaded to aFace  from theshape

const TopoDS_Face& aFace = TopoDS::Face(aFe.Current());

//required variable declaration

Standard_Real aUmin = 0.0, aVmin = 0.0, aUmax = 0.0, aVmax = 0.0;

BRepTools::UVBounds(aFace, aUmin, aUmax, aVmin, aVmax);

const Standard_Boolean isUseMidU = (theNbAlongU == 1);

const Standard_Boolean isUseMidV = (theNbAlongV == 1);

const Standard_Real aDU = (aUmax - aUmin) / (isUseMidU ? 2 : (theNbAlongU - 1));

const Standard_Real aDV = (aVmax - aVmin) / (isUseMidV ? 2 : (theNbAlongV - 1));

BRepAdaptor_Surface aSurface(aFace);

for (Standard_Integer aUIter = 0; aUIter < theNbAlongU; ++aUIter)

{

const Standard_Real aU = aUmin + (isUseMidU ? 1 : aUIter) * aDU;

for (Standard_Integer aVIter = 0; aVIter < theNbAlongV; ++aVIter)

{

const Standard_Real aV = aVmin + (isUseMidV ? 1 : aVIter) * aDV;

gp_Pnt aP1;

gp_Vec aV1, aV2;

aSurface.D1(aU, aV, aP1, aV1, aV2);

gp_Vec aVec = aV1.Crossed(aV2);

Standard_Real aNormalLen = aVec.Magnitude();

if (aFace.Orientation() == TopAbs_REVERSED) {

aVec.Reverse();

}

//aVec is the normal vector of the face explored

}

}

}

Attachments: