1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-09 13:22:24 +03:00

0025209: Draw Harness - add command 'vnormals' and extend command 'normals' to show variable number of normals

This commit is contained in:
oan
2016-07-31 13:09:37 +03:00
committed by bugmaster
parent c0a1a35fac
commit 68ef63f9f3
4 changed files with 538 additions and 84 deletions

View File

@@ -21,6 +21,7 @@
#include <Draw.hxx>
#include <Draw_Appli.hxx>
#include <DBRep.hxx>
#include <DBRep_DrawableShape.hxx>
#include <Font_BRepFont.hxx>
#include <Font_BRepTextBuilder.hxx>
@@ -129,6 +130,8 @@
#include <BRepExtrema_ExtPC.hxx>
#include <BRepExtrema_ExtPF.hxx>
#include <Prs3d_Arrow.hxx>
#include <Prs3d_ArrowAspect.hxx>
#include <Prs3d_DatumAspect.hxx>
#include <Prs3d_Drawer.hxx>
#include <Prs3d_VertexDrawMode.hxx>
@@ -5934,6 +5937,217 @@ static int VPriority (Draw_Interpretor& theDI,
return 0;
}
//! Auxiliary class for command vnormals.
class MyShapeWithNormals : public AIS_Shape
{
DEFINE_STANDARD_RTTI_INLINE(MyShapeWithNormals, AIS_Shape);
public:
Standard_Real NormalLength;
Standard_Integer NbAlongU;
Standard_Integer NbAlongV;
Standard_Boolean ToUseMesh;
Standard_Boolean ToOrient;
public:
//! Main constructor.
MyShapeWithNormals (const TopoDS_Shape& theShape)
: AIS_Shape (theShape),
NormalLength(10),
NbAlongU (1),
NbAlongV (1),
ToUseMesh (Standard_False),
ToOrient (Standard_False) {}
protected:
//! Comnpute presentation.
virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr,
const Handle(Prs3d_Presentation)& thePrs,
const Standard_Integer theMode) Standard_OVERRIDE
{
AIS_Shape::Compute (thePrsMgr, thePrs, theMode);
NCollection_DataMap<TopoDS_Face, NCollection_Vector<std::pair<gp_Pnt, gp_Pnt> > > aNormalMap;
if (ToUseMesh)
{
DBRep_DrawableShape::addMeshNormals (aNormalMap, myshape, NormalLength);
}
else
{
DBRep_DrawableShape::addSurfaceNormals (aNormalMap, myshape, NormalLength, NbAlongU, NbAlongV);
}
Handle(Graphic3d_Group) aPrsGroup = Prs3d_Root::NewGroup (thePrs);
aPrsGroup->SetGroupPrimitivesAspect (myDrawer->ArrowAspect()->Aspect());
const Standard_Real aArrowAngle = myDrawer->ArrowAspect()->Angle();
const Standard_Real aArrowLength = myDrawer->ArrowAspect()->Length();
for (NCollection_DataMap<TopoDS_Face, NCollection_Vector<std::pair<gp_Pnt, gp_Pnt> > >::Iterator aFaceIt (aNormalMap);
aFaceIt.More(); aFaceIt.Next())
{
const Standard_Boolean toReverse = ToOrient && aFaceIt.Key().Orientation() == TopAbs_REVERSED;
Handle(Graphic3d_ArrayOfSegments) aSegments = new Graphic3d_ArrayOfSegments (2 * aFaceIt.Value().Size());
for (NCollection_Vector<std::pair<gp_Pnt, gp_Pnt> >::Iterator aPntIt (aFaceIt.Value()); aPntIt.More(); aPntIt.Next())
{
std::pair<gp_Pnt, gp_Pnt> aPair = aPntIt.Value();
if (toReverse)
{
const gp_Vec aDir = aPair.first.XYZ() - aPair.second.XYZ();
aPair.second = aPair.first.XYZ() + aDir.XYZ();
}
aSegments->AddVertex (aPair.first);
aSegments->AddVertex (aPair.second);
Prs3d_Arrow::Draw (aPrsGroup, aPair.second, gp_Vec(aPair.first, aPair.second), aArrowAngle, aArrowLength);
}
aPrsGroup->AddPrimitiveArray (aSegments);
}
}
};
//=======================================================================
//function : VNormals
//purpose : Displays/Hides normals calculated on shape geometry or retrieved from triangulation
//=======================================================================
static int VNormals (Draw_Interpretor& theDI,
Standard_Integer theArgNum,
const char** theArgs)
{
Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
if (aContext.IsNull())
{
std::cout << "Error: no view available, call 'vinit' before!\n";
return 1;
}
else if (theArgNum < 2)
{
std::cout << "Error: wrong number of arguments! See usage:\n";
theDI.PrintHelp (theArgs[0]);
return 1;
}
Standard_Integer anArgIter = 1;
Standard_CString aShapeName = theArgs[anArgIter++];
TopoDS_Shape aShape = DBRep::Get (aShapeName);
Standard_Boolean isOn = Standard_True;
if (aShape.IsNull())
{
std::cout << "Error: shape with name '" << aShapeName << "' is not found\n";
return 1;
}
ViewerTest_DoubleMapOfInteractiveAndName& aMap = GetMapOfAIS();
Handle(MyShapeWithNormals) aShapePrs;
if (aMap.IsBound2 (aShapeName))
{
aShapePrs = Handle(MyShapeWithNormals)::DownCast (aMap.Find2 (aShapeName));
}
Standard_Boolean isUseMesh = Standard_False;
Standard_Real aLength = 10.0;
Standard_Integer aNbAlongU = 1, aNbAlongV = 1;
Standard_Boolean isOriented = Standard_False;
for (; anArgIter < theArgNum; ++anArgIter)
{
TCollection_AsciiString aParam (theArgs[anArgIter]);
aParam.LowerCase();
if (anArgIter == 2
&& ViewerTest::ParseOnOff (aParam.ToCString(), isOn))
{
continue;
}
else if (aParam == "-usemesh"
|| aParam == "-mesh")
{
isUseMesh = Standard_True;
}
else if (aParam == "-length"
|| aParam == "-len")
{
++anArgIter;
aLength = anArgIter < theArgNum ? Draw::Atof (theArgs[anArgIter]) : 0.0;
if (Abs (aLength) <= gp::Resolution())
{
std::cout << "Syntax error: length should not be zero\n";
return 1;
}
}
else if (aParam == "-orient"
|| aParam == "-oriented")
{
isOriented = Standard_True;
if (anArgIter + 1 < theArgNum
&& ViewerTest::ParseOnOff (theArgs[anArgIter + 1], isOriented))
{
++anArgIter;
}
}
else if (aParam == "-nbalongu"
|| aParam == "-nbu")
{
++anArgIter;
aNbAlongU = anArgIter < theArgNum ? Draw::Atoi (theArgs[anArgIter]) : 0;
if (aNbAlongU < 1)
{
std::cout << "Syntax error: NbAlongU should be >=1\n";
return 1;
}
}
else if (aParam == "-nbalongv"
|| aParam == "-nbv")
{
++anArgIter;
aNbAlongV = anArgIter < theArgNum ? Draw::Atoi (theArgs[anArgIter]) : 0;
if (aNbAlongV < 1)
{
std::cout << "Syntax error: NbAlongV should be >=1\n";
return 1;
}
}
else if (aParam == "-nbalong"
|| aParam == "-nbuv")
{
++anArgIter;
aNbAlongU = anArgIter < theArgNum ? Draw::Atoi (theArgs[anArgIter]) : 0;
aNbAlongV = aNbAlongU;
if (aNbAlongU < 1)
{
std::cout << "Syntax error: NbAlong should be >=1\n";
return 1;
}
}
else
{
std::cout << "Syntax error: unknwon argument '" << aParam << "'\n";
return 1;
}
}
if (isOn)
{
if (aShapePrs.IsNull())
{
aShapePrs = new MyShapeWithNormals (aShape);
}
aShapePrs->ToUseMesh = isUseMesh;
aShapePrs->ToOrient = isOriented;
aShapePrs->NormalLength = aLength;
aShapePrs->NbAlongU = aNbAlongU;
aShapePrs->NbAlongV = aNbAlongV;
VDisplayAISObject (aShapeName, aShapePrs);
}
else if (!aShapePrs.IsNull())
{
VDisplayAISObject (aShapeName, new AIS_Shape (aShape));
}
return 0;
}
//=======================================================================
//function : ObjectsCommands
//purpose :
@@ -6232,4 +6446,11 @@ void ViewerTest::ObjectCommands(Draw_Interpretor& theCommands)
"vpriority [-noupdate|-update] name [value]\n\t\t prints or sets the display priority for an object",
__FILE__,
VPriority, group);
theCommands.Add ("vnormals",
"vnormals usage:\n"
"vnormals Shape [{on|off}=on] [-length {10}] [-nbAlongU {1}] [-nbAlongV {1}] [-nbAlong {1}]"
"\n\t\t: [-useMesh] [-oriented {0}1}=0]"
"\n\t\t: Displays/Hides normals calculated on shape geometry or retrieved from triangulation",
__FILE__, VNormals, group);
}