1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-05-01 10:26:12 +03:00
occt/src/ViewerTest/ViewerTest_RelationCommands.cxx
aba a6eb515f9d 0024133: Development of improvement of dimensions implementation; new length, radius,diameter and angle dimensions.
Some corrections; test cases were added; coding standards in MFC samples & presentations
Request stencil buffer for Linux.
correct test cases; correct compilation errors
compilation warnings (gcc/Linux)
2013-10-31 18:02:17 +04:00

2446 lines
82 KiB
C++
Executable File

// Created on: 1998-11-12
// Created by: Robert COUBLANC
// Copyright (c) 1998-1999 Matra Datavision
// Copyright (c) 1999-2012 OPEN CASCADE SAS
//
// The content of this file is subject to the Open CASCADE Technology Public
// License Version 6.5 (the "License"). You may not use the content of this file
// except in compliance with the License. Please obtain a copy of the License
// at http://www.opencascade.org and read it completely before using this file.
//
// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
//
// The Original Code and all software distributed under the License is
// distributed on an "AS IS" basis, without warranty of any kind, and the
// Initial Developer hereby disclaims all such warranties, including without
// limitation, any warranties of merchantability, fitness for a particular
// purpose or non-infringement. Please see the License for the specific terms
// and conditions governing the rights and limitations under the License.
#include <ViewerTest.hxx>
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <AIS_AngleDimension.hxx>
#include <AIS_Circle.hxx>
#include <AIS_DiameterDimension.hxx>
#include <AIS_DisplayMode.hxx>
#include <AIS_InteractiveContext.hxx>
#include <AIS_LengthDimension.hxx>
#include <AIS_ListIteratorOfListOfInteractive.hxx>
#include <AIS_ListOfInteractive.hxx>
#include <AIS_MapOfInteractive.hxx>
#include <AIS_Point.hxx>
#include <AIS_RadiusDimension.hxx>
#include <AIS_Relation.hxx>
#include <AIS_Shape.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <BRep_Builder.hxx>
#include <BRep_Tool.hxx>
#include <BRepTools.hxx>
#include <Draw_Interpretor.hxx>
#include <Draw.hxx>
#include <Draw_Appli.hxx>
#include <Draw_Window.hxx>
#include <DBRep.hxx>
#include <ElSLib.hxx>
#include <GC_MakePlane.hxx>
#include <Geom_CartesianPoint.hxx>
#include <Geom_Circle.hxx>
#include <Geom_Plane.hxx>
#include <gp_Circ.hxx>
#include <gp_Pln.hxx>
#include <IntAna_IntConicQuad.hxx>
#include <IntAna_Quadric.hxx>
#include <Precision.hxx>
#include <Select3D_Projector.hxx>
#include <StdSelect.hxx>
#include <string.h>
#include <TCollection_AsciiString.hxx>
#include <TCollection_ExtendedString.hxx>
#include <TColStd_MapOfInteger.hxx>
#include <TopAbs.hxx>
#include <TopAbs_ShapeEnum.hxx>
#include <TopExp.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Solid.hxx>
#include <TopoDS_Vertex.hxx>
#include <V3d_Viewer.hxx>
#include <V3d_View.hxx>
#include <V3d.hxx>
#include <ViewerTest_DoubleMapOfInteractiveAndName.hxx>
#include <ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName.hxx>
#include <ViewerTest_EventManager.hxx>
extern ViewerTest_DoubleMapOfInteractiveAndName& GetMapOfAIS();
extern int ViewerMainLoop(Standard_Integer argc, const char** argv);
extern Handle(AIS_InteractiveContext)& TheAISContext ();
#ifdef HAVE_STRINGS_H
# include <strings.h>
#endif
#define VertexMask 0x01
#define EdgeMask 0x02
#define FaceMask 0x04
static Standard_Boolean ComputeIntersection(const gp_Lin& L,const gp_Pln& ThePl, gp_Pnt& TheInter)
{
static IntAna_Quadric TheQuad;
TheQuad.SetQuadric(ThePl);
static IntAna_IntConicQuad QQ;
QQ.Perform(L,TheQuad);
if(QQ.IsDone()){
if(QQ.NbPoints()>0){
TheInter = QQ.Point(1);
return Standard_True;
}
}
return Standard_False;
}
//=======================================================================
//function : Get3DPointAtMousePosition
//purpose : calcul du point 3D correspondant a la position souris dans le plan de
// la vue...
//=======================================================================
static gp_Pnt Get3DPointAtMousePosition ()
{
Handle(V3d_View) aview = ViewerTest::CurrentView();
static Select3D_Projector prj;
prj.SetView(aview);
// le plan de la vue...
Standard_Real xv,yv,zv;
aview->Proj(xv,yv,zv);
Standard_Real xat,yat,zat;
aview->At(xat,yat,zat);
gp_Pln ThePl(gp_Pnt(xat,yat,zat),gp_Dir(xv,yv,zv));
Standard_Integer xpix,ypix;
Standard_Real x,y;
ViewerTest::GetMousePosition(xpix,ypix);
aview->Convert(xpix,ypix,x,y); // espace reel 2D de la vue...
gp_Lin L = prj.Shoot(x,y);
gp_Pnt P(0.,0.,0.);
ComputeIntersection(L,ThePl,P);
return P;
}
//=======================================================================
//function : ComputeNewPlaneForDim
//purpose :
//=======================================================================
static void ComputeNewPlaneForDim (const Handle(AIS_Relation)& R,
gp_Pln& ,
gp_Pnt&)
{
// 0 COMPOUND,
// 1 COMPSOLID,
// 2 SOLID,
// 3 SHELL,
// 4 FACE,
// 5 WIRE,
// 6 EDGE,
// 7 VERTEX,
// 8 SHAPE
TopoDS_Shape S1 = R->FirstShape();
TopoDS_Shape S2 = R->SecondShape();
TopAbs_ShapeEnum Typ1 = S1.ShapeType();
TopAbs_ShapeEnum Typ2 = S2.ShapeType();
gp_Pnt thepoint [3];
thepoint[0] = Get3DPointAtMousePosition();
// on met l'objet le plus petit en 1...
if((Standard_Integer)Typ2>(Standard_Integer)Typ1){
TopoDS_Shape tmpS = S1;
TopAbs_ShapeEnum tmpT = Typ1;
S1= S2;
Typ1 = Typ2;
S2= tmpS;
Typ2 = tmpT;
}
/*
switch (Typ1){
case TopAbs_VERTEX:{
thepoint[0] = BRep_Tool::Pnt(S1);
if(Typ2==TopAbs_VERTEX)
thepoint[1] = BRep_Tool::Pnt(S2);
else if(Typ2==TopAbs_EDGE){
TopoDS_Vertex Va,Vb;
TopExp::Vertices(S2,Va,Vb);
thepoint[1] = BRep_Tool::Pnt(Va);
}
else if(Typ2==TopAbs_FACE){
}
break;
}
case TopAbs_EDGE:
}
*/
}
//=======================================================================
//function : VDimBuilder
//purpose : Command for updated dimenasions: angle, length, radius, diameter
//draw args : vdim -{angle|length|radius|diameter} -name={Dim_Name}
// shape1 [shape2 [shape3]] [-text={2d|3d} -plane={xoy|yoz|zox}]
//=======================================================================
static int VDimBuilder(Draw_Interpretor& theDi, Standard_Integer theArgsNb, const char** theArgs)
{
if (theArgsNb < 2)
{
theDi << theArgs[0] << ": command argument is required. Type help for more information.\n";
return 1;
}
// Parse parameters
TCollection_AsciiString aDimType(theArgs[1]);
AIS_KindOfDimension aKindOfDimension;
if (aDimType == "-length")
{
aKindOfDimension = AIS_KOD_LENGTH;
}
else if (aDimType == "-angle")
{
aKindOfDimension = AIS_KOD_PLANEANGLE;
}
else if (aDimType == "-radius")
{
aKindOfDimension = AIS_KOD_RADIUS;
}
else if (aDimType == "-diameter" || aDimType == "-diam")
{
aKindOfDimension = AIS_KOD_DIAMETER;
}
else
{
theDi << theArgs[0] << ": wrong type of dimension. Type help for more information.\n";
return 1;
}
NCollection_List<Handle(AIS_InteractiveObject)> aShapes;
Handle(Prs3d_DimensionAspect) anAspect = new Prs3d_DimensionAspect;
Standard_Boolean isPlaneCustom = Standard_False;
TCollection_AsciiString aName;
gp_Pln aWorkingPlane;
for (Standard_Integer anIt = 2; anIt < theArgsNb; ++anIt)
{
TCollection_AsciiString aParam (theArgs[anIt]);
if (aParam.Search("-text") == 1)
{
anAspect->MakeText3d(aParam.Search("3d") != -1 ? Standard_True : Standard_False);
}
else if (aParam.Search("-name") == 1)
{
Standard_Integer aParamNameEnd = aParam.FirstLocationInSet("=",1, aParam.Length());
if (aParamNameEnd == 0)
{
theDi << theArgs[0] << ": no name for dimension.\n";
return 1;
}
aName = aParam.Split(aParamNameEnd);
}
else if (aParam.Search("-plane") == 1)
{
isPlaneCustom = Standard_True;
if (aParam.Search("xoy") != -1)
aWorkingPlane = gp_Pln (gp_Ax3(gp::XOY()));
else if (aParam.Search("zox") != -1)
aWorkingPlane = gp_Pln (gp_Ax3(gp::ZOX()));
else if (aParam.Search("yoz") != -1)
aWorkingPlane = gp_Pln (gp_Ax3(gp::YOZ()));
else
{
theDi << theArgs[0] << ": wrong plane.\n";
return 1;
}
}
else if (aParam.Search("-") != 1) // Shape
{
if (!GetMapOfAIS().IsBound2 (aParam))
{
theDi << theArgs[0] << ": wrong name of shape. May be here is a wrong parameter.\n";
return 1;
}
Handle(AIS_InteractiveObject) aShape = Handle(AIS_InteractiveObject)::DownCast (GetMapOfAIS().Find2 (aParam));
if (aShape.IsNull())
return 1;
aShapes.Append (aShape);
}
}
// Build dimension
Handle(AIS_Dimension) aDim;
switch (aKindOfDimension)
{
case AIS_KOD_LENGTH:
{
if (!isPlaneCustom)
{
theDi << theArgs[0] << ": can build dimension without working plane.\n";
return 1;
}
if (aShapes.Extent() == 1)
{
if (aShapes.First()->Type() == AIS_KOI_Shape
&& (Handle(AIS_Shape)::DownCast(aShapes.First()))->Shape().ShapeType() != TopAbs_EDGE)
{
theDi << theArgs[0] << ": wrong shape type.\n";
return 1;
}
aDim = new AIS_LengthDimension (TopoDS::Edge ((Handle(AIS_Shape)::DownCast(aShapes.First()))->Shape()), aWorkingPlane);
}
else if (aShapes.Extent() == 2)
{
if (aShapes.First()->Type() == AIS_KOI_Shape && aShapes.Last()->Type() == AIS_KOI_Shape)
aDim = new AIS_LengthDimension ((Handle(AIS_Shape)::DownCast(aShapes.First ()))->Shape(),
(Handle(AIS_Shape)::DownCast(aShapes.Last ()))->Shape(),
aWorkingPlane);
else// AIS_Point
{
Handle(AIS_Point) aPoint1 = Handle(AIS_Point)::DownCast(aShapes.First ());
Handle(AIS_Point) aPoint2 = Handle(AIS_Point)::DownCast(aShapes.Last ());
aDim = new AIS_LengthDimension (aPoint1->Component()->Pnt(),
aPoint2->Component()->Pnt(),
aWorkingPlane);
}
}
else
{
theDi << theArgs[0] << ": wrong number of shapes to build dimension.\n";
return 1;
}
}
break;
case AIS_KOD_PLANEANGLE:
{
if (aShapes.Extent() == 1 && aShapes.First()->Type()==AIS_KOI_Shape)
{
Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(aShapes.First());
if (aShape->Shape().ShapeType() == TopAbs_FACE)
aDim = new AIS_AngleDimension (TopoDS::Face(aShape->Shape()));
}
if (aShapes.Extent() == 2)
{
Handle(AIS_Shape) aShape1 = Handle(AIS_Shape)::DownCast(aShapes.First());
Handle(AIS_Shape) aShape2 = Handle(AIS_Shape)::DownCast(aShapes.Last());
if (!aShape1.IsNull() && !aShape2.IsNull()
&& aShape1->Shape().ShapeType() == TopAbs_EDGE
&& aShape2->Shape().ShapeType() == TopAbs_EDGE)
aDim = new AIS_AngleDimension (TopoDS::Edge(aShape1->Shape()),TopoDS::Edge(aShape2->Shape()));
else
{
theDi << theArgs[0] << ": wrong shapes for angle dimension.\n";
return 1;
}
}
else if (aShapes.Extent() == 3)
{
gp_Pnt aP1, aP2, aP3;
Handle(AIS_Point) aPoint = Handle(AIS_Point)::DownCast (aShapes.First());
if (aPoint.IsNull())
return 1;
aP1 = aPoint->Component()->Pnt();
aShapes.RemoveFirst();
aPoint = Handle(AIS_Point)::DownCast (aShapes.First());
if (aPoint.IsNull())
return 1;
aP2 = aPoint->Component()->Pnt();
aShapes.RemoveFirst();
aPoint = Handle(AIS_Point)::DownCast (aShapes.First());
if (aPoint.IsNull())
return 1;
aP3 = aPoint->Component()->Pnt();
aDim = new AIS_AngleDimension (aP1, aP2, aP3);
}
else
{
theDi << theArgs[0] << ": wrong number of shapes to build dimension.\n";
return 1;
}
}
break;
case AIS_KOD_RADIUS: // radius of the circle
{
if (aShapes.Extent() == 1)
{
Handle(AIS_Circle) aShape = Handle(AIS_Circle)::DownCast (aShapes.First());
gp_Circ aCircle = aShape->Circle()->Circ();
aDim = new AIS_RadiusDimension (aCircle);
}
else
{
theDi << theArgs[0] << ": wrong number of shapes to build dimension.\n";
return 1;
}
}
break;
case AIS_KOD_DIAMETER:
{
if (aShapes.Extent() == 1)
{
Handle(AIS_Circle) aShape = Handle(AIS_Circle)::DownCast (aShapes.First());
gp_Circ aCircle = aShape->Circle()->Circ();
aDim = new AIS_DiameterDimension (aCircle);
}
else
{
theDi << theArgs[0] << ": wrong number of shapes to build dimension.\n";
return 1;
}
}
break;
default:
{
theDi << theArgs[0] << ": wrong type of dimension. Type help for more information.\n";
return 1;
}
}
aDim->SetDimensionAspect (anAspect);
if (GetMapOfAIS().IsBound2(aName))
{
theDi << theArgs[0] << ": shape with name " << aName.ToCString ()<< " already exists. It will be replaced\n";
Handle(AIS_InteractiveObject) anObj =
Handle(AIS_InteractiveObject)::DownCast(GetMapOfAIS().Find2(aName));
TheAISContext()->Remove(anObj, Standard_False);
GetMapOfAIS().UnBind2(aName);
}
GetMapOfAIS().Bind (aDim,aName);
return 0;
}
//=======================================================================
//function : VAngleDimBuilder
//purpose :
//=======================================================================
static int VAngleDimBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
Standard_Integer myCurrentIndex;
if (argc!=2) {di<<" vangledim error."<<"\n";return 1;}
TheAISContext()->CloseAllContexts();
TheAISContext()->OpenLocalContext();
myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
di<<" Select two edges coplanar or not."<<"\n";
Standard_Integer argcc = 5;
const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argvv = (const char **) buff;
while (ViewerMainLoop( argcc, argvv) ) { }
TopoDS_Shape ShapeA;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeA = TheAISContext()->SelectedShape();
}
// Si ShapeA est un Edge.
if (ShapeA.ShapeType()== TopAbs_EDGE ) {
// Boucle d'attente waitpick.
Standard_Integer argccc = 5;
const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argvvv = (const char **) bufff;
while (ViewerMainLoop( argccc, argvvv) ) { }
// fin de la boucle
TopoDS_Shape ShapeB;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeB = TheAISContext()->SelectedShape();
}
// ShapeB doit etre un Edge
if (ShapeB.ShapeType()!= TopAbs_EDGE ) {
di<<" vangledim error: you shoud have selected an edge."<<"\n";return 1;
}
// on recupere les vertexes de edgeA
TopoDS_Vertex Va,Vb;
TopExp::Vertices(TopoDS::Edge(ShapeA),Va ,Vb );
// Recuperation des points.
gp_Pnt A=BRep_Tool::Pnt(Va);
gp_Pnt B=BRep_Tool::Pnt(Vb);
gp_Pnt C(A.X()+5 ,A.Y()+5 ,A.Z()+5 );
// Construction du plane. Methode pas orthodoxe!
GC_MakePlane MkPlane(A ,B ,C );
Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
// Construction du texte.
TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("d=")+TCollection_ExtendedString( 90 ) );
// Fermeture du context local.
TheAISContext()->CloseLocalContext(myCurrentIndex);
// Construction de l'AIS dimension
Handle (AIS_AngleDimension) myAISDim= new AIS_AngleDimension (TopoDS::Edge(ShapeA) ,TopoDS::Edge(ShapeB) ,theGeomPlane->Pln());
GetMapOfAIS().Bind (myAISDim,argv[1]);
TheAISContext()->Display(myAISDim );
}
else {
di<<" vangledim error: you must select 2 edges."<<"\n";return 1;
}
return 0;
}
//==============================================================================
//function : VDiameterDim
//purpose : Display the diameter dimension of a face or an edge.
//Draw arg : vdiameterdim Name
//==============================================================================
static int VDiameterDimBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
// Declarations
Standard_Integer myCurrentIndex;
Standard_Real theRadius;
// Verification
if (argc!=2) {di<<" vdiameterdim error"<<"\n";return 1;}
// Fermeture des contextes locaux
TheAISContext()->CloseAllContexts();
// Ouverture d'un contexte local et recuperation de son index.
TheAISContext()->OpenLocalContext();
myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
// On active les modes de selections Edges et Faces.
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
di<<" Select an circled edge."<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argcc = 5;
const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argvv = (const char **) buff;
while (ViewerMainLoop( argcc, argvv) ) { }
// fin de la boucle
TopoDS_Shape ShapeA;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeA = TheAISContext()->SelectedShape();
}
if (ShapeA.ShapeType()==TopAbs_EDGE ) {
// Recuperation du rayon
BRepAdaptor_Curve theCurve(TopoDS::Edge(ShapeA));
if (theCurve.GetType()!=GeomAbs_Circle ) {di<<"vdiameterdim error: the edge is not a circular one."<<"\n";return 1;}
else {
gp_Circ theGpCircle=theCurve.Circle();
theRadius=2.*theGpCircle.Radius();
}
// Construction du texte.
TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("d=")+TCollection_ExtendedString(theRadius ) );
// Construction de L'AIS_AngleDimension.
TheAISContext()->CloseLocalContext(myCurrentIndex);
Handle (AIS_DiameterDimension) myDiamDim= new AIS_DiameterDimension(ShapeA);
GetMapOfAIS().Bind (myDiamDim,argv[1]);
TheAISContext()->Display(myDiamDim );
}
else {
di<<" vdiameterdim error: the selection of a face or an edge was expected."<<"\n";return 1;
}
return 0;
}
//==============================================================================
// Fonction vconcentric
// ----------------- Uniquement par selection dans le viewer.
//==============================================================================
//==============================================================================
//function : VConcentric
//purpose : Display the concentric relation between two surfaces.
//Draw arg : vconcentric Name
//==============================================================================
#include <AIS_ConcentricRelation.hxx>
#include <Geom_Plane.hxx>
#include <gp_Pln.hxx>
#include <GC_MakePlane.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <TopExp_Explorer.hxx>
static int VConcentricBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
// Declarations
Standard_Integer myCurrentIndex;
// Verification
if (argc!=2) {di<<"vconcentric error."<<"\n";return 1;}
// Fermeture des contextes locaux
TheAISContext()->CloseAllContexts();
// Ouverture d'un contexte local et recuperation de son index.
TheAISContext()->OpenLocalContext();
myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
// On active les modes de selections Edges et Faces.
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
di<<" Select a circled edge."<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argcc = 5;
const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argvv = (const char **) buff;
while (ViewerMainLoop( argcc, argvv) ) { }
// fin de la boucle
TopoDS_Shape ShapeA;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeA = TheAISContext()->SelectedShape();
}
// ShapeA est un edge
// ==================
if (ShapeA.ShapeType()==TopAbs_EDGE ) {
TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(4) );
di<<" Select an edge."<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argccc = 5;
const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argvvv = (const char **) bufff;
while (ViewerMainLoop( argccc, argvvv) ) { }
// fin de la boucle
TopoDS_Shape ShapeB;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeB = TheAISContext()->SelectedShape();
}
if (ShapeB.ShapeType()!=TopAbs_EDGE ) {
di<<" vconcentric error: select an edge."<<"\n";return 1;
}
// Construction du plane.
// On recupere le centre du cercle A.
BRepAdaptor_Curve theCurveA(TopoDS::Edge(ShapeA) );
gp_Circ theCircleA=theCurveA.Circle();
gp_Pnt theCenterA=theCircleA.Location();
// On recupere deux points sur le cercle A
gp_Pnt B= theCurveA.Value(0.25);
gp_Pnt C= theCurveA.Value(0.75);
// Construction du plane.
GC_MakePlane MkPlane(theCenterA ,B ,C );
Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
// Fermeture du context local
TheAISContext()->CloseLocalContext(myCurrentIndex);
Handle (AIS_ConcentricRelation) myConcentry= new AIS_ConcentricRelation(ShapeA, ShapeB, theGeomPlane );
TheAISContext()->Display(myConcentry );
GetMapOfAIS().Bind (myConcentry,argv[1]);
}
else {
di<<" vconcentric error: the selection of a face or an edge was expected."<<"\n";return 1;
}
return 0;
}
//==============================================================================
//function : VEqualDistRelation
//purpose :
//Draw arg : vdiameterdim Name DiameterValue
//==============================================================================
#include <AIS_EqualDistanceRelation.hxx>
#include <BRepExtrema_ExtCC.hxx>
#include <GC_MakePlane.hxx>
static int VEqualDistRelation(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
// Declarations
Standard_Integer myCurrentIndex;
// Verification
if (argc!=2) {di<<" vequaldistrelation error: no arguments allowed."<<"\n";return 1;}
// Fermeture des contextes locaux
TheAISContext()->CloseAllContexts();
// Ouverture d'un contexte local et recuperation de son index.
TheAISContext()->OpenLocalContext();
myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
// On active les modes de selections Edges et Vertexes.
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(1) );
di<<" Select an edge or a vertex"<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argc1 = 5;
const char *buf1[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argv1 = (const char **) buf1;
while (ViewerMainLoop( argc1, argv1) ) { }
// fin de la boucle
TopoDS_Shape ShapeA;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeA = TheAISContext()->SelectedShape();
}
di<<" Select an edge or a vertex"<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argc2 = 5;
const char *buf2[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argv2 = (const char **) buf2;
while (ViewerMainLoop( argc2, argv2) ) { }
// fin de la boucle
TopoDS_Shape ShapeB;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeB = TheAISContext()->SelectedShape();
}
// Verification des resultats.
if (ShapeA.ShapeType()==TopAbs_EDGE && ShapeB.ShapeType()==TopAbs_EDGE ) {
// A et B sont des edges ils doivent etre paralleles
BRepExtrema_ExtCC myDeltaEdge (TopoDS::Edge(ShapeA) ,TopoDS::Edge(ShapeB) );
// on verifie qu'ils sont pas paralleles.
if (!myDeltaEdge.IsParallel() ) {di<<"vequaldist error: non parallel edges."<<"\n";return 1; }
}
di<<" Select an edge or a vertex"<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argc3 = 5;
const char *buf3[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argv3 = (const char **) buf3;
while (ViewerMainLoop( argc3, argv3) ) { }
// fin de la boucle
TopoDS_Shape ShapeC;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeC = TheAISContext()->SelectedShape();
}
di<<" Select an edge or a vertex"<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argc4 = 5;
const char *buf4[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argv4 = (const char **) buf4;
while (ViewerMainLoop( argc4, argv4) ) { }
// fin de la boucle
TopoDS_Shape ShapeD;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeD = TheAISContext()->SelectedShape();
}
// Verification des resultats.
if (ShapeC.ShapeType()==TopAbs_EDGE && ShapeD.ShapeType()==TopAbs_EDGE ) {
// C et D sont des edges ils doivent etre paralleles
BRepExtrema_ExtCC myDeltaEdge2 (TopoDS::Edge(ShapeC) ,TopoDS::Edge(ShapeD) );
// on verifie qu'ils sont pas paralleles.
if (!myDeltaEdge2.IsParallel() ) {di<<"vequaldist error: non parallel edges."<<"\n";return 1; }
}
// Creation du plan porteur de la contrainte.Methode lourde!
gp_Pnt A,B,C;
if (ShapeA.ShapeType()==TopAbs_EDGE) {
// A est un edge
TopoDS_Vertex Va,Vb;
TopExp::Vertices (TopoDS::Edge(ShapeA) ,Va ,Vb );
A=BRep_Tool::Pnt(Va);
B=BRep_Tool::Pnt(Vb);
if (ShapeB.ShapeType()==TopAbs_EDGE) {
// B est un edge aussi
TopoDS_Vertex Vc,Vd;
TopExp::Vertices (TopoDS::Edge(ShapeB) ,Vc ,Vd );
// besoin que de 1 point.
C=BRep_Tool::Pnt(Vc);
}
else {
// B est un vertex
C=BRep_Tool::Pnt(TopoDS::Vertex(ShapeB) );
}
}
else {
// A est un vertex
A=BRep_Tool::Pnt(TopoDS::Vertex(ShapeA) );
if (ShapeB.ShapeType()==TopAbs_EDGE ) {
// B est un edge
TopoDS_Vertex Vb,Vc;
TopExp::Vertices (TopoDS::Edge(ShapeB) ,Vb ,Vc );
// besoin que de 2 points.
B=BRep_Tool::Pnt(Vb);
C=BRep_Tool::Pnt(Vc);
}
else {
// B est un vertex
B=BRep_Tool::Pnt(TopoDS::Vertex(ShapeB) );
C.SetX(B.X()+5.);
C.SetY(B.Y()+5.);
C.SetZ(B.Z()+5.);
}
}
// Fermeture du context local.
TheAISContext()->CloseLocalContext(myCurrentIndex);
// construction du plane
GC_MakePlane MkPlane(A ,B ,C );
Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
// Construction de l'AIS_EqualDistanceRelation
Handle (AIS_EqualDistanceRelation ) myRelation= new AIS_EqualDistanceRelation (ShapeA, ShapeB, ShapeC ,ShapeD , theGeomPlane );
TheAISContext()->Display(myRelation );
GetMapOfAIS().Bind (myRelation,argv[1]);
return 0;
}
//==============================================================================
//function : VEqualRadiusRelation
//purpose :
//Draw arg : vdiameterdim Name DiameterValue
//==============================================================================
#include <AIS_EqualRadiusRelation.hxx>
#include <GC_MakePlane.hxx>
#include <BRepAdaptor_Curve.hxx>
static int VEqualRadiusRelation(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
// Declarations
Standard_Integer myCurrentIndex;
// Verification
if (argc!=2) {di<<" vequalrad error: no arguments allowed."<<"\n";return 1;}
// Fermeture des contextes locaux
TheAISContext()->CloseAllContexts();
// Ouverture d'un contexte local et recuperation de son index.
TheAISContext()->OpenLocalContext();
myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
// On active les modes de selections Edges.
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
di<<" Select an circled edge "<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argc1 = 5;
const char *buf1[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argv1 = (const char **) buf1;
while (ViewerMainLoop( argc1, argv1) ) { }
// fin de la boucle
TopoDS_Shape ShapeA;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeA = TheAISContext()->SelectedShape();
}
di<<" Select the last circled edge."<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argc2 = 5;
const char *buf2[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argv2 = (const char **) buf2;
while (ViewerMainLoop( argc2, argv2) ) { }
// fin de la boucle
TopoDS_Shape ShapeB;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeB = TheAISContext()->SelectedShape();
}
// creation du plan qui contient la contrainte.
TopoDS_Edge EdgeA=TopoDS::Edge(ShapeA);
TopoDS_Edge EdgeB=TopoDS::Edge(ShapeB);
BRepAdaptor_Curve theCurveA(EdgeA);
// On recupere 3 points A,B,C de la curve.
gp_Pnt A=theCurveA.Value(0.1);
gp_Pnt B=theCurveA.Value(0.5);
gp_Pnt C=theCurveA.Value(0.9);
// fermeture du contexte local.
TheAISContext()->CloseLocalContext(myCurrentIndex);
// Creation du plane.
GC_MakePlane MkPlane (A ,B ,C );
Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
// Construction de l'AIS_EqualRadiusRelation
Handle (AIS_EqualRadiusRelation ) myRelation= new AIS_EqualRadiusRelation (EdgeA,EdgeB, theGeomPlane );
TheAISContext()->Display(myRelation );
GetMapOfAIS().Bind (myRelation,argv[1]);
return 0;
}
//==============================================================================
//function : VFixRelation
//purpose :
//Draw arg : vdiameterdim Name DiameterValue
//==============================================================================
#include <AIS_FixRelation.hxx>
#include <GC_MakePlane.hxx>
#include <BRepAdaptor_Curve.hxx>
static int VFixRelation(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
// Declarations
Standard_Integer myCurrentIndex;
// Verification
if (argc!=2) {di<<" vfix error: no arguments allowed."<<"\n";return 1;}
// Fermeture des contextes locaux
TheAISContext()->CloseAllContexts();
// Ouverture d'un contexte local et recuperation de son index.
TheAISContext()->OpenLocalContext();
myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
// On active les modes de selections edge.
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
di<<" Select an edge. "<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argc1 = 5;
const char *buf1[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argv1 = (const char **) buf1;
while (ViewerMainLoop( argc1, argv1) ) { }
// fin de la boucle
TopoDS_Shape ShapeA;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeA = TheAISContext()->SelectedShape();
}
// creation du plan qui contient la contrainte.
TopoDS_Edge EdgeA=TopoDS::Edge(ShapeA);
BRepAdaptor_Curve theCurveA(EdgeA);
// On recupere 3 points A,B,C de la curve.
gp_Pnt A=theCurveA.Value(0.1);
gp_Pnt B=theCurveA.Value(0.5);
gp_Pnt D=theCurveA.Value(0.9);
gp_Pnt C(B.X()+5,B.Y()+5,B.Z()+5);
// fermeture du contexte local.
TheAISContext()->CloseLocalContext(myCurrentIndex);
// Creation du plane.
GC_MakePlane MkPlane (A ,D ,C );
Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
// Construction de l'AIS_EqualRadiusRelation
Handle (AIS_FixRelation) myRelation= new AIS_FixRelation (EdgeA,theGeomPlane );
TheAISContext()->Display(myRelation );
GetMapOfAIS().Bind (myRelation,argv[1]);
return 0;
}
//==============================================================================
//function : VIdenticRelation
//purpose :
//Draw arg : vdiameterdim Name DiameterValue
//==============================================================================
#include <AIS_IdenticRelation.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <TopExp_Explorer.hxx>
static int VIdenticRelation(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
// Declarations
Standard_Integer myCurrentIndex;
// Verification
if (argc!=2) {di<<" videntity error: no arguments allowed."<<"\n";return 1;}
// Fermeture des contextes locaux
TheAISContext()->CloseAllContexts();
// Ouverture d'un contexte local et recuperation de son index.
TheAISContext()->OpenLocalContext();
myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
// On active les modes de selections vertex et face.
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(1) );
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(4) );
di<<" Select an edge, a face or a vertex. "<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argc1 = 5;
const char *buf1[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argv1 = (const char **) buf1;
while (ViewerMainLoop( argc1, argv1) ) { }
// fin de la boucle
TopoDS_Shape ShapeA;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeA = TheAISContext()->SelectedShape();
}
di<<" Select an edge, a face or a vertex. "<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argc2 = 5;
const char *buf2[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argv2 = (const char **) buf2;
while (ViewerMainLoop( argc2, argv2) ) { }
// fin de la boucle
TopoDS_Shape ShapeB;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeB = TheAISContext()->SelectedShape();
}
// Recuperation de points pour construir le Geom_Plnae.
gp_Pnt A,B,C;
if (ShapeA.ShapeType()==TopAbs_EDGE) {
// A est un edge; on peut supposer qu'il sera element d'une face ou possesseur d'un vertex ou identic a un autre edge.
// on recupere deux points sur l'edge (il peut etre rectiligne)
TopoDS_Edge EdgeA=TopoDS::Edge(ShapeA);
BRepAdaptor_Curve theCurveA(EdgeA);
// Creation des 3 points.
A=theCurveA.Value(0.1);
B=theCurveA.Value(0.9);
C.SetX(B.X()+5.);
C.SetY(B.Y()+5.);
C.SetZ(B.Z()+5.);
}
else if (ShapeA.ShapeType()==TopAbs_VERTEX ) {
// SahpeA est un Vertex
// On va utiliser ShapeB
if (ShapeB.ShapeType()==TopAbs_EDGE) {
// B est un edge
TopoDS_Edge EdgeB=TopoDS::Edge(ShapeB);
BRepAdaptor_Curve theCurveB(EdgeB);
// Creation des 3 points.
A=theCurveB.Value(0.1);
B=theCurveB.Value(0.9);
C.SetX(B.X()+5.);
C.SetY(B.Y()+5.);
C.SetZ(B.Z()+5.);
}
else if (ShapeB.ShapeType()==TopAbs_FACE ) {
// Shape B est une face
TopoDS_Face FaceB=TopoDS::Face(ShapeB);
// On recupere 1 edge de FaceB(la face n'a pas forcement de vertex) (l'element A est forcement dans B).
TopExp_Explorer FaceExp(FaceB,TopAbs_EDGE);
TopoDS_Edge EdgeFromB=TopoDS::Edge(FaceExp.Current() );
// On recupere les 3 points de l'edge de face B
BRepAdaptor_Curve theCurveB(EdgeFromB);
// On recupere 3 points A,B,C de la curve.
A=theCurveB.Value(0.1);
B=theCurveB.Value(0.5);
C=theCurveB.Value(0.9);
}
else {
// B ets un vetex aussi
A=BRep_Tool::Pnt(TopoDS::Vertex(ShapeA) );
B=BRep_Tool::Pnt(TopoDS::Vertex(ShapeB) );
C.SetX(B.X()+5.);
C.SetY(B.Y()+5.);
C.SetZ(B.Z()+5.);
}
}
else {
// A est une face.
TopoDS_Face FaceA=TopoDS::Face(ShapeA);
// On recupere 1 edge de FaceA
TopExp_Explorer FaceExp(FaceA,TopAbs_EDGE);
TopoDS_Edge EdgeFromA=TopoDS::Edge(FaceExp.Current() );
// On recupere les 3 points de l'edge
BRepAdaptor_Curve theCurveA(EdgeFromA);
// On recupere 3 points A,B,C de la curve.
A=theCurveA.Value(0.1);
B=theCurveA.Value(0.5);
C=theCurveA.Value(0.9);
}
// Fermeture du context local.
TheAISContext()->CloseLocalContext(myCurrentIndex);
// On construit le plane
GC_MakePlane MkPlane (A ,B ,C );
Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
// Construction de l'AIS_IdenticRelation
Handle ( AIS_IdenticRelation ) myRelation= new AIS_IdenticRelation (ShapeA ,ShapeB, theGeomPlane );
TheAISContext()->Display(myRelation );
GetMapOfAIS().Bind (myRelation,argv[1]);
return 0;
}
//==============================================================================
//function : VLengthDimension
//purpose : Display the diameter dimension of a face or an edge.
//Draw arg : vdiameterdim Name DiameterValue
//==============================================================================
#include <AIS_LengthDimension.hxx>
#include <BRepExtrema_ExtCC.hxx>
#include <BRepExtrema_ExtPC.hxx>
#include <BRepExtrema_ExtCF.hxx>
#include <BRepExtrema_ExtPF.hxx>
#include <BRepExtrema_ExtFF.hxx>
#include <TCollection_ExtendedString.hxx>
#include <BRepExtrema_DistShapeShape.hxx>
#include <GC_MakePlane.hxx>
#include <TopExp_Explorer.hxx>
#include <BRepBuilderAPI_MakeVertex.hxx>
static int VLenghtDimension(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
// Declarations
Standard_Integer myCurrentIndex;
Standard_Real theDist;
// Verification
if (argc!=2) {di<<" videntity error: no arguments allowed."<<"\n";return 1;}
// Fermeture des contextes locaux
TheAISContext()->CloseAllContexts();
// Ouverture d'un contexte local et recuperation de son index.
myCurrentIndex = TheAISContext()->OpenLocalContext();
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(1) );
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(4) );
di<<" Select an edge, a face or a vertex. "<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argc1 = 5;
const char *buf1[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argv1 = (const char **) buf1;
while (ViewerMainLoop( argc1, argv1) ) { }
// fin de la boucle
TopoDS_Shape ShapeA;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeA = TheAISContext()->SelectedShape();
}
di<<" Select an edge, a face or a vertex. "<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argc2 = 5;
const char *buf2[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argv2 = (const char **) buf2;
while (ViewerMainLoop( argc2, argv2) ) { }
// fin de la boucle
TopoDS_Shape ShapeB;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeB = TheAISContext()->SelectedShape();
}
// ShapeA est un edge.
// ===================
if (ShapeA.ShapeType()==TopAbs_EDGE ) {
TopoDS_Edge EdgeA=TopoDS::Edge(ShapeA);
// Si ShapeB est un edge
if (ShapeB.ShapeType()==TopAbs_EDGE ) {
TopoDS_Edge EdgeB=TopoDS::Edge(ShapeB);
BRepExtrema_ExtCC myDeltaEdge (EdgeA ,EdgeB );
// on verifie qu'ils ne sont pas paralleles.
if (!myDeltaEdge.IsParallel() ) {di<<"vlenghtdim error: non parallel edges."<<"\n";return 1; }
// On saisit la distance et on l'arrondit!
theDist=Round (sqrt(myDeltaEdge.SquareDistance(1))*10. )/10.;
// On recupere 3 Points des edges pour construire un plane.
TopoDS_Vertex Va,Vb,Vc,Vd;
TopExp::Vertices(EdgeA,Va,Vb);
TopExp::Vertices(EdgeB,Vc,Vd);
gp_Pnt A=BRep_Tool::Pnt(Va);
gp_Pnt B=BRep_Tool::Pnt(Vb);
gp_Pnt C=BRep_Tool::Pnt(Vc);
// Creation du Plane contenant la relation.
GC_MakePlane MkPlane(A,B,C);
Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("d=")+TCollection_ExtendedString(theDist ) );
// On ferme le contexte local.
TheAISContext()->CloseLocalContext(myCurrentIndex);
// on construit l'AISLenghtDimension.
Handle(AIS_LengthDimension ) myLenghtDim=new AIS_LengthDimension (EdgeA,EdgeB,theGeomPlane->Pln());
TheAISContext()->Display(myLenghtDim );
GetMapOfAIS().Bind (myLenghtDim ,argv[1]);
}
// Si ShapeB est un vertex.
else if (ShapeB.ShapeType()==TopAbs_VERTEX ) {
TopoDS_Vertex VertexB=TopoDS::Vertex(ShapeB);
BRepExtrema_ExtPC myDeltaEdgeVertex (VertexB ,EdgeA );
// On saisit la distance et on l'arrondit!
theDist=Round (sqrt (myDeltaEdgeVertex.SquareDistance(1))*10. )/10.;
// On recupere 2 Points de EdgeA pour construire un plane.
TopoDS_Vertex Va,Vb;
TopExp::Vertices(EdgeA,Va,Vb);
gp_Pnt A=BRep_Tool::Pnt(Va);
gp_Pnt B=BRep_Tool::Pnt(Vb);
gp_Pnt C=BRep_Tool::Pnt(VertexB);
GC_MakePlane MkPlane(A,B,C);
Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("d=")+TCollection_ExtendedString(theDist ) );
TheAISContext()->CloseLocalContext(myCurrentIndex);
Handle(AIS_LengthDimension ) myLenghtDim=new AIS_LengthDimension (EdgeA,VertexB,theGeomPlane->Pln());
TheAISContext()->Display(myLenghtDim );
GetMapOfAIS().Bind (myLenghtDim ,argv[1]);
}
// Si ShapeB est une Face
else
{
TopoDS_Face FaceB=TopoDS::Face(ShapeB);
BRepExtrema_ExtCF myDeltaEdgeFace (EdgeA,FaceB );
// On verifie que l'edge est bien parallele a la face.
if (!myDeltaEdgeFace.IsParallel() ) {di<<"vdistdim error: the edge isn't parallel to the face;can't compute the distance. "<<"\n";return 1; }
// on construit l'AISLenghtDimension.
Handle(AIS_LengthDimension ) myLenghtDim=new AIS_LengthDimension (FaceB,EdgeA);
TheAISContext()->Display(myLenghtDim );
GetMapOfAIS().Bind (myLenghtDim ,argv[1]);
}
}
// ShapeA est un vertex
// ====================
if (ShapeA.ShapeType()==TopAbs_VERTEX ) {
TopoDS_Vertex VertexA=TopoDS::Vertex(ShapeA);
// Si ShapeB est un edge.
if (ShapeB.ShapeType()==TopAbs_EDGE ) {
TopoDS_Edge EdgeB=TopoDS::Edge(ShapeB);
BRepExtrema_ExtPC myDeltaEdgeVertex (VertexA ,EdgeB );
// On saisit la distance et on l'arrondit!
theDist=Round (sqrt (myDeltaEdgeVertex.SquareDistance(1))*10. )/10.;
// On recupere 2 Points de EdgeB pour construire un plane.
TopoDS_Vertex Va,Vb;
TopExp::Vertices(EdgeB,Va,Vb);
gp_Pnt A=BRep_Tool::Pnt(Va);
gp_Pnt B=BRep_Tool::Pnt(Vb);
gp_Pnt C=BRep_Tool::Pnt(VertexA);
// Creation du Plane contenant la relation.
GC_MakePlane MkPlane(A,B,C);
Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
// Fermeture du contexte local.
TheAISContext()->CloseLocalContext(myCurrentIndex);
// Construction du texte.
TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("d=")+TCollection_ExtendedString(theDist ) );
// on construit l'AISLenghtDimension.
Handle(AIS_LengthDimension ) myLenghtDim=new AIS_LengthDimension (EdgeB,VertexA,theGeomPlane->Pln());
TheAISContext()->Display(myLenghtDim );
GetMapOfAIS().Bind (myLenghtDim ,argv[1]);
}
// Si ShapeB est un vertex.
else if (ShapeB.ShapeType()==TopAbs_VERTEX ) {
TopoDS_Vertex VertexB=TopoDS::Vertex(ShapeB);
BRepExtrema_DistShapeShape myDeltaVertexVertex (VertexA ,VertexB );
// On saisit la distance et on l'arrondit!
theDist=Round (myDeltaVertexVertex.Value()*10. )/10.;
// Les deux premiers points.
gp_Pnt A=BRep_Tool::Pnt(VertexA);
gp_Pnt B=BRep_Tool::Pnt(VertexB);
gp_Pnt C(B.X()+10,B.Y()+10,B.Z()+10);
GC_MakePlane MkPlane(A,B,C);
Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
// Fermeture du contexte local.
TheAISContext()->CloseLocalContext(myCurrentIndex);
// Construction du texte.
TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("d=")+TCollection_ExtendedString(theDist ) );
// on construit l'AISLenghtDimension.
Handle(AIS_LengthDimension ) myLenghtDim=new AIS_LengthDimension (VertexA,VertexB,theGeomPlane->Pln());
TheAISContext()->Display(myLenghtDim );
GetMapOfAIS().Bind (myLenghtDim ,argv[1]);
}
// Si ShapeB est une Face
else {
TopoDS_Face FaceB=TopoDS::Face(ShapeB);
BRepExtrema_ExtPF myDeltaVertexFace (VertexA ,FaceB );
// On saisit la distance et on l'arrondit!
theDist=Round (sqrt (myDeltaVertexFace.SquareDistance(1))*10. )/10.;
// Premier point.
gp_Pnt A=BRep_Tool::Pnt(VertexA);
// On recupere 1 edge de FaceB.
TopExp_Explorer FaceExp(FaceB,TopAbs_EDGE);
TopoDS_Edge EdFromB=TopoDS::Edge(FaceExp.Current() );
// On recupere les deux vertexes extremites de l'edge de face B
TopoDS_Vertex Vb,Vc;
TopExp::Vertices(EdFromB,Vb,Vc);
#ifdef DEB
gp_Pnt B=
#endif
BRep_Tool::Pnt(Vb);
gp_Pnt C=BRep_Tool::Pnt(Vc);
// On projette le point B sur la Face car il
// n'existe pas de constructeurs AIS_LD PointFace
// on est donc oblige de creer un nouveau TopoDS_Vertex.
gp_Pnt theProjA=myDeltaVertexFace.Point(1);
BRepBuilderAPI_MakeVertex theVertexMaker(theProjA);
TopoDS_Vertex VertexAproj=theVertexMaker.Vertex();
// Creation du Plane contenant la relation.
GC_MakePlane MkPlane(A,theProjA,C);
Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
// Fermeture du contexte local.
TheAISContext()->CloseLocalContext(myCurrentIndex);
// Construction du texte.
TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("d=")+TCollection_ExtendedString(theDist ) );
// on construit l'AISLenghtDimension.
Handle(AIS_LengthDimension ) myLenghtDim=new AIS_LengthDimension (VertexA,VertexAproj,theGeomPlane->Pln());
TheAISContext()->Display(myLenghtDim );
GetMapOfAIS().Bind (myLenghtDim ,argv[1]);
}
}
// ShapeA est une Face
// ===================
else {
TopoDS_Face FaceA=TopoDS::Face(ShapeA);
// Si ShapeB est un edge.
if (ShapeB.ShapeType()==TopAbs_EDGE ) {
TopoDS_Edge EdgeB=TopoDS::Edge(ShapeB);
BRepExtrema_ExtCF myDeltaEdgeFace (EdgeB,FaceA );
// On verifie que l'edge est bien parallele a la face.
if (!myDeltaEdgeFace.IsParallel() ) {di<<"vdistdim error: the edge isn't parallel to the face;can't compute the distance. "<<"\n";return 1; }
// On saisit la distance et on l'arrondit!
theDist=Round (sqrt (myDeltaEdgeFace.SquareDistance(1))*10. )/10.;
// Construction du texte.
TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("d=")+TCollection_ExtendedString(theDist ) );
// on construit l'AISLenghtDimension.
Handle(AIS_LengthDimension ) myLenghtDim=new AIS_LengthDimension (FaceA,EdgeB);
TheAISContext()->Display(myLenghtDim );
GetMapOfAIS().Bind (myLenghtDim ,argv[1]);
}
// Si ShapeB est un vertex.
else if (ShapeB.ShapeType()==TopAbs_VERTEX ) {
TopoDS_Vertex VertexB=TopoDS::Vertex(ShapeB);
BRepExtrema_ExtPF myDeltaVertexFace (VertexB ,FaceA );
// On saisit la distance et on l'arrondit!
theDist=Round (sqrt (myDeltaVertexFace.SquareDistance(1))*10. )/10.;
// Premier point.
gp_Pnt B=BRep_Tool::Pnt(VertexB);
// On recupere 1 edge de FaceA.
TopExp_Explorer FaceExp(FaceA,TopAbs_EDGE);
TopoDS_Edge EdFromA=TopoDS::Edge(FaceExp.Current() );
// On recupere les deux vertexes extremites de l'edge de face A
TopoDS_Vertex Va,Vc;
TopExp::Vertices(EdFromA,Va,Vc);
gp_Pnt A=BRep_Tool::Pnt(Va);
#ifdef DEB
gp_Pnt C=
#endif
BRep_Tool::Pnt(Vc);
// On projette le point B sur la Face car il
// n'existe pas de constructeurs AIS_LD PointFace
// on est donc oblige de creer un nouveau TopoDS_Vertex.
gp_Pnt theProjB=myDeltaVertexFace.Point(1);
BRepBuilderAPI_MakeVertex theVertexMaker(theProjB);
TopoDS_Vertex VertexBproj=theVertexMaker.Vertex();
// Creation du Plane contenant la relation.
GC_MakePlane MkPlane(A,B,theProjB);
Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
// Fermeture du contexte local.
TheAISContext()->CloseLocalContext(myCurrentIndex);
// Construction du texte.
TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("d=")+TCollection_ExtendedString(theDist ) );
// on construit l'AISLenghtDimension mais en utilisant le constructeur Vertex Vertex.
Handle(AIS_LengthDimension ) myLenghtDim=new AIS_LengthDimension (VertexB,VertexBproj,theGeomPlane->Pln());
TheAISContext()->Display(myLenghtDim );
GetMapOfAIS().Bind (myLenghtDim ,argv[1]);
}
// Si ShapeB est une Face
else {
TopoDS_Face FaceB=TopoDS::Face(ShapeB);
BRepExtrema_ExtFF myDeltaFaceFace (FaceA ,FaceB );
// On verifie que les deux faces sont bien parelles.
if (!myDeltaFaceFace.IsParallel() ) {di<<"vdistdim error: the faces are not parallel. "<<"\n";return 1; }
// On saisit la distance et on l'arrondit!
theDist=Round (sqrt (myDeltaFaceFace.SquareDistance(1))*10. )/10.;
// Fermeture du contexte local.
TheAISContext()->CloseLocalContext(myCurrentIndex);
// Construction du texte.
TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("d=")+TCollection_ExtendedString(theDist ) );
// on construit l'AISLenghtDimension.
Handle(AIS_LengthDimension ) myLenghtDim=new AIS_LengthDimension (FaceA,FaceB);
TheAISContext()->Display(myLenghtDim );
GetMapOfAIS().Bind (myLenghtDim ,argv[1]);
}
}
return 0;
}
//==============================================================================
//function : VRadiusDim
//purpose : Display the radius dimension of a face or an edge.
//Draw arg : vradiusdim Name
//==============================================================================
#include <AIS_RadiusDimension.hxx>
#include <TCollection_ExtendedString.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <gp_Circ.hxx>
static int VRadiusDimBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
// Declarations
Standard_Integer myCurrentIndex;
Standard_Real theRadius;
// Verification
if (argc!=2) {di<<" vradiusdim error"<<"\n";return 1;}
// Fermeture des contextes locaux
TheAISContext()->CloseAllContexts();
// Ouverture d'un contexte local et recuperation de son index.
TheAISContext()->OpenLocalContext();
myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
// On active les modes de selections Edges et Faces.
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(4) );
di<<" Select an circled edge or face."<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argcc = 5;
const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argvv = (const char **) buff;
while (ViewerMainLoop( argcc, argvv) ) { }
// fin de la boucle
TopoDS_Shape ShapeA;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeA = TheAISContext()->SelectedShape();
}
// Shape A est un edge.
if (ShapeA.ShapeType()==TopAbs_EDGE ) {
TopoDS_Edge EdgeA=TopoDS::Edge(ShapeA);
// Recuperation du rayon
BRepAdaptor_Curve theCurve(TopoDS::Edge(ShapeA));
if (theCurve.GetType()!=GeomAbs_Circle ) {di<<"vradiusdim error: the edge is not a circular one."<<"\n";return 1;}
else {
gp_Circ theGpCircle=theCurve.Circle();
theRadius=theGpCircle.Radius();
// On arrondit le rayon
theRadius=Round (theRadius*10. )/10.;
}
// Construction du texte.
TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("r=")+TCollection_ExtendedString(theRadius ) );
// Fermeture du contexte.
TheAISContext()->CloseLocalContext(myCurrentIndex);
// Construction de L'AIS_RadiusDimension.
Handle (AIS_RadiusDimension) myRadDim= new AIS_RadiusDimension(ShapeA);
GetMapOfAIS().Bind (myRadDim,argv[1]);
TheAISContext()->Display(myRadDim );
}
// Shape A est une face
else if (ShapeA.ShapeType()==TopAbs_FACE ) {
// on recupere un edge de la face.
TopoDS_Face FaceA=TopoDS::Face(ShapeA);
// on explore.
TopExp_Explorer FaceExp(FaceA,TopAbs_EDGE);
TopoDS_Edge EdgeFromA=TopoDS::Edge(FaceExp.Current() );
// Recuperation du rayon
BRepAdaptor_Curve theCurve(EdgeFromA );
if (theCurve.GetType()!=GeomAbs_Circle ) {di<<"vradiusdim error: the face is not a circular one."<<"\n";return 1;}
else {
gp_Circ theGpCircle=theCurve.Circle();
theRadius=theGpCircle.Radius();
// On arrondit le rayon
theRadius=Round (theRadius*10. )/10.;
}
// Construction du texte.
TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("r=")+TCollection_ExtendedString(theRadius ) );
// Fermeture du contexte.
TheAISContext()->CloseLocalContext(myCurrentIndex);
// Construction de L'AIS_RadiusDimension.
Handle (AIS_RadiusDimension) myRadDim= new AIS_RadiusDimension(ShapeA);
GetMapOfAIS().Bind (myRadDim,argv[1]);
TheAISContext()->Display(myRadDim );
}
else {
di<<" vradiusdim error: the selection of a face or an edge was expected."<<"\n";return 1;
}
return 0;
}
//==============================================================================
//function : VOffsetDim
//purpose : Display the offset dimension
//Draw arg : voffsetdim Name
//==============================================================================
#include <AIS_OffsetDimension.hxx>
#include <TCollection_ExtendedString.hxx>
#include <BRepExtrema_ExtFF.hxx>
static int VOffsetDimBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
// Declarations
Standard_Integer myCurrentIndex;
Standard_Real theDist;
// Verification
if (argc!=2) {di<<" voffsetdim error"<<"\n";return 1;}
// Fermeture des contextes locaux
TheAISContext()->CloseAllContexts();
// Ouverture d'un contexte local et recuperation de son index.
TheAISContext()->OpenLocalContext();
myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
// On active les modes de selections Faces.
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(4) );
di<<" Select a face."<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argcc = 5;
const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argvv = (const char **) buff;
while (ViewerMainLoop( argcc, argvv) ) { }
// fin de la boucle
TopoDS_Shape ShapeA;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeA = TheAISContext()->SelectedShape();
}
di<<" Select a face."<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argccc = 5;
const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argvvv = (const char **) bufff;
while (ViewerMainLoop( argccc, argvvv) ) { }
// fin de la boucle
TopoDS_Shape ShapeB;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeB = TheAISContext()->SelectedShape();
}
// Shape A et B est une face
if (ShapeA.ShapeType()==TopAbs_FACE && ShapeB.ShapeType()==TopAbs_FACE ) {
TopoDS_Face FaceA=TopoDS::Face(ShapeA);
TopoDS_Face FaceB=TopoDS::Face(ShapeB);
BRepExtrema_ExtFF myDeltaFaceFace (FaceA ,FaceB );
// On verifie que les deux faces sont bien parelles.
if (!myDeltaFaceFace.IsParallel() ) {di<<"vdistdim error: the faces are not parallel. "<<"\n";return 1; }
// On saisit la distance et on l'arrondit!
theDist=Round (sqrt (myDeltaFaceFace.SquareDistance(1))*10. )/10.;
// Fermeture du contexte local.
TheAISContext()->CloseLocalContext(myCurrentIndex);
// Construction du texte.
TCollection_ExtendedString TheMessage_Str(TCollection_ExtendedString("offset=")+TCollection_ExtendedString(theDist ) );
// on construit l'AIS_OffsetDimension
Handle(AIS_OffsetDimension) myOffsetDim=new AIS_OffsetDimension (FaceA,FaceB,theDist,TheMessage_Str );
TheAISContext()->Display(myOffsetDim );
GetMapOfAIS().Bind (myOffsetDim ,argv[1]);
}
else {
di<<" voffsetdim error: the selection of a face was expected."<<"\n";return 1;
}
return 0;
}
//==============================================================================
//function : VParallel
//purpose : Display the parallel relation
//Draw arg : vparallel Name
//==============================================================================
#include <AIS_ParallelRelation.hxx>
#include <TCollection_ExtendedString.hxx>
#include <BRepExtrema_ExtFF.hxx>
#include <BRepExtrema_ExtCC.hxx>
#include <GC_MakePlane.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <TopExp_Explorer.hxx>
static int VParallelBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
// Declarations
Standard_Integer myCurrentIndex;
// Verification
if (argc!=2) {di<<" vparallel error"<<"\n";return 1;}
// Fermeture des contextes locaux
TheAISContext()->CloseAllContexts();
// Ouverture d'un contexte local et recuperation de son index.
TheAISContext()->OpenLocalContext();
myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
// On active les modes de selections Edges.
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(4) );
di<<" Select an edge or a face "<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argcc = 5;
const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argvv = (const char **) buff;
while (ViewerMainLoop( argcc, argvv) ) { }
// fin de la boucle
TopoDS_Shape ShapeA;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeA = TheAISContext()->SelectedShape();
}
// SahpeA est un edge.
// ===================
if (ShapeA.ShapeType()==TopAbs_EDGE ) {
// desactivation du mode face
TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(4) );
di<<" Select a second edge"<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argccc = 5;
const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argvvv = (const char **) bufff;
while (ViewerMainLoop( argccc, argvvv) ) { }
// fin de la boucle
TopoDS_Shape ShapeB;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeB = TheAISContext()->SelectedShape();
}
// recuperation des edges.
TopoDS_Edge EdgeA=TopoDS::Edge(ShapeA);
TopoDS_Edge EdgeB=TopoDS::Edge(ShapeB);
BRepExtrema_ExtCC myDeltaEdge (EdgeA ,EdgeB );
// on verifie qu'ils ne sont pas paralleles.
if (!myDeltaEdge.IsParallel() ) {di<<"vparallel error: non parallel edges."<<"\n";return 1; }
// On recupere les vertexes extremites des edge A et B.
BRepAdaptor_Curve theCurveA(EdgeA);
BRepAdaptor_Curve theCurveB(EdgeB);
// On recupere 3 points A,B,C des curves.
gp_Pnt A=theCurveA.Value(0.1);
gp_Pnt B=theCurveA.Value(0.9);
gp_Pnt C=theCurveB.Value(0.5);
// Construction du Geom_Plane
GC_MakePlane MkPlane(A,B,C);
Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
// Fermeture du contexte local.
TheAISContext()->CloseLocalContext(myCurrentIndex);
// Construction de l'AIS_ParallelRelation
Handle(AIS_ParallelRelation) myParaRelation= new AIS_ParallelRelation(EdgeA ,EdgeB ,theGeomPlane );
TheAISContext()->Display(myParaRelation );
GetMapOfAIS().Bind (myParaRelation ,argv[1]);
}
// Shape A est une face
// ====================
else {
// desactivation du mode edge
TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(2) );
di<<" Select a second edge"<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argccc = 5;
const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argvvv = (const char **) bufff;
while (ViewerMainLoop( argccc, argvvv) ) { }
// fin de la boucle
TopoDS_Shape ShapeB;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeB = TheAISContext()->SelectedShape();
}
TopoDS_Face FaceA=TopoDS::Face(ShapeA);
TopoDS_Face FaceB=TopoDS::Face(ShapeB);
BRepExtrema_ExtFF myDeltaFaceFace (FaceA ,FaceB );
// On verifie que les deux faces sont bien parelles.
if (!myDeltaFaceFace.IsParallel() ) {di<<"vdistdim error: the faces are not parallel. "<<"\n";return 1; }
// recuperation des edges des faces.
TopExp_Explorer FaceExpA(FaceA,TopAbs_EDGE);
TopExp_Explorer FaceExpB(FaceB,TopAbs_EDGE);
TopoDS_Edge EdgeA=TopoDS::Edge(FaceExpA.Current() );
TopoDS_Edge EdgeB=TopoDS::Edge(FaceExpB.Current() );
// On recupere les vertexes extremites des edge A et B.
BRepAdaptor_Curve theCurveA(EdgeA);
BRepAdaptor_Curve theCurveB(EdgeB);
// On recupere 3 points A,B,C des curves.
gp_Pnt A=theCurveA.Value(0.1);
gp_Pnt B=theCurveA.Value(0.9);
gp_Pnt C=theCurveB.Value(0.5);
// Construction du Geom_Plane
GC_MakePlane MkPlane(A,B,C);
Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
// Fermeture du contexte local.
TheAISContext()->CloseLocalContext(myCurrentIndex);
// Construction de l'AIS_ParallelRelation
Handle(AIS_ParallelRelation) myParaRelation= new AIS_ParallelRelation(FaceA ,FaceB ,theGeomPlane );
TheAISContext()->Display(myParaRelation );
GetMapOfAIS().Bind (myParaRelation ,argv[1]);
}
return 0;
}
//==============================================================================
//function : VPerpendicularRelation
//purpose : Display the Perpendicular Relation
//Draw arg : vperpendicular Name
//==============================================================================
#include <AIS_PerpendicularRelation.hxx>
#include <TCollection_ExtendedString.hxx>
#include <GC_MakePlane.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <TopExp_Explorer.hxx>
static int VPerpendicularBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
// Declarations
Standard_Integer myCurrentIndex;
// Verification
if (argc!=2) {di<<" vortho error"<<"\n";return 1;}
// Fermeture des contextes locaux
TheAISContext()->CloseAllContexts();
// Ouverture d'un contexte local et recuperation de son index.
TheAISContext()->OpenLocalContext();
myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
// On active les modes de selections Edges.
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(4) );
di<<" Select an edge or a face "<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argcc = 5;
const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argvv = (const char **) buff;
while (ViewerMainLoop( argcc, argvv) ) { }
// fin de la boucle
TopoDS_Shape ShapeA;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeA = TheAISContext()->SelectedShape();
}
// ShapeA est un edge.
// ===================
if (ShapeA.ShapeType()==TopAbs_EDGE ) {
// desactivation du mode face
TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(4) );
di<<" Select a second edge"<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argccc = 5;
const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argvvv = (const char **) bufff;
while (ViewerMainLoop( argccc, argvvv) ) { }
// fin de la boucle
TopoDS_Shape ShapeB;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeB = TheAISContext()->SelectedShape();
}
// recuperation des edges.
TopoDS_Edge EdgeA=TopoDS::Edge(ShapeA);
TopoDS_Edge EdgeB=TopoDS::Edge(ShapeB);
// On recupere les curves
BRepAdaptor_Curve theCurveA(EdgeA);
BRepAdaptor_Curve theCurveB(EdgeB);
// on verifie si les edges sont orthogonaux.
//gp_Lin theLineA=theCurveA.Line();
//gp_Lin theLineB=theCurveB.Line();
//if (abs(theLineA.Angle(theLineB) ) != M_PI/2 ) {cout<<"vperpendicular error: Edges are not othogonals."<<endl;return 1;}
// On recupere 3 points A,B,C des curves.
gp_Pnt A=theCurveA.Value(0.1);
gp_Pnt B=theCurveA.Value(0.9);
gp_Pnt C=theCurveB.Value(0.5);
// Construction du Geom_Plane
GC_MakePlane MkPlane(A,B,C);
Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
// Fermeture du contexte local.
TheAISContext()->CloseLocalContext(myCurrentIndex);
// Construction de l'AIS_ParallelRelation
Handle(AIS_PerpendicularRelation) myOrthoRelation= new AIS_PerpendicularRelation (EdgeA ,EdgeB ,theGeomPlane );
TheAISContext()->Display(myOrthoRelation );
GetMapOfAIS().Bind (myOrthoRelation ,argv[1]);
}
// Shape A est une face
// ====================
else {
// desactivation du mode edge
TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(2) );
di<<" Select a second edge"<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argccc = 5;
const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argvvv = (const char **) bufff;
while (ViewerMainLoop( argccc, argvvv) ) { }
// fin de la boucle
TopoDS_Shape ShapeB;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeB = TheAISContext()->SelectedShape();
}
// pas de verification d'orthogonalite.
TopoDS_Face FaceA=TopoDS::Face(ShapeA);
TopoDS_Face FaceB=TopoDS::Face(ShapeB);
// recuperation des edges des faces.
TopExp_Explorer FaceExpA(FaceA,TopAbs_EDGE);
TopExp_Explorer FaceExpB(FaceB,TopAbs_EDGE);
TopoDS_Edge EdgeA=TopoDS::Edge(FaceExpA.Current() );
TopoDS_Edge EdgeB=TopoDS::Edge(FaceExpB.Current() );
// On recupere les vertexes extremites des edge A et B.
BRepAdaptor_Curve theCurveA(EdgeA);
BRepAdaptor_Curve theCurveB(EdgeB);
// On recupere 3 points A,B,C des curves.
gp_Pnt A=theCurveA.Value(0.1);
gp_Pnt B=theCurveA.Value(0.9);
gp_Pnt C=theCurveB.Value(0.5);
// Construction du Geom_Plane
GC_MakePlane MkPlane(A,B,C);
Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
// Fermeture du contexte local.
TheAISContext()->CloseLocalContext(myCurrentIndex);
// Construction de l'AIS_PerpendicularRelation
Handle(AIS_PerpendicularRelation) myOrthoRelation= new AIS_PerpendicularRelation(FaceA ,FaceB );
TheAISContext()->Display(myOrthoRelation );
GetMapOfAIS().Bind (myOrthoRelation ,argv[1]);
}
return 0;
}
//==============================================================================
//function : VTangentRelation
//purpose : Display the tangent Relation
//Draw arg : vtangent Name
//==============================================================================
#include <AIS_TangentRelation.hxx>
static int VTangentBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
// Declarations
Standard_Integer myCurrentIndex;
// Verification
if (argc!=2) {di<<" vtangent error"<<"\n";return 1;}
// Fermeture des contextes locaux
TheAISContext()->CloseAllContexts();
// Ouverture d'un contexte local et recuperation de son index.
TheAISContext()->OpenLocalContext();
myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
// On active les modes de selections Edges.
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(4) );
di<<" Select two coplanar edges(First the circular edge then the tangent edge) or two faces "<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argcc = 5;
const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argvv = (const char **) buff;
while (ViewerMainLoop( argcc, argvv) ) { }
// fin de la boucle
TopoDS_Shape ShapeA;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeA = TheAISContext()->SelectedShape();
}
// ShapeA est un edge.
// ===================
if (ShapeA.ShapeType()==TopAbs_EDGE ) {
// desactivation du mode face
TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(4) );
di<<" Select a second edge"<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argccc = 5;
const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argvvv = (const char **) bufff;
while (ViewerMainLoop( argccc, argvvv) ) { }
// fin de la boucle
TopoDS_Shape ShapeB;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeB = TheAISContext()->SelectedShape();
}
// recuperation des edges.
TopoDS_Edge EdgeA=TopoDS::Edge(ShapeA);
TopoDS_Edge EdgeB=TopoDS::Edge(ShapeB);
// On recupere les curves
BRepAdaptor_Curve theCurveA(EdgeA);
BRepAdaptor_Curve theCurveB(EdgeB);
// On recupere 3 points A,B,C des curves.
gp_Pnt A=theCurveA.Value(0.1);
gp_Pnt B=theCurveA.Value(0.9);
gp_Pnt C=theCurveB.Value(0.5);
// Construction du Geom_Plane
GC_MakePlane MkPlane(A,B,C);
Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
// Fermeture du contexte local.
TheAISContext()->CloseLocalContext(myCurrentIndex);
// Construction de l'AIS_TangentRelation
Handle(AIS_TangentRelation) myTanRelation= new AIS_TangentRelation (EdgeA ,EdgeB ,theGeomPlane );
TheAISContext()->Display(myTanRelation );
GetMapOfAIS().Bind (myTanRelation ,argv[1]);
}
// Shape A est une face
// ====================
else {
// desactivation du mode edge
TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(2) );
di<<" Select a second edge"<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argccc = 5;
const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argvvv = (const char **) bufff;
while (ViewerMainLoop( argccc, argvvv) ) { }
// fin de la boucle
TopoDS_Shape ShapeB;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeB = TheAISContext()->SelectedShape();
}
TopoDS_Face FaceA=TopoDS::Face(ShapeA);
TopoDS_Face FaceB=TopoDS::Face(ShapeB);
// recuperation des edges des faces.
TopExp_Explorer FaceExpA(FaceA,TopAbs_EDGE);
TopExp_Explorer FaceExpB(FaceB,TopAbs_EDGE);
TopoDS_Edge EdgeA=TopoDS::Edge(FaceExpA.Current() );
TopoDS_Edge EdgeB=TopoDS::Edge(FaceExpB.Current() );
// On recupere les vertexes extremites des edge A et B.
BRepAdaptor_Curve theCurveA(EdgeA);
BRepAdaptor_Curve theCurveB(EdgeB);
// On recupere 3 points A,B,C des curves.
gp_Pnt A=theCurveA.Value(0.1);
gp_Pnt B=theCurveA.Value(0.9);
gp_Pnt C=theCurveB.Value(0.5);
// Construction du Geom_Plane
GC_MakePlane MkPlane(A,B,C);
Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
// Fermeture du contexte local.
TheAISContext()->CloseLocalContext(myCurrentIndex);
// Construction de l'AIS_PerpendicularRelation
Handle(AIS_TangentRelation) myTanRelation= new AIS_TangentRelation(FaceA ,FaceB,theGeomPlane );
TheAISContext()->Display(myTanRelation );
GetMapOfAIS().Bind (myTanRelation ,argv[1]);
}
return 0;
}
//==============================================================================
//function : VSymetricalRelation
//purpose : Display the Symetrical Relation
//Draw arg : vsymetric Name
//==============================================================================
#include <AIS_SymmetricRelation.hxx>
static int VSymmetricBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
// Declarations
Standard_Integer myCurrentIndex;
// Verification
if (argc!=2) {di<<" vSymmetric error"<<"\n";return 1;}
// Fermeture des contextes locaux
TheAISContext()->CloseAllContexts();
// Ouverture d'un contexte local et recuperation de son index.
TheAISContext()->OpenLocalContext();
myCurrentIndex=TheAISContext()->IndexOfCurrentLocal();
// On active les modes de selections
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
di<<" Select an edge:the axis of symetry "<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argcc = 5;
const char *buff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argvv = (const char **) buff;
while (ViewerMainLoop( argcc, argvv) ) { }
// fin de la boucle
TopoDS_Shape ShapeA;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeA = TheAISContext()->SelectedShape();
}
// recuperation des edges.
TopoDS_Edge EdgeA=TopoDS::Edge(ShapeA);
// On active les modes de selections
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(2) );
TheAISContext()->ActivateStandardMode (AIS_Shape::SelectionType(1) );
di<<" Select two edges or two vertices. "<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argcc2 = 5;
// const char *buff2[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argvv2 = (const char **) buff;
while (ViewerMainLoop( argcc2, argvv2) ) { }
// fin de la boucle
TopoDS_Shape ShapeB;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeB = TheAISContext()->SelectedShape();
}
// ShapeB est un edge.
// ===================
if (ShapeB.ShapeType()==TopAbs_EDGE ) {
// desactivation du mode vertex
TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(1) );
di<<" Select a second edge"<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argccc = 5;
const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argvvv = (const char **) bufff;
while (ViewerMainLoop( argccc, argvvv) ) { }
// fin de la boucle
TopoDS_Shape ShapeC;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeC = TheAISContext()->SelectedShape();
}
// recuperation des edges.
TopoDS_Edge EdgeB=TopoDS::Edge(ShapeB);
TopoDS_Edge EdgeC=TopoDS::Edge(ShapeC);
// on verifie que les edges sont paralleles
BRepExtrema_ExtCC myDeltaEdgeAB (EdgeA ,EdgeB );
BRepExtrema_ExtCC myDeltaEdgeAC (EdgeA ,EdgeC );
// on verifie qu'ils sont paralleles.
if (!myDeltaEdgeAB.IsParallel() ) {di<<"vsymetric error: non parallel edges."<<"\n";return 1; }
if (!myDeltaEdgeAC.IsParallel() ) {di<<"vsymetric error: non parallel edges."<<"\n";return 1; }
// on recupere les vertexs
TopoDS_Vertex Va,Vb,Vc,Vd;
TopExp::Vertices(EdgeB,Va,Vb );
TopExp::Vertices(EdgeC,Vc,Vd );
gp_Pnt A=BRep_Tool::Pnt(Va);
gp_Pnt B=BRep_Tool::Pnt(Vc);
gp_Pnt C = Get3DPointAtMousePosition();
// gp_Pnt C=BRep_Tool::Pnt(Vc);
// Construction du Geom_Plane
GC_MakePlane MkPlane(A,B,C);
Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
// Fermeture du contexte local.
TheAISContext()->CloseLocalContext(myCurrentIndex);
// Construction de l'AIS_SymmetricRelation
Handle(AIS_SymmetricRelation) mySymRelation= new AIS_SymmetricRelation (EdgeA ,EdgeB ,EdgeC, theGeomPlane );
TheAISContext()->Display(mySymRelation );
GetMapOfAIS().Bind (mySymRelation ,argv[1]);
}
// Shape B est un vertex
// =====================
else {
// desactivation du mode edge
TheAISContext()->DeactivateStandardMode (AIS_Shape::SelectionType(2) );
di<<" Select a second edge"<<"\n";
// Boucle d'attente waitpick.
Standard_Integer argccc = 5;
const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argvvv = (const char **) bufff;
while (ViewerMainLoop( argccc, argvvv) ) { }
// fin de la boucle
TopoDS_Shape ShapeC;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
ShapeC = TheAISContext()->SelectedShape();
}
// recuperation des Vertex
TopoDS_Vertex VertexB=TopoDS::Vertex(ShapeB);
TopoDS_Vertex VertexC=TopoDS::Vertex(ShapeC);
// transfo en gp_Pnt
gp_Pnt B=BRep_Tool::Pnt(VertexB);
gp_Pnt C=BRep_Tool::Pnt(VertexC);
// on recupere les vertexes de l'axe de sym
TopoDS_Vertex Va,Vb;
TopExp::Vertices(EdgeA,Va,Vb );
gp_Pnt A=BRep_Tool::Pnt(Va);
// Construction du Geom_Plane
GC_MakePlane MkPlane(A,B,C);
Handle(Geom_Plane) theGeomPlane=MkPlane.Value();
// Fermeture du contexte local.
TheAISContext()->CloseLocalContext(myCurrentIndex);
// Construction de l'AIS_SymmetricRelation
Handle(AIS_SymmetricRelation) mySymRelation= new AIS_SymmetricRelation (EdgeA ,VertexB ,VertexC, theGeomPlane );
TheAISContext()->Display(mySymRelation );
GetMapOfAIS().Bind (mySymRelation ,argv[1]);
}
return 0;
}
//=======================================================================
//function : VMoveDim
//purpose :
//=======================================================================
static int VMoveDim(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
if(argc>2) return 1;
const Handle(V3d_View) aview = ViewerTest::CurrentView();
Handle(AIS_InteractiveObject) pickedobj;
if(argc==1){
pickedobj = TheAISContext()->FirstCurrentObject();
if(pickedobj.IsNull() || pickedobj->Type()!=AIS_KOI_Relation)
pickedobj = ViewerTest::PickObject(AIS_KOI_Relation);
}
else{
// reperage dans le viewer...
if(!strcasecmp(argv[1],".")){
pickedobj = ViewerTest::PickObject(AIS_KOI_Relation);
}
else if(GetMapOfAIS().IsBound2(argv[1]))
pickedobj = Handle(AIS_InteractiveObject)::DownCast
(GetMapOfAIS().Find2(argv[1]));
}
if(pickedobj.IsNull()){
di<<"Bad Type Object"<<"\n";
return 1 ;}
if(pickedobj->Type() != AIS_KOI_Relation)
return 1;
Standard_Integer argccc = 5;
const char *bufff[] = { "VPick", "X", "VPickY","VPickZ", "VPickShape" };
const char **argvvv = (const char **) bufff;
Handle(AIS_Relation) R = *((Handle(AIS_Relation)*)&pickedobj);
Handle(Geom_Plane) ThePl;
// Standard_Real x,y,z,xv,yv,zv;
Standard_Real x,y,xv,yv,zv;
static Standard_Real last_xv(0),last_yv(0),last_zv(0);
Standard_Integer xpix,ypix;
// Standard_Boolean SameAsLast(Standard_False);
Select3D_Projector prj(aview);
while (ViewerMainLoop( argccc, argvvv) ) {
//....... la ligne de tir
ViewerTest::GetMousePosition(xpix,ypix);
aview->Convert(xpix,ypix,x,y); // espace reel 2D de la vue...
gp_Lin L = prj.Shoot(x,y);
// ....... le plan de la vue...
aview->Proj(xv,yv,zv);
static Standard_Boolean haschanged(Standard_False);
if(Abs(last_xv-xv)>Precision::Confusion() ||
Abs(last_yv-yv)>Precision::Confusion() ||
Abs(last_zv-zv)>Precision::Confusion() ){
last_xv = xv;
last_yv = yv;
last_zv = zv;
Standard_Real xat,yat,zat;
aview->At(xat,yat,zat);
ThePl = new Geom_Plane(gp_Pnt(xat,yat,zat),gp_Dir(xv,yv,zv));
haschanged = Standard_True;
di <<"changement de plan"<<"\n";
}
//
// Standard_Integer xpix,ypix;
// Standard_Real x,y;
gp_Pnt GoodPoint;
if(haschanged){
gp_Pln NewPlane;;
ComputeNewPlaneForDim(R,NewPlane,GoodPoint);
haschanged = Standard_False;
}
else{
if(ComputeIntersection(L,ThePl->Pln(),GoodPoint)){
R->SetPosition(GoodPoint);
}
TheAISContext()->Redisplay(R);
}
}
return 0;
}
//=======================================================================
//function : RelationsCommands
//purpose :
//=======================================================================
void ViewerTest::RelationCommands(Draw_Interpretor& theCommands)
{
const char *group = "AISRelations";
theCommands.Add("vdim",
"vdim -{angle|length|radius|diameter} -name={Dim_Name}"
" shape1 [shape2 [shape3]] [-text={2d|3d} -plane={xoy|yoz|zox}]"
" -Build a angle, length, radius and diameter dimensions;"
" -Workis only with interactive objects",
__FILE__,VDimBuilder,group);
theCommands.Add("vangledim",
"vangledim Name:Selection in the viewer only ",
__FILE__,VAngleDimBuilder,group);
theCommands.Add("vdiameterdim",
"vdiameterdim Name : Selection in the viewer only ",
__FILE__,VDiameterDimBuilder,group);
theCommands.Add("vconcentric",
"vconcentric Name : Selection in the viewer only ",
__FILE__,VConcentricBuilder,group);
theCommands.Add("vequaldist",
"vequaldist Name Selection in the viewer only ",
__FILE__,VEqualDistRelation ,group);
theCommands.Add("vequalrad",
"vequalrad Name Selection in the viewer only ",
__FILE__,VEqualRadiusRelation ,group);
theCommands.Add("vfix",
"vfix Name Selection in the viewer only ",
__FILE__,VFixRelation ,group);
theCommands.Add("videntity",
"videntity Name Selection in the viewer only ",
__FILE__,VIdenticRelation ,group);
theCommands.Add("vdistdim",
"vdistdim Name Selection in the viewer only ",
__FILE__,VLenghtDimension ,group);
theCommands.Add("vradiusdim",
"vradiusdim Name Selection in the viewer only ",
__FILE__,VRadiusDimBuilder ,group);
theCommands.Add("voffsetdim",
"voffsetdim Name Selection in the viewer only ",
__FILE__,VOffsetDimBuilder ,group);
theCommands.Add("vparallel",
"vparallel Name Selection in the viewer only ",
__FILE__,VParallelBuilder ,group);
theCommands.Add("vortho",
"vortho Name Selection in the viewer only ",
__FILE__,VPerpendicularBuilder ,group);
theCommands.Add("vtangent",
"vtangent Name Selection in the viewer only ",
__FILE__,VTangentBuilder ,group);
theCommands.Add("vsymetric",
"vsymetric Name Selection in the viewer only ",
__FILE__,VSymmetricBuilder ,group);
theCommands.Add("vmovedim",
"vmovedim [name] : move Mouse in the viewer; click MB1 to stop motion...",
__FILE__,VMoveDim,group);
}