1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-07 18:30:55 +03:00
occt/src/DNaming/DNaming_Line3DDriver.cxx
abv 92efcf78a6 0026936: Drawbacks of inlining in new type system in OCCT 7.0 -- automatic
Automatic restore of IMPLEMENT_STANDARD_RTTIEXT macro (upgrade -rtti)
2015-12-04 14:15:06 +03:00

301 lines
10 KiB
C++

// Created on: 2010-02-26
// Created by: Sergey ZARITCHNY
// Copyright (c) 2010-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 <BRep_Builder.hxx>
#include <BRep_Tool.hxx>
#include <BRepAlgo.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <BRepBuilderAPI_MakeWire.hxx>
#include <DNaming.hxx>
#include <DNaming_Line3DDriver.hxx>
#include <Geom_BSplineCurve.hxx>
#include <GeomAPI_Interpolate.hxx>
#include <gp_Pnt.hxx>
#include <gp_Trsf.hxx>
#include <gp_Vec.hxx>
#include <ModelDefinitions.hxx>
#include <Precision.hxx>
#include <Standard_GUID.hxx>
#include <Standard_Type.hxx>
#include <TColgp_HArray1OfPnt.hxx>
#include <TDataStd_Integer.hxx>
#include <TDataStd_Name.hxx>
#include <TDataStd_Real.hxx>
#include <TDF_AttributeMap.hxx>
#include <TDF_Label.hxx>
#include <TDF_MapIteratorOfAttributeMap.hxx>
#include <TFunction_Function.hxx>
#include <TFunction_Logbook.hxx>
#include <TNaming.hxx>
#include <TNaming_Builder.hxx>
#include <TNaming_NamedShape.hxx>
#include <TopAbs.hxx>
#include <TopExp.hxx>
#include <TopExp_Explorer.hxx>
#include <TopLoc_Location.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Shape.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Wire.hxx>
#include <TopTools_Array1OfShape.hxx>
#include <TopTools_HSequenceOfShape.hxx>
IMPLEMENT_STANDARD_RTTIEXT(DNaming_Line3DDriver,TFunction_Driver)
//=======================================================================
//function : DNaming_Line3DDriver
//purpose : Constructor
//=======================================================================
DNaming_Line3DDriver::DNaming_Line3DDriver()
{}
//=======================================================================
//function : Validate
//purpose : Validates labels of a function in <theLog>.
//=======================================================================
void DNaming_Line3DDriver::Validate(Handle(TFunction_Logbook)&) const
{}
//=======================================================================
//function : MustExecute
//purpose : Analyse in <theLog> if the loaded function must be executed
//=======================================================================
Standard_Boolean DNaming_Line3DDriver::MustExecute(const Handle(TFunction_Logbook)&) const
{
return Standard_True;
}
//=======================================================================
//function : Execute
//purpose : Execute the function
//=======================================================================
Standard_Integer DNaming_Line3DDriver::Execute(Handle(TFunction_Logbook)& theLog) const
{
Handle(TFunction_Function) aFunction;
Label().FindAttribute(TFunction_Function::GetID(),aFunction);
if(aFunction.IsNull()) return -1;
aFunction->SetFailure(NOTDONE);
Handle(TNaming_NamedShape) aPrevILine3D = DNaming::GetFunctionResult(aFunction);
// Save location
TopLoc_Location aLocation;
if (!aPrevILine3D.IsNull() && !aPrevILine3D->IsEmpty()) {
aLocation = aPrevILine3D->Get().Location();
}
const Standard_Integer aType = DNaming::GetInteger(aFunction, LINE3D_TYPE)->Get();
Standard_Boolean isClosed(aType);
Standard_Integer aCounter(0), aLength = DNaming::GetInteger(aFunction, LINE3D_PNTNB)->Get();
if(aLength < 2) {
aFunction->SetFailure(WRONG_ARGUMENT);
return -1;
}
Handle(TNaming_NamedShape) aNS1, aNS2;
BRepBuilderAPI_MakeWire aMakeWire;
TopoDS_Wire aWire;
TopoDS_Shape aShape1, aShape2;
TopTools_Array1OfShape anArV(1,aLength); //aLength - number of points
for(aCounter = 1; aCounter <= aLength-1; aCounter++) {
Handle(TDataStd_UAttribute) aRefP1 = DNaming::GetObjectArg(aFunction, (LINE3D_TYPE + aCounter));
aNS1 = DNaming::GetObjectValue(aRefP1);
Handle(TDataStd_UAttribute) aRefP2 = DNaming::GetObjectArg(aFunction, (LINE3D_TYPE + aCounter +1));
aNS2 = DNaming::GetObjectValue(aRefP2);
#ifdef OCCT_DEBUG
if(!aNS1->IsEmpty()) {
aShape1 = aNS1->Get();
gp_Pnt aDebPoint = BRep_Tool::Pnt(TopoDS::Vertex(aShape1));
// cout << aCounter << " X = " << aDebPoint.X() << " Y = " << aDebPoint.Y() << " Z = " << aDebPoint.Z() << endl;
} else
cout << " Line3DDriver:: NS1 is empty" << endl;
if(!aNS2->IsEmpty()) {
aShape2 = aNS2->Get();
gp_Pnt aDebPoint = BRep_Tool::Pnt(TopoDS::Vertex(aShape2));
// cout << aCounter+1 << " X = " << aDebPoint.X() << " Y = " << aDebPoint.Y() << " Z = " << aDebPoint.Z() << endl;
} else
cout << " Line3DDriver:: NS2 is empty" << endl;
#endif
if(aNS1->IsEmpty() || aNS2->IsEmpty() ||
aNS1->Get().IsNull() || aNS2->Get().IsNull()) {
aFunction->SetFailure(WRONG_ARGUMENT);
return -1;
}
aShape1 = aNS1->Get();
aShape2 = aNS2->Get();
#ifdef OCCT_DEBUG
gp_Pnt aDebPoint = BRep_Tool::Pnt(TopoDS::Vertex(aShape1));
// cout << aCounter << " X = " << aDebPoint.X() << " Y = " << aDebPoint.Y() << " Z = " << aDebPoint.Z() << endl;
aDebPoint = BRep_Tool::Pnt(TopoDS::Vertex(aShape2));
// cout << aCounter+1 << " X = " << aDebPoint.X() << " Y = " << aDebPoint.Y() << " Z = " << aDebPoint.Z() << endl;
#endif
if(aShape1.ShapeType() != TopAbs_VERTEX || aShape2.ShapeType() != TopAbs_VERTEX) {
aFunction->SetFailure(WRONG_ARGUMENT);
return -1;
}
BRepBuilderAPI_MakeEdge aMakeEdge(TopoDS::Vertex(aShape1), TopoDS::Vertex(aShape2));
if(aMakeEdge.IsDone()) {
anArV.SetValue(aCounter, aShape1);
anArV.SetValue(aCounter+1, aShape2);
aMakeWire.Add(aMakeEdge.Edge());
}
}
// } else // closed
if(isClosed) {
Handle(TDataStd_UAttribute) aRefP1 = DNaming::GetObjectArg(aFunction, (LINE3D_TYPE + 1));
aNS1 = DNaming::GetObjectValue(aRefP1);
aShape1 = aNS1->Get();
BRepBuilderAPI_MakeEdge aMakeEdge(TopoDS::Vertex(aShape2), TopoDS::Vertex(aShape1));
if(aMakeEdge.IsDone()) aMakeWire.Add(aMakeEdge.Edge());
}
if(aMakeWire.IsDone()) aWire = aMakeWire.Wire();
if(aWire.IsNull()) {
aFunction->SetFailure(ALGO_FAILED);
return -1;
}
if (!BRepAlgo::IsValid(aWire)) {
aFunction->SetFailure(RESULT_NOT_VALID);
return -1;
}
TDF_Label aResultLabel = RESPOSITION(aFunction); //aFunction->GetResult()->Label();
try {
LoadNamingDS(aResultLabel, aWire, anArV, isClosed);
} catch (Standard_Failure) {
aFunction->SetFailure(NAMING_FAILED);
return -1;
}
// restore location
if(!aLocation.IsIdentity())
TNaming::Displace(aResultLabel, aLocation, Standard_True);
theLog->SetValid(aResultLabel, Standard_True);
aFunction->SetFailure(DONE);
return 0;
}
//=======================================================================
//function : LoadNamingDS
//purpose : Loads a Line3D in a data framework
//=======================================================================
void DNaming_Line3DDriver::LoadNamingDS (const TDF_Label& theResultLabel,
const TopoDS_Wire& theWire,
const TopTools_Array1OfShape& theArV,
const Standard_Boolean isClosed) const
{
if(theWire.IsNull()) return;
//Wire
TNaming_Builder aWBuilder(theResultLabel);
aWBuilder.Generated(theWire);
#ifdef OCCT_DEBUG
TDataStd_Name::Set(theResultLabel, "Line3DCurve");
#endif
Standard_Integer aLength = theArV.Length();
if(aLength < 2) return;
TopoDS_Shape aShape;
TopTools_Array1OfShape anArE(1,aLength);
TopoDS_Vertex aFirst, aLast;
for(Standard_Integer i = 1;i < aLength;i++) {
gp_Pnt aP1 = BRep_Tool::Pnt(TopoDS::Vertex(theArV.Value(i)));
gp_Pnt aP2 = BRep_Tool::Pnt(TopoDS::Vertex(theArV.Value(i+1)));
Standard_Boolean aFound = Standard_False;
TopExp_Explorer anExp(theWire,TopAbs_EDGE);
for(;anExp.More();anExp.Next()) {
const TopoDS_Edge& anE = TopoDS::Edge(anExp.Current());
TopoDS_Vertex aV, aV1, aV2;
TopExp::Vertices(anE, aV1, aV2);
gp_Pnt aPE1 = BRep_Tool::Pnt(aV1);
gp_Pnt aPE2 = BRep_Tool::Pnt(aV2);
if(aP1.IsEqual(aPE1, Precision::Confusion()) && aP2.IsEqual(aPE2, Precision::Confusion())) {
anArE.SetValue(i, anE);
aFound = Standard_True;
break;
}
}
if(!aFound)
anArE.SetValue(i, aShape);
else aFound = Standard_False;
}
if(isClosed) {
Standard_Boolean aFound = Standard_False;
gp_Pnt aP1 = BRep_Tool::Pnt(TopoDS::Vertex(theArV.Value(aLength)));
gp_Pnt aP2 = BRep_Tool::Pnt(TopoDS::Vertex(theArV.Value(1)));
TopExp_Explorer anExp(theWire,TopAbs_EDGE);
for(;anExp.More();anExp.Next()) {
const TopoDS_Edge& anE = TopoDS::Edge(anExp.Current());
TopoDS_Vertex aV, aV1, aV2;
TopExp::Vertices(anE, aV1, aV2);
gp_Pnt aPE1 = BRep_Tool::Pnt(aV1);
gp_Pnt aPE2 = BRep_Tool::Pnt(aV2);
if(aP1.IsEqual(aPE1, Precision::Confusion()) && aP2.IsEqual(aPE2, Precision::Confusion())) {
anArE.SetValue(aLength, anE);
aFound = Standard_True;
// closed case
aFirst = aV2;
aLast = aV1;
break;
}
}
if(!aFound)
anArE.SetValue(aLength, aShape);
} else {
// open
anArE.SetValue(aLength, aShape); // last edge
TopExp::Vertices(theWire, aFirst, aLast);
}
// put edges
// from 1:aLength - edges
for(Standard_Integer i1 = 1;i1 <= aLength ;i1++) {
TDF_Label aLab = theResultLabel.FindChild(i1);
if(!anArE.Value(i1).IsNull()) {
TNaming_Builder aBuilder(aLab);
aBuilder.Generated(anArE.Value(i1));
} else {
Handle(TNaming_NamedShape) aNS;
if(aLab.FindAttribute(TNaming_NamedShape::GetID(), aNS))
TNaming_Builder aB(aLab);
}
}
//put vertexes
// aLength +1 - first vertex
// aLength +2 - last vertex
TDF_Label aLab1 = theResultLabel.FindChild(aLength+1);
TDF_Label aLab2 = theResultLabel.FindChild(aLength+2);
if(!aFirst.IsNull()) {
TNaming_Builder aBuilder(aLab1);
aBuilder.Generated(aFirst);
} else {
Handle(TNaming_NamedShape) aNS;
if(aLab1.FindAttribute(TNaming_NamedShape::GetID(), aNS))
TNaming_Builder aB(aLab1);
}
if(!aLast.IsNull()) {
TNaming_Builder aBuilder(aLab2);
aBuilder.Generated(aLast);
} else {
Handle(TNaming_NamedShape) aNS;
if(aLab2.FindAttribute(TNaming_NamedShape::GetID(), aNS))
TNaming_Builder aB(aLab2);
}
}