1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-05-01 10:26:12 +03:00
occt/src/TopOpeBRepBuild/TopOpeBRepBuild_Builder1_2.cxx
bugmster 973c2be1e1 0024428: Implementation of LGPL license
The copying permission statements at the beginning of source files updated to refer to LGPL.
Copyright dates extended till 2014 in advance.
2013-12-17 12:42:41 +04:00

205 lines
6.2 KiB
C++

// Created on: 2000-02-01
// Created by: Peter KURNEV
// Copyright (c) 2000-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 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 <TopOpeBRepBuild_Builder1.ixx>
#include <TopExp.hxx>
#include <TopExp_Explorer.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Shape.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Solid.hxx>
#include <TopoDS_Shell.hxx>
#include <TopoDS_Wire.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Vertex.hxx>
#include <BRep_Builder.hxx>
#include <TopTools_ListOfShape.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TopTools_IndexedMapOfShape.hxx>
#include <TopTools_IndexedDataMapOfShapeShape.hxx>
#include <TopOpeBRepDS_CurveExplorer.hxx>
//=======================================================================
//function : TopOpeBRepBuild_Builder1::CorrectResult2d
//purpose : Change the Result (after CorrectFace2d)
//=======================================================================
Standard_Integer TopOpeBRepBuild_Builder1::CorrectResult2d(TopoDS_Shape& aResult)
{
Standard_Integer aNb=myMapOfCorrect2dEdges.Extent();
if(!aNb)
return 0;
if (aResult.ShapeType()!=TopAbs_SOLID)
return 0;
//
// 1. Map Of sources' subshapes .
// The map (aSourceShapeMap) is to prevent unnecessary coping
TopTools_IndexedMapOfShape aSourceShapeMap;
TopExp::MapShapes(myShape1, TopAbs_EDGE, aSourceShapeMap);
TopExp::MapShapes(myShape2, TopAbs_EDGE, aSourceShapeMap);
TopTools_IndexedDataMapOfShapeShape EdMap;
BRep_Builder BB;
TopoDS_Shape aLocalShape = aResult.EmptyCopied();
TopoDS_Solid aSolid=TopoDS::Solid(aLocalShape);
// TopoDS_Solid aSolid=TopoDS::Solid(aResult.EmptyCopied());
TopExp_Explorer anExpShells(aResult, TopAbs_SHELL);
for (; anExpShells.More(); anExpShells.Next()) {
const TopoDS_Shell& S=TopoDS::Shell(anExpShells.Current());
aLocalShape = S.EmptyCopied();
TopoDS_Shell aShell=TopoDS::Shell(aLocalShape);
// TopoDS_Shell aShell=TopoDS::Shell(S.EmptyCopied());
TopExp_Explorer anExpFaces(S, TopAbs_FACE);
for (; anExpFaces.More(); anExpFaces.Next()) {
TopoDS_Face F=TopoDS::Face(anExpFaces.Current());
//modified by NIZHNY-MZV Mon Mar 27 09:51:59 2000
TopAbs_Orientation Fori = F.Orientation();
//we should explore FORWARD face
// F.Orientation(TopAbs_FORWARD);
aLocalShape = F.EmptyCopied();
TopoDS_Face aFace=TopoDS::Face(aLocalShape);
// TopoDS_Face aFace=TopoDS::Face(F.EmptyCopied());
TopExp_Explorer anExpWires(F, TopAbs_WIRE);
for (; anExpWires.More(); anExpWires.Next()) {
TopoDS_Wire W=TopoDS::Wire(anExpWires.Current());
//modified by NIZHNY-MZV Mon Mar 27 09:51:59 2000
TopAbs_Orientation Wori = W.Orientation();
//we should explore FORWARD wire
// W.Orientation(TopAbs_FORWARD);
aLocalShape = W.EmptyCopied();
TopoDS_Wire aWire = TopoDS::Wire(aLocalShape);
// TopoDS_Wire aWire = TopoDS::Wire(W.EmptyCopied());
TopExp_Explorer anExpEdges(W, TopAbs_EDGE);
for (; anExpEdges.More(); anExpEdges.Next()) {
TopoDS_Edge E = TopoDS::Edge(anExpEdges.Current());
if (EdMap.Contains(E)) {
TopoDS_Shape anEdge = EdMap.ChangeFromKey(E);
anEdge.Orientation(E.Orientation());
BB.Add (aWire, anEdge);
continue;
}
if (myMapOfCorrect2dEdges.Contains(E)) {
TopoDS_Shape anEdge=myMapOfCorrect2dEdges.ChangeFromKey(E);
anEdge.Orientation(E.Orientation());
BB.Add (aWire, anEdge);
EdMap.Add(E, anEdge);
continue;
}
// add edges
TopoDS_Edge anEdge;
//we copy edge in order to not change it in source shapes
if(aSourceShapeMap.Contains(E)) {
TopoDS_Shape aLocalShape1 = E.EmptyCopied();
anEdge = TopoDS::Edge(aLocalShape1);
// anEdge = TopoDS::Edge(E.EmptyCopied());
EdMap.Add(E, anEdge);
TopExp_Explorer anExpVertices(E, TopAbs_VERTEX);
Standard_Boolean free = anEdge.Free();
anEdge.Free(Standard_True);
for(; anExpVertices.More(); anExpVertices.Next())
BB.Add(anEdge, anExpVertices.Current());
anEdge.Free(free);
}
else
anEdge = E;
anEdge.Orientation(E.Orientation());
BB.Add (aWire, anEdge);
}
// Add wires
aWire.Orientation(Wori);
BB.Add (aFace, aWire);
}
aFace.Orientation(Fori);
BB.Add (aShell, aFace);
}
aShell.Orientation(S.Orientation());
BB.Add (aSolid, aShell);
}
aResult=aSolid;
//update section curves
TopOpeBRepDS_CurveExplorer cex(myDataStructure->DS());
for (; cex.More(); cex.Next()) {
Standard_Integer ic = cex.Index();
TopTools_ListOfShape& LSE = ChangeNewEdges(ic);
TopTools_ListOfShape corrLSE;
TopTools_ListIteratorOfListOfShape it(LSE);
for(; it.More(); it.Next()) {
const TopoDS_Shape& E = it.Value();
if(EdMap.Contains(E)) {
const TopoDS_Shape& newE = EdMap.FindFromKey(E);
corrLSE.Append(newE);
}
else
corrLSE.Append(E);
}
LSE.Clear();
LSE.Append(corrLSE);
}
//update section edges
const TopOpeBRepDS_DataStructure& BDS = myDataStructure->DS();
Standard_Integer i,nes = BDS.NbSectionEdges();
for(i = 1; i <= nes; i++) {
const TopoDS_Shape& es = BDS.SectionEdge(i);
if(es.IsNull())
continue;
for(Standard_Integer j = 0; j <= 2; j++) {
TopAbs_State staspl = TopAbs_State(j); // 0 - IN, 1 - OUT, 2 - ON
TopTools_ListOfShape& LSE = ChangeSplit(es,staspl);
TopTools_ListOfShape corrLSE;
TopTools_ListIteratorOfListOfShape it(LSE);
for(; it.More(); it.Next()) {
const TopoDS_Shape& E = it.Value();
if(EdMap.Contains(E)) {
const TopoDS_Shape& newE = EdMap.FindFromKey(E);
corrLSE.Append(newE);
}
else
corrLSE.Append(E);
}
LSE.Clear();
LSE.Append(corrLSE);
}
}
return 1;
}