// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
-// See http://www.salome-platform.org/
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File: GEOMAlgo_Gluer.cxx
// Created: Sat Dec 04 12:45:53 2004
#include <GEOMAlgo_Gluer.ixx>
+#include <NMTDS_BoxBndTree.hxx>
+#include <NCollection_UBTreeFiller.hxx>
+
+#include <TColStd_MapIteratorOfMapOfInteger.hxx>
+#include <TColStd_MapOfInteger.hxx>
#include <TColStd_ListOfInteger.hxx>
#include <TColStd_ListIteratorOfListOfInteger.hxx>
#include <GEOMAlgo_IndexedDataMapOfIntegerShape.hxx>
#include <GEOMAlgo_IndexedDataMapOfShapeBox.hxx>
-#include <GEOMAlgo_IndexedDataMapOfPassKeyShapeListOfShape.hxx>
+#include <GEOMAlgo_IndexedDataMapOfPassKeyShapeListOfShape.hxx>
#include <GEOMAlgo_PassKeyShape.hxx>
#include <GEOMAlgo_Tools.hxx>
//
{
myErrorStatus=0;
//
- Standard_Integer j, i, aNbV, aIndex, aNbVSD;
+ Standard_Integer j, i, aNbV, aNbVSD;
TColStd_ListIteratorOfListOfInteger aIt;
- Handle(Bnd_HArray1OfBox) aHAB;
- Bnd_BoundSortBox aBSB;
- TopoDS_Shape aSTmp, aVF;
+ TopoDS_Shape aVF;
TopoDS_Vertex aVnew;
TopTools_IndexedMapOfShape aMV, aMVProcessed;
TopTools_ListIteratorOfListOfShape aItS;
GEOMAlgo_IndexedDataMapOfIntegerShape aMIS;
GEOMAlgo_IndexedDataMapOfShapeBox aMSB;
//
+ NMTDS_BoxBndTreeSelector aSelector;
+ NMTDS_BoxBndTree aBBTree;
+ NCollection_UBTreeFiller <Standard_Integer, Bnd_Box> aTreeFiller(aBBTree);
+ //
+ //
TopExp::MapShapes(myShape, TopAbs_VERTEX, aMV);
aNbV=aMV.Extent();
if (!aNbV) {
return;
}
//
- aHAB=new Bnd_HArray1OfBox(1, aNbV);
- //
for (i=1; i<=aNbV; ++i) {
const TopoDS_Shape& aV=aMV(i);
Bnd_Box aBox;
//
aBox.SetGap(myTol);
BRepBndLib::Add(aV, aBox);
- aHAB->SetValue(i, aBox);
+ //
+ aTreeFiller.Add(i, aBox);
+ //
aMIS.Add(i, aV);
aMSB.Add(aV, aBox);
}
//
- aBSB.Initialize(aHAB);
+ aTreeFiller.Fill();
//
+ //------------------------------
+ // Chains
for (i=1; i<=aNbV; ++i) {
const TopoDS_Shape& aV=aMV(i);
//
continue;
}
//
- const Bnd_Box& aBoxV=aMSB.FindFromKey(aV);
- const TColStd_ListOfInteger& aLI=aBSB.Compare(aBoxV);
- aNbVSD=aLI.Extent();
- if (!aNbVSD) {
- myErrorStatus=3; // it must not be
- return;
- }
+ Standard_Integer aNbIP, aIP, aNbIP1, aIP1;
+ TopTools_ListOfShape aLVSD;
+ TColStd_MapOfInteger aMIP, aMIP1, aMIPC;
+ TColStd_MapIteratorOfMapOfInteger aIt1;
//
- // Images
+ aMIP.Add(i);
+ while(1) {
+ aNbIP=aMIP.Extent();
+ aIt1.Initialize(aMIP);
+ for(; aIt1.More(); aIt1.Next()) {
+ aIP=aIt1.Key();
+ if (aMIPC.Contains(aIP)) {
+ continue;
+ }
+ //
+ const TopoDS_Shape& aVP=aMIS.FindFromKey(aIP);
+ const Bnd_Box& aBoxVP=aMSB.FindFromKey(aVP);
+ //
+ aSelector.Clear();
+ aSelector.SetBox(aBoxVP);
+ //
+ aNbVSD=aBBTree.Select(aSelector);
+ if (!aNbVSD) {
+ continue; // it must not be
+ }
+ //
+ const TColStd_ListOfInteger& aLI=aSelector.Indices();
+ aIt.Initialize(aLI);
+ for (; aIt.More(); aIt.Next()) {
+ aIP1=aIt.Value();
+ if (aMIP.Contains(aIP1)) {
+ continue;
+ }
+ aMIP1.Add(aIP1);
+ } //for (; aIt.More(); aIt.Next()) {
+ }//for(; aIt1.More(); aIt1.Next()) {
+ //
+ aNbIP1=aMIP1.Extent();
+ if (!aNbIP1) {
+ break;
+ }
+ //
+ aIt1.Initialize(aMIP);
+ for(; aIt1.More(); aIt1.Next()) {
+ aIP=aIt1.Key();
+ aMIPC.Add(aIP);
+ }
+ //
+ aMIP.Clear();
+ aIt1.Initialize(aMIP1);
+ for(; aIt1.More(); aIt1.Next()) {
+ aIP=aIt1.Key();
+ aMIP.Add(aIP);
+ }
+ aMIP1.Clear();
+ }// while(1)
//
- TopTools_ListOfShape aLVSD;
+ // Fill myImages
+ aNbIP=aMIPC.Extent();
//
- aIt.Initialize(aLI);
- for (j=0; aIt.More(); aIt.Next(), ++j) {
- aIndex=aIt.Value();
- const TopoDS_Shape& aVx=aMIS.FindFromKey(aIndex);
- if(!j) {
- aVF=aVx;
+ if (!aNbIP) {// no SD vertices founded
+ aVF=aV;
+ aLVSD.Append(aV);
+ aMVProcessed.Add(aV);
+ }
+ else { // SD vertices founded [ aMIPC ]
+ aIt1.Initialize(aMIPC);
+ for(j=0; aIt1.More(); aIt1.Next(), ++j) {
+ aIP=aIt1.Key();
+ const TopoDS_Shape& aVP=aMIS.FindFromKey(aIP);
+ if (!j) {
+ aVF=aVP;
+ }
+ aLVSD.Append(aVP);
+ aMVProcessed.Add(aVP);
}
- aLVSD.Append(aVx);
- aMVProcessed.Add(aVx);
}
- //
myImages.Bind(aVF, aLVSD);
- }
+ }// for (i=1; i<=aNbV; ++i) {
+ //------------------------------
//
// Make new vertices
aMV.Clear();
for (; aItIm.More(); aItIm.Next()) {
const TopoDS_Shape& aV=aItIm.Key();
const TopTools_ListOfShape& aLVSD=aItIm.Value();
- //
aItS.Initialize(aLVSD);
for (; aItS.More(); aItS.Next()) {
const TopoDS_Shape& aVSD=aItS.Value();
for (i=1; i<=aNbF; ++i) {
const TopoDS_Shape& aS=aMF(i);
//
- aPKF.Clear();
if (aType==TopAbs_FACE) {
const TopoDS_Face& aF=TopoDS::Face(aS);
FacePassKey(aF, aPKF);
void GEOMAlgo_Gluer::FacePassKey(const TopoDS_Face& aF,
GEOMAlgo_PassKeyShape& aPK)
{
- Standard_Integer i, aNbE, aNbMax;
+ Standard_Integer i, aNbE;
TopTools_ListOfShape aLE;
TopTools_IndexedMapOfShape aME;
//
TopExp::MapShapes(aF, TopAbs_EDGE, aME);
aNbE=aME.Extent();
- aNbMax=aPK.NbMax();
- if (!aNbE || aNbE>aNbMax) {
- myErrorStatus=101; // temprorary
- return;
- }
//
for (i=1; i<=aNbE; ++i) {
const TopoDS_Shape& aE=aME(i);
const TopoDS_Shape& aER=myOrigins.Find(aE);
aLE.Append(aER);
}
- aPK.SetIds(aLE);
+ aPK.SetShapes(aLE);
}
//=======================================================================
//function : EdgePassKey
}
const TopoDS_Shape& aVR1=myOrigins.Find(aV1);
const TopoDS_Shape& aVR2=myOrigins.Find(aV2);
- aPK.SetIds(aVR1, aVR2);
+ aPK.SetShapes(aVR1, aVR2);
}
//=======================================================================
//function : MakeVertex
BOPTools_Tools::MakeSplitEdge(aEx, aVR1, aT1, aVR2, aT2, aNewEdge);
}
}
-//
//=======================================================================
//function : MakeFace
//purpose :
//
aBB.Add(newWire, aER);
}
- //modified by NIZNHY-PKV Mon Jan 31 17:26:36 2005f
- //
+ // xf
TopTools_ListOfShape aLW;
//
aLW.Append(aW);
myImages.Bind(newWire, aLW);
myOrigins.Bind(aW, newWire);
- //
- //modified by NIZNHY-PKV Mon Jan 31 17:26:41 2005 t
+ // xt
aBB.Add(newFace, newWire);
}
aNewFace=newFace;
aType=aS.ShapeType();
if (aType==TopAbs_VERTEX ||
aType==TopAbs_EDGE ||
- aType==TopAbs_WIRE || //modified by NIZNHY-PKV Mon Jan 31 17:18:36 2005ft
+ aType==TopAbs_WIRE ||
aType==TopAbs_FACE ||
- aType==TopAbs_SHELL || //modified by NIZNHY-PKV Mon Jan 31 17:18:36 2005ft
- aType==TopAbs_SOLID) { //modified by NIZNHY-PKV Mon Jan 31 17:18:36 2005ft
+ aType==TopAbs_SHELL ||
+ aType==TopAbs_SOLID) {
if(myOrigins.IsBound(aS)) {
const TopoDS_Shape& aSnew=myOrigins.Find(aS);
if (!aSnew.IsSame(aS)) {