1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-14 13:30:48 +03:00

0024509: Suspect unused variable in TPrsStd_ConstraintTools.cxx

- AIS_TypeOfDist is not used for length dimension construction;
- Added opportunity to build TPrsSrd length constraint on one edge.
- length dimension in TPrsStd_ConstraintTool is build on one or two shapes, but not on three.
Added validation of dimension plane.
Warnings were corrected.
This commit is contained in:
aba
2014-05-22 17:13:04 +04:00
committed by apn
parent 1ee621b661
commit 011b361de5

View File

@@ -124,21 +124,27 @@ static void FindExternalShape(const Handle(TDataXtd_Constraint)& aConst,
//function : static GetGoodShape for planar constraint
//purpose :
//=======================================================================
static void GetGoodShape(TopoDS_Shape& shape)
static void GetGoodShape(TopoDS_Shape& theShape)
{
switch (shape.ShapeType()) {
switch (theShape.ShapeType())
{
case TopAbs_EDGE:
case TopAbs_VERTEX: { return; }
default:
{
TopExp_Explorer EXP(shape,TopAbs_EDGE);
if (EXP.More()) {
shape = EXP.Current();
return;
TopExp_Explorer anExp (theShape,TopAbs_EDGE);
if (anExp.More())
{
theShape = anExp.Current();
return;
}
else {
EXP.Init(shape,TopAbs_VERTEX);
if (EXP.More()) shape = EXP.Current();
else
{
anExp.Init (theShape, TopAbs_VERTEX);
if (anExp.More())
{
theShape = anExp.Current();
}
}
}
}
@@ -231,180 +237,232 @@ void TPrsStd_ConstraintTools::UpdateOnlyValue(const Handle(TDataXtd_Constraint)&
//=======================================================================
//function : ComputeDistance
//purpose : Build an AIS_LengtDimension.
//purpose : Build an AIS_LengthDimension.
//=======================================================================
void TPrsStd_ConstraintTools::ComputeDistance (const Handle(TDataXtd_Constraint)& aConst,
Handle(AIS_InteractiveObject)& anAIS)
void TPrsStd_ConstraintTools::ComputeDistance (const Handle(TDataXtd_Constraint)& theConst,
Handle(AIS_InteractiveObject)& theAIS)
{
Standard_Integer nbgeom = aConst->NbGeometries();
if (nbgeom < 2) {
Standard_Integer aGeomNum = theConst->NbGeometries();
// Dimension is build on one or two shapes.
if (aGeomNum < 1 || aGeomNum > 2)
{
#ifdef DEB
cout << "TPrsStd_ConstraintTools::ComputeDistance: at least 2 geometries are needed" << endl;
cout << "TPrsStd_ConstraintTools::ComputeDistance: 1 or 2 geometries are needed" << endl;
#endif
NullifyAIS(anAIS);
NullifyAIS(theAIS);
return;
}
TopoDS_Shape shape1,shape2,shape3 ;
Handle(Geom_Geometry) ageom3;
Standard_Boolean is_planar(aConst->IsPlanar()),is_directed(Standard_False);
AIS_TypeOfDist typedist = AIS_TOD_Unknown;
TopoDS_Shape aShape1, aShape2;
Handle(Geom_Geometry) aGeom3;
Standard_Boolean isPlanar (theConst->IsPlanar());
// Get shapes and geometry
if (is_planar) {
if (nbgeom == 2)
GetShapesAndGeom (aConst,shape1,shape2,ageom3);
else
GetShapesAndGeom (aConst,shape1,shape2,shape3,ageom3);
}
else
GetTwoShapes (aConst,shape1,shape2);
if (aGeomNum == 1)
{
GetOneShape (theConst, aShape1);
if (shape1.IsNull() || shape2.IsNull()) {
#ifdef DEB
cout << "TPrsStd_ConstraintTools::ComputeDistance : null shape" << endl;
#endif
NullifyAIS(anAIS);
if (aShape1.IsNull())
{
#ifdef DEB
cout << "TPrsStd_ConstraintTools::ComputeDistance : null shape" << endl;
#endif
NullifyAIS (theAIS);
return;
}
}
else //aGeomNum == 2
{
GetTwoShapes (theConst, aShape1, aShape2);
if (aShape1.IsNull() || aShape2.IsNull())
{
#ifdef DEB
cout << "TPrsStd_ConstraintTools::ComputeDistance : null shape" << endl;
#endif
NullifyAIS (theAIS);
return;
}
}
// Get plane from constraint
Handle(Geom_Plane) aPlane;
if (isPlanar)
{
GetGeom (theConst, aGeom3);
GetGoodShape (aShape1);
if (aGeomNum == 2)
{
GetGoodShape (aShape2);
}
aPlane = Handle(Geom_Plane)::DownCast (aGeom3);
}
// Get custom value
Standard_Real aValue;
TCollection_ExtendedString aText;
ComputeTextAndValue (theConst, aValue, aText,Standard_False);
Standard_Boolean isFaces = Standard_False;
Standard_Boolean isEdges = Standard_False;
Standard_Boolean isEdgeFace = Standard_False;
Standard_Boolean isVertices = Standard_False;
Standard_Boolean isEdge = Standard_False;
Standard_Boolean SaveDrw = Standard_False;
Handle(AIS_Drawer) aDrawer;
Handle(AIS_LengthDimension) aDim;
if (!theAIS.IsNull())
{
aDim = Handle(AIS_LengthDimension)::DownCast (theAIS);
}
// Check shapes for AIS dimension
if (aGeomNum == 1)
{
if (aShape1.ShapeType () != TopAbs_EDGE)
{
#ifdef DEB
cout << "TPrsStd_ConstraintTools::ComputeDistance : shape should be edge" << endl;
#endif
NullifyAIS (theAIS);
return;
}
isEdge = Standard_True;
}
else // nbgeom == 2
{
isFaces = IsFace (aShape1) && IsFace (aShape2);
isEdges = (aShape1.ShapeType() == TopAbs_EDGE) && (aShape2.ShapeType() == TopAbs_EDGE);
isEdgeFace = ((aShape1.ShapeType() == TopAbs_FACE) && (aShape2.ShapeType() == TopAbs_EDGE))
|| ((aShape1.ShapeType() == TopAbs_EDGE) && (aShape2.ShapeType() == TopAbs_FACE));
isVertices = (aShape1.ShapeType() == TopAbs_VERTEX) && (aShape2.ShapeType() == TopAbs_VERTEX);
if (!isPlanar && !isFaces && !isEdges && !isVertices)
{
// Search suitable geometry for dimension
if (aShape1.ShapeType() == aShape2.ShapeType())
{
TopoDS_Vertex aV1, aV2, aV3, aV4;
if (aShape1.ShapeType() == TopAbs_WIRE)
{
TopExp::Vertices (TopoDS::Wire(aShape1), aV1, aV2);
TopExp::Vertices (TopoDS::Wire(aShape2), aV3, aV4);
}
aShape1 = aV1;
gp_Pnt aP1 = BRep_Tool::Pnt(aV1);
gp_Pnt aP2 = BRep_Tool::Pnt(aV3);
gp_Pnt aP3 = BRep_Tool::Pnt (aV4);
if (aP1.Distance (aP2) < aP1.Distance (aP3))
{
aShape2 = aV3;
gp_Ax2 ax2 (aP1, gp_Dir (aP2.XYZ() - aP1.XYZ()));
aPlane = new Geom_Plane (aP1, ax2.XDirection());
}
else
{
aShape2 = aV4;
gp_Ax2 anAx2 (aP1, gp_Dir (aP3.XYZ() - aP1.XYZ()));
aPlane = new Geom_Plane (aP1, anAx2.XDirection());
}
}
else if (!isEdgeFace)
{
NullifyAIS (theAIS);
return;
}
}
}
// Check plane
Standard_Boolean isCheckPlane = (aDim.IsNull() && !isFaces) || isPlanar;
if ((isVertices || isEdges) && !isPlanar)
{
gp_Pnt aP1, aP2, aP3;
if (isVertices)
{
aP1 = BRep_Tool::Pnt (TopoDS::Vertex (aShape1));
aP2 = BRep_Tool::Pnt (TopoDS::Vertex (aShape2));
aP3 = gp_Pnt (aP1.Y() - 1.0, aP2.X() + 1.0, 0.0);
}
if (isEdges)
{
TopoDS_Vertex aV1, aV2, aV3, aV4;
TopExp::Vertices (TopoDS::Edge(aShape1), aV1, aV2);
TopExp::Vertices (TopoDS::Edge(aShape2), aV3, aV4);
aP1 = BRep_Tool::Pnt (aV1);
aP2 = BRep_Tool::Pnt (aV2);
aP3 = BRep_Tool::Pnt (aV3);
}
GC_MakePlane aPlaneMaker (aP1, aP2, aP3);
if (aPlaneMaker.IsDone() && !isPlanar)
{
aPlane = aPlaneMaker.Value();
}
}
if (isCheckPlane && aPlane.IsNull())
{
#ifdef DEB
cout << "TPrsStd_ConstraintTools::ComputeDistance : null plane" << endl;
#endif
NullifyAIS (theAIS);
return;
}
Handle(Geom_Plane) aplane;
if (is_planar) {
if (nbgeom != 2) {
is_directed = !shape3.IsNull();
if (!is_directed) {
#ifdef DEB
cout << "TPrsStd_ConstraintTools::ComputeDistance : null shape" << endl;
#endif
NullifyAIS(anAIS);
return;
}
}
GetGoodShape (shape1);
GetGoodShape (shape2);
aplane = Handle(Geom_Plane)::DownCast(ageom3);
if (aplane.IsNull()) {
#ifdef DEB
cout << "TPrsStd_ConstraintTools::ComputeDistance : null plane" << endl;
#endif
NullifyAIS(anAIS);
return;
}
if (is_directed) {
GetGoodShape(shape3);
const TopoDS_Edge& E = TopoDS::Edge(shape3);
BRepAdaptor_Curve CURVE(E);
Handle(Geom_Geometry) aGeomGeometry = CURVE.Curve().Curve()->Transformed(CURVE.Trsf()) ;
gp_Dir Dir = ((Handle(Geom_Line)&) aGeomGeometry)->Lin().Direction();
gp_Dir xdir(aplane->Pln().Position().XDirection());
if (Dir.IsParallel(xdir,Precision::Confusion()))
typedist = AIS_TOD_Horizontal;
else
typedist = AIS_TOD_Vertical;
}
}
Standard_Real val1;
TCollection_ExtendedString txt;
ComputeTextAndValue(aConst,val1,txt,Standard_False);
// Arguments de l'AIS
Standard_Boolean isface = IsFace(shape1) && IsFace(shape2);
Standard_Boolean isedgeface = (shape1.ShapeType () == TopAbs_FACE &&
shape2.ShapeType () == TopAbs_EDGE);
Standard_Boolean is2vertices =(shape1.ShapeType () == TopAbs_VERTEX && //addition 1
shape2.ShapeType () == TopAbs_VERTEX);
if (!isface && !is_planar && !is2vertices) {
// Recherche arguments pouvant convenir
if (shape1.ShapeType() == shape2.ShapeType()) {
TopoDS_Vertex v1,v2,v3,v4;
if (shape1.ShapeType() == TopAbs_EDGE) {
TopExp::Vertices (TopoDS::Edge(shape1),v1,v2);
TopExp::Vertices (TopoDS::Edge(shape2),v3,v4);
}
else
if (shape1.ShapeType() == TopAbs_WIRE) {
TopExp::Vertices (TopoDS::Wire(shape1),v1,v2);
TopExp::Vertices (TopoDS::Wire(shape2),v3,v4);
}
shape1 = v1;
gp_Pnt P1 = BRep_Tool::Pnt(v1);
gp_Pnt P2 = BRep_Tool::Pnt(v3), P3 = BRep_Tool::Pnt(v4);
if (P1.Distance(P2) < P1.Distance(P3)) {
shape2 = v3;
gp_Ax2 ax2 (P1, gp_Dir (P2.XYZ() - P1.XYZ()));
aplane = new Geom_Plane (P1,ax2.XDirection());
}
else {
shape2 = v4;
gp_Ax2 ax2 (P1, gp_Dir (P3.XYZ() - P1.XYZ()));
aplane = new Geom_Plane (P1,ax2.XDirection());
}
}
else {
if (!isedgeface) {
NullifyAIS(anAIS);
return;
}
}
}
// Update de l'AIS
Handle(AIS_LengthDimension) ais;
Standard_Boolean SaveDrw = Standard_False;
Handle(AIS_Drawer) aDrawer;
if (!anAIS.IsNull()) {
ais = Handle(AIS_LengthDimension)::DownCast(anAIS);
}
if (ais.IsNull()) {
if (is2vertices) { //addition 2
gp_Pnt P1 = BRep_Tool::Pnt( TopoDS::Vertex(shape1) );
gp_Pnt P2 = BRep_Tool::Pnt( TopoDS::Vertex(shape2) );
gp_Pnt P3(P1.Y()-1., P2.X()+1., 0.);
GC_MakePlane mkPlane(P1, P2, P3);
ais = new AIS_LengthDimension (P1, P2, mkPlane.Value()->Pln());
}
else if (isface)
// Update of AIS
if (aDim.IsNull())
{
if (isEdge)
{
ais = new AIS_LengthDimension (GetFace(shape1),GetFace(shape2),aplane->Pln());
aDim = new AIS_LengthDimension (GetEdge (aShape1), aPlane->Pln());
}
else if (isedgeface) {
ais = new AIS_LengthDimension (GetFace(shape1),GetEdge(shape2),aplane->Pln());
}
else {
ais = new AIS_LengthDimension (shape1,shape2,aplane->Pln());
}
if( SaveDrw ) ais->SetAttributes(aDrawer);
}
else {
if (isface)
else if (isFaces)
{
ais->SetMeasuredGeometry (GetFace(shape1), GetFace(shape2));
aDim = new AIS_LengthDimension (GetFace (aShape1), GetFace (aShape2));
}
else
{
ais->SetMeasuredShapes (shape1, shape2);
}
if (is2vertices) { //addition 3
gp_Pnt P1 = BRep_Tool::Pnt( TopoDS::Vertex(shape1) );
gp_Pnt P2 = BRep_Tool::Pnt( TopoDS::Vertex(shape2) );
gp_Pnt P3(P1.Y()-1., P2.X()+1., 0.);
GC_MakePlane mkPlane(P1, P2, P3);
ais->SetCustomPlane( mkPlane.Value()->Pln() );
aDim = new AIS_LengthDimension (aShape1, aShape2, aPlane->Pln());
}
ais->SetCustomValue (val1);
if (SaveDrw)
{
aDim->SetAttributes (aDrawer);
}
}
if (is_planar)
else
{
ais->SetCustomPlane (aplane->Pln());
if (isEdge)
{
aDim->SetMeasuredGeometry (GetEdge(aShape1), aPlane->Pln());
}
else
{
aDim->SetMeasuredShapes (aShape1, aShape2);
}
aDim->SetCustomValue (aValue);
}
anAIS = ais;
if (!aPlane.IsNull())
{
aDim->SetCustomPlane (aPlane->Pln());
}
theAIS = aDim;
}
//=======================================================================