mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-05-01 10:26:12 +03:00
Macro NO_CXX_EXCEPTION was removed from code. Method Raise() was replaced by explicit throw statement. Method Standard_Failure::Caught() was replaced by normal C++mechanism of exception transfer. Method Standard_Failure::Caught() is deprecated now. Eliminated empty constructors. Updated samples. Eliminate empty method ChangeValue from NCollection_Map class. Removed not operable methods from NCollection classes.
326 lines
10 KiB
C++
326 lines
10 KiB
C++
// Created on: 1993-03-11
|
|
// Created by: Jean Yves LEBEY
|
|
// Copyright (c) 1993-1999 Matra Datavision
|
|
// Copyright (c) 1999-2014 OPEN CASCADE SAS
|
|
//
|
|
// This file is part of Open CASCADE Technology software library.
|
|
//
|
|
// This library is free software; you can redistribute it and/or modify it under
|
|
// the terms of the GNU Lesser General Public License version 2.1 as published
|
|
// by the Free Software Foundation, with special exception defined in the file
|
|
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
|
|
// distribution for complete text of the license and disclaimer of any warranty.
|
|
//
|
|
// Alternatively, this file may be used under the terms of Open CASCADE
|
|
// commercial license or contractual agreement.
|
|
|
|
|
|
#include <Standard_Failure.hxx>
|
|
#include <TopoDS_Shape.hxx>
|
|
#include <TopOpeBRepBuild_BlockBuilder.hxx>
|
|
#include <TopOpeBRepBuild_BlockIterator.hxx>
|
|
#include <TopOpeBRepBuild_ShapeSet.hxx>
|
|
|
|
//=======================================================================
|
|
//function : TopOpeBRepBuild_BlockBuilder
|
|
//purpose :
|
|
//=======================================================================
|
|
TopOpeBRepBuild_BlockBuilder::TopOpeBRepBuild_BlockBuilder()
|
|
:myIsDone(Standard_False)
|
|
{
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : TopOpeBRepBuild_BlockBuilder
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
TopOpeBRepBuild_BlockBuilder::TopOpeBRepBuild_BlockBuilder
|
|
(TopOpeBRepBuild_ShapeSet& SS)
|
|
:myIsDone(Standard_False)
|
|
{
|
|
MakeBlock(SS);
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : MakeBlock
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void TopOpeBRepBuild_BlockBuilder::MakeBlock(TopOpeBRepBuild_ShapeSet& SS)
|
|
{
|
|
// Compute the set of connexity blocks of elements of element set SS
|
|
//
|
|
// Logic :
|
|
// - A block is a set of connex elements of SS
|
|
// - We assume that any element of SS appears in only 1 connexity block.
|
|
//
|
|
// Implementation :
|
|
// - All the elements of all the blocks are stored in map myOrientedShapeMap(M).
|
|
// - A connexity block is a segment [f,l] of element indices of M.
|
|
// - myBlocks is a sequence of integer; each integer is the index of the
|
|
// first element (in M) of a connexity block.
|
|
// - Bounds [f,l] of a connexity block are :
|
|
// f = myBlocks(i)
|
|
// l = myBlocks(i+1) - 1
|
|
|
|
myOrientedShapeMap.Clear();
|
|
myOrientedShapeMapIsValid.Clear();
|
|
myBlocks.Clear();
|
|
myBlocksIsRegular.Clear();
|
|
|
|
Standard_Boolean IsRegular;
|
|
Standard_Integer CurNei;
|
|
Standard_Integer Mextent;
|
|
Standard_Integer Eindex;
|
|
|
|
for (SS.InitStartElements();SS.MoreStartElements();SS.NextStartElement()) {
|
|
|
|
const TopoDS_Shape& E = SS.StartElement();
|
|
Mextent = myOrientedShapeMap.Extent();
|
|
Eindex = AddElement(E);
|
|
|
|
// E = current element of the element set SS
|
|
// Mextent = index of last element stored in map M, before E is added.
|
|
// Eindex = index of E added to M : Eindex > Mextent => E is new in M
|
|
|
|
Standard_Boolean EnewinM = (Eindex > Mextent);
|
|
if (EnewinM) {
|
|
|
|
// make a new block starting at element Eindex
|
|
myBlocks.Append(Eindex);
|
|
IsRegular = Standard_True; CurNei = 0;
|
|
// put in current block all the elements connex to E :
|
|
// while an element E has been added to M
|
|
// - compute neighbours of E : N(E)
|
|
// - add each element N of N(E) to M
|
|
|
|
Mextent = myOrientedShapeMap.Extent();
|
|
Standard_Boolean searchneighbours = (Eindex <= Mextent);
|
|
while (searchneighbours) {
|
|
|
|
// E = element of M on which neighbours must be searched
|
|
// first step : Eindex = index of starting element of SS
|
|
// next steps : Eindex = index of neighbours of starting element of SS
|
|
const TopoDS_Shape& E1 = myOrientedShapeMap(Eindex);
|
|
CurNei = SS.MaxNumberSubShape(E1);
|
|
Standard_Boolean condregu = Standard_True;
|
|
if (CurNei > 2) condregu = Standard_False;
|
|
IsRegular = IsRegular && condregu;
|
|
// compute neighbours of E : add them to M to increase M.Extent().
|
|
SS.InitNeighbours(E1);
|
|
|
|
for (; SS.MoreNeighbours(); SS.NextNeighbour()) {
|
|
const TopoDS_Shape& N = SS.Neighbour();
|
|
AddElement(N);
|
|
}
|
|
|
|
Eindex++;
|
|
Mextent = myOrientedShapeMap.Extent();
|
|
searchneighbours = (Eindex <= Mextent);
|
|
|
|
} // while (searchneighbours)
|
|
Standard_Integer iiregu = IsRegular ? 1 : 0;
|
|
myBlocksIsRegular.Append(iiregu);
|
|
} // if (EnewinM)
|
|
} // for ()
|
|
|
|
// To value the l bound of the last connexity block created above,
|
|
// we create an artificial block of value = myOrientedShapeMap.Extent() + 1
|
|
// The real number of connexity blocks is myBlocks.Length() - 1
|
|
Mextent = myOrientedShapeMap.Extent();
|
|
myBlocks.Append(Mextent + 1);
|
|
myIsDone = Standard_True;
|
|
|
|
#if 0
|
|
// version seche
|
|
myOrientedShapeMap.Clear();
|
|
myOrientedShapeMapIsValid.Clear();
|
|
myBlocks.Clear();
|
|
while (SS.MoreStartElements()) {
|
|
Standard_Integer last = myOrientedShapeMap.Extent();
|
|
Standard_Integer index =AddElement(SS.StartElement());
|
|
if (index > last) {
|
|
myBlocks.Append(index);
|
|
while (index <= myOrientedShapeMap.Extent()) {
|
|
for (SS.InitNeighbours(myOrientedShapeMap(index));
|
|
SS.MoreNeighbours();
|
|
SS.NextNeighbour()) {
|
|
AddElement(SS.Neighbour());
|
|
}
|
|
index++;
|
|
}
|
|
}
|
|
SS.NextStartElement();
|
|
}
|
|
myBlocks.Append(myOrientedShapeMap.Extent()+1);
|
|
myBlockIndex = 1;
|
|
#endif
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : InitBlock
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void TopOpeBRepBuild_BlockBuilder::InitBlock()
|
|
{
|
|
myBlockIndex = 1;
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : MoreBlock
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
Standard_Boolean TopOpeBRepBuild_BlockBuilder::MoreBlock() const
|
|
{
|
|
// the length of myBlocks is 1 + number of connexity blocks
|
|
Standard_Integer l = myBlocks.Length();
|
|
Standard_Boolean b = (myBlockIndex < l);
|
|
return b;
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : NextBlock
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void TopOpeBRepBuild_BlockBuilder::NextBlock()
|
|
{
|
|
myBlockIndex++;
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : BlockIterator
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
TopOpeBRepBuild_BlockIterator TopOpeBRepBuild_BlockBuilder::BlockIterator() const
|
|
{
|
|
Standard_Integer lower = myBlocks(myBlockIndex);
|
|
Standard_Integer upper = myBlocks(myBlockIndex+1)-1;
|
|
return TopOpeBRepBuild_BlockIterator(lower,upper);
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : Element
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
const TopoDS_Shape& TopOpeBRepBuild_BlockBuilder::Element
|
|
(const TopOpeBRepBuild_BlockIterator& BI) const
|
|
{
|
|
Standard_Boolean isbound = BI.More();
|
|
if (!isbound) throw Standard_Failure("OutOfRange");
|
|
|
|
Standard_Integer index = BI.Value();
|
|
const TopoDS_Shape& E = myOrientedShapeMap(index);
|
|
return E;
|
|
}
|
|
|
|
const TopoDS_Shape& TopOpeBRepBuild_BlockBuilder::Element
|
|
(const Standard_Integer index) const
|
|
{
|
|
Standard_Boolean isbound = myOrientedShapeMapIsValid.IsBound(index);
|
|
if (!isbound) throw Standard_Failure("OutOfRange");
|
|
|
|
const TopoDS_Shape& E = myOrientedShapeMap(index);
|
|
return E;
|
|
}
|
|
|
|
Standard_Integer TopOpeBRepBuild_BlockBuilder::Element
|
|
(const TopoDS_Shape& E) const
|
|
{
|
|
Standard_Boolean isbound = myOrientedShapeMap.Contains(E);
|
|
if (!isbound) throw Standard_Failure("OutOfRange");
|
|
|
|
Standard_Integer I = myOrientedShapeMap.FindIndex(E);
|
|
return I;
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : ElementIsValid
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
Standard_Boolean TopOpeBRepBuild_BlockBuilder::ElementIsValid
|
|
(const TopOpeBRepBuild_BlockIterator& BI) const
|
|
{
|
|
Standard_Boolean isbound = BI.More();
|
|
if (!isbound) return Standard_False;
|
|
|
|
Standard_Integer Sindex = BI.Value();
|
|
Standard_Integer isb = myOrientedShapeMapIsValid.Find(Sindex);
|
|
Standard_Boolean isvalid = (isb == 1)? Standard_True: Standard_False;
|
|
|
|
return isvalid;
|
|
}
|
|
|
|
Standard_Boolean TopOpeBRepBuild_BlockBuilder::ElementIsValid
|
|
(const Standard_Integer Sindex) const
|
|
{
|
|
Standard_Boolean isbound = myOrientedShapeMapIsValid.IsBound(Sindex);
|
|
if (!isbound) return Standard_False;
|
|
|
|
Standard_Integer isb = myOrientedShapeMapIsValid.Find(Sindex);
|
|
Standard_Boolean isvalid = (isb == 1)? Standard_True: Standard_False;
|
|
|
|
return isvalid;
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : AddElement
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
Standard_Integer TopOpeBRepBuild_BlockBuilder::AddElement(const TopoDS_Shape& S)
|
|
{
|
|
Standard_Integer Sindex = myOrientedShapeMap.Add(S);
|
|
myOrientedShapeMapIsValid.Bind(Sindex, 1);
|
|
|
|
return Sindex;
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : SetValid
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void TopOpeBRepBuild_BlockBuilder::SetValid
|
|
(const TopOpeBRepBuild_BlockIterator& BI,
|
|
const Standard_Boolean isvalid)
|
|
{
|
|
Standard_Boolean isbound = BI.More();
|
|
if (!isbound) return;
|
|
|
|
Standard_Integer Sindex = BI.Value();
|
|
Standard_Integer i = (isvalid) ? 1 : 0;
|
|
myOrientedShapeMapIsValid.Bind(Sindex,i);
|
|
}
|
|
|
|
void TopOpeBRepBuild_BlockBuilder::SetValid
|
|
(const Standard_Integer Sindex,
|
|
const Standard_Boolean isvalid)
|
|
{
|
|
Standard_Boolean isbound = myOrientedShapeMapIsValid.IsBound(Sindex);
|
|
if (!isbound) return;
|
|
|
|
Standard_Integer i = (isvalid) ? 1 : 0;
|
|
myOrientedShapeMapIsValid.Bind(Sindex,i);
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : CurrentBlockIsRegular
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
Standard_Boolean TopOpeBRepBuild_BlockBuilder::CurrentBlockIsRegular()
|
|
{
|
|
Standard_Boolean b = Standard_False;
|
|
Standard_Integer i = myBlocksIsRegular.Value(myBlockIndex);
|
|
if(i == 1)
|
|
b = Standard_True;
|
|
return b;
|
|
}
|