mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-14 13:30:48 +03:00
HLR debug
This commit is contained in:
@@ -1239,14 +1239,15 @@ void ComputeInternalPoints
|
|||||||
solution = Standard_False;
|
solution = Standard_False;
|
||||||
math_Vector dir1(1,2), dir2(1,2);
|
math_Vector dir1(1,2), dir2(1,2);
|
||||||
math_Vector prevX(1,2), prevPrevX (1,2);
|
math_Vector prevX(1,2), prevPrevX (1,2);
|
||||||
int count = 0;
|
Standard_Integer count = 0;
|
||||||
int revCount = 0;
|
Standard_Integer revCount = 0;
|
||||||
double dot = 0;
|
Standard_Integer maxRevCount = 10000;
|
||||||
double t = 0.5;
|
Standard_Real dot = 0;
|
||||||
|
Standard_Real t = 0.5;
|
||||||
while (!solution)
|
while (!solution)
|
||||||
{
|
{
|
||||||
X(1) =/* (XInf(1) + XSup(1)) /2.;*/ XInf(1) + t * (XSup(1) - XInf(1));
|
X(1) = XInf(1) + t * (XSup(1) - XInf(1));
|
||||||
X(2) = /*(XInf(2) + XSup(2)) /2.;*/XInf(2) + t * (XSup(2) - XInf(2));
|
X(2) = XInf(2) + t * (XSup(2) - XInf(2));
|
||||||
rsnld.Perform(SFunc,X,infb,supb);
|
rsnld.Perform(SFunc,X,infb,supb);
|
||||||
|
|
||||||
if (!rsnld.IsDone()) {
|
if (!rsnld.IsDone()) {
|
||||||
@@ -1304,13 +1305,11 @@ void ComputeInternalPoints
|
|||||||
else if (vtestb.Dot(vecref) < 0.) {
|
else if (vtestb.Dot(vecref) < 0.) {
|
||||||
XSup = X;
|
XSup = X;
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
XInf = X;
|
XInf = X;
|
||||||
if (revCount > 10000)
|
if (revCount > maxRevCount)
|
||||||
{
|
|
||||||
//XInf = (X + prevPrevX)/2;
|
|
||||||
t = 0.75;
|
t = 0.75;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else { // on n est pas sur une solution
|
else { // on n est pas sur une solution
|
||||||
|
@@ -63,6 +63,29 @@ void HLRAppli_ReflectLines::SetAxes(const Standard_Real Nx,
|
|||||||
myProjector = HLRAlgo_Projector(T,IsPerspective,aFocus);
|
myProjector = HLRAlgo_Projector(T,IsPerspective,aFocus);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HLRAppli_ReflectLines::SetAxes(const Standard_Real Nx,
|
||||||
|
const Standard_Real Ny,
|
||||||
|
const Standard_Real Nz,
|
||||||
|
const Standard_Real XAt,
|
||||||
|
const Standard_Real YAt,
|
||||||
|
const Standard_Real ZAt,
|
||||||
|
const Standard_Real XUp,
|
||||||
|
const Standard_Real YUp,
|
||||||
|
const Standard_Real ZUp,
|
||||||
|
Standard_Boolean IsPerspective,
|
||||||
|
Standard_Real theFocus)
|
||||||
|
{
|
||||||
|
gp_Pnt At (XAt,YAt,ZAt);
|
||||||
|
gp_Dir Zpers (Nx,Ny,Nz);
|
||||||
|
gp_Dir Ypers (XUp,YUp,ZUp);
|
||||||
|
gp_Dir Xpers = Ypers.Crossed(Zpers);
|
||||||
|
gp_Ax3 Axe (At, Zpers, Xpers);
|
||||||
|
gp_Trsf T;
|
||||||
|
T.SetTransformation(Axe);
|
||||||
|
myProjector = HLRAlgo_Projector(T,IsPerspective,theFocus);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : Perform
|
//function : Perform
|
||||||
//purpose :
|
//purpose :
|
||||||
@@ -117,8 +140,9 @@ TopoDS_Shape HLRAppli_ReflectLines::GetResult() const
|
|||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
TopoDS_Shape HLRAppli_ReflectLines::GetCompoundOfFaces(bool theMode,
|
TopoDS_Shape HLRAppli_ReflectLines::GetCompoundOfFaces(bool theMode,
|
||||||
TopTools_DataMapOfShapeShape& OrigFaceToProjFace ) const
|
TopTools_DataMapOfShapeShape& OrigFaceToProjFace,
|
||||||
|
TopTools_DataMapOfShapeShape& ProjFaceToOrigFace) const
|
||||||
{
|
{
|
||||||
HLRBRep_HLRToShape aHLRToShape( myHLRAlgo );
|
HLRBRep_HLRToShape aHLRToShape( myHLRAlgo );
|
||||||
return aHLRToShape.CompoundOfFaces(theMode, OrigFaceToProjFace);
|
return aHLRToShape.CompoundOfFaces(theMode, OrigFaceToProjFace, ProjFaceToOrigFace);
|
||||||
}
|
}
|
||||||
|
@@ -48,6 +48,13 @@ public:
|
|||||||
//! the coordinates of the vertical direction vector.
|
//! the coordinates of the vertical direction vector.
|
||||||
Standard_EXPORT void SetAxes (const Standard_Real Nx, const Standard_Real Ny, const Standard_Real Nz, const Standard_Real XAt, const Standard_Real YAt, const Standard_Real ZAt, const Standard_Real XUp, const Standard_Real YUp, const Standard_Real ZUp);
|
Standard_EXPORT void SetAxes (const Standard_Real Nx, const Standard_Real Ny, const Standard_Real Nz, const Standard_Real XAt, const Standard_Real YAt, const Standard_Real ZAt, const Standard_Real XUp, const Standard_Real YUp, const Standard_Real ZUp);
|
||||||
|
|
||||||
|
|
||||||
|
Standard_EXPORT void SetAxes (const Standard_Real Nx, const Standard_Real Ny, const Standard_Real Nz,
|
||||||
|
const Standard_Real XAt, const Standard_Real YAt, const Standard_Real ZAt,
|
||||||
|
const Standard_Real XUp, const Standard_Real YUp, const Standard_Real ZUp,
|
||||||
|
Standard_Boolean IsPerspective, Standard_Real theFocus);
|
||||||
|
|
||||||
|
|
||||||
Standard_EXPORT void Perform();
|
Standard_EXPORT void Perform();
|
||||||
|
|
||||||
//! returns resulting compound of reflect lines
|
//! returns resulting compound of reflect lines
|
||||||
@@ -62,7 +69,8 @@ public:
|
|||||||
const Standard_Boolean In3d) const;
|
const Standard_Boolean In3d) const;
|
||||||
|
|
||||||
Standard_EXPORT TopoDS_Shape GetCompoundOfFaces(bool theMode,
|
Standard_EXPORT TopoDS_Shape GetCompoundOfFaces(bool theMode,
|
||||||
TopTools_DataMapOfShapeShape& OrigFaceToProjFace) const;
|
TopTools_DataMapOfShapeShape& OrigFaceToProjFace,
|
||||||
|
TopTools_DataMapOfShapeShape& ProjFaceToOrigFace) const;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -569,7 +569,6 @@ public:
|
|||||||
myStop = 1;
|
myStop = 1;
|
||||||
}
|
}
|
||||||
return Standard_True;
|
return Standard_True;
|
||||||
//int nbpnt = an_inter->.NbPnt();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetLine (const gp_Lin& theLine)
|
void SetLine (const gp_Lin& theLine)
|
||||||
@@ -623,8 +622,7 @@ static bool FuseVE(TopoDS_Shape& theRes)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void ProcessHVertices(TopoDS_Shape& theRes,
|
static void ProcessHVertices(TopoDS_Shape& theRes,
|
||||||
NCollection_IndexedDataMap<TopoDS_Edge, BRepAdaptor_Curve2d, TopTools_ShapeMapHasher>& theEdAd,
|
NCollection_IndexedDataMap<TopoDS_Edge, BRepAdaptor_Curve2d, TopTools_ShapeMapHasher>& theEdAd)
|
||||||
NCollection_DataMap<TopoDS_Edge, Bnd_Box2d, TopTools_ShapeMapHasher>& theEdBnd2d )
|
|
||||||
{
|
{
|
||||||
BRepTools_ReShape reshaper;
|
BRepTools_ReShape reshaper;
|
||||||
///hanging vertices => find closely located point on some edge or vertex
|
///hanging vertices => find closely located point on some edge or vertex
|
||||||
@@ -661,22 +659,19 @@ static void ProcessHVertices(TopoDS_Shape& theRes,
|
|||||||
NCollection_UBTree <Standard_Integer, Bnd_Box2d> aTreeVE;
|
NCollection_UBTree <Standard_Integer, Bnd_Box2d> aTreeVE;
|
||||||
NCollection_UBTreeFiller <Standard_Integer, Bnd_Box2d> aTreeFillerVE (aTreeVE);
|
NCollection_UBTreeFiller <Standard_Integer, Bnd_Box2d> aTreeFillerVE (aTreeVE);
|
||||||
int nbEE = EE.Extent();
|
int nbEE = EE.Extent();
|
||||||
//NCollection_Array1<BRepAdaptor_Curve2d> anEdgeAdapters(1, nbEE);
|
|
||||||
for (Standard_Integer i = 1; i <= nbEE; i++)
|
for (Standard_Integer i = 1; i <= nbEE; i++)
|
||||||
{
|
{
|
||||||
const TopoDS_Edge& anE = TopoDS::Edge(EE(i));
|
const TopoDS_Edge& anE = TopoDS::Edge(EE(i));
|
||||||
Bnd_Box2d aBB;
|
Bnd_Box2d aBB;
|
||||||
theEdAd.Add(anE, BRepAdaptor_Curve2d(anE, aDraftPrFace));
|
theEdAd.Add(anE, BRepAdaptor_Curve2d(anE, aDraftPrFace));
|
||||||
BndLib_Add2dCurve::Add(*theEdAd.Seek(anE), 0, aBB);
|
BndLib_Add2dCurve::Add(*theEdAd.Seek(anE), 0, aBB);
|
||||||
theEdBnd2d.Bind(anE, aBB);
|
|
||||||
aTreeFillerVE.Add(i, aBB);
|
aTreeFillerVE.Add(i, aBB);
|
||||||
}
|
}
|
||||||
|
|
||||||
aTreeFillerVE.Fill();
|
aTreeFillerVE.Fill();
|
||||||
HLRVE_BndBoxTreeSelector aSelectorVE(theEdAd, Precision::Infinite()); //min dist doesn't matter here
|
HLRVE_BndBoxTreeSelector aSelectorVE(theEdAd, Precision::Infinite()); //min dist doesn't matter here
|
||||||
//
|
//
|
||||||
|
TopTools_IndexedMapOfShape toadd, torem;
|
||||||
TopTools_IndexedMapOfShape toadd, torem;//temp
|
|
||||||
for (int i = 1; i <= HV.Extent(); i++ )
|
for (int i = 1; i <= HV.Extent(); i++ )
|
||||||
{
|
{
|
||||||
const TopoDS_Vertex& CHV = TopoDS::Vertex(HV(i));
|
const TopoDS_Vertex& CHV = TopoDS::Vertex(HV(i));
|
||||||
@@ -685,20 +680,19 @@ static void ProcessHVertices(TopoDS_Shape& theRes,
|
|||||||
int id = VV.FindIndex(CHV);
|
int id = VV.FindIndex(CHV);
|
||||||
aSelectorVV.Reset(Precision::Infinite());
|
aSelectorVV.Reset(Precision::Infinite());
|
||||||
aSelectorVV.SetCurrentPoint( id );
|
aSelectorVV.SetCurrentPoint( id );
|
||||||
/*int resVV =*/ aTreeVV.Select(aSelectorVV);
|
aTreeVV.Select(aSelectorVV);
|
||||||
double aMinDDistReached = aSelectorVV.GetMinDDist();
|
double aMinDDistReached = aSelectorVV.GetMinDDist();
|
||||||
TopoDS_Vertex aResV = TopoDS::Vertex(VV(aSelectorVV.GetResVId()));
|
TopoDS_Vertex aResV = TopoDS::Vertex(VV(aSelectorVV.GetResVId()));
|
||||||
//
|
//
|
||||||
aSelectorVE.Reset(aMinDDistReached);
|
aSelectorVE.Reset(aMinDDistReached);
|
||||||
aSelectorVE.SetCurrentPoint( CHVPnt );
|
aSelectorVE.SetCurrentPoint( CHVPnt );
|
||||||
/*int resVE = */aTreeVE.Select(aSelectorVE);
|
aTreeVE.Select(aSelectorVE);
|
||||||
|
//
|
||||||
Extrema_POnCurv2d aPSolRes;
|
Extrema_POnCurv2d aPSolRes;
|
||||||
BRepAdaptor_Curve2d aResEA;
|
BRepAdaptor_Curve2d aResEA;
|
||||||
bool VEFound = aSelectorVE.GetPResult(aPSolRes, aResEA);
|
bool VEFound = aSelectorVE.GetPResult(aPSolRes, aResEA);
|
||||||
if (VEFound)
|
if (VEFound)
|
||||||
{
|
{
|
||||||
///if (BRep_Tool::Degenerated(E)) //can be degenerted??
|
|
||||||
double aPar = aPSolRes.Parameter();
|
double aPar = aPSolRes.Parameter();
|
||||||
const TopoDS_Edge& aResE = aResEA.Edge();
|
const TopoDS_Edge& aResE = aResEA.Edge();
|
||||||
TopoDS_Edge aDE1 = TopoDS::Edge(aResE.EmptyCopied().Oriented(TopAbs_FORWARD));
|
TopoDS_Edge aDE1 = TopoDS::Edge(aResE.EmptyCopied().Oriented(TopAbs_FORWARD));
|
||||||
@@ -718,19 +712,29 @@ static void ProcessHVertices(TopoDS_Shape& theRes,
|
|||||||
gp_Pnt aNC;
|
gp_Pnt aNC;
|
||||||
double aNTol;
|
double aNTol;
|
||||||
BRepLib::BoundingVertex(nls, aNC, aNTol);
|
BRepLib::BoundingVertex(nls, aNC, aNTol);
|
||||||
|
|
||||||
gp_Pnt aFVP = BRep_Tool::Pnt(aFV);
|
gp_Pnt aFVP = BRep_Tool::Pnt(aFV);
|
||||||
gp_Pnt aLVP = BRep_Tool::Pnt(aLV);
|
gp_Pnt aLVP = BRep_Tool::Pnt(aLV);
|
||||||
if (aFVP.Distance(aNC) < aNTol*1e10 ||
|
double dF_NC = aFVP.Distance(aNC);
|
||||||
aLVP.Distance(aNC) < aNTol*1e10)
|
double dL_NC = aLVP.Distance(aNC);
|
||||||
|
double aFVTol = BRep_Tool::Tolerance(aFV);
|
||||||
|
double aLVTol = BRep_Tool::Tolerance(aLV);
|
||||||
|
bool aFt = (aNTol + aFVTol) > dF_NC;
|
||||||
|
bool aLt = (aNTol + aLVTol) > dL_NC;
|
||||||
|
|
||||||
|
if (aFt || aLt)
|
||||||
{
|
{
|
||||||
nls.RemoveFirst();
|
nls.RemoveFirst();
|
||||||
nls.Append(aResV);
|
//either aFt or aLt is true; dont consider when both true => degenerated case
|
||||||
|
TopoDS_Vertex maV;
|
||||||
|
if (aFt)
|
||||||
|
maV = TopoDS::Vertex(nls.Append(aFV));
|
||||||
|
else
|
||||||
|
maV = TopoDS::Vertex(nls.Append(aLV));
|
||||||
BRepLib::BoundingVertex(nls, aNC, aNTol);
|
BRepLib::BoundingVertex(nls, aNC, aNTol);
|
||||||
BRep_Builder().UpdateVertex(aResV, aNC, aNTol);
|
BRep_Builder().UpdateVertex(maV, aNC, aNTol);
|
||||||
reshaper.Replace(CHV, aResV.Oriented(CHV.Orientation()));
|
reshaper.Replace(CHV, maV.Oriented(CHV.Orientation()));
|
||||||
if (HV.Contains(aResV)) //if the closest vertex lays on edge => never contains in HV
|
if (HV.Contains(maV))
|
||||||
HV.RemoveKey(aResV);
|
HV.RemoveKey(maV);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -743,28 +747,11 @@ static void ProcessHVertices(TopoDS_Shape& theRes,
|
|||||||
BRep_Builder().Add(aDE2, CHV.Oriented(TopAbs_FORWARD));
|
BRep_Builder().Add(aDE2, CHV.Oriented(TopAbs_FORWARD));
|
||||||
BRep_Builder().Add(aDE2, aLV.Oriented(TopAbs_REVERSED));
|
BRep_Builder().Add(aDE2, aLV.Oriented(TopAbs_REVERSED));
|
||||||
//
|
//
|
||||||
|
TopoDS_Wire nW;
|
||||||
///TODO temp
|
BRep_Builder().MakeWire(nW);
|
||||||
torem.Add(aResE);
|
BRep_Builder().Add(nW, aDE1);
|
||||||
toadd.Add(aDE1);
|
BRep_Builder().Add(nW, aDE2);
|
||||||
toadd.Add(aDE2);
|
reshaper.Replace(aResE, nW);
|
||||||
//TopoDS_Compound aResCmp;
|
|
||||||
//BRep_Builder().MakeCompound(aResCmp);
|
|
||||||
//BRep_Builder().Add(aResCmp, aDE1);
|
|
||||||
//BRep_Builder().Add(aResCmp, aDE2);
|
|
||||||
//
|
|
||||||
//TopoDS_Wire aResW;
|
|
||||||
//BRep_Builder().MakeWire(aResW);
|
|
||||||
//BRep_Builder().Add(aResW, aDE1);
|
|
||||||
//BRep_Builder().Add(aResW, aDE2);
|
|
||||||
//TopoDS_Wire aResW = BRepBuilderAPI_MakeWire(aDE1, aDE2).Wire(); //this will control proper sharing and tolerance matching between vertices
|
|
||||||
/*{ //DEB
|
|
||||||
TopTools_IndexedMapOfShape VVVV;
|
|
||||||
TopExp::MapShapes(aResW, TopAbs_VERTEX, VVVV);
|
|
||||||
//cout << VVVV.Extent() << endl;
|
|
||||||
}*/
|
|
||||||
//aResW.Orientation(aResE.Orientation());
|
|
||||||
//reshape.Replace(aResE, aResCmp);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -781,14 +768,7 @@ static void ProcessHVertices(TopoDS_Shape& theRes,
|
|||||||
HV.RemoveKey(aResV);
|
HV.RemoveKey(aResV);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//DEB
|
theRes = reshaper.Apply(theRes);
|
||||||
for (int i =1; i<= torem.Extent() ;i++)
|
|
||||||
BRep_Builder().Remove(theRes, torem(i));
|
|
||||||
//DEB
|
|
||||||
for (int i =1; i<= toadd.Extent() ;i++)
|
|
||||||
BRep_Builder().Add(theRes, toadd(i));
|
|
||||||
//
|
|
||||||
theRes = reshaper.Apply(theRes); //replace only vertices
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FillNode2LLMap(Standard_Integer NewNode, const Poly_MakeLoops2D::Link& NewLink,
|
static void FillNode2LLMap(Standard_Integer NewNode, const Poly_MakeLoops2D::Link& NewLink,
|
||||||
@@ -802,21 +782,26 @@ static void FillNode2LLMap(Standard_Integer NewNode, const Poly_MakeLoops2D::Lin
|
|||||||
|
|
||||||
static TopAbs_State GetStateOfSamplePoint(const TopoDS_Face& ff2,
|
static TopAbs_State GetStateOfSamplePoint(const TopoDS_Face& ff2,
|
||||||
const IntTools_FClass2d& fclass,
|
const IntTools_FClass2d& fclass,
|
||||||
const Bnd_Box2d& fbnd)
|
const Bnd_Box& bb1,
|
||||||
|
double mass1)
|
||||||
{
|
{
|
||||||
TopExp_Explorer exp(ff2, TopAbs_EDGE); //should contains at least one edge
|
TopExp_Explorer exp(ff2, TopAbs_EDGE); //should contains at least one edge
|
||||||
TopoDS_Edge fe2 = TopoDS::Edge(exp.Current());
|
TopoDS_Edge fe2 = TopoDS::Edge(exp.Current());
|
||||||
BRepAdaptor_Curve2d afe2(fe2, ff2);
|
BRepAdaptor_Curve2d afe2(fe2, ff2);
|
||||||
gp_Pnt2d middlepoint = afe2.Value((afe2.LastParameter() + afe2.FirstParameter()) / 2.0);
|
gp_Pnt2d middlepoint = afe2.Value((afe2.LastParameter() + afe2.FirstParameter()) / 2.0);
|
||||||
Bnd_Box bb3d;
|
if (Abs(mass1)>1e-10) //?? toler
|
||||||
BRepBndLib::Add(ff2, bb3d);
|
{
|
||||||
Bnd_Box2d bb2d;
|
Bnd_Box2d bb2d;
|
||||||
bb2d.Set(gp_Pnt2d(bb3d.CornerMin().X(), bb3d.CornerMin().Y()));
|
double xmin, ymin, zmin, xmax, ymax, zmax;
|
||||||
bb2d.Add(gp_Pnt2d(bb3d.CornerMax().X(), bb3d.CornerMax().Y()));
|
bb1.Get(xmin, ymin, zmin, xmax, ymax, zmax);
|
||||||
if (bb2d.IsOut(middlepoint))
|
bb2d.Add(gp_Pnt2d(xmin, ymin));
|
||||||
return TopAbs_OUT;
|
bb2d.Add(gp_Pnt2d(xmax, ymax));
|
||||||
else
|
if (mass1 > 0 && bb2d.IsOut(middlepoint))
|
||||||
return fclass.Perform(middlepoint);
|
return TopAbs_OUT;
|
||||||
|
if (mass1 < 0 && bb2d.IsOut(middlepoint))
|
||||||
|
return TopAbs_IN;
|
||||||
|
}
|
||||||
|
return fclass.Perform(middlepoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HLRBRep_ParComp(const HLRFL_BndBoxTreeSelector::FaceParam& a,
|
bool HLRBRep_ParComp(const HLRFL_BndBoxTreeSelector::FaceParam& a,
|
||||||
@@ -827,15 +812,14 @@ bool HLRBRep_ParComp(const HLRFL_BndBoxTreeSelector::FaceParam& a,
|
|||||||
|
|
||||||
static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes,
|
static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes,
|
||||||
NCollection_IndexedDataMap<TopoDS_Edge, BRepAdaptor_Curve2d, TopTools_ShapeMapHasher>& anEdAd,
|
NCollection_IndexedDataMap<TopoDS_Edge, BRepAdaptor_Curve2d, TopTools_ShapeMapHasher>& anEdAd,
|
||||||
NCollection_DataMap<TopoDS_Edge, Bnd_Box2d, TopTools_ShapeMapHasher> theEdBnd2d,
|
|
||||||
HLRAlgo_Projector& projector,
|
HLRAlgo_Projector& projector,
|
||||||
const TopTools_ListOfShape& anOrigShapes,
|
const TopTools_ListOfShape& anOrigShapes,
|
||||||
bool theMode,
|
bool theMode,
|
||||||
TopTools_DataMapOfShapeShape& OrigFaceToProjFace )
|
TopTools_DataMapOfShapeShape& OrigFaceToProjFace,
|
||||||
|
TopTools_DataMapOfShapeShape& ProjFaceToOrigFace)
|
||||||
{
|
{
|
||||||
NCollection_List<TopoDS_Wire> theLoops;
|
NCollection_List<TopoDS_Wire> theLoops;
|
||||||
NCollection_List<TopoDS_Wire> SelfLoops;
|
NCollection_List<TopoDS_Wire> SelfLoops;
|
||||||
NCollection_DataMap<TopoDS_Shape, Bnd_Box2d, TopTools_ShapeMapHasher> aShToBnd2d;
|
|
||||||
TopoDS_Face aDraftPrFace;
|
TopoDS_Face aDraftPrFace;
|
||||||
BRep_Builder().MakeFace(aDraftPrFace, BRepLib::Plane(), Precision::Confusion());
|
BRep_Builder().MakeFace(aDraftPrFace, BRepLib::Plane(), Precision::Confusion());
|
||||||
TopTools_IndexedMapOfShape mN2V;
|
TopTools_IndexedMapOfShape mN2V;
|
||||||
@@ -860,9 +844,6 @@ static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes,
|
|||||||
{
|
{
|
||||||
const TopoDS_Wire& aW = BRepLib_MakeWire(E).Wire();
|
const TopoDS_Wire& aW = BRepLib_MakeWire(E).Wire();
|
||||||
SelfLoops.Append(aW);
|
SelfLoops.Append(aW);
|
||||||
Bnd_Box2d aBB;
|
|
||||||
BndLib_Add2dCurve::Add(BRepAdaptor_Curve2d(E, aDraftPrFace), 0, aBB);
|
|
||||||
aShToBnd2d.Bind(aW, aBB);
|
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -872,11 +853,7 @@ static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes,
|
|||||||
{
|
{
|
||||||
anEdAd.Add(E, BRepAdaptor_Curve2d(E, aDraftPrFace));
|
anEdAd.Add(E, BRepAdaptor_Curve2d(E, aDraftPrFace));
|
||||||
anAd = anEdAd.Seek(E);
|
anAd = anEdAd.Seek(E);
|
||||||
Bnd_Box2d aBB;
|
|
||||||
BndLib_Add2dCurve::Add(*anEdAd.Seek(E), 0, aBB);
|
|
||||||
theEdBnd2d.Bind(E, aBB);
|
|
||||||
}
|
}
|
||||||
//NCollection_Handle<BRepAdaptor_Curve2d> adapt = new BRepAdaptor_Curve2d(E, aDraftPrFace);
|
|
||||||
|
|
||||||
gp_Pnt2d Pnt;
|
gp_Pnt2d Pnt;
|
||||||
gp_Vec2d Vec;
|
gp_Vec2d Vec;
|
||||||
@@ -949,40 +926,19 @@ static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes,
|
|||||||
Info2->myD1L = D1L;
|
Info2->myD1L = D1L;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//DEBUG: print D1F
|
|
||||||
/*{
|
|
||||||
NCollection_DataMap<Standard_Integer, Poly_MakeLoops2D::ListOfLink>::Iterator it(mNode2ListOfLinks);
|
|
||||||
for (;it.More();it.Next())
|
|
||||||
{
|
|
||||||
int nK = it.Key();
|
|
||||||
Poly_MakeLoops2D::ListOfLink links = it.Value();
|
|
||||||
Poly_MakeLoops2D::ListOfLink::Iterator itl(links);
|
|
||||||
cout << "next:" << endl;
|
|
||||||
for (;itl.More();itl.Next())
|
|
||||||
{
|
|
||||||
BRepFill_TangentLinkInfo linfo = mL2TI(itl.Value());
|
|
||||||
cout << linfo.myD1F.X() << " " << linfo.myD1F.Y() << endl;
|
|
||||||
TopoDS_Edge eee = mL2E(itl.Value());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
//
|
//
|
||||||
BRepFill_PolyHelper helper(mL2TI, mNode2ListOfLinks);
|
BRepFill_PolyHelper helper(mL2TI, mNode2ListOfLinks);
|
||||||
Poly_MakeLoops2D aLoopMaker(1, &helper, NCollection_BaseAllocator::CommonBaseAllocator() );
|
Poly_MakeLoops2D aLoopMaker(1, &helper, NCollection_BaseAllocator::CommonBaseAllocator() );
|
||||||
for (NCollection_DataMap<Poly_MakeLoops2D::Link, TopoDS_Edge>::Iterator aMapIt (mL2E); aMapIt.More(); aMapIt.Next())
|
for (NCollection_DataMap<Poly_MakeLoops2D::Link, TopoDS_Edge>::Iterator aMapIt (mL2E); aMapIt.More(); aMapIt.Next())
|
||||||
aLoopMaker.AddLink(aMapIt.Key());
|
aLoopMaker.AddLink(aMapIt.Key());
|
||||||
|
|
||||||
aLoopMaker.Perform(); //try to find loops
|
aLoopMaker.Perform(); //try to find loopsEdBnd2d
|
||||||
Standard_Integer NbLoops = aLoopMaker.GetNbLoops();
|
Standard_Integer NbLoops = aLoopMaker.GetNbLoops();
|
||||||
Standard_Integer NbHangs = aLoopMaker.GetNbHanging();
|
Standard_Integer NbHangs = aLoopMaker.GetNbHanging();
|
||||||
|
|
||||||
cout << "NbLoops=" << NbLoops << endl;
|
cout << "NbLoops=" << NbLoops << endl;
|
||||||
cout << "NbHangs=" << NbHangs << endl;
|
cout << "NbHangs=" << NbHangs << endl;
|
||||||
|
|
||||||
// if (NbLoops == 0 || NbHangs != 0 )
|
|
||||||
// return Standard_False;
|
|
||||||
|
|
||||||
theLoops.Append(SelfLoops);
|
theLoops.Append(SelfLoops);
|
||||||
for (Standard_Integer i = 1; i <= NbLoops; i++) //loops to wires
|
for (Standard_Integer i = 1; i <= NbLoops; i++) //loops to wires
|
||||||
{
|
{
|
||||||
@@ -999,44 +955,20 @@ static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes,
|
|||||||
E.Reverse();
|
E.Reverse();
|
||||||
//if null => probably this edge was passed as two links (based on the same edge); so skip this edge
|
//if null => probably this edge was passed as two links (based on the same edge); so skip this edge
|
||||||
if (!E.IsNull())
|
if (!E.IsNull())
|
||||||
{
|
|
||||||
aWM.Add(E);
|
aWM.Add(E);
|
||||||
aWBox2d.Add(theEdBnd2d(E));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (aWM.IsDone())
|
if (aWM.IsDone())
|
||||||
{
|
{
|
||||||
TopoDS_Wire W = aWM.Wire();
|
TopoDS_Wire W = aWM.Wire();
|
||||||
if (W.Closed())
|
if (W.Closed())
|
||||||
{
|
|
||||||
theLoops.Append(W);
|
theLoops.Append(W);
|
||||||
aShToBnd2d.Bind(W, aWBox2d);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//DEBUG
|
|
||||||
/* Poly_MakeLoops2D::ListOfLink theHLinks;
|
|
||||||
aLoopMaker.GetHangingLinks(theHLinks);
|
|
||||||
Poly_MakeLoops2D::ListOfLink::Iterator itt(theHLinks);
|
|
||||||
|
|
||||||
TopoDS_Compound cmpH;BRep_Builder().MakeCompound(cmpH);
|
|
||||||
for (; itt.More();itt.Next())
|
|
||||||
{
|
|
||||||
Poly_MakeLoops2D::Link alink = itt.Value();
|
|
||||||
const Poly_MakeLoops2D::Link& Link = itt.Value();
|
|
||||||
TopoDS_Edge E = mL2E(Link);
|
|
||||||
if (Link.flags & Poly_MakeLoops2D::LF_Reversed)
|
|
||||||
E.Reverse();
|
|
||||||
//if null => probably this edge was passed as two links (based on the same edge); so skip this edge
|
|
||||||
if (!E.IsNull())
|
|
||||||
BRep_Builder().Add(cmpH, E);
|
|
||||||
}*/
|
|
||||||
//
|
|
||||||
|
|
||||||
IntTools_Context context1;// = new IntTools_Context();
|
IntTools_Context context1;// = new IntTools_Context();
|
||||||
NCollection_List<TopoDS_Wire>::Iterator itL(theLoops);
|
NCollection_List<TopoDS_Wire>::Iterator itL(theLoops);
|
||||||
NCollection_IndexedDataMap<TopoDS_Shape, double> lf1, lf2;
|
NCollection_IndexedDataMap<TopoDS_Shape, double> lf1, lf2;
|
||||||
|
NCollection_DataMap<TopoDS_Face, double> f2mass;
|
||||||
for (; itL.More(); itL.Next())
|
for (; itL.More(); itL.Next())
|
||||||
{
|
{
|
||||||
const TopoDS_Wire& aW = itL.Value();
|
const TopoDS_Wire& aW = itL.Value();
|
||||||
@@ -1046,11 +978,10 @@ static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes,
|
|||||||
BRep_Builder().MakeFace(ff, BRepLib::Plane(), Precision::Confusion());
|
BRep_Builder().MakeFace(ff, BRepLib::Plane(), Precision::Confusion());
|
||||||
//plane is static; pcurves of edges are already based on this plane
|
//plane is static; pcurves of edges are already based on this plane
|
||||||
BRep_Builder().Add(ff, aW);
|
BRep_Builder().Add(ff, aW);
|
||||||
aShToBnd2d(aW).Enlarge(0.001);
|
|
||||||
aShToBnd2d.Bind(ff, aShToBnd2d(aW)); //bndbox still the same
|
|
||||||
GProp_GProps pr;
|
GProp_GProps pr;
|
||||||
BRepGProp::SurfaceProperties(ff, pr);
|
BRepGProp::SurfaceProperties(ff, pr);
|
||||||
Standard_Real CurMass = pr.Mass();
|
Standard_Real CurMass = pr.Mass();
|
||||||
|
f2mass.Bind(ff, CurMass);
|
||||||
if (Abs(CurMass) < 1e-10) //?? TODO
|
if (Abs(CurMass) < 1e-10) //?? TODO
|
||||||
continue;
|
continue;
|
||||||
if (CurMass >= 0)
|
if (CurMass >= 0)
|
||||||
@@ -1061,7 +992,6 @@ static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes,
|
|||||||
NCollection_IndexedDataMap<TopoDS_Face, NCollection_List<TopoDS_Face>> FaceToIntWires;
|
NCollection_IndexedDataMap<TopoDS_Face, NCollection_List<TopoDS_Face>> FaceToIntWires;
|
||||||
for (int i = 1; i <= lf1.Size() && !lf2.IsEmpty(); i++)
|
for (int i = 1; i <= lf1.Size() && !lf2.IsEmpty(); i++)
|
||||||
{
|
{
|
||||||
//NCollection_Handle<BRepTopAdaptor_FClass2d> fclass;
|
|
||||||
NCollection_Sequence<TopoDS_Face> intf;
|
NCollection_Sequence<TopoDS_Face> intf;
|
||||||
const TopoDS_Face& ff1 = TopoDS::Face(lf1.FindKey(i));
|
const TopoDS_Face& ff1 = TopoDS::Face(lf1.FindKey(i));
|
||||||
for (int j=1;j<= lf2.Size();j++)
|
for (int j=1;j<= lf2.Size();j++)
|
||||||
@@ -1071,11 +1001,10 @@ static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes,
|
|||||||
if (pm < -nm)
|
if (pm < -nm)
|
||||||
continue;
|
continue;
|
||||||
const TopoDS_Face& ff2 = TopoDS::Face(lf2.FindKey(j));
|
const TopoDS_Face& ff2 = TopoDS::Face(lf2.FindKey(j));
|
||||||
//if (!fclass)
|
IntTools_FClass2d& fclass1 = context1.FClass2d(ff1);
|
||||||
// fclass = new BRepTopAdaptor_FClass2d(ff1, Precision::Confusion());
|
const Bnd_Box& bb1 = context1.BndBox(ff1);
|
||||||
IntTools_FClass2d& fclass = context1.FClass2d(ff1);
|
double mass1 = f2mass(ff1);
|
||||||
Bnd_Box2d fbnd = aShToBnd2d(ff1);
|
TopAbs_State st = GetStateOfSamplePoint(ff2, fclass1, bb1, mass1);
|
||||||
TopAbs_State st = GetStateOfSamplePoint(ff2, fclass, fbnd);
|
|
||||||
if (st == TopAbs_IN)
|
if (st == TopAbs_IN)
|
||||||
intf.Append(ff2);
|
intf.Append(ff2);
|
||||||
}
|
}
|
||||||
@@ -1084,16 +1013,17 @@ static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes,
|
|||||||
{
|
{
|
||||||
if (intfInd.Contains(i))
|
if (intfInd.Contains(i))
|
||||||
continue;
|
continue;
|
||||||
//BRepTopAdaptor_FClass2d fclassInt(intf(i), Precision::Confusion());
|
const TopoDS_Face& intfi = intf(i);
|
||||||
IntTools_FClass2d& fclassInt = context1.FClass2d(intf(i));
|
IntTools_FClass2d& fclassInt = context1.FClass2d(intfi);
|
||||||
Bnd_Box2d fbndi = aShToBnd2d(intf(i));
|
const Bnd_Box& bb1 = context1.BndBox(intfi);
|
||||||
|
double mass1 = f2mass(intfi);
|
||||||
for (int j=1; j<= intf.Size();j++)
|
for (int j=1; j<= intf.Size();j++)
|
||||||
{
|
{
|
||||||
if (i==j)
|
if (i==j)
|
||||||
continue;
|
continue;
|
||||||
if (intfInd.Contains(j))
|
if (intfInd.Contains(j))
|
||||||
continue;
|
continue;
|
||||||
TopAbs_State st = GetStateOfSamplePoint(intf(j), fclassInt, fbndi);
|
TopAbs_State st = GetStateOfSamplePoint(intf(j), fclassInt, bb1, mass1);
|
||||||
if (st == TopAbs_OUT) //note that intf-faces are holes
|
if (st == TopAbs_OUT) //note that intf-faces are holes
|
||||||
intfInd.Add(j);
|
intfInd.Add(j);
|
||||||
}
|
}
|
||||||
@@ -1142,10 +1072,14 @@ static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes,
|
|||||||
BRep_Builder().Add(cf, int_wire);
|
BRep_Builder().Add(cf, int_wire);
|
||||||
}
|
}
|
||||||
gp_Pnt2d p2d;
|
gp_Pnt2d p2d;
|
||||||
gp_Pnt p3d;
|
gp_Pnt p3d;
|
||||||
TopExp_Explorer exp(cf, TopAbs_EDGE);
|
|
||||||
Handle(IntTools_Context) context = new IntTools_Context();
|
Handle(IntTools_Context) context = new IntTools_Context();
|
||||||
BOPTools_AlgoTools3D::PointNearEdge( TopoDS::Edge(exp.Current()), cf, p2d, p3d, context);
|
int ierr = BOPTools_AlgoTools3D::PointInFace( cf, p3d, p2d, context);
|
||||||
|
if (ierr)
|
||||||
|
{
|
||||||
|
TopExp_Explorer exp(cf, TopAbs_EDGE);
|
||||||
|
BOPTools_AlgoTools3D::PointNearEdge( TopoDS::Edge(exp.Current()), cf, p2d, p3d, context);
|
||||||
|
}
|
||||||
gp_Lin shot_line = projector.Shoot(p2d.X(), p2d.Y());
|
gp_Lin shot_line = projector.Shoot(p2d.X(), p2d.Y());
|
||||||
|
|
||||||
aSelFL.ResetResult();
|
aSelFL.ResetResult();
|
||||||
@@ -1159,7 +1093,10 @@ static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes,
|
|||||||
if (theMode)
|
if (theMode)
|
||||||
{
|
{
|
||||||
std::sort(fp.begin(), fp.end(), HLRBRep_ParComp);
|
std::sort(fp.begin(), fp.end(), HLRBRep_ParComp);
|
||||||
OrigFaceToProjFace.Bind(cf, fp.front().myF);
|
TopoDS_Face orF ;
|
||||||
|
orF = fp.front().myF;
|
||||||
|
OrigFaceToProjFace.Bind(orF, cf);
|
||||||
|
ProjFaceToOrigFace.Bind(cf, orF);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1168,7 +1105,8 @@ static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes,
|
|||||||
}
|
}
|
||||||
|
|
||||||
TopoDS_Shape HLRBRep_HLRToShape::CompoundOfFaces(bool theMode,
|
TopoDS_Shape HLRBRep_HLRToShape::CompoundOfFaces(bool theMode,
|
||||||
TopTools_DataMapOfShapeShape& OrigFaceToProjFace)
|
TopTools_DataMapOfShapeShape& OrigFaceToProjFace,
|
||||||
|
TopTools_DataMapOfShapeShape& ProjFaceToOrigFace)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
TopTools_ListOfShape anOrigShapes;
|
TopTools_ListOfShape anOrigShapes;
|
||||||
@@ -1197,12 +1135,11 @@ TopoDS_Shape HLRBRep_HLRToShape::CompoundOfFaces(bool theMode,
|
|||||||
if( !FuseVE (aTotalOSh))
|
if( !FuseVE (aTotalOSh))
|
||||||
return TopoDS_Shape();
|
return TopoDS_Shape();
|
||||||
//
|
//
|
||||||
NCollection_DataMap<TopoDS_Edge, Bnd_Box2d, TopTools_ShapeMapHasher> theEdBnd2d;
|
|
||||||
NCollection_IndexedDataMap<TopoDS_Edge, BRepAdaptor_Curve2d, TopTools_ShapeMapHasher> anEdAd;
|
NCollection_IndexedDataMap<TopoDS_Edge, BRepAdaptor_Curve2d, TopTools_ShapeMapHasher> anEdAd;
|
||||||
ProcessHVertices(aTotalOSh, anEdAd, theEdBnd2d);
|
ProcessHVertices(aTotalOSh, anEdAd);
|
||||||
//
|
//
|
||||||
TopoDS_Shape aRes = ProcessLoops(aTotalOSh, anEdAd, theEdBnd2d,
|
TopoDS_Shape aRes = ProcessLoops(aTotalOSh, anEdAd, myAlgo->Projector(), anOrigShapes, theMode,
|
||||||
myAlgo->Projector(), anOrigShapes, theMode, OrigFaceToProjFace);
|
OrigFaceToProjFace, ProjFaceToOrigFace);
|
||||||
//
|
//
|
||||||
return aRes;
|
return aRes;
|
||||||
}
|
}
|
||||||
|
@@ -133,7 +133,8 @@ public:
|
|||||||
const Standard_Boolean In3d);
|
const Standard_Boolean In3d);
|
||||||
|
|
||||||
TopoDS_Shape CompoundOfFaces (bool theMode,
|
TopoDS_Shape CompoundOfFaces (bool theMode,
|
||||||
TopTools_DataMapOfShapeShape& OrigFaceToProjFace);
|
TopTools_DataMapOfShapeShape& OrigFaceToProjFace,
|
||||||
|
TopTools_DataMapOfShapeShape& ProjFaceToOrigFace);
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@@ -292,7 +292,7 @@ static bool ClarifyPoint(math_FunctionSetRoot& rsnld, Contap_SurfFunction& SFunc
|
|||||||
TopAbs_State state = const_cast<BRepTopAdaptor_TopolTool*>(Domain)
|
TopAbs_State state = const_cast<BRepTopAdaptor_TopolTool*>(Domain)
|
||||||
->Classify(P2d,Precision::PConfusion());
|
->Classify(P2d,Precision::PConfusion());
|
||||||
if (state == TopAbs_IN || state == TopAbs_ON)
|
if (state == TopAbs_IN || state == TopAbs_ON)
|
||||||
{
|
{
|
||||||
const Handle(Adaptor3d_HSurface)& Surf = SFunc.Surface();
|
const Handle(Adaptor3d_HSurface)& Surf = SFunc.Surface();
|
||||||
p3d = Adaptor3d_HSurfaceTool::Value(Surf,P2d.X(),P2d.Y());
|
p3d = Adaptor3d_HSurfaceTool::Value(Surf,P2d.X(),P2d.Y());
|
||||||
return true;
|
return true;
|
||||||
@@ -309,7 +309,8 @@ static bool ClarifyPoint(math_FunctionSetRoot& rsnld, Contap_SurfFunction& SFunc
|
|||||||
|
|
||||||
void HLRTopoBRep_DSFiller::InsertFace (const Standard_Integer /*FI*/,
|
void HLRTopoBRep_DSFiller::InsertFace (const Standard_Integer /*FI*/,
|
||||||
const TopoDS_Face& F,
|
const TopoDS_Face& F,
|
||||||
Contap_Contour& FO, const BRepTopAdaptor_TopolTool* Domain,
|
Contap_Contour& FO,
|
||||||
|
const BRepTopAdaptor_TopolTool* Domain,
|
||||||
HLRTopoBRep_Data& DS,
|
HLRTopoBRep_Data& DS,
|
||||||
const Standard_Boolean withPCurve)
|
const Standard_Boolean withPCurve)
|
||||||
{
|
{
|
||||||
@@ -385,8 +386,8 @@ void HLRTopoBRep_DSFiller::InsertFace (const Standard_Integer /*FI*/,
|
|||||||
Standard_Boolean InsuffisantNumberOfPoints=Standard_False;
|
Standard_Boolean InsuffisantNumberOfPoints=Standard_False;
|
||||||
|
|
||||||
switch (Line.TypeContour()) {
|
switch (Line.TypeContour()) {
|
||||||
|
|
||||||
case Contap_Lin :
|
case Contap_Lin :
|
||||||
{
|
{
|
||||||
C = new Geom_Line(Line.Line());
|
C = new Geom_Line(Line.Line());
|
||||||
if (withPCurve) {
|
if (withPCurve) {
|
||||||
@@ -396,8 +397,8 @@ void HLRTopoBRep_DSFiller::InsertFace (const Standard_Integer /*FI*/,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Contap_Circle :
|
case Contap_Circle :
|
||||||
{
|
{
|
||||||
C = new Geom_Circle(Line.Circle());
|
C = new Geom_Circle(Line.Circle());
|
||||||
if (withPCurve) {
|
if (withPCurve) {
|
||||||
@@ -411,89 +412,89 @@ void HLRTopoBRep_DSFiller::InsertFace (const Standard_Integer /*FI*/,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Contap_Walking :
|
case Contap_Walking :
|
||||||
{
|
{
|
||||||
// copy the points
|
// copy the points
|
||||||
Standard_Integer ipF = Standard_Integer(parF);
|
Standard_Integer ipF = Standard_Integer(parF);
|
||||||
Standard_Integer ipL = Standard_Integer(parL);
|
Standard_Integer ipL = Standard_Integer(parL);
|
||||||
|
|
||||||
if(ipL-ipF < 1) {
|
if(ipL-ipF < 1) {
|
||||||
InsuffisantNumberOfPoints=Standard_True;
|
InsuffisantNumberOfPoints=Standard_True;
|
||||||
//cout<<"\n !! Pb ds HLRTopoBRep_DSFiller.cxx (Contour App Nbp <3)"<<endl;
|
//cout<<"\n !! Pb ds HLRTopoBRep_DSFiller.cxx (Contour App Nbp <3)"<<endl;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
else if(ipL-ipF < 6) {
|
else if(ipL-ipF < 6) {
|
||||||
// compute the tangents
|
// compute the tangents
|
||||||
Contap_SurfFunction& SFunc =
|
Contap_SurfFunction& SFunc =
|
||||||
FO.SurfaceFunction();
|
FO.SurfaceFunction();
|
||||||
|
|
||||||
Standard_Boolean isTg1,isTg2;
|
Standard_Boolean isTg1,isTg2;
|
||||||
gp_Vec tg1,tg2;
|
gp_Vec tg1,tg2;
|
||||||
gp_Vec2d uv1,uv2;
|
gp_Vec2d uv1,uv2;
|
||||||
math_Vector UV(1,2),F(1,1);
|
math_Vector UV(1,2),F(1,1);
|
||||||
|
|
||||||
Line.Point(ipF).ParametersOnS2(UV(1),UV(2));
|
Line.Point(ipF).ParametersOnS2(UV(1),UV(2));
|
||||||
SFunc.Value(UV,F);
|
SFunc.Value(UV,F);
|
||||||
isTg1 = SFunc.IsTangent();
|
isTg1 = SFunc.IsTangent();
|
||||||
if (!isTg1) {
|
if (!isTg1) {
|
||||||
tg1 = SFunc.Direction3d();
|
tg1 = SFunc.Direction3d();
|
||||||
if (withPCurve) uv1 = SFunc.Direction2d();
|
if (withPCurve) uv1 = SFunc.Direction2d();
|
||||||
}
|
}
|
||||||
|
|
||||||
Line.Point(ipL).ParametersOnS2(UV(1),UV(2));
|
Line.Point(ipL).ParametersOnS2(UV(1),UV(2));
|
||||||
SFunc.Value(UV,F);
|
SFunc.Value(UV,F);
|
||||||
isTg2 = SFunc.IsTangent();
|
isTg2 = SFunc.IsTangent();
|
||||||
if (!isTg2) {
|
if (!isTg2) {
|
||||||
tg2 = SFunc.Direction3d();
|
tg2 = SFunc.Direction3d();
|
||||||
if (withPCurve) uv2 = SFunc.Direction2d();
|
if (withPCurve) uv2 = SFunc.Direction2d();
|
||||||
}
|
}
|
||||||
// interpolate
|
// interpolate
|
||||||
Standard_Integer nbp = ipL - ipF + 1;
|
Standard_Integer nbp = ipL - ipF + 1;
|
||||||
AppDef_MultiLine MLine(nbp);
|
AppDef_MultiLine MLine(nbp);
|
||||||
Standard_Integer nb2d = 0;
|
Standard_Integer nb2d = 0;
|
||||||
if (withPCurve) nb2d = 1;
|
if (withPCurve) nb2d = 1;
|
||||||
|
|
||||||
for (Standard_Integer i = 1; i <= nbp; i++) {
|
for (Standard_Integer i = 1; i <= nbp; i++) {
|
||||||
AppDef_MultiPointConstraint MP(1, nb2d);
|
AppDef_MultiPointConstraint MP(1, nb2d);
|
||||||
MP.SetPoint(1,Line.Point(i + ipF - 1).Value());
|
MP.SetPoint(1,Line.Point(i + ipF - 1).Value());
|
||||||
if (withPCurve) {
|
if (withPCurve) {
|
||||||
Line.Point(i + ipF - 1).ParametersOnS2(UV(1),UV(2));
|
Line.Point(i + ipF - 1).ParametersOnS2(UV(1),UV(2));
|
||||||
MP.SetPoint2d(2,gp_Pnt2d(UV(1),UV(2)));
|
MP.SetPoint2d(2,gp_Pnt2d(UV(1),UV(2)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == 1 && !isTg1) {
|
if (i == 1 && !isTg1) {
|
||||||
MP.SetTang (1,tg1);
|
MP.SetTang (1,tg1);
|
||||||
if (withPCurve) MP.SetTang2d(2,uv1);
|
if (withPCurve) MP.SetTang2d(2,uv1);
|
||||||
}
|
}
|
||||||
if (i == nbp && !isTg2) {
|
if (i == nbp && !isTg2) {
|
||||||
MP.SetTang (1,tg2);
|
MP.SetTang (1,tg2);
|
||||||
if (withPCurve) MP.SetTang2d(2,uv2);
|
if (withPCurve) MP.SetTang2d(2,uv2);
|
||||||
}
|
}
|
||||||
MLine.SetValue(i,MP);
|
MLine.SetValue(i,MP);
|
||||||
}
|
}
|
||||||
AppDef_BSplineCompute interp;
|
AppDef_BSplineCompute interp;
|
||||||
interp.Interpol(MLine);
|
interp.Interpol(MLine);
|
||||||
AppParCurves_MultiBSpCurve TheCurve = interp.Value();
|
AppParCurves_MultiBSpCurve TheCurve = interp.Value();
|
||||||
Standard_Integer Degree = TheCurve.Degree();
|
Standard_Integer Degree = TheCurve.Degree();
|
||||||
TColgp_Array1OfPnt Poles(1,TheCurve.NbPoles());
|
TColgp_Array1OfPnt Poles(1,TheCurve.NbPoles());
|
||||||
TheCurve.Curve(1,Poles);
|
TheCurve.Curve(1,Poles);
|
||||||
C = new Geom_BSplineCurve(Poles,
|
C = new Geom_BSplineCurve(Poles,
|
||||||
TheCurve.Knots(),
|
TheCurve.Knots(),
|
||||||
TheCurve.Multiplicities(),
|
TheCurve.Multiplicities(),
|
||||||
Degree);
|
Degree);
|
||||||
if (withPCurve) {
|
if (withPCurve) {
|
||||||
TColgp_Array1OfPnt2d Pol2d(1,TheCurve.NbPoles());
|
TColgp_Array1OfPnt2d Pol2d(1,TheCurve.NbPoles());
|
||||||
TheCurve.Curve(2,Pol2d);
|
TheCurve.Curve(2,Pol2d);
|
||||||
C2d = new Geom2d_BSplineCurve(Pol2d,
|
C2d = new Geom2d_BSplineCurve(Pol2d,
|
||||||
TheCurve.Knots(),
|
TheCurve.Knots(),
|
||||||
TheCurve.Multiplicities(),
|
TheCurve.Multiplicities(),
|
||||||
Degree);
|
Degree);
|
||||||
}
|
}
|
||||||
first = 0;
|
first = 0;
|
||||||
last = 1;
|
last = 1;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
else if(ipL-ipF < 5) {
|
else if(ipL-ipF < 5) {
|
||||||
const Standard_Integer nbp = ipL - ipF + 1;
|
const Standard_Integer nbp = ipL - ipF + 1;
|
||||||
TColStd_Array1OfReal knots(1,nbp);
|
TColStd_Array1OfReal knots(1,nbp);
|
||||||
@@ -507,7 +508,7 @@ void HLRTopoBRep_DSFiller::InsertFace (const Standard_Integer /*FI*/,
|
|||||||
}
|
}
|
||||||
mults(1)=mults(nbp)=2;
|
mults(1)=mults(nbp)=2;
|
||||||
C = new Geom_BSplineCurve(Points,knots,mults,1);
|
C = new Geom_BSplineCurve(Points,knots,mults,1);
|
||||||
|
|
||||||
if(withPCurve) {
|
if(withPCurve) {
|
||||||
TColgp_Array1OfPnt2d Points2d(1,nbp);
|
TColgp_Array1OfPnt2d Points2d(1,nbp);
|
||||||
for(Standard_Integer i=1;i<=nbp;i++) {
|
for(Standard_Integer i=1;i<=nbp;i++) {
|
||||||
@@ -530,84 +531,39 @@ void HLRTopoBRep_DSFiller::InsertFace (const Standard_Integer /*FI*/,
|
|||||||
Standard_Real Minx,Miny,Minz,Minu,Minv;
|
Standard_Real Minx,Miny,Minz,Minu,Minv;
|
||||||
Maxx=Maxy=Maxz=Maxu=Maxv=-RealLast();
|
Maxx=Maxy=Maxz=Maxu=Maxv=-RealLast();
|
||||||
Minx=Miny=Minz=Minu=Minv=RealLast();
|
Minx=Miny=Minz=Minu=Minv=RealLast();
|
||||||
|
|
||||||
for(Standard_Integer i=1;i<=nbp;i++)
|
|
||||||
{
|
|
||||||
knots.SetValue(i,(Standard_Real)i);
|
|
||||||
mults.SetValue(i,1);
|
|
||||||
const gp_Pnt& P= Line.Point(i+ipF-1).Value();
|
|
||||||
if(P.X()<Minx) Minx=P.X();
|
|
||||||
if(P.Y()<Miny) Miny=P.Y();
|
|
||||||
if(P.Z()<Minz) Minz=P.Z();
|
|
||||||
if(P.X()>Maxx) Maxx=P.X();
|
|
||||||
if(P.Y()>Maxy) Maxy=P.Y();
|
|
||||||
if(P.Z()>Maxz) Maxz=P.Z();
|
|
||||||
Points.SetValue(i,P);
|
|
||||||
}
|
|
||||||
mults(1)=mults(nbp)=2;
|
|
||||||
//Handle(Geom_BSplineCurve) AppC;
|
|
||||||
//Handle(Geom2d_BSplineCurve) AppC2d;
|
|
||||||
//AppC = new Geom_BSplineCurve(Points,knots,mults,1);
|
|
||||||
|
|
||||||
|
|
||||||
TColgp_Array1OfPnt2d Points2d(1,nbp);
|
|
||||||
for(Standard_Integer i=1;i<=nbp;i++)
|
|
||||||
{
|
|
||||||
Standard_Real u,v;
|
|
||||||
Line.Point(i+ipF-1).ParametersOnS2(u,v);
|
|
||||||
if(u<Minu) Minu=u;
|
|
||||||
if(v<Minv) Minv=v;
|
|
||||||
if(u>Maxu) Maxu=u;
|
|
||||||
if(v>Maxv) Maxv=v;
|
|
||||||
Points2d.SetValue(i,gp_Pnt2d(u,v));
|
|
||||||
}
|
|
||||||
//AppC2d = new Geom2d_BSplineCurve(Points2d,knots,mults,1);
|
|
||||||
|
|
||||||
first = 1;
|
|
||||||
last = nbp;
|
|
||||||
|
|
||||||
//Handle(BRepApprox_ApproxLine) AppLine;
|
|
||||||
Handle(Geom2d_BSplineCurve) CNull;
|
Handle(Geom2d_BSplineCurve) CNull;
|
||||||
//AppLine = new BRepApprox_ApproxLine(AppC,AppC2d,CNull);
|
|
||||||
|
|
||||||
Standard_Integer dmin=4,dmax=8,niter=0;
|
Standard_Integer dmin=4,dmax=8,niter=0;
|
||||||
Standard_Boolean tg= Standard_False;
|
Standard_Boolean tg= Standard_False;
|
||||||
BRepApprox_Approx Approx;
|
BRepApprox_Approx Approx;
|
||||||
Standard_Real TOL3d,TOL2d,TOL=0.0001;
|
|
||||||
|
|
||||||
Maxx-=Minx; Maxy-=Miny; Maxz-=Minz;
|
|
||||||
Maxu-=Minu; Maxv-=Minv;
|
|
||||||
if(Maxy>Maxx) Maxx=Maxy;
|
|
||||||
if(Maxz>Maxx) Maxx=Maxy;
|
|
||||||
if(Maxv>Maxu) Maxu=Maxv;
|
|
||||||
|
|
||||||
TOL3d=TOL*Maxx; if(TOL3d<1e-12) TOL3d=1e-12; else if(TOL3d>0.1) TOL3d=0.1;
|
|
||||||
TOL2d=TOL*Maxu; if(TOL2d<1e-12) TOL2d=1e-12; else if(TOL2d>0.1) TOL2d=0.1;
|
|
||||||
|
|
||||||
Contap_SurfFunction& SFunc = FO.SurfaceFunction();
|
Contap_SurfFunction& SFunc = FO.SurfaceFunction();
|
||||||
const Handle(Adaptor3d_HSurface)& Surf = SFunc.Surface();
|
const Handle(Adaptor3d_HSurface)& Surf = SFunc.Surface();
|
||||||
|
|
||||||
double cmax = 2.0;
|
double cmax = 2.0;
|
||||||
double c = 100;
|
double c = 100;
|
||||||
int newsize;
|
int newsize = 0;
|
||||||
|
|
||||||
NCollection_List<gp_Pnt2d> lp2d;
|
NCollection_List<gp_Pnt2d> lp2d;
|
||||||
NCollection_List<gp_Pnt> lp;
|
NCollection_List<gp_Pnt> lp;
|
||||||
|
|
||||||
lp2d.Append(Points2d.First());
|
gp_Pnt firstPnt = Line.Point(ipF).Value();
|
||||||
lp.Append(Points.First());
|
gp_Pnt2d firstPnt2d = Line.Point(ipF).ValueOnSurface(Standard_False);
|
||||||
for (int jj=2; jj < Points.Size(); jj++ )
|
lp2d.Append(firstPnt2d/*Points2d.First()*/);
|
||||||
|
lp.Append(firstPnt/*Points.First()*/);
|
||||||
|
|
||||||
|
|
||||||
|
for (Standard_Integer jj=2;jj<=nbp-1;jj++)
|
||||||
{
|
{
|
||||||
gp_Pnt curPnt = Points(jj);
|
const gp_Pnt& curPnt= Line.Point(jj+ipF-1).Value();
|
||||||
gp_Pnt2d curPnt2d = Points2d(jj);
|
gp_Pnt2d curPnt2d = Line.Point(jj+ipF-1).ValueOnSurface(Standard_False);
|
||||||
|
gp_Pnt2d nextPnt2d = Line.Point(jj+ipF).ValueOnSurface(Standard_False);
|
||||||
|
double x0 = curPnt2d.X(), y0= curPnt2d.Y();
|
||||||
double d3_1 = lp.Last().Distance(curPnt);
|
double d3_1 = lp.Last().Distance(curPnt);
|
||||||
double d3_2 = curPnt.Distance(Points(jj+1));
|
double d3_2 = curPnt.Distance(Line.Point(jj+ipF).Value());
|
||||||
|
double d1 = lp2d.Last().Distance(curPnt2d);
|
||||||
double d1 = lp2d.Last().Distance(Points2d(jj));
|
double d2 = curPnt2d.Distance(nextPnt2d);
|
||||||
double d2 = Points2d(jj).Distance(Points2d(jj+1));
|
|
||||||
|
|
||||||
double x0 = curPnt2d.X();
|
|
||||||
double y0 = curPnt2d.Y();
|
|
||||||
|
|
||||||
double coeff = d3_1/d3_2;
|
double coeff = d3_1/d3_2;
|
||||||
c = 1.4;
|
c = 1.4;
|
||||||
@@ -650,8 +606,8 @@ void HLRTopoBRep_DSFiller::InsertFace (const Standard_Integer /*FI*/,
|
|||||||
double t = 0;
|
double t = 0;
|
||||||
lp2d.Append(curPnt2d);
|
lp2d.Append(curPnt2d);
|
||||||
lp.Append(curPnt);
|
lp.Append(curPnt);
|
||||||
double x1 = Points2d(jj+1).X();
|
double x1 = nextPnt2d.X();
|
||||||
double y1 = Points2d(jj+1).Y();
|
double y1 = nextPnt2d.Y();
|
||||||
math_Vector tol(1,2), inf(1,2), sup(1,2);
|
math_Vector tol(1,2), inf(1,2), sup(1,2);
|
||||||
GetSurfInfo(Surf, tol, inf, sup);
|
GetSurfInfo(Surf, tol, inf, sup);
|
||||||
math_FunctionSetRoot rsnld(SFunc,tol,50);
|
math_FunctionSetRoot rsnld(SFunc,tol,50);
|
||||||
@@ -680,8 +636,8 @@ void HLRTopoBRep_DSFiller::InsertFace (const Standard_Integer /*FI*/,
|
|||||||
lp.Append(curPnt);
|
lp.Append(curPnt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
lp2d.Append(Points2d.Last());
|
lp2d.Append(Line.Point(ipL).ValueOnSurface(Standard_False));
|
||||||
lp.Append(Points.Last());
|
lp.Append(Line.Point(ipL).Value());
|
||||||
//
|
//
|
||||||
|
|
||||||
newsize = lp.Size();
|
newsize = lp.Size();
|
||||||
@@ -694,11 +650,37 @@ void HLRTopoBRep_DSFiller::InsertFace (const Standard_Integer /*FI*/,
|
|||||||
NCollection_List<gp_Pnt2d>::Iterator itl2(lp2d);
|
NCollection_List<gp_Pnt2d>::Iterator itl2(lp2d);
|
||||||
for (int jj = 1;itl.More(), itl2.More();itl.Next(), itl2.Next(), jj++)
|
for (int jj = 1;itl.More(), itl2.More();itl.Next(), itl2.Next(), jj++)
|
||||||
{
|
{
|
||||||
|
const gp_Pnt& P= itl.Value();
|
||||||
|
if(P.X()<Minx) Minx=P.X();
|
||||||
|
if(P.Y()<Miny) Miny=P.Y();
|
||||||
|
if(P.Z()<Minz) Minz=P.Z();
|
||||||
|
if(P.X()>Maxx) Maxx=P.X();
|
||||||
|
if(P.Y()>Maxy) Maxy=P.Y();
|
||||||
|
if(P.Z()>Maxz) Maxz=P.Z();
|
||||||
|
//
|
||||||
|
const gp_Pnt2d& P2d = itl2.Value();
|
||||||
|
if(P2d.X()<Minu) Minu=P2d.X();
|
||||||
|
if(P2d.Y()<Minv) Minv=P2d.Y();
|
||||||
|
if(P2d.X()>Maxu) Maxu=P2d.X();
|
||||||
|
if(P2d.Y()>Maxv) Maxv=P2d.Y();
|
||||||
|
|
||||||
nknots.SetValue(jj,(Standard_Real)jj);
|
nknots.SetValue(jj,(Standard_Real)jj);
|
||||||
nmults.SetValue(jj,1);
|
nmults.SetValue(jj,1);
|
||||||
newPoints2dA.SetValue(jj, itl2.Value());
|
newPoints2dA.SetValue(jj, P2d);
|
||||||
newPoints3dA.SetValue(jj, itl.Value());
|
newPoints3dA.SetValue(jj, P);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Standard_Real TOL3d,TOL2d,TOL=0.0001;
|
||||||
|
|
||||||
|
Maxx-=Minx; Maxy-=Miny; Maxz-=Minz;
|
||||||
|
Maxu-=Minu; Maxv-=Minv;
|
||||||
|
if(Maxy>Maxx) Maxx=Maxy;
|
||||||
|
if(Maxz>Maxx) Maxx=Maxy;
|
||||||
|
if(Maxv>Maxu) Maxu=Maxv;
|
||||||
|
|
||||||
|
TOL3d=TOL*Maxx; if(TOL3d<1e-12) TOL3d=1e-12; else if(TOL3d>0.1) TOL3d=0.1;
|
||||||
|
TOL2d=TOL*Maxu; if(TOL2d<1e-12) TOL2d=1e-12; else if(TOL2d>0.1) TOL2d=0.1;
|
||||||
|
|
||||||
nmults(1)=nmults(newsize)=2;
|
nmults(1)=nmults(newsize)=2;
|
||||||
Handle_BRepApprox_ApproxLine nAppLine ;
|
Handle_BRepApprox_ApproxLine nAppLine ;
|
||||||
Handle(Geom_BSplineCurve) nAppC =
|
Handle(Geom_BSplineCurve) nAppC =
|
||||||
@@ -708,10 +690,6 @@ void HLRTopoBRep_DSFiller::InsertFace (const Standard_Integer /*FI*/,
|
|||||||
|
|
||||||
nAppLine = new BRepApprox_ApproxLine(nAppC,nAppC2d,CNull);
|
nAppLine = new BRepApprox_ApproxLine(nAppC,nAppC2d,CNull);
|
||||||
|
|
||||||
|
|
||||||
//AppC2d = new Geom2d_BSplineCurve(Points2d,knots,mults,1);
|
|
||||||
//-- cout<<"\nHLRTopoBRep_DSFiller : nbp="<<nbp<<" Tol3d="<<TOL3d<<" Tol2d="<<TOL2d<<endl;
|
|
||||||
|
|
||||||
Approx.SetParameters(TOL3d, TOL2d, dmin, dmax, niter, 30, tg);
|
Approx.SetParameters(TOL3d, TOL2d, dmin, dmax, niter, 30, tg);
|
||||||
Approx.Perform(nAppLine,Standard_True,Standard_True,Standard_False,1,newsize/*nbp*/);
|
Approx.Perform(nAppLine,Standard_True,Standard_True,Standard_False,1,newsize/*nbp*/);
|
||||||
if (!Approx.IsDone()) {
|
if (!Approx.IsDone()) {
|
||||||
|
@@ -1737,13 +1737,169 @@ static Standard_Integer OCC28991 (Draw_Interpretor& , Standard_Integer n, const
|
|||||||
|
|
||||||
Reflector.Perform();
|
Reflector.Perform();
|
||||||
|
|
||||||
TopTools_DataMapOfShapeShape aDummy;
|
TopTools_DataMapOfShapeShape aDummy, aDummy2;
|
||||||
TopoDS_Shape aFaces = Reflector.GetCompoundOfFaces(true, aDummy);
|
TopoDS_Shape aFaces = Reflector.GetCompoundOfFaces(true, aDummy, aDummy2);
|
||||||
|
|
||||||
DBRep::Set(a[1], aFaces);
|
DBRep::Set(a[1], aFaces);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#include <XCAFDoc_ColorTool.hxx>
|
||||||
|
#include <TDataStd_TreeNode.hxx>
|
||||||
|
#include <Quantity_Color.hxx>
|
||||||
|
#include <XCAFDoc.hxx>
|
||||||
|
#include <TopExp_Explorer.hxx>
|
||||||
|
#include <TopTools_DataMapIteratorOfDataMapOfShapeShape.hxx>
|
||||||
|
#include <V3d_View.hxx>
|
||||||
|
#include <ViewerTest.hxx>
|
||||||
|
static Standard_Integer OCC_HLRDEMO (Draw_Interpretor& di, Standard_Integer n, const char** a)
|
||||||
|
{
|
||||||
|
if (n != 4)
|
||||||
|
{
|
||||||
|
cout << "Use: hlrdemo resDoc inpDoc axo/top/bottom/front/back/left/right" << endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Handle(TDocStd_Document) aDoc;
|
||||||
|
DDocStd::GetDocument(a[2], aDoc);
|
||||||
|
if ( aDoc.IsNull() )
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
TDF_LabelSequence Labels;
|
||||||
|
Handle(XCAFDoc_ShapeTool) STool = XCAFDoc_DocumentTool::ShapeTool(aDoc->Main());
|
||||||
|
STool->GetFreeShapes(Labels);
|
||||||
|
if ( Labels.Length() <=0 )
|
||||||
|
{
|
||||||
|
cout << "no shapes" << endl;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
TopoDS_Compound aShape;
|
||||||
|
BRep_Builder B;
|
||||||
|
B.MakeCompound ( aShape );
|
||||||
|
for ( int i = 1; i <= Labels.Length(); i++)
|
||||||
|
{
|
||||||
|
TopoDS_Shape S = STool->GetShape ( Labels.Value(i) );
|
||||||
|
B.Add ( aShape, S );
|
||||||
|
}
|
||||||
|
//
|
||||||
|
|
||||||
|
gp_Pnt anOrigin(0.,0.,0.);
|
||||||
|
gp_Dir aNormal(0.57735026918962573, -0.57735026918962573, 0.57735026918962573);
|
||||||
|
gp_Ax2 anAxes(anOrigin, aNormal);
|
||||||
|
gp_Dir aDX = anAxes.XDirection();
|
||||||
|
|
||||||
|
HLRAppli_ReflectLines Reflector(aShape);
|
||||||
|
|
||||||
|
bool from_view = false;
|
||||||
|
if (strcmp(a[3],"from_view") == 0)
|
||||||
|
{
|
||||||
|
Handle(V3d_View) aView = ViewerTest::CurrentView();
|
||||||
|
if (aView.IsNull())
|
||||||
|
return 1;
|
||||||
|
from_view = true;
|
||||||
|
//Standard_Real aViewScale = aView->Scale();
|
||||||
|
//Standard_Real aViewSize = 1.0;
|
||||||
|
//Graphic3d_Vec2i aCenter2d;
|
||||||
|
//gp_XYZ aViewProj, aViewUp, aViewAt, aViewEye;
|
||||||
|
//aView->Proj (aViewProj.ChangeCoord (1), aViewProj.ChangeCoord (2), aViewProj.ChangeCoord (3));
|
||||||
|
//aView->Up (aViewUp .ChangeCoord (1), aViewUp .ChangeCoord (2), aViewUp .ChangeCoord (3));
|
||||||
|
//aView->At (aViewAt .ChangeCoord (1), aViewAt .ChangeCoord (2), aViewAt .ChangeCoord (3));
|
||||||
|
//aView->Eye (aViewEye .ChangeCoord (1), aViewEye .ChangeCoord (2), aViewEye .ChangeCoord (3));
|
||||||
|
|
||||||
|
//anOrigin.SetXYZ(aViewEye);
|
||||||
|
//aNormal.SetXYZ(aViewProj);
|
||||||
|
//aDX.SetXYZ(aViewUp);
|
||||||
|
|
||||||
|
Handle(Graphic3d_Camera) aCamera = aView->Camera();
|
||||||
|
const gp_Dir aDir = aCamera->Direction().Reversed();
|
||||||
|
const gp_Pnt anAt = aCamera->Center();
|
||||||
|
const gp_Dir anUp = aCamera->Up();
|
||||||
|
|
||||||
|
Reflector.SetAxes(aDir.X(), aDir.Y(), aDir.Z(),
|
||||||
|
anAt.X(), anAt.Y(), anAt.Z(),
|
||||||
|
anUp.X(), anUp.Y(), anUp.Z(),
|
||||||
|
!aCamera->IsOrthographic(),
|
||||||
|
aCamera->Scale());
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (strcmp(a[3],"axo") == 0)
|
||||||
|
{
|
||||||
|
aNormal.SetCoord(0.57735026918962573, -0.57735026918962573, 0.57735026918962573);
|
||||||
|
aDX.SetCoord(-0.40824829046386307, 0.40824829046386307, 0.81649658092772615);
|
||||||
|
}
|
||||||
|
else if (strcmp(a[3],"top") == 0)
|
||||||
|
{
|
||||||
|
aNormal.SetCoord(0,0,1);
|
||||||
|
aDX.SetCoord(0,1,0);
|
||||||
|
}
|
||||||
|
else if (strcmp(a[3],"bottom") == 0)
|
||||||
|
{
|
||||||
|
aNormal.SetCoord(0,0,-1);
|
||||||
|
aDX.SetCoord(0,-1,0);
|
||||||
|
}
|
||||||
|
else if (strcmp(a[3],"front") == 0)
|
||||||
|
{
|
||||||
|
aNormal.SetCoord(0,-1,0);
|
||||||
|
aDX.SetCoord(0,0,1);
|
||||||
|
}
|
||||||
|
else if (strcmp(a[3],"back") == 0)
|
||||||
|
{
|
||||||
|
aNormal.SetCoord(0,1,0);
|
||||||
|
aDX.SetCoord(0,0,1);
|
||||||
|
}
|
||||||
|
else if (strcmp(a[3],"left") == 0)
|
||||||
|
{
|
||||||
|
aNormal.SetCoord(-1,0,0);
|
||||||
|
aDX.SetCoord(0,0,1);
|
||||||
|
}
|
||||||
|
else if (strcmp(a[3],"right") == 0)
|
||||||
|
{
|
||||||
|
aNormal.SetCoord(1,0,0);
|
||||||
|
aDX.SetCoord(0,0,1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!from_view)
|
||||||
|
Reflector.SetAxes(aNormal.X(), aNormal.Y(), aNormal.Z(),
|
||||||
|
anOrigin.X(), anOrigin.Y(), anOrigin.Z(),
|
||||||
|
aDX.X(), aDX.Y(), aDX.Z());
|
||||||
|
|
||||||
|
Reflector.Perform();
|
||||||
|
|
||||||
|
TopTools_DataMapOfShapeShape map3Dto2Dfaces, map2Dto3Dfaces;
|
||||||
|
TopoDS_Shape aFaces = Reflector.GetCompoundOfFaces(true, map3Dto2Dfaces, map2Dto3Dfaces);
|
||||||
|
|
||||||
|
Handle(XCAFDoc_ColorTool) CTool = XCAFDoc_DocumentTool::ColorTool( aDoc->Main() );
|
||||||
|
|
||||||
|
Handle(TDocStd_Document) OutDoc;
|
||||||
|
DDocStd::GetDocument(a[1], OutDoc);
|
||||||
|
if ( OutDoc.IsNull() )
|
||||||
|
{
|
||||||
|
di << a[2] << " is not a document\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
TopExp_Explorer exp(aFaces, TopAbs_FACE);
|
||||||
|
Handle(XCAFDoc_ShapeTool) SToolOut = XCAFDoc_DocumentTool::ShapeTool(OutDoc->Main());
|
||||||
|
Handle(XCAFDoc_ColorTool) CToolOut = XCAFDoc_DocumentTool::ColorTool(OutDoc->Main());
|
||||||
|
|
||||||
|
for (;exp.More();exp.Next())
|
||||||
|
{
|
||||||
|
TopoDS_Shape aCShape = exp.Current();
|
||||||
|
TDF_Label aLabel;
|
||||||
|
aLabel = SToolOut->AddShape(aCShape, 0);
|
||||||
|
if (aLabel.IsNull())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const TopoDS_Shape& a3df = map2Dto3Dfaces(aCShape);
|
||||||
|
Quantity_Color aQColor;
|
||||||
|
if (!CTool->GetColor ( a3df, XCAFDoc_ColorGen, aQColor) )
|
||||||
|
continue;
|
||||||
|
CToolOut->SetColor(aLabel, aQColor, XCAFDoc_ColorGen);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
@@ -2623,8 +2779,13 @@ void QABugs::Commands_20(Draw_Interpretor& theCommands) {
|
|||||||
"OCC27341 res shape axo/top/bottom/front/back/left/right",
|
"OCC27341 res shape axo/top/bottom/front/back/left/right",
|
||||||
__FILE__, OCC27341, group);
|
__FILE__, OCC27341, group);
|
||||||
theCommands.Add("OCC28991",
|
theCommands.Add("OCC28991",
|
||||||
"OCC289911 res shape axo/top/bottom/front/back/left/right",
|
"OCC28991 res shape axo/top/bottom/front/back/left/right",
|
||||||
__FILE__, OCC28991, group);
|
__FILE__, OCC28991, group);
|
||||||
|
|
||||||
|
theCommands.Add("OCC_HLRDEMO",
|
||||||
|
"OCC_HLRDEMO outdoc inpdoc axo/top/bottom/front/back/left/right",
|
||||||
|
__FILE__, OCC_HLRDEMO, group);
|
||||||
|
|
||||||
theCommands.Add ("OCC26747_1", "OCC26747_1 result", __FILE__, OCC26747_1, group);
|
theCommands.Add ("OCC26747_1", "OCC26747_1 result", __FILE__, OCC26747_1, group);
|
||||||
theCommands.Add ("OCC26747_2", "OCC26747_2 result", __FILE__, OCC26747_2, group);
|
theCommands.Add ("OCC26747_2", "OCC26747_2 result", __FILE__, OCC26747_2, group);
|
||||||
theCommands.Add ("OCC26747_3", "OCC26747_3 result", __FILE__, OCC26747_3, group);
|
theCommands.Add ("OCC26747_3", "OCC26747_3 result", __FILE__, OCC26747_3, group);
|
||||||
@@ -2642,5 +2803,7 @@ void QABugs::Commands_20(Draw_Interpretor& theCommands) {
|
|||||||
__FILE__, OCC28887, group);
|
__FILE__, OCC28887, group);
|
||||||
theCommands.Add("OCC28131", "OCC28131 name: creates face problematic for offset", __FILE__, OCC28131, group);
|
theCommands.Add("OCC28131", "OCC28131 name: creates face problematic for offset", __FILE__, OCC28131, group);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user