#include <TopAbs_State.hxx>
#include <Draw_ProgressIndicator.hxx>
+#include <ShapeAnalysis_FreeBounds.hxx>
+#include <TopTools_HSequenceOfShape.hxx>
+#include <BRep_Builder.hxx>
+#include <TopTools_IndexedMapOfShape.hxx>
+#include <TopExp.hxx>
#ifdef AIX
#include <strings.h>
return 0;
}
+static Standard_Integer connectedges(Draw_Interpretor& di, Standard_Integer n, const char** a)
+{
+ if( n < 3) {
+ di<<"Invalid number of arguments. Should be : result shape [toler shared]"<<"\n";
+ return 1;
+ }
+ TopoDS_Shape aSh1 = DBRep::Get(a[2]);
+ if(aSh1.IsNull()) {
+ di<<"Shape is null"<<"\n";
+ return 1;
+ }
+ Standard_Real aTol = Precision::Confusion();
+ if( n > 3)
+ aTol = atof(a[3]);
+
+ Standard_Boolean shared = Standard_True;
+ if( n > 4)
+ shared = (atoi(a[4]) == 1);
+ TopExp_Explorer aExpE(aSh1,TopAbs_EDGE);
+ Handle(TopTools_HSequenceOfShape) aSeqEdges = new TopTools_HSequenceOfShape;
+ Handle(TopTools_HSequenceOfShape) aSeqWires = new TopTools_HSequenceOfShape;
+ TopTools_IndexedMapOfShape aMapEdges;
+ for( ; aExpE.More(); aExpE.Next())
+ {
+ aSeqEdges->Append(aExpE.Current());
+ aMapEdges.Add(aExpE.Current());
+ }
+
+ ShapeAnalysis_FreeBounds::ConnectEdgesToWires(aSeqEdges,aTol,shared,aSeqWires );
+ TopoDS_Compound aComp;
+ BRep_Builder aB;
+ aB.MakeCompound(aComp);
+ Standard_Integer i = 1;
+ for( ; i <= aSeqWires->Length() ; i++)
+ {
+ TopoDS_Shape aW = aSeqWires->Value(i);
+ di<<"Wire - "<<i<<" : "<<"\n";
+
+ TopExp_Explorer aExp1(aW, TopAbs_EDGE);
+ for( ; aExp1.More(); aExp1.Next())
+ {
+ if(shared)
+ {
+ Standard_Integer ind = aMapEdges.FindIndex(aExp1.Current());
+ di<<ind<<" ";
+ }
+ else
+ {
+ TopoDS_Vertex aV1, aV2;
+ TopExp::Vertices(TopoDS::Edge(aExp1.Current()), aV1,aV2);
+ gp_Pnt aP = BRep_Tool::Pnt(aV1);
+ di<<aP.X()<<" "<<aP.Y()<<" "<<aP.Z()<<"\n";
+ }
+ }
+
+ di<<"\n";
+ aB.Add( aComp,aSeqWires->Value(i));
+ }
+ DBRep::Set(a[1],aComp);
+ return 0;
+
+}
+
//=======================================================================
//function : InitCommands
//purpose :
__FILE__,checkoverlapedges,g);
theCommands.Add ("checkfclass2d","face ucoord vcoord",
__FILE__,checkfclass2d,g);
+ theCommands.Add ("connectedges","res shape [toler shared]",
+ __FILE__,connectedges,g);
+
}
#include <gp_Pnt.hxx>
#include <TColStd_ListIteratorOfListOfInteger.hxx>
#include <BRep_Tool.hxx>
+#include <Precision.hxx>
//=======================================================================
//function : Reject
Standard_Boolean IsAccept = Standard_False;
if (myList.Contains(theObj))
return Standard_False;
-
+ enum
+ {
+ First = 1,
+ Last = 2
+ };
TopoDS_Wire W = TopoDS::Wire (mySeq->Value (theObj));
TopoDS_Vertex V1,V2;
if (myLVertex.IsSame(V1)){
myStatus = ShapeExtend::EncodeStatus (ShapeExtend_DONE1);
IsAccept = Standard_True;
+ myArrIndices(Last) = theObj;
}
else {
if (myLVertex.IsSame(V2)){
myStatus = ShapeExtend::EncodeStatus (ShapeExtend_DONE2);
IsAccept = Standard_True;
+ myArrIndices(Last) = theObj;
}
else {
if (myFVertex.IsSame(V2)){
myStatus = ShapeExtend::EncodeStatus (ShapeExtend_DONE3);
IsAccept = Standard_True;
+ myArrIndices(First) = theObj;
}
else {
if (myFVertex.IsSame(V1)){
myStatus = ShapeExtend::EncodeStatus (ShapeExtend_DONE4);
IsAccept = Standard_True;
+ myArrIndices(First) = theObj;
}
else myStatus = ShapeExtend::EncodeStatus (ShapeExtend_FAIL2);
if (IsAccept){
SetNb(theObj);
- myStop = Standard_True;
+ if(myArrIndices(Last))
+ myStop = Standard_True;
return Standard_True;
}
else myStop = Standard_False;
if (min3d > myMin3d)
return Standard_False;
+ Standard_Integer minInd = (dm1 > dm2 ? First : Last );
+ Standard_Integer maxInd = (dm1 > dm2 ? Last : First);
+ myArrIndices(minInd) = theObj;
+ if((min3d - myMin3d) > RealSmall())
+ myArrIndices(maxInd) = 0;
+
myMin3d = min3d;
if (min3d > myTol)
{
myStatus = ShapeExtend::EncodeStatus (ShapeExtend_FAIL2);
return Standard_False;
}
-
- SetNb(theObj);
- if (min3d == 0)
- myStop = Standard_True;
+ Standard_Integer anObj = (myArrIndices(Last) ? myArrIndices(Last) : myArrIndices(First));
+ SetNb(anObj);
+ if (min3d == 0 && minInd == Last)
+ myStop = Standard_True;
+
if (dm1 > dm2)
{
dm1 = dm2;
result = res2 + 2;
}
-
-
- switch (result) {
+ if(anObj == theObj)
+ {
+ switch (result) {
case 0: myStatus = ShapeExtend::EncodeStatus (ShapeExtend_DONE1); break;
case 1: myStatus = ShapeExtend::EncodeStatus (ShapeExtend_DONE2); break;
case 2: myStatus = ShapeExtend::EncodeStatus (ShapeExtend_DONE3); break;
case 3: myStatus = ShapeExtend::EncodeStatus (ShapeExtend_DONE4); break;
}
-
+ }
return Standard_True;
}
#include <ShapeExtend_Status.hxx>
#include <TopoDS_Vertex.hxx>
#include <TColStd_MapOfInteger.hxx>
+#include <TColStd_Array1OfInteger.hxx>
typedef NCollection_UBTree <Standard_Integer , Bnd_Box> ShapeAnalysis_BoxBndTree;
ShapeAnalysis_BoxBndTreeSelector
(Handle (TopTools_HArray1OfShape) theSeq,
Standard_Boolean theShared)
- : mySeq(theSeq), myShared(theShared), myNb(0), myTol(1e-7), myMin3d(1e-7),
- myStatus(ShapeExtend::EncodeStatus (ShapeExtend_OK)){}
+ : mySeq(theSeq), myShared(theShared), myNb(0), myTol(1e-7), myMin3d(1e-7),myArrIndices(1,2),
+ myStatus(ShapeExtend::EncodeStatus (ShapeExtend_OK))
+ {
+ myArrIndices.Init(0);
+ }
void DefineBoxes (const Bnd_Box& theFBox, const Bnd_Box& theLBox)
{ myFBox = theFBox;
- myLBox = theLBox; }
+ myLBox = theLBox;
+ myArrIndices.Init(0);
+
+ }
void DefineVertexes (TopoDS_Vertex theVf, TopoDS_Vertex theVl)
{ myFVertex = theVf;
TColStd_MapOfInteger myList;
Standard_Real myTol;
Standard_Real myMin3d;
+ TColStd_Array1OfInteger myArrIndices;
};
#endif