1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-09 13:22:24 +03:00

Integration of OCCT 6.5.0 from SVN

This commit is contained in:
bugmaster
2011-03-16 07:30:28 +00:00
committed by bugmaster
parent 4903637061
commit 7fd59977df
16375 changed files with 3882564 additions and 0 deletions

302
src/LocOpe/LocOpe_LinearForm.cxx Executable file
View File

@@ -0,0 +1,302 @@
// File: LocOpe_LinearForm.cxx
// Created: Wed Sep 4 15:01:13 1996
// Author: Olga PILLOT
#include <LocOpe_LinearForm.ixx>
#include <BRepSweep_Prism.hxx>
#include <TopExp.hxx>
#include <TopExp_Explorer.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Compound.hxx>
#include <BRep_Builder.hxx>
#include <LocOpe_BuildShape.hxx>
#include <LocOpe.hxx>
#include <gp_Ax1.hxx>
#include <gp_Trsf.hxx>
#include <BRepTools_TrsfModification.hxx>
#include <BRepTools_Modifier.hxx>
#include <BRep_Tool.hxx>
#include <BRepLib_MakeEdge.hxx>
#include <Geom_Line.hxx>
#include <Geom_Curve.hxx>
#include <Geom_TrimmedCurve.hxx>
#include <BRepLib_MakeVertex.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
#include <TColgp_SequenceOfPnt.hxx>
//=======================================================================
//function : Perform
//purpose :
//=======================================================================
void LocOpe_LinearForm::Perform(const TopoDS_Shape& Base,
const gp_Vec& V,
const gp_Pnt& Pnt1,
const gp_Pnt& Pnt2)
{
myIsTrans = Standard_False;
myMap.Clear();
myFirstShape.Nullify();
myLastShape.Nullify();
myBase.Nullify();
myRes.Nullify();
myBase = Base;
myVec = V;
//myEdge = E;
myPnt1 = Pnt1;
myPnt2 = Pnt2;
IntPerf();
}
//=======================================================================
//function : Perform
//purpose :
//=======================================================================
void LocOpe_LinearForm::Perform(const TopoDS_Shape& Base,
const gp_Vec& V,
const gp_Vec& Vectra,
const gp_Pnt& Pnt1,
const gp_Pnt& Pnt2)
{
myIsTrans = Standard_True;
myTra = Vectra;
myMap.Clear();
myFirstShape.Nullify();
myLastShape.Nullify();
myBase.Nullify();
myRes.Nullify();
myBase = Base;
myVec = V;
//myEdge = E;
myPnt1 = Pnt1;
myPnt2 = Pnt2;
IntPerf();
}
//=======================================================================
//function : IntPerf
//purpose :
//=======================================================================
void LocOpe_LinearForm::IntPerf()
{
TopoDS_Shape theBase = myBase;
BRepTools_Modifier Modif;
if (myIsTrans) {
gp_Trsf T;
T.SetTranslation(myTra);
Handle(BRepTools_TrsfModification) modbase =
new BRepTools_TrsfModification(T);
Modif.Init(theBase);
Modif.Perform(modbase);
theBase = Modif.ModifiedShape(theBase);
}
BRepSweep_Prism myPrism(theBase, myVec);
myFirstShape = myPrism.FirstShape();
myLastShape = myPrism.LastShape();
TopExp_Explorer exp;
if (theBase.ShapeType() == TopAbs_FACE) {
for (exp.Init(theBase,TopAbs_EDGE);exp.More();exp.Next()) {
const TopoDS_Edge& edg = TopoDS::Edge(exp.Current());
if (!myMap.IsBound(edg)) {
TopTools_ListOfShape thelist;
myMap.Bind(edg, thelist);
TopoDS_Shape desc = myPrism.Shape(edg);
if (!desc.IsNull()) {
myMap(edg).Append(desc);
}
}
}
myRes = myPrism.Shape();
}
else {
// Cas base != FACE
TopTools_IndexedDataMapOfShapeListOfShape theEFMap;
TopExp::MapShapesAndAncestors(theBase,TopAbs_EDGE,TopAbs_FACE,theEFMap);
TopTools_ListOfShape lfaces;
Standard_Boolean toremove = Standard_False;
for (Standard_Integer i=1; i<=theEFMap.Extent(); i++) {
const TopoDS_Shape& edg = theEFMap.FindKey(i);
TopTools_ListOfShape thelist1;
myMap.Bind(edg, thelist1);
TopoDS_Shape desc = myPrism.Shape(edg);
if (!desc.IsNull()) {
if (theEFMap(i).Extent() >= 2) {
toremove = Standard_True;
}
else {
myMap(edg).Append(desc);
lfaces.Append(desc);
}
}
}
if(toremove) {
// Rajouter les faces de FirstShape et LastShape
for (exp.Init(myFirstShape,TopAbs_FACE);exp.More();exp.Next()) {
lfaces.Append(exp.Current());
}
for (exp.Init(myLastShape,TopAbs_FACE);exp.More();exp.Next()) {
lfaces.Append(exp.Current());
}
LocOpe_BuildShape BS(lfaces);
myRes = BS.Shape();
}
else {
for (exp.Init(theBase,TopAbs_EDGE);exp.More();exp.Next()) {
const TopoDS_Edge& edg = TopoDS::Edge(exp.Current());
if (!myMap.IsBound(edg)) {
TopTools_ListOfShape thelist2;
myMap.Bind(edg, thelist2);
TopoDS_Shape desc = myPrism.Shape(edg);
if (!desc.IsNull()) {
myMap(edg).Append(desc);
}
}
}
myRes = myPrism.Shape();
}
}
if (myIsTrans) {
// m-a-j des descendants
TopExp_Explorer exp;
for (exp.Init(myBase,TopAbs_EDGE);exp.More();exp.Next()) {
const TopoDS_Edge& edg = TopoDS::Edge(exp.Current());
const TopoDS_Edge& edgbis = TopoDS::Edge(Modif.ModifiedShape(edg));
if (!edgbis.IsSame(edg) && myMap.IsBound(edgbis)) {
myMap.Bind(edg,myMap(edgbis));
myMap.UnBind(edgbis);
}
}
}
myDone = Standard_True;
}
//=======================================================================
//function : Shape
//purpose :
//=======================================================================
const TopoDS_Shape& LocOpe_LinearForm::Shape () const
{
if (!myDone) {
StdFail_NotDone::Raise();
}
return myRes;
}
//=======================================================================
//function : FirstShape
//purpose :
//=======================================================================
const TopoDS_Shape& LocOpe_LinearForm::FirstShape () const
{
return myFirstShape;
}
//=======================================================================
//function : LastShape
//purpose :
//=======================================================================
const TopoDS_Shape& LocOpe_LinearForm::LastShape () const
{
return myLastShape;
}
//=======================================================================
//function : Shapes
//purpose :
//=======================================================================
const TopTools_ListOfShape& LocOpe_LinearForm::Shapes (const TopoDS_Shape& S) const
{
return myMap(S);
}