-// File: BRepFill_PipeShell.cxx
-// Created: Wed Jul 22 10:52:44 1998
-// Author: Philippe MANGIN
-// <pmn@sgi29>
+// Created on: 1998-07-22
+// Created by: Philippe MANGIN
+// Copyright (c) 1998-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 <stdio.h>
-
-#include <BRepFill_PipeShell.ixx>
#include <BRep_Builder.hxx>
#include <BRep_Tool.hxx>
-#include <TopExp.hxx>
-#include <TopTools_SequenceOfShape.hxx>
-#include <TopoDS.hxx>
-#include <TopoDS_Shell.hxx>
-#include <TopoDS_Solid.hxx>
-#include <TopoDS_Iterator.hxx>
-#include <TopLoc_Location.hxx>
-
-#include <BRepLib_MakeEdge.hxx>
-#include <BRepLib_MakeFace.hxx>
#include <BRepAdaptor_HCompCurve.hxx>
+#include <BRepBuilderAPI_Copy.hxx>
+#include <BRepBuilderAPI_Transform.hxx>
#include <BRepClass3d_SolidClassifier.hxx>
-
#include <BRepFill.hxx>
-#include <BRepFill_Sweep.hxx>
-#include <BRepFill_SectionPlacement.hxx>
-#include <BRepFill_Edge3DLaw.hxx>
#include <BRepFill_ACRLaw.hxx>
-#include <BRepFill_EdgeOnSurfLaw.hxx>
-#include <BRepFill_ShapeLaw.hxx>
#include <BRepFill_CompatibleWires.hxx>
+#include <BRepFill_DataMapOfShapeHArray2OfShape.hxx>
+#include <BRepFill_Edge3DLaw.hxx>
+#include <BRepFill_EdgeOnSurfLaw.hxx>
+#include <BRepFill_LocationLaw.hxx>
#include <BRepFill_NSections.hxx>
-#include <TColStd_HArray1OfReal.hxx>
-
-#include <GeomFill_TrihedronLaw.hxx>
-#include <GeomFill_CorrectedFrenet.hxx>
-#include <GeomFill_Frenet.hxx>
-#include <GeomFill_Fixed.hxx>
+#include <BRepFill_PipeShell.hxx>
+#include <BRepFill_Section.hxx>
+#include <BRepFill_SectionLaw.hxx>
+#include <BRepFill_SectionPlacement.hxx>
+#include <BRepFill_ShapeLaw.hxx>
+#include <BRepFill_Sweep.hxx>
+#include <BRepGProp.hxx>
+#include <BRepLib_MakeEdge.hxx>
+#include <BRepLib_MakeFace.hxx>
+#include <GeomAdaptor_HCurve.hxx>
+#include <GeomAdaptor_HSurface.hxx>
#include <GeomFill_ConstantBiNormal.hxx>
-#include <GeomFill_SectionLaw.hxx>
+#include <GeomFill_CorrectedFrenet.hxx>
#include <GeomFill_CurveAndTrihedron.hxx>
+#include <GeomFill_DiscreteTrihedron.hxx>
+#include <GeomFill_Fixed.hxx>
+#include <GeomFill_Frenet.hxx>
#include <GeomFill_GuideTrihedronAC.hxx>
#include <GeomFill_GuideTrihedronPlan.hxx>
#include <GeomFill_LocationGuide.hxx>
-
-//Specification Guide
-#include <GeomAdaptor_HCurve.hxx>
-
-#include <gp_Trsf.hxx>
+#include <GeomFill_SectionLaw.hxx>
+#include <GeomFill_TrihedronLaw.hxx>
+#include <gp_Ax2.hxx>
#include <gp_Dir.hxx>
+#include <gp_Trsf.hxx>
#include <gp_Vec.hxx>
+#include <GProp_GProps.hxx>
+#include <IntCurveSurface_HInter.hxx>
+#include <IntCurveSurface_IntersectionPoint.hxx>
+#include <Law_Function.hxx>
+#include <Law_Interpol.hxx>
#include <Precision.hxx>
-
-#include <Standard_NotImplemented.hxx>
#include <Standard_ConstructionError.hxx>
+#include <Standard_DomainError.hxx>
+#include <Standard_NotImplemented.hxx>
+#include <Standard_Type.hxx>
#include <StdFail_NotDone.hxx>
+#include <TColgp_HArray1OfPnt2d.hxx>
+#include <TColStd_HArray1OfReal.hxx>
+#include <TopExp.hxx>
+#include <TopLoc_Location.hxx>
+#include <TopoDS.hxx>
+#include <TopoDS_Iterator.hxx>
+#include <TopoDS_Shape.hxx>
+#include <TopoDS_Shell.hxx>
+#include <TopoDS_Solid.hxx>
+#include <TopoDS_Vertex.hxx>
+#include <TopoDS_Wire.hxx>
+#include <TopTools_SequenceOfShape.hxx>
-#include <BRepBuilderAPI_Copy.hxx>
-
+#include <stdio.h>
+//Specification Guide
#ifdef DRAW
#include <Draw.hxx>
#include <DrawTrSurf.hxx>
//=======================================================================
BRepFill_PipeShell::BRepFill_PipeShell(const TopoDS_Wire& Spine)
: mySpine(Spine),
- myTrihedron(GeomFill_IsCorrectedFrenet),
- myTransition(BRepFill_Modified),
- myStatus(GeomFill_PipeOk)
+ myForceApproxC1(Standard_False),
+ myIsAutomaticLaw(Standard_False),
+ myTrihedron(GeomFill_IsCorrectedFrenet),
+ myTransition(BRepFill_Modified),
+ myStatus(GeomFill_PipeOk)
{
myLocation.Nullify();
mySection.Nullify();
myLaw.Nullify();
SetTolerance();
+ myMaxDegree = 11;
+ myMaxSegments = 100;
+
// Attention to closed non-declared wire !
if (!mySpine.Closed()) {
TopoDS_Vertex Vf, Vl;
mySection.Nullify(); //It is required to relocalize sections.
}
+//=======================================================================
+//function : SetDiscrete
+//purpose : Define a law of Discrete Trihedron
+//=======================================================================
+ void BRepFill_PipeShell::SetDiscrete()
+{
+ Handle(GeomFill_TrihedronLaw) TLaw;
+
+ myTrihedron = GeomFill_IsDiscreteTrihedron;
+ TLaw = new (GeomFill_DiscreteTrihedron) ();
+
+ Handle(GeomFill_CurveAndTrihedron) Loc =
+ new (GeomFill_CurveAndTrihedron) (TLaw);
+ myLocation = new (BRepFill_Edge3DLaw) (mySpine, Loc);
+ mySection.Nullify(); //It is required to relocalize sections.
+}
+
//=======================================================================
//function : Set
//purpose : Define a law Constant
//=======================================================================
void BRepFill_PipeShell::Set(const TopoDS_Wire& AuxiliarySpine,
const Standard_Boolean CurvilinearEquivalence,
- const Standard_Boolean KeepContact)
+ const BRepFill_TypeOfContact KeepContact)
{
// Reorganization of the guide (pb of orientation and origin)
TopoDS_Wire TheGuide;
Standard_Boolean SpClose = mySpine.Closed(),
GuideClose = AuxiliarySpine.Closed();
+ if (KeepContact == BRepFill_ContactOnBorder)
+ myIsAutomaticLaw = Standard_True;
+
if (!SpClose && !GuideClose) {
// Case open reorientation of the guide
TopoDS_Wire sp = mySpine;
Guide->ChangeCurve().SetPeriodic(Standard_True);
if (CurvilinearEquivalence) { // trihedron by curvilinear reduced abscissa
- if (KeepContact)
+ if (KeepContact == BRepFill_Contact ||
+ KeepContact == BRepFill_ContactOnBorder)
myTrihedron = GeomFill_IsGuideACWithContact; // with rotation
else
myTrihedron = GeomFill_IsGuideAC; // without rotation
myLocation = new (BRepFill_ACRLaw) (mySpine, Loc);
}
else {// trihedron by plane
- if (KeepContact)
+ if (KeepContact == BRepFill_Contact ||
+ KeepContact == BRepFill_ContactOnBorder)
myTrihedron = GeomFill_IsGuidePlanWithContact; // with rotation
else
myTrihedron = GeomFill_IsGuidePlan; // without rotation
mySection.Nullify(); //It is required to relocalize the sections.
}
+
+//=======================================================================
+//function : SetMaxDegree
+//purpose :
+//=======================================================================
+void BRepFill_PipeShell::SetMaxDegree(const Standard_Integer NewMaxDegree)
+{
+ myMaxDegree = NewMaxDegree;
+}
+
+//=======================================================================
+//function : SetMaxSegments
+//purpose :
+//=======================================================================
+void BRepFill_PipeShell::SetMaxSegments(const Standard_Integer NewMaxSegments)
+{
+ myMaxSegments = NewMaxSegments;
+}
+
+//=======================================================================
+//function : SetForceApproxC1
+//purpose : Set the flag that indicates attempt to approximate
+// a C1-continuous surface if a swept surface proved
+// to be C0.
+//=======================================================================
+void BRepFill_PipeShell::SetForceApproxC1(const Standard_Boolean ForceApproxC1)
+{
+ myForceApproxC1 = ForceApproxC1;
+}
+
//=======================================================================
//function : Add
//purpose : Add a Section
const Standard_Boolean WithCorrection)
{
Delete(Profile); // No duplication
- BRepFill_Section S (Profile, Location, WithContact, WithCorrection);
- mySeq.Append(S);
- mySection.Nullify();
- ResetLoc();
+ if (myIsAutomaticLaw)
+ {
+ mySeq.Clear();
+ BRepFill_Section S (Profile, Location, WithContact, WithCorrection);
+ S.Set(Standard_True);
+ mySeq.Append(S);
+ mySection.Nullify();
+ ResetLoc();
+
+ Handle(GeomFill_LocationGuide) Loc = Handle(GeomFill_LocationGuide)::DownCast(myLocation->Law(1));
+ Handle(TColgp_HArray1OfPnt2d) ParAndRad;
+ Loc->ComputeAutomaticLaw(ParAndRad);
+
+ //Compuite initial width of section (this will be 1.)
+ GProp_GProps GlobalProps;
+ BRepGProp::LinearProperties(Profile, GlobalProps);
+ gp_Pnt BaryCenter = GlobalProps.CentreOfMass();
+
+ TopoDS_Face ProfileFace = BRepLib_MakeFace(TopoDS::Wire(Profile), Standard_True); //only plane
+ Handle(Geom_Surface) thePlane = BRep_Tool::Surface(ProfileFace);
+ Handle(GeomAdaptor_HSurface) GAHplane = new GeomAdaptor_HSurface(thePlane);
+ IntCurveSurface_HInter Intersector;
+ Handle(Adaptor3d_HCurve) aHCurve [2];
+ aHCurve[0] = Loc->GetCurve();
+ aHCurve[1] = Loc->Guide();
+ gp_Pnt PointsOnSpines [2];
+ Standard_Integer i, j;
+
+ for (i = 0; i < 2; i++)
+ {
+ Intersector.Perform(aHCurve[i], GAHplane);
+ Standard_Real MinDist = RealLast();
+ for (j = 1; j <= Intersector.NbPoints(); j++)
+ {
+ gp_Pnt aPint = Intersector.Point(j).Pnt();
+ Standard_Real aDist = BaryCenter.Distance(aPint);
+ if (aDist < MinDist)
+ {
+ MinDist = aDist;
+ PointsOnSpines[i] = aPint;
+ }
+ }
+ }
+
+ //Correct <ParAndRad> according to <InitialWidth>
+ Standard_Real InitialWidth = PointsOnSpines[0].Distance(PointsOnSpines[1]);
+ Standard_Integer NbParRad = ParAndRad->Upper();
+ for (i = 1; i <= NbParRad; i++)
+ {
+ gp_Pnt2d aParRad = ParAndRad->Value(i);
+ aParRad.SetY( aParRad.Y() / InitialWidth );
+ ParAndRad->SetValue(i, aParRad);
+ }
+
+ myLaw = new Law_Interpol();
+
+ Standard_Boolean IsPeriodic =
+ (Abs(ParAndRad->Value(1).Y() - ParAndRad->Value(NbParRad).Y()) < Precision::Confusion());
+
+ (Handle(Law_Interpol)::DownCast(myLaw))->Set(ParAndRad->Array1(), IsPeriodic);
+ }
+ else
+ {
+ BRepFill_Section S (Profile, Location, WithContact, WithCorrection);
+ mySeq.Append(S);
+ mySection.Nullify();
+ ResetLoc();
+ }
}
//=======================================================================
BRepFill_Sweep MkSw(mySection, myLocation, Standard_True);
MkSw.SetTolerance(myTol3d, myBoundTol, 1.e-5, myTolAngular);
MkSw.SetAngularControl(angmin, angmax);
+ MkSw.SetForceApproxC1(myForceApproxC1);
MkSw.SetBounds(TopoDS::Wire(myFirst),
TopoDS::Wire(myLast));
- MkSw.Build(myTransition);
+ GeomAbs_Shape theContinuity = GeomAbs_C2;
+ if (myTrihedron == GeomFill_IsDiscreteTrihedron)
+ theContinuity = GeomAbs_C0;
+ TopTools_MapOfShape Dummy;
+ BRepFill_DataMapOfShapeHArray2OfShape Dummy2;
+ BRepFill_DataMapOfShapeHArray2OfShape Dummy3;
+ MkSw.Build(Dummy, Dummy2, Dummy3, myTransition, theContinuity,
+ GeomFill_Location, myMaxDegree, myMaxSegments);
myStatus = myLocation->GetStatus();
Ok = (MkSw.IsDone() && (myStatus == GeomFill_PipeOk));
if (Ok) {
myShape = MkSw.Shape();
+ myErrorOnSurf = MkSw.ErrorOnSurface();
TopoDS_Shape aBottomWire = myFirst;
TopoDS_Shape aTopWire = myLast;
return myShape;
}
+//=======================================================================
+//function : ErrorOnSurface
+//purpose :
+//=======================================================================
+
+Standard_Real BRepFill_PipeShell::ErrorOnSurface() const
+{
+ return myErrorOnSurf;
+}
+
//=======================================================================
//function : FirstShape
//purpose : Return the start section
Sec.Vertex(),
Sec.WithContact(),
Sec.WithCorrection());
- W = Sec.Wire();
+ TopoDS_Wire TmpWire = Sec.Wire();
aTrsf = Place.Transformation();
- TopLoc_Location Loc2(Place.Transformation()), Loc1;
- Loc1 = W.Location();
- W.Location(Loc2.Multiplied(Loc1));
+ //TopLoc_Location Loc2(Place.Transformation()), Loc1;
+ //Loc1 = TmpWire.Location();
+ //W.Location(Loc2.Multiplied(Loc1));
+ //Transform the copy
+ W = TopoDS::Wire(BRepBuilderAPI_Transform(TmpWire, aTrsf, Standard_True));
+ ////////////////////////////////////
param = Place.AbscissaOnPath();
}
}
for(j = myLocation->NbLaw(); j >= 1; j--) {
- Standard_Boolean ismodified = Standard_False;
TopTools_ListOfShape aListOfFace;
if(bPrevModified) {