mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-09 13:22:24 +03:00
Compare commits
17 Commits
CR30459
...
CR32857_us
Author | SHA1 | Date | |
---|---|---|---|
|
f53c218335 | ||
|
057dcfddf7 | ||
|
3837b3bf28 | ||
|
acaaf4f598 | ||
|
db2bfd1e83 | ||
|
a855215141 | ||
|
195aac3a42 | ||
|
f706dd34b3 | ||
|
c325231de6 | ||
|
91a2f58f8f | ||
|
8175a70c4e | ||
|
f9990707fe | ||
|
aba5c241c6 | ||
|
cc164fd7dc | ||
|
d7d89acb39 | ||
|
d444cc35c6 | ||
|
7b98ef4e57 |
@@ -42,12 +42,14 @@
|
|||||||
#include <TopTools_SequenceOfShape.hxx>
|
#include <TopTools_SequenceOfShape.hxx>
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
//#define OCCT_DEBUG_ALGO
|
||||||
|
//#define DRAW
|
||||||
#ifdef DRAW
|
#ifdef DRAW
|
||||||
#include <DBRep.hxx>
|
#include <DBRep.hxx>
|
||||||
#pragma comment(lib,"TKDraw")
|
#pragma comment(lib,"TKDraw")
|
||||||
#endif
|
#endif
|
||||||
#ifdef OCCT_DEBUG_ALGO
|
#ifdef OCCT_DEBUG_ALGO
|
||||||
Standard_Boolean AffichLoop = Standard_False;
|
Standard_Boolean AffichLoop = Standard_True;
|
||||||
Standard_Integer NbLoops = 0;
|
Standard_Integer NbLoops = 0;
|
||||||
Standard_Integer NbWires = 1;
|
Standard_Integer NbWires = 1;
|
||||||
static char* name = new char[100];
|
static char* name = new char[100];
|
||||||
@@ -58,7 +60,8 @@ static char* name = new char[100];
|
|||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
|
|
||||||
BRepAlgo_Loop::BRepAlgo_Loop()
|
BRepAlgo_Loop::BRepAlgo_Loop():
|
||||||
|
myTolConf (0.001)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,7 +188,6 @@ static TopoDS_Vertex UpdateClosedEdge(const TopoDS_Edge& E,
|
|||||||
Standard_Boolean OnStart = 0, OnEnd = 0;
|
Standard_Boolean OnStart = 0, OnEnd = 0;
|
||||||
//// modified by jgv, 13.04.04 for OCC5634 ////
|
//// modified by jgv, 13.04.04 for OCC5634 ////
|
||||||
TopExp::Vertices (E,V1,V2);
|
TopExp::Vertices (E,V1,V2);
|
||||||
//Standard_Real Tol = Precision::Confusion();
|
|
||||||
Standard_Real Tol = BRep_Tool::Tolerance( V1 );
|
Standard_Real Tol = BRep_Tool::Tolerance( V1 );
|
||||||
///////////////////////////////////////////////
|
///////////////////////////////////////////////
|
||||||
|
|
||||||
@@ -427,13 +429,12 @@ static void StoreInMVE (const TopoDS_Face& F,
|
|||||||
TopoDS_Edge& E,
|
TopoDS_Edge& E,
|
||||||
TopTools_IndexedDataMapOfShapeListOfShape& MVE,
|
TopTools_IndexedDataMapOfShapeListOfShape& MVE,
|
||||||
Standard_Boolean& YaCouture,
|
Standard_Boolean& YaCouture,
|
||||||
TopTools_DataMapOfShapeShape& VerticesForSubstitute )
|
TopTools_DataMapOfShapeShape& VerticesForSubstitute,
|
||||||
|
const Standard_Real theTolConf)
|
||||||
{
|
{
|
||||||
TopoDS_Vertex V1, V2, V;
|
TopoDS_Vertex V1, V2, V;
|
||||||
TopTools_ListOfShape Empty;
|
TopTools_ListOfShape Empty;
|
||||||
|
|
||||||
Standard_Real Tol = 0.001; //5.e-05; //5.e-07;
|
|
||||||
// gp_Pnt P1, P2, P;
|
|
||||||
gp_Pnt P1, P;
|
gp_Pnt P1, P;
|
||||||
BRep_Builder BB;
|
BRep_Builder BB;
|
||||||
for (Standard_Integer iV = 1; iV <= MVE.Extent(); iV++)
|
for (Standard_Integer iV = 1; iV <= MVE.Extent(); iV++)
|
||||||
@@ -449,7 +450,7 @@ static void StoreInMVE (const TopoDS_Face& F,
|
|||||||
{
|
{
|
||||||
V1 = TopoDS::Vertex( itl.Value() );
|
V1 = TopoDS::Vertex( itl.Value() );
|
||||||
P1 = BRep_Tool::Pnt( V1 );
|
P1 = BRep_Tool::Pnt( V1 );
|
||||||
if (P.IsEqual( P1, Tol ) && !V.IsSame(V1))
|
if (P.IsEqual( P1, theTolConf ) && !V.IsSame(V1))
|
||||||
{
|
{
|
||||||
V.Orientation( V1.Orientation() );
|
V.Orientation( V1.Orientation() );
|
||||||
if (VerticesForSubstitute.IsBound( V1 ))
|
if (VerticesForSubstitute.IsBound( V1 ))
|
||||||
@@ -574,7 +575,7 @@ void BRepAlgo_Loop::Perform()
|
|||||||
TopoDS_Edge& E = TopoDS::Edge(itl1.Value());
|
TopoDS_Edge& E = TopoDS::Edge(itl1.Value());
|
||||||
if (!Emap.Add(E))
|
if (!Emap.Add(E))
|
||||||
continue;
|
continue;
|
||||||
StoreInMVE(myFace,E,MVE,YaCouture,myVerticesForSubstitute);
|
StoreInMVE(myFace,E,MVE,YaCouture,myVerticesForSubstitute, myTolConf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -586,7 +587,7 @@ void BRepAlgo_Loop::Perform()
|
|||||||
for (itl.Initialize(myConstEdges); itl.More(); itl.Next()) {
|
for (itl.Initialize(myConstEdges); itl.More(); itl.Next()) {
|
||||||
TopoDS_Edge& E = TopoDS::Edge(itl.Value());
|
TopoDS_Edge& E = TopoDS::Edge(itl.Value());
|
||||||
if (DejaVu.Add(E))
|
if (DejaVu.Add(E))
|
||||||
StoreInMVE(myFace,E,MVE,YaCouture,myVerticesForSubstitute);
|
StoreInMVE(myFace,E,MVE,YaCouture,myVerticesForSubstitute, myTolConf);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DRAW
|
#ifdef DRAW
|
||||||
@@ -626,42 +627,42 @@ void BRepAlgo_Loop::Perform()
|
|||||||
//--------------------------------
|
//--------------------------------
|
||||||
RemovePendingEdges(MVE);
|
RemovePendingEdges(MVE);
|
||||||
|
|
||||||
if (MVE.Extent() == 0) break;
|
if (MVE.Extent() == 0) break;
|
||||||
//--------------------------------
|
//--------------------------------
|
||||||
// Start edge.
|
// Start edge.
|
||||||
//--------------------------------
|
//--------------------------------
|
||||||
EF = CE = TopoDS::Edge(MVE(1).First());
|
EF = CE = TopoDS::Edge(MVE(1).First());
|
||||||
TopExp::Vertices(CE,V1,V2);
|
TopExp::Vertices(CE, V1, V2);
|
||||||
//--------------------------------
|
//--------------------------------
|
||||||
// VF vertex start of new wire
|
// VF vertex start of new wire
|
||||||
//--------------------------------
|
//--------------------------------
|
||||||
if (CE.Orientation() == TopAbs_FORWARD) { CV = VF = V1;}
|
if (CE.Orientation() == TopAbs_FORWARD) { CV = VF = V1; }
|
||||||
else { CV = VF = V2;}
|
else { CV = VF = V2; }
|
||||||
if (!MVE.Contains(CV)) continue;
|
if (!MVE.Contains(CV)) continue;
|
||||||
TopTools_ListOfShape& aListEdges = MVE.ChangeFromKey(CV);
|
TopTools_ListOfShape& aListEdges = MVE.ChangeFromKey(CV);
|
||||||
for ( itl.Initialize(aListEdges); itl.More(); itl.Next()) {
|
for (itl.Initialize(aListEdges); itl.More(); itl.Next()) {
|
||||||
if (itl.Value().IsEqual(CE)) {
|
if (itl.Value().IsEqual(CE)) {
|
||||||
aListEdges.Remove(itl);
|
aListEdges.Remove(itl);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
End = Standard_False;
|
End = Standard_False;
|
||||||
|
|
||||||
while (!End) {
|
while (!End) {
|
||||||
//-------------------------------
|
//-------------------------------
|
||||||
// Construction of a wire.
|
// Construction of a wire.
|
||||||
//-------------------------------
|
//-------------------------------
|
||||||
TopExp::Vertices(CE,V1,V2);
|
TopExp::Vertices(CE, V1, V2);
|
||||||
if (!CV.IsSame(V1)) CV = V1; else CV = V2;
|
if (!CV.IsSame(V1)) CV = V1; else CV = V2;
|
||||||
|
|
||||||
B.Add (NW,CE);
|
B.Add(NW, CE);
|
||||||
UsedEdges.Add(CE);
|
UsedEdges.Add(CE);
|
||||||
|
|
||||||
if (!MVE.Contains(CV) || MVE.FindFromKey(CV).IsEmpty()) {
|
if (!MVE.Contains(CV) || MVE.FindFromKey(CV).IsEmpty()) {
|
||||||
End = Standard_True;
|
End = Standard_True;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
End = !SelectEdge(myFace,CE,CV,NE,MVE.ChangeFromKey(CV));
|
End = !SelectEdge(myFace, CE, CV, NE, MVE.ChangeFromKey(CV));
|
||||||
if (!End) {
|
if (!End) {
|
||||||
CE = NE;
|
CE = NE;
|
||||||
if (MVE.FindFromKey(CV).IsEmpty())
|
if (MVE.FindFromKey(CV).IsEmpty())
|
||||||
@@ -672,35 +673,41 @@ void BRepAlgo_Loop::Perform()
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// Add new wire to the set of wires
|
// Add new wire to the set of wires
|
||||||
//------------------------------------------------
|
//------------------------------------------------
|
||||||
Standard_Real Tol = 0.001; //5.e-05; //5.e-07;
|
|
||||||
TopExp_Explorer explo( NW, TopAbs_VERTEX );
|
|
||||||
for (; explo.More(); explo.Next())
|
|
||||||
{
|
|
||||||
const TopoDS_Vertex& aV = TopoDS::Vertex( explo.Current() );
|
|
||||||
Handle(BRep_TVertex)& TV = *((Handle(BRep_TVertex)*) &(aV).TShape());
|
|
||||||
TV->Tolerance( Tol );
|
|
||||||
TV->Modified( Standard_True );
|
|
||||||
}
|
|
||||||
for (explo.Init( NW, TopAbs_EDGE ); explo.More(); explo.Next())
|
|
||||||
{
|
|
||||||
const TopoDS_Edge& aE = TopoDS::Edge( explo.Current() );
|
|
||||||
Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &(aE).TShape());
|
|
||||||
TE->Tolerance( Tol );
|
|
||||||
TE->Modified( Standard_True );
|
|
||||||
}
|
|
||||||
|
|
||||||
if (VF.IsSame(CV) && SamePnt2d(VF,EF,CE,myFace))
|
if (VF.IsSame(CV))
|
||||||
{
|
{
|
||||||
NW.Closed (Standard_True);
|
if (SamePnt2d(VF, EF, CE, myFace))
|
||||||
myNewWires.Append (NW);
|
{
|
||||||
|
NW.Closed(Standard_True);
|
||||||
|
myNewWires.Append(NW);
|
||||||
|
}
|
||||||
|
else if(BRep_Tool::Tolerance(VF) < myTolConf)
|
||||||
|
{
|
||||||
|
BRep_Builder aBB;
|
||||||
|
aBB.UpdateVertex(VF, myTolConf);
|
||||||
|
if (SamePnt2d(VF, EF, CE, myFace))
|
||||||
|
{
|
||||||
|
NW.Closed(Standard_True);
|
||||||
|
myNewWires.Append(NW);
|
||||||
|
}
|
||||||
|
#ifdef OCCT_DEBUG_ALGO
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << "BRepAlgo_Loop: Open Wire" << std::endl;
|
||||||
|
if (AffichLoop)
|
||||||
|
std::cout << "OpenWire is : NW_" << NbLoops << "_" << NbWires << std::endl;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#ifdef OCCT_DEBUG_ALGO
|
#ifdef OCCT_DEBUG_ALGO
|
||||||
else {
|
else {
|
||||||
std::cout <<"BRepAlgo_Loop: Open Wire"<<std::endl;
|
std::cout << "BRepAlgo_Loop: Open Wire" << std::endl;
|
||||||
if (AffichLoop)
|
if (AffichLoop)
|
||||||
std::cout << "OpenWire is : NW_"<<NbLoops<<"_"<<NbWires<<std::endl;
|
std::cout << "OpenWire is : NW_" << NbLoops << "_" << NbWires << std::endl;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DRAW
|
#ifdef DRAW
|
||||||
if (AffichLoop) {
|
if (AffichLoop) {
|
||||||
sprintf(name,"NW_%d_%d",NbLoops,NbWires++);
|
sprintf(name,"NW_%d_%d",NbLoops,NbWires++);
|
||||||
@@ -777,8 +784,6 @@ void BRepAlgo_Loop::CutEdge (const TopoDS_Edge& E,
|
|||||||
VF = TopoDS::Vertex(aLocalV);
|
VF = TopoDS::Vertex(aLocalV);
|
||||||
aLocalV = VCEI.Oriented(TopAbs_REVERSED);
|
aLocalV = VCEI.Oriented(TopAbs_REVERSED);
|
||||||
VL = TopoDS::Vertex(aLocalV);
|
VL = TopoDS::Vertex(aLocalV);
|
||||||
// VF = TopoDS::Vertex(VCEI.Oriented(TopAbs_FORWARD));
|
|
||||||
// VL = TopoDS::Vertex(VCEI.Oriented(TopAbs_REVERSED));
|
|
||||||
}
|
}
|
||||||
SV.Prepend(VF);
|
SV.Prepend(VF);
|
||||||
SV.Append(VL);
|
SV.Append(VL);
|
||||||
@@ -813,13 +818,9 @@ void BRepAlgo_Loop::CutEdge (const TopoDS_Edge& E,
|
|||||||
B.Add (NewEdge,aLocalEdge);
|
B.Add (NewEdge,aLocalEdge);
|
||||||
aLocalEdge = V2.Oriented(TopAbs_REVERSED);
|
aLocalEdge = V2.Oriented(TopAbs_REVERSED);
|
||||||
B.Add (TopoDS::Edge(NewEdge),aLocalEdge);
|
B.Add (TopoDS::Edge(NewEdge),aLocalEdge);
|
||||||
// B.Add (NewEdge,V1.Oriented(TopAbs_FORWARD));
|
|
||||||
// B.Add (NewEdge,V2.Oriented(TopAbs_REVERSED));
|
|
||||||
if (V1.IsSame(VF))
|
if (V1.IsSame(VF))
|
||||||
U1 = f;
|
U1 = f;
|
||||||
else
|
else
|
||||||
// U1=BRep_Tool::Parameter
|
|
||||||
// (TopoDS::Vertex(V1.Oriented(TopAbs_INTERNAL)),WE);
|
|
||||||
{
|
{
|
||||||
TopoDS_Shape aLocalV = V1.Oriented(TopAbs_INTERNAL);
|
TopoDS_Shape aLocalV = V1.Oriented(TopAbs_INTERNAL);
|
||||||
U1=BRep_Tool::Parameter(TopoDS::Vertex(aLocalV),WE);
|
U1=BRep_Tool::Parameter(TopoDS::Vertex(aLocalV),WE);
|
||||||
@@ -830,8 +831,6 @@ void BRepAlgo_Loop::CutEdge (const TopoDS_Edge& E,
|
|||||||
{
|
{
|
||||||
TopoDS_Shape aLocalV = V2.Oriented(TopAbs_INTERNAL);
|
TopoDS_Shape aLocalV = V2.Oriented(TopAbs_INTERNAL);
|
||||||
U2=BRep_Tool::Parameter(TopoDS::Vertex(aLocalV),WE);
|
U2=BRep_Tool::Parameter(TopoDS::Vertex(aLocalV),WE);
|
||||||
// U2=BRep_Tool::Parameter
|
|
||||||
// (TopoDS::Vertex(V2.Oriented(TopAbs_INTERNAL)),WE);
|
|
||||||
}
|
}
|
||||||
B.Range (TopoDS::Edge(NewEdge),U1,U2);
|
B.Range (TopoDS::Edge(NewEdge),U1,U2);
|
||||||
#ifdef DRAW
|
#ifdef DRAW
|
||||||
|
@@ -86,8 +86,17 @@ public:
|
|||||||
|
|
||||||
Standard_EXPORT void VerticesForSubstitute (TopTools_DataMapOfShapeShape& VerVerMap);
|
Standard_EXPORT void VerticesForSubstitute (TopTools_DataMapOfShapeShape& VerVerMap);
|
||||||
|
|
||||||
|
//! Set maximal tolerance used for comparing distaces between vertices.
|
||||||
|
void SetTolConf(const Standard_Real theTolConf)
|
||||||
|
{
|
||||||
|
myTolConf = theTolConf;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Get maximal tolerance used for comparing distaces between vertices.
|
||||||
|
Standard_Real GetTolConf() const
|
||||||
|
{
|
||||||
|
return myTolConf;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
@@ -108,6 +117,7 @@ private:
|
|||||||
TopTools_DataMapOfShapeListOfShape myCutEdges;
|
TopTools_DataMapOfShapeListOfShape myCutEdges;
|
||||||
TopTools_DataMapOfShapeShape myVerticesForSubstitute;
|
TopTools_DataMapOfShapeShape myVerticesForSubstitute;
|
||||||
BRepAlgo_Image myImageVV;
|
BRepAlgo_Image myImageVV;
|
||||||
|
Standard_Real myTolConf;
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@@ -43,6 +43,8 @@ BRepExtrema_ProximityDistTool::BRepExtrema_ProximityDistTool()
|
|||||||
//=======================================================================
|
//=======================================================================
|
||||||
BRepExtrema_ProximityDistTool::BRepExtrema_ProximityDistTool (const Handle(BRepExtrema_TriangleSet)& theSet1,
|
BRepExtrema_ProximityDistTool::BRepExtrema_ProximityDistTool (const Handle(BRepExtrema_TriangleSet)& theSet1,
|
||||||
const Standard_Integer theNbSamples1,
|
const Standard_Integer theNbSamples1,
|
||||||
|
const BVH_Array3d& theAddVertices1,
|
||||||
|
const NCollection_Vector<ProxPnt_Status>& theAddStatus1,
|
||||||
const Handle(BRepExtrema_TriangleSet)& theSet2,
|
const Handle(BRepExtrema_TriangleSet)& theSet2,
|
||||||
const BRepExtrema_ShapeList& theShapeList1,
|
const BRepExtrema_ShapeList& theShapeList1,
|
||||||
const BRepExtrema_ShapeList& theShapeList2)
|
const BRepExtrema_ShapeList& theShapeList2)
|
||||||
@@ -55,6 +57,7 @@ BRepExtrema_ProximityDistTool::BRepExtrema_ProximityDistTool (const Handle(BRepE
|
|||||||
{
|
{
|
||||||
LoadTriangleSets (theSet1, theSet2);
|
LoadTriangleSets (theSet1, theSet2);
|
||||||
LoadShapeLists (theShapeList1, theShapeList2);
|
LoadShapeLists (theShapeList1, theShapeList2);
|
||||||
|
LoadAdditionalPointsFirstSet (theAddVertices1, theAddStatus1);
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
@@ -69,7 +72,7 @@ void BRepExtrema_ProximityDistTool::LoadTriangleSets (const Handle(BRepExtrema_T
|
|||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : LoadTriangleSets
|
//function : LoadShapeLists
|
||||||
//purpose : Loads the given list of subshapes into the proximity tool
|
//purpose : Loads the given list of subshapes into the proximity tool
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
void BRepExtrema_ProximityDistTool::LoadShapeLists (const BRepExtrema_ShapeList& theShapeList1,
|
void BRepExtrema_ProximityDistTool::LoadShapeLists (const BRepExtrema_ShapeList& theShapeList1,
|
||||||
@@ -78,23 +81,33 @@ void BRepExtrema_ProximityDistTool::LoadShapeLists (const BRepExtrema_ShapeList&
|
|||||||
myShapeList1 = theShapeList1;
|
myShapeList1 = theShapeList1;
|
||||||
myShapeList2 = theShapeList2;
|
myShapeList2 = theShapeList2;
|
||||||
}
|
}
|
||||||
//=======================================================================
|
|
||||||
//function : Perform
|
|
||||||
//purpose : Performs searching of the proximity distance
|
|
||||||
//=======================================================================
|
|
||||||
void BRepExtrema_ProximityDistTool::Perform()
|
|
||||||
{
|
|
||||||
SetBVHSet (mySet2.get());
|
|
||||||
|
|
||||||
const BVH_Array3d& aVertices1 = mySet1->GetVertices();
|
//=======================================================================
|
||||||
Standard_Integer aVtxSize = (Standard_Integer)aVertices1.size();
|
//function : LoadAdditionalPointsFirstSet
|
||||||
|
//purpose : Loads given additional vertices and their statuses
|
||||||
|
//=======================================================================
|
||||||
|
void BRepExtrema_ProximityDistTool::LoadAdditionalPointsFirstSet (const BVH_Array3d& theAddVertices1,
|
||||||
|
const NCollection_Vector<ProxPnt_Status>& theAddStatus1)
|
||||||
|
{
|
||||||
|
myAddVertices1 = theAddVertices1;
|
||||||
|
myAddStatus1 = theAddStatus1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : goThroughtSet1
|
||||||
|
//purpose : Goes throught vertices from the 1st set
|
||||||
|
//=======================================================================
|
||||||
|
void BRepExtrema_ProximityDistTool::goThroughtSet1 (const BVH_Array3d& theVertices1,
|
||||||
|
const Standard_Boolean theIsAdditionalSet)
|
||||||
|
{
|
||||||
|
Standard_Integer aVtxSize = (Standard_Integer)theVertices1.size();
|
||||||
Standard_Integer aVtxStep = Max (myNbSamples1 <= 0 ? 1 : aVtxSize / myNbSamples1, 1);
|
Standard_Integer aVtxStep = Max (myNbSamples1 <= 0 ? 1 : aVtxSize / myNbSamples1, 1);
|
||||||
for (Standard_Integer aVtxIdx = 0; aVtxIdx < aVtxSize; aVtxIdx += aVtxStep)
|
for (Standard_Integer aVtxIdx = 0; aVtxIdx < aVtxSize; aVtxIdx += aVtxStep)
|
||||||
{
|
{
|
||||||
myDistance = std::numeric_limits<Standard_Real>::max();
|
myDistance = std::numeric_limits<Standard_Real>::max();
|
||||||
myMinDistance = std::numeric_limits<Standard_Real>::max();
|
myMinDistance = std::numeric_limits<Standard_Real>::max();
|
||||||
myIsDone = Standard_False;
|
myIsDone = Standard_False;
|
||||||
SetObject (aVertices1[aVtxIdx]);
|
SetObject (theVertices1[aVtxIdx]);
|
||||||
|
|
||||||
ComputeDistance();
|
ComputeDistance();
|
||||||
|
|
||||||
@@ -102,20 +115,31 @@ void BRepExtrema_ProximityDistTool::Perform()
|
|||||||
|
|
||||||
if (IsDone() && myDistance > myProxDist)
|
if (IsDone() && myDistance > myProxDist)
|
||||||
{
|
{
|
||||||
myPnt1 = aVertices1[aVtxIdx];
|
myPnt1 = theVertices1[aVtxIdx];
|
||||||
myPnt2 = myExtremaPoint;
|
myPnt2 = myExtremaPoint;
|
||||||
myProxDist = myDistance;
|
myProxDist = myDistance;
|
||||||
myProxVtxIdx1 = aVtxIdx;
|
myProxVtxIdx1 = aVtxIdx;
|
||||||
|
myIsProxVtx1FromAddSet = theIsAdditionalSet;
|
||||||
myProxPrjState = myExtPrjState;
|
myProxPrjState = myExtPrjState;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
myIsDone = myProxDist > -1.;
|
//=======================================================================
|
||||||
|
//function : Perform
|
||||||
|
//purpose : Performs searching of the proximity distance
|
||||||
|
//=======================================================================
|
||||||
|
void BRepExtrema_ProximityDistTool::Perform()
|
||||||
|
{
|
||||||
|
SetBVHSet (mySet2.get());
|
||||||
|
goThroughtSet1 (mySet1->GetVertices(), Standard_False);
|
||||||
|
goThroughtSet1 (myAddVertices1, Standard_True);
|
||||||
|
|
||||||
if (myIsDone)
|
myIsDone = myProxDist > -1.;
|
||||||
{
|
if (myIsDone)
|
||||||
DefineStatusProxPnt();
|
{
|
||||||
}
|
DefineStatusProxPnt();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Standard_Real pointBoxSquareMaxDistance (const BVH_Vec3d& thePoint,
|
static Standard_Real pointBoxSquareMaxDistance (const BVH_Vec3d& thePoint,
|
||||||
@@ -247,7 +271,12 @@ Standard_Real BRepExtrema_ProximityDistTool::ComputeDistance()
|
|||||||
return myDistance;
|
return myDistance;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Standard_Boolean isNodeOnBorder (const Standard_Integer theNodeIdx, const Handle (Poly_Triangulation)& theTr)
|
//=======================================================================
|
||||||
|
//function : IsNodeOnBorder
|
||||||
|
//purpose : Returns true if the node is on the boarder
|
||||||
|
//=======================================================================
|
||||||
|
Standard_Boolean BRepExtrema_ProximityDistTool::IsNodeOnBorder (const Standard_Integer theNodeIdx,
|
||||||
|
const Handle(Poly_Triangulation)& theTr)
|
||||||
{
|
{
|
||||||
Poly_Connect aPolyConnect (theTr);
|
Poly_Connect aPolyConnect (theTr);
|
||||||
|
|
||||||
@@ -279,12 +308,49 @@ static Standard_Boolean isNodeOnBorder (const Standard_Integer theNodeIdx, const
|
|||||||
return Standard_False;
|
return Standard_False;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : IsEdgeOnBorder
|
||||||
|
//purpose : Returns true if the edge is on the boarder
|
||||||
|
//=======================================================================
|
||||||
|
Standard_Boolean BRepExtrema_ProximityDistTool::IsEdgeOnBorder (const Standard_Integer theTrgIdx,
|
||||||
|
const Standard_Integer theFirstEdgeNodeIdx,
|
||||||
|
const Standard_Integer theSecondEdgeNodeIdx,
|
||||||
|
const Handle(Poly_Triangulation)& theTr)
|
||||||
|
{
|
||||||
|
Poly_Connect aPolyConnect (theTr);
|
||||||
|
|
||||||
|
Standard_Integer aAdjTrg[3];
|
||||||
|
aPolyConnect.Triangles (theTrgIdx, aAdjTrg[0], aAdjTrg[1], aAdjTrg[2]); //indices of adjacent triangles
|
||||||
|
|
||||||
|
for (Standard_Integer j = 0; j < 3; j++)
|
||||||
|
{
|
||||||
|
Standard_Integer k = (j + 1) % 3;
|
||||||
|
if (aAdjTrg[j] == 0) //free segment of triangle
|
||||||
|
{
|
||||||
|
//are ends of free segment and it is a part of border
|
||||||
|
if (j == theFirstEdgeNodeIdx &&
|
||||||
|
k == theSecondEdgeNodeIdx)
|
||||||
|
{
|
||||||
|
return Standard_True;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Standard_False;
|
||||||
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : defineStatusProxPnt1
|
//function : defineStatusProxPnt1
|
||||||
//purpose : Defines the status of proximity point from 1st BVH
|
//purpose : Defines the status of proximity point from 1st BVH
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
void BRepExtrema_ProximityDistTool::defineStatusProxPnt1()
|
void BRepExtrema_ProximityDistTool::defineStatusProxPnt1()
|
||||||
{
|
{
|
||||||
|
if (myIsProxVtx1FromAddSet)
|
||||||
|
{
|
||||||
|
myPntStatus1 = myAddStatus1[myProxVtxIdx1];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Standard_Integer aFaceID1 = mySet1->GetShapeIDOfVtx (myProxVtxIdx1);
|
Standard_Integer aFaceID1 = mySet1->GetShapeIDOfVtx (myProxVtxIdx1);
|
||||||
|
|
||||||
if (myShapeList1 (aFaceID1).ShapeType() == TopAbs_EDGE)
|
if (myShapeList1 (aFaceID1).ShapeType() == TopAbs_EDGE)
|
||||||
@@ -314,9 +380,9 @@ void BRepExtrema_ProximityDistTool::defineStatusProxPnt1()
|
|||||||
|
|
||||||
TopLoc_Location aLocation;
|
TopLoc_Location aLocation;
|
||||||
const TopoDS_Face& aF = TopoDS::Face (myShapeList1 (aFaceID1));
|
const TopoDS_Face& aF = TopoDS::Face (myShapeList1 (aFaceID1));
|
||||||
Handle (Poly_Triangulation) aTr = BRep_Tool::Triangulation (aF, aLocation);
|
Handle(Poly_Triangulation) aTr = BRep_Tool::Triangulation (aF, aLocation);
|
||||||
|
|
||||||
if (isNodeOnBorder (aNodeIdx, aTr))
|
if (IsNodeOnBorder (aNodeIdx, aTr))
|
||||||
{
|
{
|
||||||
myPntStatus1 = ProxPnt_Status_BORDER;
|
myPntStatus1 = ProxPnt_Status_BORDER;
|
||||||
}
|
}
|
||||||
@@ -398,7 +464,7 @@ void BRepExtrema_ProximityDistTool::defineStatusProxPnt2()
|
|||||||
{
|
{
|
||||||
TopLoc_Location aLocation;
|
TopLoc_Location aLocation;
|
||||||
const TopoDS_Face& aF = TopoDS::Face (myShapeList2 (aFaceID2));
|
const TopoDS_Face& aF = TopoDS::Face (myShapeList2 (aFaceID2));
|
||||||
Handle (Poly_Triangulation) aTr = BRep_Tool::Triangulation (aF, aLocation);
|
Handle(Poly_Triangulation) aTr = BRep_Tool::Triangulation (aF, aLocation);
|
||||||
|
|
||||||
NCollection_Array1<Standard_Integer> aVtxIndicesOfTrg;
|
NCollection_Array1<Standard_Integer> aVtxIndicesOfTrg;
|
||||||
mySet2->GetVtxIndices (aTrgIdx, aVtxIndicesOfTrg);
|
mySet2->GetVtxIndices (aTrgIdx, aVtxIndicesOfTrg);
|
||||||
@@ -408,7 +474,7 @@ void BRepExtrema_ProximityDistTool::defineStatusProxPnt2()
|
|||||||
Standard_Integer aNodeNum = myProxPrjState.GetNumberOfFirstNode();
|
Standard_Integer aNodeNum = myProxPrjState.GetNumberOfFirstNode();
|
||||||
Standard_Integer aNodeIdx = mySet2->GetVtxIdxInShape (aVtxIndicesOfTrg[aNodeNum]) + 1;
|
Standard_Integer aNodeIdx = mySet2->GetVtxIdxInShape (aVtxIndicesOfTrg[aNodeNum]) + 1;
|
||||||
|
|
||||||
if (isNodeOnBorder (aNodeIdx, aTr))
|
if (IsNodeOnBorder (aNodeIdx, aTr))
|
||||||
{
|
{
|
||||||
myPntStatus2 = ProxPnt_Status_BORDER;
|
myPntStatus2 = ProxPnt_Status_BORDER;
|
||||||
}
|
}
|
||||||
@@ -419,27 +485,18 @@ void BRepExtrema_ProximityDistTool::defineStatusProxPnt2()
|
|||||||
}
|
}
|
||||||
else if (myProxPrjState.GetPrjState() == BVH_PrjState::BVH_PrjStateInTriangle_EDGE)
|
else if (myProxPrjState.GetPrjState() == BVH_PrjState::BVH_PrjStateInTriangle_EDGE)
|
||||||
{
|
{
|
||||||
myPntStatus2 = ProxPnt_Status_MIDDLE;
|
|
||||||
|
|
||||||
Poly_Connect aPolyConnect (aTr);
|
|
||||||
Standard_Integer aTrgIdxInShape = mySet2->GetTrgIdxInShape (aTrgIdx) + 1;
|
Standard_Integer aTrgIdxInShape = mySet2->GetTrgIdxInShape (aTrgIdx) + 1;
|
||||||
|
|
||||||
Standard_Integer aAdjTrg[3];
|
if (IsEdgeOnBorder (aTrgIdxInShape,
|
||||||
aPolyConnect.Triangles (aTrgIdxInShape, aAdjTrg[0], aAdjTrg[1], aAdjTrg[2]); //indices of adjacent triangles
|
myProxPrjState.GetNumberOfFirstNode(),
|
||||||
|
myProxPrjState.GetNumberOfLastNode(),
|
||||||
for (Standard_Integer j = 0; j < 3; j++)
|
aTr))
|
||||||
{
|
{
|
||||||
Standard_Integer k = (j + 1) % 3;
|
myPntStatus2 = ProxPnt_Status_BORDER;
|
||||||
if (aAdjTrg[j] == 0) //free segment of triangle
|
}
|
||||||
{
|
else
|
||||||
//aVtxIndicesOfTrg[j] and aVtxIndicesOfTrg[k] are ends of free segment and it is a part of border
|
{
|
||||||
if (j == myProxPrjState.GetNumberOfFirstNode() &&
|
myPntStatus2 = ProxPnt_Status_MIDDLE;
|
||||||
k == myProxPrjState.GetNumberOfLastNode())
|
|
||||||
{
|
|
||||||
myPntStatus2 = ProxPnt_Status_BORDER;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} //else if (myProxPrjState.GetPrjState() == BVH_PrjState::BVH_PrjStateInTriangle_EDGE)
|
} //else if (myProxPrjState.GetPrjState() == BVH_PrjState::BVH_PrjStateInTriangle_EDGE)
|
||||||
}
|
}
|
||||||
|
@@ -21,6 +21,7 @@
|
|||||||
#include <BRepExtrema_TriangleSet.hxx>
|
#include <BRepExtrema_TriangleSet.hxx>
|
||||||
#include <BVH_Distance.hxx>
|
#include <BVH_Distance.hxx>
|
||||||
#include <BVH_Tools.hxx>
|
#include <BVH_Tools.hxx>
|
||||||
|
#include <Poly_Triangulation.hxx>
|
||||||
|
|
||||||
//! Tool class for computation the proximity distance from first
|
//! Tool class for computation the proximity distance from first
|
||||||
//! primitive set to second one that is the maximal from minimum
|
//! primitive set to second one that is the maximal from minimum
|
||||||
@@ -93,6 +94,8 @@ public:
|
|||||||
//! Creates new tool for the given element sets.
|
//! Creates new tool for the given element sets.
|
||||||
Standard_EXPORT BRepExtrema_ProximityDistTool (const Handle(BRepExtrema_TriangleSet)& theSet1,
|
Standard_EXPORT BRepExtrema_ProximityDistTool (const Handle(BRepExtrema_TriangleSet)& theSet1,
|
||||||
const Standard_Integer theNbSamples1,
|
const Standard_Integer theNbSamples1,
|
||||||
|
const BVH_Array3d& theAddVertices1,
|
||||||
|
const NCollection_Vector<ProxPnt_Status>& theAddStatus1,
|
||||||
const Handle(BRepExtrema_TriangleSet)& theSet2,
|
const Handle(BRepExtrema_TriangleSet)& theSet2,
|
||||||
const BRepExtrema_ShapeList& theShapeList1,
|
const BRepExtrema_ShapeList& theShapeList1,
|
||||||
const BRepExtrema_ShapeList& theShapeList2);
|
const BRepExtrema_ShapeList& theShapeList2);
|
||||||
@@ -107,6 +110,10 @@ public:
|
|||||||
Standard_EXPORT void LoadShapeLists (const BRepExtrema_ShapeList& theShapeList1,
|
Standard_EXPORT void LoadShapeLists (const BRepExtrema_ShapeList& theShapeList1,
|
||||||
const BRepExtrema_ShapeList& theShapeList2);
|
const BRepExtrema_ShapeList& theShapeList2);
|
||||||
|
|
||||||
|
//! Loads given additional vertices and their statuses.
|
||||||
|
void LoadAdditionalPointsFirstSet (const BVH_Array3d& theAddVertices1,
|
||||||
|
const NCollection_Vector<ProxPnt_Status>& theAddStatus1);
|
||||||
|
|
||||||
//! Performs searching of the proximity distance.
|
//! Performs searching of the proximity distance.
|
||||||
Standard_EXPORT void Perform();
|
Standard_EXPORT void Perform();
|
||||||
|
|
||||||
@@ -121,6 +128,20 @@ public: //! @name Reject/Accept implementations
|
|||||||
Standard_EXPORT virtual Standard_Boolean Accept (const Standard_Integer theSgmIdx,
|
Standard_EXPORT virtual Standard_Boolean Accept (const Standard_Integer theSgmIdx,
|
||||||
const Standard_Real&) Standard_OVERRIDE;
|
const Standard_Real&) Standard_OVERRIDE;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//! Returns true if the node is on the boarder.
|
||||||
|
Standard_EXPORT static Standard_Boolean IsNodeOnBorder (const Standard_Integer theNodeIdx,
|
||||||
|
const Handle (Poly_Triangulation)& theTr);
|
||||||
|
|
||||||
|
//! Returns true if the edge is on the boarder.
|
||||||
|
Standard_EXPORT static Standard_Boolean IsEdgeOnBorder (const Standard_Integer theTrgIdx,
|
||||||
|
const Standard_Integer theFirstEdgeNodeIdx,
|
||||||
|
const Standard_Integer theSecondEdgeNodeIdx,
|
||||||
|
const Handle (Poly_Triangulation)& theTr);
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
//! Returns points on triangles sets, which provide the proximity distance.
|
//! Returns points on triangles sets, which provide the proximity distance.
|
||||||
void ProximityPoints (BVH_Vec3d& thePoint1, BVH_Vec3d& thePoint2) const
|
void ProximityPoints (BVH_Vec3d& thePoint1, BVH_Vec3d& thePoint2) const
|
||||||
{
|
{
|
||||||
@@ -148,6 +169,10 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
//! Goes throught vertices from the 1st set.
|
||||||
|
void goThroughtSet1 (const BVH_Array3d& aVertices1,
|
||||||
|
const Standard_Boolean theIsAdditionalSet);
|
||||||
|
|
||||||
//! Defines the status of proximity point from 1st BVH.
|
//! Defines the status of proximity point from 1st BVH.
|
||||||
void defineStatusProxPnt1();
|
void defineStatusProxPnt1();
|
||||||
|
|
||||||
@@ -183,6 +208,11 @@ private:
|
|||||||
|
|
||||||
Standard_Integer myNbSamples1; //!< Number of samples points on the first shape
|
Standard_Integer myNbSamples1; //!< Number of samples points on the first shape
|
||||||
|
|
||||||
|
//! Is vertex corresponding to proximity point of 1st shape from additional set
|
||||||
|
Standard_Integer myIsProxVtx1FromAddSet;
|
||||||
|
BVH_Array3d myAddVertices1; //!< Additional vertices on the 1st shape
|
||||||
|
NCollection_Vector<ProxPnt_Status> myAddStatus1; //!< Status of additional vertices on the 1st shape
|
||||||
|
|
||||||
//! Vertex index from 1st BVH corresponding to proximity point of 1st shape
|
//! Vertex index from 1st BVH corresponding to proximity point of 1st shape
|
||||||
Standard_Integer myProxVtxIdx1;
|
Standard_Integer myProxVtxIdx1;
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
// Created on: 2022-08-08
|
// Created on: 2022-08-08
|
||||||
// Created by: Kseniya NOSULKO
|
// Created by: Kseniya NOSULKO
|
||||||
// Copyright (c) 2022 OPEN CASCADE SAS
|
// Copyright (c) 2022 OPEN CASCADE SAS
|
||||||
//
|
//
|
||||||
@@ -14,17 +14,32 @@
|
|||||||
// commercial license or contractual agreement.
|
// commercial license or contractual agreement.
|
||||||
|
|
||||||
#include <BRepExtrema_ProximityValueTool.hxx>
|
#include <BRepExtrema_ProximityValueTool.hxx>
|
||||||
|
#include <BRepExtrema_ProximityDistTool.hxx>
|
||||||
|
|
||||||
|
#include <BRep_Tool.hxx>
|
||||||
|
#include <BRepAdaptor_Curve.hxx>
|
||||||
|
#include <BRepGProp.hxx>
|
||||||
|
#include <GCPnts_AbscissaPoint.hxx>
|
||||||
|
#include <GCPnts_QuasiUniformAbscissa.hxx>
|
||||||
|
#include <GProp_GProps.hxx>
|
||||||
|
#include <Poly_Connect.hxx>
|
||||||
|
#include <TopoDS.hxx>
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : BRepExtrema_ProximityValueTool
|
//function : BRepExtrema_ProximityValueTool
|
||||||
//purpose : Creates new unitialized proximity tool
|
//purpose : Creates new unitialized proximity tool
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
BRepExtrema_ProximityValueTool::BRepExtrema_ProximityValueTool()
|
BRepExtrema_ProximityValueTool::BRepExtrema_ProximityValueTool()
|
||||||
: myDistance (std::numeric_limits<Standard_Real>::max()),
|
: myIsRefinementRequired1 (Standard_False),
|
||||||
|
myIsRefinementRequired2 (Standard_False),
|
||||||
|
myDistance (std::numeric_limits<Standard_Real>::max()),
|
||||||
myIsDone (Standard_False),
|
myIsDone (Standard_False),
|
||||||
myNbSamples1(0),
|
myNbSamples1(0),
|
||||||
myNbSamples2(0)
|
myNbSamples2(0)
|
||||||
{}
|
{
|
||||||
|
// Should be initialized later
|
||||||
|
myIsInitS1 = myIsInitS2 = Standard_False;
|
||||||
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : BRepExtrema_ProximityValueTool
|
//function : BRepExtrema_ProximityValueTool
|
||||||
@@ -34,13 +49,15 @@ BRepExtrema_ProximityValueTool::BRepExtrema_ProximityValueTool (const Handle(BRe
|
|||||||
const Handle(BRepExtrema_TriangleSet)& theSet2,
|
const Handle(BRepExtrema_TriangleSet)& theSet2,
|
||||||
const BRepExtrema_ShapeList& theShapeList1,
|
const BRepExtrema_ShapeList& theShapeList1,
|
||||||
const BRepExtrema_ShapeList& theShapeList2)
|
const BRepExtrema_ShapeList& theShapeList2)
|
||||||
: myDistance (std::numeric_limits<Standard_Real>::max()),
|
: myIsRefinementRequired1 (Standard_False),
|
||||||
|
myIsRefinementRequired2 (Standard_False),
|
||||||
|
myDistance (std::numeric_limits<Standard_Real>::max()),
|
||||||
myIsDone (Standard_False),
|
myIsDone (Standard_False),
|
||||||
myNbSamples1(0),
|
myNbSamples1 (0),
|
||||||
myNbSamples2(0)
|
myNbSamples2 (0)
|
||||||
{
|
{
|
||||||
LoadTriangleSets (theSet1, theSet2);
|
|
||||||
LoadShapeLists (theShapeList1, theShapeList2);
|
LoadShapeLists (theShapeList1, theShapeList2);
|
||||||
|
LoadTriangleSets (theSet1, theSet2);
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
@@ -53,7 +70,94 @@ void BRepExtrema_ProximityValueTool::LoadTriangleSets (const Handle(BRepExtrema_
|
|||||||
mySet1 = theSet1;
|
mySet1 = theSet1;
|
||||||
mySet2 = theSet2;
|
mySet2 = theSet2;
|
||||||
|
|
||||||
myIsDone = Standard_False;
|
MarkDirty();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : calcEdgeRefinementStep
|
||||||
|
//purpose : Calculates the edge refinement step
|
||||||
|
//=======================================================================
|
||||||
|
static Standard_Real calcEdgeRefinementStep (const TopoDS_Edge& theEdge,
|
||||||
|
const Standard_Integer theNbNodes)
|
||||||
|
{
|
||||||
|
if (theNbNodes < 2)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
BRepAdaptor_Curve aBAC (theEdge);
|
||||||
|
Standard_Real aLen = GCPnts_AbscissaPoint::Length (aBAC);
|
||||||
|
return aLen / (Standard_Real)(theNbNodes - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : calcFaceRefinementStep
|
||||||
|
//purpose : Calculates the face refinement step as an approximate square
|
||||||
|
// (Shape area / number triangles) * 2
|
||||||
|
//=======================================================================
|
||||||
|
static Standard_Real calcFaceRefinementStep (const TopoDS_Face& theFace,
|
||||||
|
const Standard_Integer theNbTrg)
|
||||||
|
{
|
||||||
|
if (theNbTrg < 1)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
GProp_GProps props;
|
||||||
|
BRepGProp::SurfaceProperties (theFace, props);
|
||||||
|
Standard_Real aArea = props.Mass();
|
||||||
|
return 2 * (aArea / (Standard_Real)theNbTrg);
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : getInfoForRefinement
|
||||||
|
//purpose : Gets shape data for further refinement
|
||||||
|
//=======================================================================
|
||||||
|
Standard_Boolean BRepExtrema_ProximityValueTool::getInfoForRefinement (const TopoDS_Shape& theShape,
|
||||||
|
TopAbs_ShapeEnum& theShapeType,
|
||||||
|
Standard_Integer& theNbNodes,
|
||||||
|
Standard_Real& theStep)
|
||||||
|
{
|
||||||
|
if (theShape.ShapeType() == TopAbs_FACE)
|
||||||
|
{
|
||||||
|
theShapeType = TopAbs_FACE;
|
||||||
|
TopoDS_Face aF = TopoDS::Face (theShape);
|
||||||
|
|
||||||
|
TopLoc_Location aLocation;
|
||||||
|
Handle(Poly_Triangulation) aTriangulation = BRep_Tool::Triangulation (aF, aLocation);
|
||||||
|
|
||||||
|
if (aTriangulation.IsNull())
|
||||||
|
{
|
||||||
|
return Standard_False;
|
||||||
|
}
|
||||||
|
|
||||||
|
theNbNodes = aTriangulation->NbNodes();
|
||||||
|
Standard_Integer aNbTrg = aTriangulation->NbTriangles();
|
||||||
|
theStep = calcFaceRefinementStep (aF, aNbTrg);
|
||||||
|
}
|
||||||
|
else if (theShape.ShapeType() == TopAbs_EDGE)
|
||||||
|
{
|
||||||
|
theShapeType = TopAbs_EDGE;
|
||||||
|
TopoDS_Edge aE = TopoDS::Edge (theShape);
|
||||||
|
|
||||||
|
TopLoc_Location aLocation;
|
||||||
|
Handle(Poly_Polygon3D) aPolygon = BRep_Tool::Polygon3D (aE, aLocation);
|
||||||
|
|
||||||
|
if (aPolygon.IsNull())
|
||||||
|
{
|
||||||
|
return Standard_False;
|
||||||
|
}
|
||||||
|
|
||||||
|
theNbNodes = aPolygon->NbNodes();
|
||||||
|
theStep = calcEdgeRefinementStep (aE, theNbNodes);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return Standard_False;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (theStep < Precision::Confusion())
|
||||||
|
{
|
||||||
|
return Standard_False;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Standard_True;
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
@@ -66,7 +170,13 @@ void BRepExtrema_ProximityValueTool::LoadShapeLists (const BRepExtrema_ShapeList
|
|||||||
myShapeList1 = theShapeList1;
|
myShapeList1 = theShapeList1;
|
||||||
myShapeList2 = theShapeList2;
|
myShapeList2 = theShapeList2;
|
||||||
|
|
||||||
myIsDone = Standard_False;
|
myShape1 = theShapeList1 (0);
|
||||||
|
myIsInitS1 = getInfoForRefinement (myShape1, myShapeType1, myNbNodes1, myStep1);
|
||||||
|
|
||||||
|
myShape2 = theShapeList2 (0);
|
||||||
|
myIsInitS2 = getInfoForRefinement (myShape2, myShapeType2, myNbNodes2, myStep2);
|
||||||
|
|
||||||
|
MarkDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
@@ -79,7 +189,7 @@ void BRepExtrema_ProximityValueTool::SetNbSamplePoints(const Standard_Integer th
|
|||||||
myNbSamples1 = theSamples1;
|
myNbSamples1 = theSamples1;
|
||||||
myNbSamples2 = theSamples2;
|
myNbSamples2 = theSamples2;
|
||||||
|
|
||||||
myIsDone = Standard_False;
|
MarkDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
@@ -88,6 +198,8 @@ void BRepExtrema_ProximityValueTool::SetNbSamplePoints(const Standard_Integer th
|
|||||||
//=======================================================================
|
//=======================================================================
|
||||||
Standard_Real BRepExtrema_ProximityValueTool::computeProximityDist (const Handle(BRepExtrema_TriangleSet)& theSet1,
|
Standard_Real BRepExtrema_ProximityValueTool::computeProximityDist (const Handle(BRepExtrema_TriangleSet)& theSet1,
|
||||||
const Standard_Integer theNbSamples1,
|
const Standard_Integer theNbSamples1,
|
||||||
|
const BVH_Array3d& theAddVertices1,
|
||||||
|
const NCollection_Vector<ProxPnt_Status>& theAddStatus1,
|
||||||
const Handle(BRepExtrema_TriangleSet)& theSet2,
|
const Handle(BRepExtrema_TriangleSet)& theSet2,
|
||||||
const BRepExtrema_ShapeList& theShapeList1,
|
const BRepExtrema_ShapeList& theShapeList1,
|
||||||
const BRepExtrema_ShapeList& theShapeList2,
|
const BRepExtrema_ShapeList& theShapeList2,
|
||||||
@@ -96,7 +208,8 @@ Standard_Real BRepExtrema_ProximityValueTool::computeProximityDist (const Handle
|
|||||||
ProxPnt_Status& thePointStatus1,
|
ProxPnt_Status& thePointStatus1,
|
||||||
ProxPnt_Status& thePointStatus2) const
|
ProxPnt_Status& thePointStatus2) const
|
||||||
{
|
{
|
||||||
BRepExtrema_ProximityDistTool aProxDistTool (theSet1, theNbSamples1, theSet2, theShapeList1, theShapeList2);
|
BRepExtrema_ProximityDistTool aProxDistTool (theSet1, theNbSamples1, theAddVertices1, theAddStatus1,
|
||||||
|
theSet2, theShapeList1, theShapeList2);
|
||||||
aProxDistTool.Perform();
|
aProxDistTool.Perform();
|
||||||
|
|
||||||
if (!aProxDistTool.IsDone())
|
if (!aProxDistTool.IsDone())
|
||||||
@@ -108,21 +221,311 @@ Standard_Real BRepExtrema_ProximityValueTool::computeProximityDist (const Handle
|
|||||||
return aProxDistTool.ProximityDistance();
|
return aProxDistTool.ProximityDistance();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : getEdgeAdditionalVertices
|
||||||
|
//purpose : Gets additional vertices and their statuses on the edge with the input step
|
||||||
|
//=======================================================================
|
||||||
|
Standard_Boolean BRepExtrema_ProximityValueTool::getEdgeAdditionalVertices (
|
||||||
|
const TopoDS_Edge& theEdge,
|
||||||
|
const Standard_Real theStep,
|
||||||
|
BVH_Array3d& theAddVertices,
|
||||||
|
NCollection_Vector<ProxPnt_Status>& theAddStatuses)
|
||||||
|
{
|
||||||
|
BRepAdaptor_Curve aBAC (theEdge);
|
||||||
|
|
||||||
|
if (!aBAC.Is3DCurve() || theStep < Precision::Confusion())
|
||||||
|
{
|
||||||
|
return Standard_False;
|
||||||
|
}
|
||||||
|
|
||||||
|
Standard_Real aLen = GCPnts_AbscissaPoint::Length (aBAC);
|
||||||
|
Standard_Integer aNbSamplePoints = (Standard_Integer) (aLen / theStep) + 1;
|
||||||
|
|
||||||
|
GCPnts_QuasiUniformAbscissa aGCPnts (aBAC, Max (3, aNbSamplePoints));
|
||||||
|
|
||||||
|
if (!aGCPnts.IsDone())
|
||||||
|
return Standard_False;
|
||||||
|
|
||||||
|
Standard_Integer aNbNodes = aGCPnts.NbPoints();
|
||||||
|
for (Standard_Integer aVertIdx = 2; aVertIdx < aNbNodes; ++aVertIdx) //don't add extreme points
|
||||||
|
{
|
||||||
|
Standard_Real aPar = aGCPnts.Parameter (aVertIdx);
|
||||||
|
gp_Pnt aP = aBAC.Value (aPar);
|
||||||
|
|
||||||
|
theAddVertices.push_back (BVH_Vec3d (aP.X(), aP.Y(), aP.Z()));
|
||||||
|
theAddStatuses.Append (ProxPnt_Status::ProxPnt_Status_MIDDLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Standard_True;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : doRecurTrgSplit
|
||||||
|
//purpose : Splits the triangle into two ones recursively, halving the longest side
|
||||||
|
// untill the area of the current triangle > input step
|
||||||
|
//! @param theTrg points of the triangle to be splitted
|
||||||
|
//! @param theEdgesStatus status of triangle edges - on the border or middle of the face
|
||||||
|
//! @param theTol telerance used in search of coincidence points
|
||||||
|
//! @param theStep minimum area of the resulting triangle
|
||||||
|
//! @param theAddVertices vertices obtained halving sides
|
||||||
|
//! @param theAddStatuses status of obtained vertices - on the border or middle of the face,
|
||||||
|
//! from triangulation of which the input triangle is
|
||||||
|
//=======================================================================
|
||||||
|
void BRepExtrema_ProximityValueTool::doRecurTrgSplit (const gp_Pnt (&theTrg)[3],
|
||||||
|
const ProxPnt_Status (&theEdgesStatus)[3],
|
||||||
|
const Standard_Real theTol,
|
||||||
|
const Standard_Real theStep,
|
||||||
|
BVH_Array3d& theAddVertices,
|
||||||
|
NCollection_Vector<ProxPnt_Status>& theAddStatuses)
|
||||||
|
{
|
||||||
|
gp_XYZ aTrgSide1 = theTrg[1].Coord() - theTrg[0].Coord();
|
||||||
|
gp_XYZ aTrgSide2 = theTrg[2].Coord() - theTrg[0].Coord();
|
||||||
|
Standard_Real aTrgArea = 0.5 * aTrgSide1.CrossMagnitude (aTrgSide2);
|
||||||
|
|
||||||
|
if (aTrgArea - theStep < Precision::SquareConfusion())
|
||||||
|
return;
|
||||||
|
|
||||||
|
Standard_Real aD[3] { theTrg[0].Distance (theTrg[1]),
|
||||||
|
theTrg[1].Distance (theTrg[2]),
|
||||||
|
theTrg[2].Distance (theTrg[0]) };
|
||||||
|
Standard_Integer aBisectedEdgeIdx = aD[0] > aD[1] ? (aD[0] > aD[2] ? 0 : 2) : (aD[1] > aD[2] ? 1 : 2);
|
||||||
|
gp_Pnt aCenterOfMaxSide (theTrg[aBisectedEdgeIdx].Coord());
|
||||||
|
aCenterOfMaxSide.BaryCenter (0.5, theTrg[(aBisectedEdgeIdx + 1) % 3], 0.5);
|
||||||
|
|
||||||
|
Bnd_Box aBox;
|
||||||
|
aBox.Add (aCenterOfMaxSide);
|
||||||
|
aBox.Enlarge (theTol);
|
||||||
|
myInspector.SetCurrent (aCenterOfMaxSide.Coord());
|
||||||
|
myCells.Inspect (aBox.CornerMin().XYZ(), aBox.CornerMax().XYZ(), myInspector);
|
||||||
|
|
||||||
|
if (myInspector.IsNeedAdd()) //is point aCenterOfMaxSide unique
|
||||||
|
{
|
||||||
|
BVH_Vec3d aBisectingPnt (aCenterOfMaxSide.X(), aCenterOfMaxSide.Y(), aCenterOfMaxSide.Z());
|
||||||
|
theAddVertices.push_back (aBisectingPnt);
|
||||||
|
theAddStatuses.Append (theEdgesStatus[aBisectedEdgeIdx]);
|
||||||
|
myInspector.Add (aCenterOfMaxSide.Coord());
|
||||||
|
myCells.Add (static_cast<BRepExtrema_VertexInspector::Target>(theAddVertices.size()),
|
||||||
|
aBox.CornerMin().XYZ(), aBox.CornerMax().XYZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
gp_Pnt aTrg1[3] = { theTrg[0], theTrg[1], theTrg[2] };
|
||||||
|
gp_Pnt aTrg2[3] = { theTrg[0], theTrg[1], theTrg[2] };
|
||||||
|
ProxPnt_Status aEdgesStatus1[3] = { theEdgesStatus[0], theEdgesStatus[1], theEdgesStatus[2] };
|
||||||
|
ProxPnt_Status aEdgesStatus2[3] = { theEdgesStatus[0], theEdgesStatus[1], theEdgesStatus[2] };
|
||||||
|
switch (aBisectedEdgeIdx)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
aTrg1[0] = aTrg2[1] = aCenterOfMaxSide;
|
||||||
|
aEdgesStatus1[2] = aEdgesStatus2[1] = ProxPnt_Status::ProxPnt_Status_MIDDLE;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
aTrg1[1] = aTrg2[2] = aCenterOfMaxSide;
|
||||||
|
aEdgesStatus1[0] = aEdgesStatus2[2] = ProxPnt_Status::ProxPnt_Status_MIDDLE;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
aTrg1[2] = aTrg2[0] = aCenterOfMaxSide;
|
||||||
|
aEdgesStatus1[1] = aEdgesStatus2[0] = ProxPnt_Status::ProxPnt_Status_MIDDLE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
doRecurTrgSplit (aTrg1, aEdgesStatus1, theTol, theStep, theAddVertices, theAddStatuses);
|
||||||
|
doRecurTrgSplit (aTrg2, aEdgesStatus2, theTol, theStep, theAddVertices, theAddStatuses);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Standard_Real getModelRange (const TopLoc_Location& theLocation,
|
||||||
|
const Handle(Poly_Triangulation)& theTr)
|
||||||
|
{
|
||||||
|
Bnd_Box aBox;
|
||||||
|
theTr->MinMax (aBox, theLocation.Transformation());
|
||||||
|
Standard_Real aXm = 0.0, aYm = 0.0, aZm = 0.0, aXM = 0.0, aYM = 0.0, aZM = 0.0;
|
||||||
|
aBox.Get (aXm, aYm, aZm, aXM, aYM, aZM);
|
||||||
|
Standard_Real aRange = aXM - aXm;
|
||||||
|
aRange = Max (aRange, aYM - aYm);
|
||||||
|
aRange = Max (aRange, aZM - aZm);
|
||||||
|
|
||||||
|
return aRange;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void getNodesOfTrg (const Standard_Integer theTriIdx,
|
||||||
|
const TopLoc_Location& theLocation,
|
||||||
|
const Handle (Poly_Triangulation)& theTr,
|
||||||
|
gp_Pnt (&theTrg)[3])
|
||||||
|
{
|
||||||
|
Standard_Integer aVtxIdx1;
|
||||||
|
Standard_Integer aVtxIdx2;
|
||||||
|
Standard_Integer aVtxIdx3;
|
||||||
|
|
||||||
|
theTr->Triangle (theTriIdx).Get (aVtxIdx1, aVtxIdx2, aVtxIdx3);
|
||||||
|
|
||||||
|
gp_Pnt aVtx1 = theTr->Node (aVtxIdx1);
|
||||||
|
aVtx1.Transform (theLocation);
|
||||||
|
theTrg[0] = aVtx1;
|
||||||
|
|
||||||
|
gp_Pnt aVtx2 = theTr->Node (aVtxIdx2);
|
||||||
|
aVtx2.Transform (theLocation);
|
||||||
|
theTrg[1] = aVtx2;
|
||||||
|
|
||||||
|
gp_Pnt aVtx3 = theTr->Node (aVtxIdx3);
|
||||||
|
aVtx3.Transform (theLocation);
|
||||||
|
theTrg[2] = aVtx3;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gets status of triangle edges - on the border or middle of the face
|
||||||
|
static void getEdgesStatus(const Standard_Integer theTriIdx,
|
||||||
|
const Handle(Poly_Triangulation)& theTr,
|
||||||
|
ProxPnt_Status (&theEdgesStatus1)[3])
|
||||||
|
{
|
||||||
|
for (Standard_Integer j = 0; j < 3; j++)
|
||||||
|
{
|
||||||
|
Standard_Integer k = (j + 1) % 3;
|
||||||
|
|
||||||
|
if (BRepExtrema_ProximityDistTool::IsEdgeOnBorder (theTriIdx, j, k, theTr))
|
||||||
|
{
|
||||||
|
theEdgesStatus1[j] = ProxPnt_Status::ProxPnt_Status_BORDER;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
theEdgesStatus1[j] = ProxPnt_Status::ProxPnt_Status_MIDDLE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : getFaceAdditionalVertices
|
||||||
|
//purpose : Gets additional vertices and their statuses on the face with the input step (triangle square)
|
||||||
|
//=======================================================================
|
||||||
|
Standard_Boolean BRepExtrema_ProximityValueTool::getFaceAdditionalVertices (
|
||||||
|
const TopoDS_Face& theFace,
|
||||||
|
const Standard_Real theStep,
|
||||||
|
BVH_Array3d& theAddVertices,
|
||||||
|
NCollection_Vector<ProxPnt_Status>& theAddStatuses)
|
||||||
|
{
|
||||||
|
Standard_Real aTol = Precision::Confusion();
|
||||||
|
|
||||||
|
TopLoc_Location aLocation;
|
||||||
|
Handle(Poly_Triangulation) aTr = BRep_Tool::Triangulation (theFace, aLocation);
|
||||||
|
|
||||||
|
if (aTr.IsNull())
|
||||||
|
{
|
||||||
|
return Standard_False;
|
||||||
|
}
|
||||||
|
|
||||||
|
myCells.Reset (Max (aTol, getModelRange (aLocation, aTr) / IntegerLast()));
|
||||||
|
|
||||||
|
for (Standard_Integer aTriIdx = 1; aTriIdx <= aTr->NbTriangles(); ++aTriIdx)
|
||||||
|
{
|
||||||
|
gp_Pnt aTrg[3];
|
||||||
|
ProxPnt_Status aEdgesStatus[3];
|
||||||
|
getNodesOfTrg (aTriIdx, aLocation, aTr, aTrg);
|
||||||
|
getEdgesStatus (aTriIdx, aTr, aEdgesStatus);
|
||||||
|
doRecurTrgSplit (aTrg, aEdgesStatus, aTol, theStep, theAddVertices, theAddStatuses);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Standard_True;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : getShapesVertices
|
||||||
|
//purpose : Gets additional vertices on shapes with refining a coarser one if it's needed
|
||||||
|
//=======================================================================
|
||||||
|
Standard_Boolean BRepExtrema_ProximityValueTool::getShapesAdditionalVertices()
|
||||||
|
{
|
||||||
|
// estimate the density of meshes of shapes to add points to a coarcer one
|
||||||
|
// target steps for refinement
|
||||||
|
Standard_Real aStep1 = myStep1;
|
||||||
|
Standard_Real aStep2 = myStep2;
|
||||||
|
|
||||||
|
if ((myShapeType1 == TopAbs_EDGE) && (myShapeType2 == TopAbs_EDGE))
|
||||||
|
{
|
||||||
|
if (myNbSamples1 > myNbNodes1) // 1st edge needs refinement
|
||||||
|
{
|
||||||
|
aStep1 = calcEdgeRefinementStep (TopoDS::Edge (myShape1), myNbSamples1);
|
||||||
|
myIsRefinementRequired1 = Standard_True;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (myNbSamples2 > myNbNodes2) // 2nd edge needs refinement
|
||||||
|
{
|
||||||
|
aStep2 = calcEdgeRefinementStep (TopoDS::Edge (myShape2), myNbSamples2);
|
||||||
|
myIsRefinementRequired2 = Standard_True;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aStep1 / aStep2 > 2.) // 1st edge needs refinement
|
||||||
|
{
|
||||||
|
myIsRefinementRequired1 = Standard_True;
|
||||||
|
aStep1 = aStep2;
|
||||||
|
}
|
||||||
|
else if (aStep2 / aStep1 > 2.) // 2nd edge needs refinement
|
||||||
|
{
|
||||||
|
myIsRefinementRequired2 = Standard_True;
|
||||||
|
aStep2 = aStep1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (myIsRefinementRequired1)
|
||||||
|
{
|
||||||
|
if (!getEdgeAdditionalVertices (TopoDS::Edge (myShape1), aStep1, myAddVertices1, myAddStatus1))
|
||||||
|
{
|
||||||
|
return Standard_False;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (myIsRefinementRequired2)
|
||||||
|
{
|
||||||
|
if (!getEdgeAdditionalVertices (TopoDS::Edge (myShape2), aStep2, myAddVertices2, myAddStatus2))
|
||||||
|
{
|
||||||
|
return Standard_False;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((myShapeType1 == TopAbs_FACE) && (myShapeType2 == TopAbs_FACE))
|
||||||
|
{
|
||||||
|
if (aStep1 / aStep2 > 2) // 1st face needs refinement
|
||||||
|
{
|
||||||
|
myIsRefinementRequired1 = Standard_True;
|
||||||
|
aStep1 = myStep2;
|
||||||
|
}
|
||||||
|
else if (aStep2 / aStep1 > 2.) // 2nd face needs refinement
|
||||||
|
{
|
||||||
|
myIsRefinementRequired2 = Standard_True;
|
||||||
|
aStep2 = myStep1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (myIsRefinementRequired1)
|
||||||
|
{
|
||||||
|
return getFaceAdditionalVertices (TopoDS::Face (myShape1), aStep1, myAddVertices1, myAddStatus1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (myIsRefinementRequired2)
|
||||||
|
{
|
||||||
|
return getFaceAdditionalVertices (TopoDS::Face (myShape2), aStep2, myAddVertices2, myAddStatus2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Standard_True;
|
||||||
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : Perform
|
//function : Perform
|
||||||
//purpose : Performs the computation of the proximity value
|
//purpose : Performs the computation of the proximity value
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
void BRepExtrema_ProximityValueTool::Perform (Standard_Real& theTolerance)
|
void BRepExtrema_ProximityValueTool::Perform (Standard_Real& theTolerance)
|
||||||
{
|
{
|
||||||
myIsDone = Standard_False;
|
if (!myIsInitS1 || !myIsInitS2 || (myShapeType1 != myShapeType2))
|
||||||
|
return;
|
||||||
|
|
||||||
|
//get vertices on shapes with refining a coarser mesh if it's needed
|
||||||
|
if (!getShapesAdditionalVertices())
|
||||||
|
return;
|
||||||
|
|
||||||
// max(min) dist from the 1st shape to the 2nd one
|
// max(min) dist from the 1st shape to the 2nd one
|
||||||
BVH_Vec3d aP1_1, aP1_2;
|
BVH_Vec3d aP1_1, aP1_2;
|
||||||
ProxPnt_Status aPointStatus1_1 = ProxPnt_Status::ProxPnt_Status_UNKNOWN;
|
ProxPnt_Status aPointStatus1_1 = ProxPnt_Status::ProxPnt_Status_UNKNOWN;
|
||||||
ProxPnt_Status aPointStatus1_2 = ProxPnt_Status::ProxPnt_Status_UNKNOWN;
|
ProxPnt_Status aPointStatus1_2 = ProxPnt_Status::ProxPnt_Status_UNKNOWN;
|
||||||
|
|
||||||
Standard_Real aProximityDist1 = computeProximityDist (mySet1, myNbSamples1, mySet2, myShapeList1, myShapeList2,
|
Standard_Real aProximityDist1 = computeProximityDist (mySet1, myNbSamples1, myAddVertices1, myAddStatus1,
|
||||||
aP1_1, aP1_2, aPointStatus1_1, aPointStatus1_2);
|
mySet2,
|
||||||
|
myShapeList1, myShapeList2,
|
||||||
|
aP1_1, aP1_2,
|
||||||
|
aPointStatus1_1, aPointStatus1_2);
|
||||||
|
|
||||||
if (aProximityDist1 < 0.)
|
if (aProximityDist1 < 0.)
|
||||||
return;
|
return;
|
||||||
@@ -132,8 +535,11 @@ void BRepExtrema_ProximityValueTool::Perform (Standard_Real& theTolerance)
|
|||||||
ProxPnt_Status aPointStatus2_1 = ProxPnt_Status::ProxPnt_Status_UNKNOWN;
|
ProxPnt_Status aPointStatus2_1 = ProxPnt_Status::ProxPnt_Status_UNKNOWN;
|
||||||
ProxPnt_Status aPointStatus2_2 = ProxPnt_Status::ProxPnt_Status_UNKNOWN;
|
ProxPnt_Status aPointStatus2_2 = ProxPnt_Status::ProxPnt_Status_UNKNOWN;
|
||||||
|
|
||||||
Standard_Real aProximityDist2 = computeProximityDist (mySet2, myNbSamples2, mySet1, myShapeList2, myShapeList1,
|
Standard_Real aProximityDist2 = computeProximityDist (mySet2, myNbSamples2, myAddVertices2, myAddStatus2,
|
||||||
aP2_2, aP2_1, aPointStatus2_2, aPointStatus2_1);
|
mySet1,
|
||||||
|
myShapeList2, myShapeList1,
|
||||||
|
aP2_2, aP2_1,
|
||||||
|
aPointStatus2_2, aPointStatus2_1);
|
||||||
|
|
||||||
if (aProximityDist2 < 0.)
|
if (aProximityDist2 < 0.)
|
||||||
return;
|
return;
|
||||||
@@ -159,3 +565,23 @@ void BRepExtrema_ProximityValueTool::Perform (Standard_Real& theTolerance)
|
|||||||
myIsDone = Standard_True;
|
myIsDone = Standard_True;
|
||||||
theTolerance = myDistance;
|
theTolerance = myDistance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : Inspect
|
||||||
|
//purpose : Used for selection and storage of coinciding nodes
|
||||||
|
//=======================================================================
|
||||||
|
NCollection_CellFilter_Action BRepExtrema_VertexInspector::Inspect (const Standard_Integer theTarget)
|
||||||
|
{
|
||||||
|
myIsNeedAdd = Standard_True;
|
||||||
|
|
||||||
|
const gp_XYZ& aPnt = myPoints.Value (theTarget - 1);
|
||||||
|
Standard_Real aDx, aDy, aDz;
|
||||||
|
aDx = myCurrent.X() - aPnt.X();
|
||||||
|
aDy = myCurrent.Y() - aPnt.Y();
|
||||||
|
aDz = myCurrent.Z() - aPnt.Z();
|
||||||
|
|
||||||
|
if ((aDx * aDx <= myTol) && (aDy * aDy <= myTol) && (aDz * aDz <= myTol))
|
||||||
|
myIsNeedAdd = Standard_False;
|
||||||
|
|
||||||
|
return CellFilter_Keep;
|
||||||
|
}
|
@@ -1,4 +1,4 @@
|
|||||||
// Created on: 2022-08-08
|
// Created on: 2022-08-08
|
||||||
// Created by: Kseniya NOSULKO
|
// Created by: Kseniya NOSULKO
|
||||||
// Copyright (c) 2022 OPEN CASCADE SAS
|
// Copyright (c) 2022 OPEN CASCADE SAS
|
||||||
//
|
//
|
||||||
@@ -18,9 +18,67 @@
|
|||||||
|
|
||||||
#include <BRepExtrema_ProximityDistTool.hxx>
|
#include <BRepExtrema_ProximityDistTool.hxx>
|
||||||
#include <BRepExtrema_TriangleSet.hxx>
|
#include <BRepExtrema_TriangleSet.hxx>
|
||||||
|
#include <NCollection_CellFilter.hxx>
|
||||||
|
#include <Precision.hxx>
|
||||||
|
|
||||||
|
typedef NCollection_Vector<gp_XYZ> VectorOfPoint;
|
||||||
|
|
||||||
|
//! Class BRepExtrema_VertexInspector
|
||||||
|
//! derived from NCollection_CellFilter_InspectorXYZ
|
||||||
|
//! This class define the Inspector interface for CellFilter algorithm,
|
||||||
|
//! working with gp_XYZ points in 3d space.
|
||||||
|
//! Used in search of coincidence points with a certain tolerance.
|
||||||
|
class BRepExtrema_VertexInspector : public NCollection_CellFilter_InspectorXYZ
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef Standard_Integer Target;
|
||||||
|
|
||||||
|
//! Constructor; remembers the tolerance
|
||||||
|
BRepExtrema_VertexInspector()
|
||||||
|
: myTol (Precision::SquareConfusion()),
|
||||||
|
myIsNeedAdd (Standard_True)
|
||||||
|
{}
|
||||||
|
|
||||||
|
//! Keep the points used for comparison
|
||||||
|
void Add (const gp_XYZ& thePnt)
|
||||||
|
{
|
||||||
|
myPoints.Append (thePnt);
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Set tolerance for comparison of point coordinates
|
||||||
|
void SetTol (const Standard_Real theTol)
|
||||||
|
{
|
||||||
|
myTol = theTol;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Set current point to search for coincidence
|
||||||
|
void SetCurrent (const gp_XYZ& theCurPnt)
|
||||||
|
{
|
||||||
|
myCurrent = theCurPnt;
|
||||||
|
myIsNeedAdd = Standard_True;
|
||||||
|
}
|
||||||
|
|
||||||
|
Standard_Boolean IsNeedAdd()
|
||||||
|
{
|
||||||
|
return myIsNeedAdd;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Implementation of inspection method
|
||||||
|
Standard_EXPORT NCollection_CellFilter_Action Inspect (const Standard_Integer theTarget);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Standard_Real myTol;
|
||||||
|
Standard_Boolean myIsNeedAdd;
|
||||||
|
VectorOfPoint myPoints;
|
||||||
|
gp_XYZ myCurrent;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef NCollection_CellFilter<BRepExtrema_VertexInspector> BRepExtrema_CellFilter;
|
||||||
|
typedef typename BRepExtrema_ProximityDistTool::ProxPnt_Status ProxPnt_Status;
|
||||||
|
|
||||||
//! Tool class for computation of the proximity value from one BVH
|
//! Tool class for computation of the proximity value from one BVH
|
||||||
//! primitive set to another, solving max(min) problem.
|
//! primitive set to another, solving max(min) problem.
|
||||||
|
//! Handles only edge/edge or face/face cases.
|
||||||
//! This tool is not intended to be used independently, and is integrated
|
//! This tool is not intended to be used independently, and is integrated
|
||||||
//! in other classes, implementing algorithms based on shape tessellation
|
//! in other classes, implementing algorithms based on shape tessellation
|
||||||
//! (BRepExtrema_ShapeProximity and BRepExtrema_SelfIntersection).
|
//! (BRepExtrema_ShapeProximity and BRepExtrema_SelfIntersection).
|
||||||
@@ -29,8 +87,6 @@
|
|||||||
//! on the quality of input tessellation(s).
|
//! on the quality of input tessellation(s).
|
||||||
class BRepExtrema_ProximityValueTool
|
class BRepExtrema_ProximityValueTool
|
||||||
{
|
{
|
||||||
public:
|
|
||||||
typedef typename BRepExtrema_ProximityDistTool::ProxPnt_Status ProxPnt_Status;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@@ -86,9 +142,17 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
//! Gets shape data for further refinement.
|
||||||
|
Standard_Boolean getInfoForRefinement (const TopoDS_Shape& theShapes,
|
||||||
|
TopAbs_ShapeEnum& theShapeType,
|
||||||
|
Standard_Integer& theNbNodes,
|
||||||
|
Standard_Real& theStep);
|
||||||
|
|
||||||
//! Returns the computed proximity value from first BVH to another one.
|
//! Returns the computed proximity value from first BVH to another one.
|
||||||
Standard_Real computeProximityDist (const Handle(BRepExtrema_TriangleSet)& theSet1,
|
Standard_Real computeProximityDist (const Handle(BRepExtrema_TriangleSet)& theSet1,
|
||||||
const Standard_Integer theNbSamples1,
|
const Standard_Integer theNbSamples1,
|
||||||
|
const BVH_Array3d& theAddVertices1,
|
||||||
|
const NCollection_Vector<ProxPnt_Status>& theAddStatus1,
|
||||||
const Handle(BRepExtrema_TriangleSet)& theSet2,
|
const Handle(BRepExtrema_TriangleSet)& theSet2,
|
||||||
const BRepExtrema_ShapeList& theShapeList1,
|
const BRepExtrema_ShapeList& theShapeList1,
|
||||||
const BRepExtrema_ShapeList& theShapeList2,
|
const BRepExtrema_ShapeList& theShapeList2,
|
||||||
@@ -97,6 +161,29 @@ private:
|
|||||||
ProxPnt_Status& thePointStatus1,
|
ProxPnt_Status& thePointStatus1,
|
||||||
ProxPnt_Status& thePointStatus2) const;
|
ProxPnt_Status& thePointStatus2) const;
|
||||||
|
|
||||||
|
//! Gets additional vertices on shapes with refining a coarser one if it's needed.
|
||||||
|
Standard_Boolean getShapesAdditionalVertices();
|
||||||
|
|
||||||
|
//! Gets additional vertices and their statuses on the edge with the input step.
|
||||||
|
Standard_Boolean getEdgeAdditionalVertices (const TopoDS_Edge& theEdge,
|
||||||
|
const Standard_Real theStep,
|
||||||
|
BVH_Array3d& theAddVertices,
|
||||||
|
NCollection_Vector<ProxPnt_Status>& theAddStatuses);
|
||||||
|
|
||||||
|
//! Gets additional vertices and their statuses on the face with the input step (triangle square).
|
||||||
|
Standard_Boolean getFaceAdditionalVertices (const TopoDS_Face& theFace,
|
||||||
|
const Standard_Real theStep,
|
||||||
|
BVH_Array3d& theAddVertices,
|
||||||
|
NCollection_Vector<ProxPnt_Status>& theAddStatuses);
|
||||||
|
|
||||||
|
//! Splits the triangle recursively, halving the longest side
|
||||||
|
//! to the area of the current triangle > input step
|
||||||
|
void doRecurTrgSplit (const gp_Pnt (&theTrg)[3],
|
||||||
|
const ProxPnt_Status (&theEdgesStatus)[3],
|
||||||
|
const Standard_Real theTol,
|
||||||
|
const Standard_Real theStep,
|
||||||
|
BVH_Array3d& theAddVertices,
|
||||||
|
NCollection_Vector<ProxPnt_Status>& theAddStatuses);
|
||||||
private:
|
private:
|
||||||
|
|
||||||
//! Set of all mesh primitives of the 1st shape.
|
//! Set of all mesh primitives of the 1st shape.
|
||||||
@@ -109,6 +196,35 @@ private:
|
|||||||
//! List of subshapes of the 2nd shape.
|
//! List of subshapes of the 2nd shape.
|
||||||
BRepExtrema_ShapeList myShapeList2;
|
BRepExtrema_ShapeList myShapeList2;
|
||||||
|
|
||||||
|
//! The 1st shape.
|
||||||
|
TopoDS_Shape myShape1;
|
||||||
|
//! The 2nd shape.
|
||||||
|
TopoDS_Shape myShape2;
|
||||||
|
|
||||||
|
BVH_Array3d myAddVertices1; //!< Additional vertices on the 1st shape if its mesh is coarser.
|
||||||
|
BVH_Array3d myAddVertices2; //!< Additional vertices on the 2nd shape if its mesh is coarser.
|
||||||
|
|
||||||
|
NCollection_Vector<ProxPnt_Status> myAddStatus1; //!< Status of additional vertices on the 1st shape.
|
||||||
|
NCollection_Vector<ProxPnt_Status> myAddStatus2; //!< Status of additional vertices on the 2nd shape.
|
||||||
|
|
||||||
|
Standard_Boolean myIsInitS1; //!< Is the 1st shape initialized?
|
||||||
|
Standard_Boolean myIsInitS2; //!< Is the 2nd shape initialized?
|
||||||
|
|
||||||
|
Standard_Boolean myIsRefinementRequired1; //!< Flag about the need to refine the 1st shape.
|
||||||
|
Standard_Boolean myIsRefinementRequired2; //!< Flag about the need to refine the 2nd shape.
|
||||||
|
|
||||||
|
Standard_Integer myNbNodes1; //!< Number of nodes in triangulation of the 1st shape.
|
||||||
|
Standard_Integer myNbNodes2; //!< Number of nodes in triangulation of the 2nd shape.
|
||||||
|
|
||||||
|
Standard_Real myStep1; //!< Step for getting vertices on the 1st shape.
|
||||||
|
Standard_Real myStep2; //!< Step for getting vertices on the 2nd shape.
|
||||||
|
|
||||||
|
BRepExtrema_CellFilter myCells;
|
||||||
|
BRepExtrema_VertexInspector myInspector;
|
||||||
|
|
||||||
|
TopAbs_ShapeEnum myShapeType1; //!< 1st shape type.
|
||||||
|
TopAbs_ShapeEnum myShapeType2; //!< 2nd shape type.
|
||||||
|
|
||||||
Standard_Real myDistance; //!< Distance
|
Standard_Real myDistance; //!< Distance
|
||||||
Standard_Boolean myIsDone; //!< State of the algorithm
|
Standard_Boolean myIsDone; //!< State of the algorithm
|
||||||
|
|
||||||
|
@@ -129,6 +129,7 @@ void BRepExtrema_ShapeProximity::Perform()
|
|||||||
myElementSet2);
|
myElementSet2);
|
||||||
myProxValTool.LoadShapeLists (myShapeList1,
|
myProxValTool.LoadShapeLists (myShapeList1,
|
||||||
myShapeList2);
|
myShapeList2);
|
||||||
|
myProxValTool.SetNbSamplePoints (myNbSamples1, myNbSamples2);
|
||||||
|
|
||||||
myProxValTool.Perform (myTolerance);
|
myProxValTool.Perform (myTolerance);
|
||||||
myProxValTool.ProximityPoints(myProxPoint1, myProxPoint2);
|
myProxValTool.ProximityPoints(myProxPoint1, myProxPoint2);
|
||||||
|
@@ -37,7 +37,8 @@
|
|||||||
//! on distance less than the given tolerance from each other.
|
//! on distance less than the given tolerance from each other.
|
||||||
//!
|
//!
|
||||||
//! Second approach:
|
//! Second approach:
|
||||||
//! Compute the proximity value between two shapes if the tolerance is not defined (Precision::Infinite()).
|
//! Compute the proximity value between two shapes (handles only edge/edge or face/face cases)
|
||||||
|
//! if the tolerance is not defined (Precision::Infinite()).
|
||||||
//! In this case the proximity value is a minimal thickness of a layer containing both shapes.
|
//! In this case the proximity value is a minimal thickness of a layer containing both shapes.
|
||||||
//!
|
//!
|
||||||
//! For the both approaches the high performance is achieved through the use of existing
|
//! For the both approaches the high performance is achieved through the use of existing
|
||||||
@@ -46,8 +47,6 @@
|
|||||||
//! triangulation).
|
//! triangulation).
|
||||||
class BRepExtrema_ShapeProximity
|
class BRepExtrema_ShapeProximity
|
||||||
{
|
{
|
||||||
public:
|
|
||||||
typedef typename BRepExtrema_ProximityValueTool::ProxPnt_Status ProxPnt_Status;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@@ -56,6 +56,7 @@
|
|||||||
#include <TopTools_MapOfShape.hxx>
|
#include <TopTools_MapOfShape.hxx>
|
||||||
#include <TopTools_SequenceOfShape.hxx>
|
#include <TopTools_SequenceOfShape.hxx>
|
||||||
#include <BRepExtrema_ExtCC.hxx>
|
#include <BRepExtrema_ExtCC.hxx>
|
||||||
|
#include <ShapeFix_Edge.hxx>
|
||||||
|
|
||||||
static TopoDS_Edge FindEdgeCloseToBisectorPlane(const TopoDS_Vertex& theVertex,
|
static TopoDS_Edge FindEdgeCloseToBisectorPlane(const TopoDS_Vertex& theVertex,
|
||||||
TopoDS_Compound& theComp,
|
TopoDS_Compound& theComp,
|
||||||
@@ -534,6 +535,26 @@ BRepFill_TrimShellCorner::MakeFacesNonSec(const Standard_Integer
|
|||||||
|
|
||||||
if(bHasNewEdge) {
|
if(bHasNewEdge) {
|
||||||
aNewEdge.Orientation(TopAbs_FORWARD);
|
aNewEdge.Orientation(TopAbs_FORWARD);
|
||||||
|
|
||||||
|
// Refer to BrepFill_Sweep.cxx BuildEdge Construct an edge via an iso
|
||||||
|
gp_Pnt P1, P2;
|
||||||
|
Standard_Real p11, p12, p21, p22;
|
||||||
|
P1 = BRep_Tool::Pnt(TopExp::FirstVertex(TopoDS::Edge(aNewEdge)));
|
||||||
|
P2 = BRep_Tool::Pnt(TopExp::LastVertex(TopoDS::Edge(aNewEdge)));
|
||||||
|
|
||||||
|
TopoDS_Edge aERef = TopoDS::Edge(fit == 1 ? aE1 : aE2);
|
||||||
|
p11 = P1.Distance(BRep_Tool::Pnt(TopExp::FirstVertex(aERef)));
|
||||||
|
p22 = P2.Distance(BRep_Tool::Pnt(TopExp::LastVertex(aERef)));
|
||||||
|
p12 = P1.Distance(BRep_Tool::Pnt(TopExp::LastVertex(aERef)));
|
||||||
|
p21 = P2.Distance(BRep_Tool::Pnt(TopExp::FirstVertex(aERef)));
|
||||||
|
|
||||||
|
if (p11 > p12 && p22 > p21) {
|
||||||
|
aNewEdge.Reverse();
|
||||||
|
}
|
||||||
|
|
||||||
|
// for nonPlane surface, we should add pCurve
|
||||||
|
Handle(ShapeFix_Edge) sfe = new ShapeFix_Edge();
|
||||||
|
sfe->FixAddPCurve(aNewEdge, TopoDS::Face(aFace), Standard_False);
|
||||||
}
|
}
|
||||||
|
|
||||||
TopTools_ListOfShape aOrderedList;
|
TopTools_ListOfShape aOrderedList;
|
||||||
|
@@ -802,7 +802,7 @@ static void GetEdgeTol(const TopoDS_Edge& theEdge,
|
|||||||
}
|
}
|
||||||
if(temp > d2) d2 = temp;
|
if(temp > d2) d2 = temp;
|
||||||
}
|
}
|
||||||
d2 = 1.5*sqrt(d2);
|
d2 = 1.05*sqrt(d2);
|
||||||
theEdTol = d2;
|
theEdTol = d2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -884,10 +884,6 @@ static void UpdShTol(const TopTools_DataMapOfShapeReal& theShToTol,
|
|||||||
case TopAbs_VERTEX:
|
case TopAbs_VERTEX:
|
||||||
{
|
{
|
||||||
const Handle(BRep_TVertex)& aTV = *((Handle(BRep_TVertex)*)&aNsh.TShape());
|
const Handle(BRep_TVertex)& aTV = *((Handle(BRep_TVertex)*)&aNsh.TShape());
|
||||||
//
|
|
||||||
if(aTV->Locked())
|
|
||||||
throw TopoDS_LockedShape("BRep_Builder::UpdateVertex");
|
|
||||||
//
|
|
||||||
if (theVForceUpdate)
|
if (theVForceUpdate)
|
||||||
aTV->Tolerance(aTol);
|
aTV->Tolerance(aTol);
|
||||||
else
|
else
|
||||||
@@ -1709,8 +1705,8 @@ static void InternalUpdateTolerances(const TopoDS_Shape& theOldShape,
|
|||||||
for (iCur=1; iCur<=nbV; iCur++) {
|
for (iCur=1; iCur<=nbV; iCur++) {
|
||||||
tol=0;
|
tol=0;
|
||||||
const TopoDS_Vertex& V = TopoDS::Vertex(parents.FindKey(iCur));
|
const TopoDS_Vertex& V = TopoDS::Vertex(parents.FindKey(iCur));
|
||||||
Bnd_Box box;
|
gp_Pnt aPV = BRep_Tool::Pnt(V);
|
||||||
box.Add(BRep_Tool::Pnt(V));
|
Standard_Real aMaxDist = 0.;
|
||||||
gp_Pnt p3d;
|
gp_Pnt p3d;
|
||||||
for (lConx.Initialize(parents(iCur)); lConx.More(); lConx.Next()) {
|
for (lConx.Initialize(parents(iCur)); lConx.More(); lConx.Next()) {
|
||||||
const TopoDS_Edge& E = TopoDS::Edge(lConx.Value());
|
const TopoDS_Edge& E = TopoDS::Edge(lConx.Value());
|
||||||
@@ -1732,8 +1728,10 @@ static void InternalUpdateTolerances(const TopoDS_Shape& theOldShape,
|
|||||||
if (!C.IsNull()) { // edge non degenerated
|
if (!C.IsNull()) { // edge non degenerated
|
||||||
p3d = C->Value(par);
|
p3d = C->Value(par);
|
||||||
p3d.Transform(L.Transformation());
|
p3d.Transform(L.Transformation());
|
||||||
box.Add(p3d);
|
Standard_Real aDist = p3d.SquareDistance(aPV);
|
||||||
}
|
if (aDist > aMaxDist)
|
||||||
|
aMaxDist = aDist;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (cr->IsCurveOnSurface()) {
|
else if (cr->IsCurveOnSurface()) {
|
||||||
const Handle(Geom_Surface)& Su = cr->Surface();
|
const Handle(Geom_Surface)& Su = cr->Surface();
|
||||||
@@ -1745,21 +1743,22 @@ static void InternalUpdateTolerances(const TopoDS_Shape& theOldShape,
|
|||||||
gp_Pnt2d p2d = PC->Value(par);
|
gp_Pnt2d p2d = PC->Value(par);
|
||||||
p3d = Su->Value(p2d.X(),p2d.Y());
|
p3d = Su->Value(p2d.X(),p2d.Y());
|
||||||
p3d.Transform(L.Transformation());
|
p3d.Transform(L.Transformation());
|
||||||
box.Add(p3d);
|
Standard_Real aDist = p3d.SquareDistance(aPV);
|
||||||
|
if (aDist > aMaxDist)
|
||||||
|
aMaxDist = aDist;
|
||||||
if (!PC2.IsNull()) {
|
if (!PC2.IsNull()) {
|
||||||
p2d = PC2->Value(par);
|
p2d = PC2->Value(par);
|
||||||
p3d = Su->Value(p2d.X(),p2d.Y());
|
p3d = Su->Value(p2d.X(),p2d.Y());
|
||||||
p3d.Transform(L.Transformation());
|
p3d.Transform(L.Transformation());
|
||||||
box.Add(p3d);
|
aDist = p3d.SquareDistance(aPV);
|
||||||
|
if (aDist > aMaxDist)
|
||||||
|
aMaxDist = aDist;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
itcr.Next();
|
itcr.Next();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
|
tol = Max(tol, sqrt(aMaxDist));
|
||||||
box.Get(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
|
|
||||||
aXmax -= aXmin; aYmax -= aYmin; aZmax -= aZmin;
|
|
||||||
tol = Max(tol,sqrt(aXmax*aXmax+aYmax*aYmax+aZmax*aZmax));
|
|
||||||
tol += 2.*Epsilon(tol);
|
tol += 2.*Epsilon(tol);
|
||||||
//
|
//
|
||||||
Standard_Real aVTol = BRep_Tool::Tolerance(V);
|
Standard_Real aVTol = BRep_Tool::Tolerance(V);
|
||||||
|
@@ -336,8 +336,10 @@ static BRepOffset_Error checkSinglePoint(const Standard_Real theUParam,
|
|||||||
const NCollection_Vector<gp_Pnt>& theBadPoints);
|
const NCollection_Vector<gp_Pnt>& theBadPoints);
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
static void UpdateTolerance ( TopoDS_Shape& myShape,
|
static void UpdateTolerance ( TopoDS_Shape& theShape,
|
||||||
const TopTools_IndexedMapOfShape& myFaces);
|
const TopTools_IndexedMapOfShape& theFaces,
|
||||||
|
const TopoDS_Shape& theInitShape);
|
||||||
|
|
||||||
static Standard_Real ComputeMaxDist(const gp_Pln& thePlane,
|
static Standard_Real ComputeMaxDist(const gp_Pln& thePlane,
|
||||||
const Handle(Geom_Curve)& theCrv,
|
const Handle(Geom_Curve)& theCrv,
|
||||||
const Standard_Real theFirst,
|
const Standard_Real theFirst,
|
||||||
@@ -1036,8 +1038,16 @@ void BRepOffset_MakeOffset::MakeOffsetShape(const Message_ProgressRange& theRang
|
|||||||
// MAJ Tolerance edge and Vertex
|
// MAJ Tolerance edge and Vertex
|
||||||
// ----------------------------
|
// ----------------------------
|
||||||
if (!myOffsetShape.IsNull()) {
|
if (!myOffsetShape.IsNull()) {
|
||||||
UpdateTolerance (myOffsetShape,myFaces);
|
if (myThickening)
|
||||||
BRepLib::UpdateTolerances( myOffsetShape );
|
{
|
||||||
|
UpdateTolerance(myOffsetShape, myFaces, myShape);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TopoDS_Shape aDummy;
|
||||||
|
UpdateTolerance(myOffsetShape, myFaces, aDummy);
|
||||||
|
}
|
||||||
|
BRepLib::UpdateTolerances(myOffsetShape);
|
||||||
}
|
}
|
||||||
|
|
||||||
CorrectConicalFaces();
|
CorrectConicalFaces();
|
||||||
@@ -3165,13 +3175,38 @@ void BRepOffset_MakeOffset::MakeMissingWalls (const Message_ProgressRange& theRa
|
|||||||
} //if both edges are arcs of circles
|
} //if both edges are arcs of circles
|
||||||
if (NewFace.IsNull())
|
if (NewFace.IsNull())
|
||||||
{
|
{
|
||||||
BRepLib_MakeFace MF(theWire, Standard_True); //Only plane
|
Standard_Real anEdgeTol = BRep_Tool::Tolerance(anEdge);
|
||||||
if (MF.Error() == BRepLib_FaceDone)
|
//Tolerances of input shape should not be increased by BRepLib_MakeFace
|
||||||
|
BRepLib_FindSurface aFindPlane(theWire, anEdgeTol, Standard_True); //only plane
|
||||||
|
IsPlanar = Standard_False;
|
||||||
|
if(aFindPlane.Found() && aFindPlane.ToleranceReached() <= anEdgeTol)
|
||||||
{
|
{
|
||||||
NewFace = MF.Face();
|
Standard_Real f, l;
|
||||||
IsPlanar = Standard_True;
|
Handle(Geom_Curve) aGC = BRep_Tool::Curve(anEdge, f, l);
|
||||||
|
Handle(Geom_Plane) aPln = Handle(Geom_Plane)::DownCast(aFindPlane.Surface());
|
||||||
|
Standard_Real aMaxDist = ComputeMaxDist(aPln->Pln(), aGC, f, l);
|
||||||
|
if (aMaxDist <= anEdgeTol)
|
||||||
|
{
|
||||||
|
BRepLib_MakeFace MF(aPln->Pln(), theWire);
|
||||||
|
if (MF.IsDone())
|
||||||
|
{
|
||||||
|
NewFace = MF.Face();
|
||||||
|
TopoDS_Iterator anItE(theWire);
|
||||||
|
for (; anItE.More(); anItE.Next())
|
||||||
|
{
|
||||||
|
const TopoDS_Edge& anE = TopoDS::Edge(anItE.Value());
|
||||||
|
if (anE.IsSame(anEdge))
|
||||||
|
continue;
|
||||||
|
aGC = BRep_Tool::Curve(anE, f, l);
|
||||||
|
aMaxDist = ComputeMaxDist(aPln->Pln(), aGC, f, l);
|
||||||
|
BB.UpdateEdge(anE, aMaxDist);
|
||||||
|
}
|
||||||
|
IsPlanar = Standard_True;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else //Extrusion (by thrusections)
|
//
|
||||||
|
if(!IsPlanar) //Extrusion (by thrusections)
|
||||||
{
|
{
|
||||||
Handle(Geom_Curve) EdgeCurve = BRep_Tool::Curve(anEdge, fpar, lpar);
|
Handle(Geom_Curve) EdgeCurve = BRep_Tool::Curve(anEdge, fpar, lpar);
|
||||||
Handle(Geom_TrimmedCurve) TrEdgeCurve =
|
Handle(Geom_TrimmedCurve) TrEdgeCurve =
|
||||||
@@ -3185,7 +3220,6 @@ void BRepOffset_MakeOffset::MakeMissingWalls (const Message_ProgressRange& theRa
|
|||||||
ThrusecGenerator.AddCurve( TrOffsetCurve );
|
ThrusecGenerator.AddCurve( TrOffsetCurve );
|
||||||
ThrusecGenerator.Perform( Precision::PConfusion() );
|
ThrusecGenerator.Perform( Precision::PConfusion() );
|
||||||
theSurf = ThrusecGenerator.Surface();
|
theSurf = ThrusecGenerator.Surface();
|
||||||
//theSurf = new Geom_SurfaceOfLinearExtrusion( TrOffsetCurve, OffsetDir );
|
|
||||||
Standard_Real Uf, Ul, Vf, Vl;
|
Standard_Real Uf, Ul, Vf, Vl;
|
||||||
theSurf->Bounds(Uf, Ul, Vf, Vl);
|
theSurf->Bounds(Uf, Ul, Vf, Vl);
|
||||||
TopLoc_Location Loc;
|
TopLoc_Location Loc;
|
||||||
@@ -3272,8 +3306,14 @@ void BRepOffset_MakeOffset::MakeMissingWalls (const Message_ProgressRange& theRa
|
|||||||
BB.Range( anE3, FirstPar, LastPar );
|
BB.Range( anE3, FirstPar, LastPar );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BRepLib::SameParameter(NewFace);
|
|
||||||
BRepTools::Update(NewFace);
|
if (!IsPlanar)
|
||||||
|
{
|
||||||
|
// For planar faces these operations are useless,
|
||||||
|
// because there are no curves on surface
|
||||||
|
BRepLib::SameParameter(NewFace);
|
||||||
|
BRepTools::Update(NewFace);
|
||||||
|
}
|
||||||
//Check orientation
|
//Check orientation
|
||||||
TopAbs_Orientation anOr = OrientationOfEdgeInFace(anEdge, aFaceOfEdge);
|
TopAbs_Orientation anOr = OrientationOfEdgeInFace(anEdge, aFaceOfEdge);
|
||||||
TopAbs_Orientation OrInNewFace = OrientationOfEdgeInFace(anEdge, NewFace);
|
TopAbs_Orientation OrInNewFace = OrientationOfEdgeInFace(anEdge, NewFace);
|
||||||
@@ -3781,6 +3821,7 @@ void BRepOffset_MakeOffset::EncodeRegularity ()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : ComputeMaxDist
|
//function : ComputeMaxDist
|
||||||
//purpose :
|
//purpose :
|
||||||
@@ -3807,13 +3848,15 @@ Standard_Real ComputeMaxDist(const gp_Pln& thePlane,
|
|||||||
}
|
}
|
||||||
return sqrt(aMaxDist)*1.05;
|
return sqrt(aMaxDist)*1.05;
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : UpDateTolerance
|
//function : UpdateTolerance
|
||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
|
|
||||||
void UpdateTolerance (TopoDS_Shape& S,
|
void UpdateTolerance (TopoDS_Shape& S,
|
||||||
const TopTools_IndexedMapOfShape& Faces)
|
const TopTools_IndexedMapOfShape& Faces,
|
||||||
|
const TopoDS_Shape& theInitShape)
|
||||||
{
|
{
|
||||||
BRep_Builder B;
|
BRep_Builder B;
|
||||||
TopTools_MapOfShape View;
|
TopTools_MapOfShape View;
|
||||||
@@ -3829,12 +3872,31 @@ void UpdateTolerance (TopoDS_Shape& S,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Standard_Real Tol;
|
// The edges of initial shape are not modified
|
||||||
TopExp_Explorer ExpF;
|
TopTools_MapOfShape aMapInitF;
|
||||||
for (ExpF.Init(S, TopAbs_FACE); ExpF.More(); ExpF.Next())
|
if (!theInitShape.IsNull())
|
||||||
{
|
{
|
||||||
const TopoDS_Shape& F = ExpF.Current();
|
TopExp_Explorer anExpF(theInitShape, TopAbs_FACE);
|
||||||
if (Faces.Contains(F))
|
for (; anExpF.More(); anExpF.Next()) {
|
||||||
|
aMapInitF.Add(anExpF.Current());
|
||||||
|
TopExp_Explorer anExpE;
|
||||||
|
for (anExpE.Init(anExpF.Current(), TopAbs_EDGE); anExpE.More(); anExpE.Next()) {
|
||||||
|
View.Add(anExpE.Current());
|
||||||
|
TopoDS_Iterator anItV(anExpE.Current());
|
||||||
|
for (; anItV.More(); anItV.Next())
|
||||||
|
{
|
||||||
|
View.Add(anItV.Value());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Standard_Real Tol;
|
||||||
|
TopExp_Explorer anExpF(S, TopAbs_FACE);
|
||||||
|
for (; anExpF.More(); anExpF.Next())
|
||||||
|
{
|
||||||
|
const TopoDS_Shape& F = anExpF.Current();
|
||||||
|
if (Faces.Contains(F) || aMapInitF.Contains(F))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -3843,6 +3905,7 @@ void UpdateTolerance (TopoDS_Shape& S,
|
|||||||
for (Exp.Init(F, TopAbs_EDGE); Exp.More(); Exp.Next()) {
|
for (Exp.Init(F, TopAbs_EDGE); Exp.More(); Exp.Next()) {
|
||||||
TopoDS_Edge E = TopoDS::Edge(Exp.Current());
|
TopoDS_Edge E = TopoDS::Edge(Exp.Current());
|
||||||
Standard_Boolean isUpdated = Standard_False;
|
Standard_Boolean isUpdated = Standard_False;
|
||||||
|
Standard_Real aCurrTol = BRep_Tool::Tolerance(E);
|
||||||
if (aBAS.GetType() == GeomAbs_Plane)
|
if (aBAS.GetType() == GeomAbs_Plane)
|
||||||
{
|
{
|
||||||
//Edge does not seem to have pcurve on plane,
|
//Edge does not seem to have pcurve on plane,
|
||||||
@@ -3850,17 +3913,22 @@ void UpdateTolerance (TopoDS_Shape& S,
|
|||||||
Standard_Real aFirst, aLast;
|
Standard_Real aFirst, aLast;
|
||||||
Handle(Geom_Curve) aCrv = BRep_Tool::Curve(E, aFirst, aLast);
|
Handle(Geom_Curve) aCrv = BRep_Tool::Curve(E, aFirst, aLast);
|
||||||
Standard_Real aMaxDist = ComputeMaxDist(aBAS.Plane(), aCrv, aFirst, aLast);
|
Standard_Real aMaxDist = ComputeMaxDist(aBAS.Plane(), aCrv, aFirst, aLast);
|
||||||
E.Locked (Standard_False);
|
if (aMaxDist > aCurrTol)
|
||||||
B.UpdateEdge(E, aMaxDist);
|
{
|
||||||
isUpdated = Standard_True;
|
B.UpdateEdge(E, aMaxDist);
|
||||||
|
isUpdated = Standard_True;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (View.Add(E))
|
if (View.Add(E))
|
||||||
{
|
{
|
||||||
|
E.Locked(Standard_False);
|
||||||
BRepCheck_Edge EdgeCorrector(E);
|
BRepCheck_Edge EdgeCorrector(E);
|
||||||
Tol = EdgeCorrector.Tolerance();
|
Tol = EdgeCorrector.Tolerance();
|
||||||
B.UpdateEdge(E, Tol);
|
if (Tol > aCurrTol)
|
||||||
isUpdated = Standard_True;
|
{
|
||||||
|
B.UpdateEdge(E, Tol);
|
||||||
|
isUpdated = Standard_True;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (isUpdated)
|
if (isUpdated)
|
||||||
{
|
{
|
||||||
@@ -3869,11 +3937,11 @@ void UpdateTolerance (TopoDS_Shape& S,
|
|||||||
TopExp::Vertices(E, V[0], V[1]);
|
TopExp::Vertices(E, V[0], V[1]);
|
||||||
|
|
||||||
for (Standard_Integer i = 0; i <= 1; i++) {
|
for (Standard_Integer i = 0; i <= 1; i++) {
|
||||||
|
V[i].Locked(Standard_False);
|
||||||
if (View.Add(V[i])) {
|
if (View.Add(V[i])) {
|
||||||
Handle(BRep_TVertex) TV = Handle(BRep_TVertex)::DownCast(V[i].TShape());
|
Handle(BRep_TVertex) TV = Handle(BRep_TVertex)::DownCast(V[i].TShape());
|
||||||
TV->Tolerance(0.);
|
TV->Tolerance(0.);
|
||||||
BRepCheck_Vertex VertexCorrector(V[i]);
|
BRepCheck_Vertex VertexCorrector(V[i]);
|
||||||
V[i].Locked (Standard_False);
|
|
||||||
B.UpdateVertex(V[i], VertexCorrector.Tolerance());
|
B.UpdateVertex(V[i], VertexCorrector.Tolerance());
|
||||||
// use the occasion to clean the vertices.
|
// use the occasion to clean the vertices.
|
||||||
(TV->ChangePoints()).Clear();
|
(TV->ChangePoints()).Clear();
|
||||||
@@ -4953,6 +5021,53 @@ Standard_Boolean BRepOffset_MakeOffset::IsPlanar()
|
|||||||
if (aPlanarityChecker.IsPlanar())
|
if (aPlanarityChecker.IsPlanar())
|
||||||
{
|
{
|
||||||
gp_Pln aPln = aPlanarityChecker.Plan();
|
gp_Pln aPln = aPlanarityChecker.Plan();
|
||||||
|
Standard_Real u1, u2, v1, v2, um, vm;
|
||||||
|
aSurf->Bounds(u1, u2, v1, v2);
|
||||||
|
Standard_Boolean isInf1 = Precision::IsInfinite(u1), isInf2 = Precision::IsInfinite(u2);
|
||||||
|
if (!isInf1 && !isInf2)
|
||||||
|
{
|
||||||
|
um = (u1 + u2) / 2.;
|
||||||
|
}
|
||||||
|
else if(isInf1 && !isInf2)
|
||||||
|
{
|
||||||
|
um = u2 - 1.;
|
||||||
|
}
|
||||||
|
else if(!isInf1 && isInf2)
|
||||||
|
{
|
||||||
|
um = u1 + 1.;
|
||||||
|
}
|
||||||
|
else //isInf1 && isInf2
|
||||||
|
{
|
||||||
|
um = 0.;
|
||||||
|
}
|
||||||
|
isInf1 = Precision::IsInfinite(v1), isInf2 = Precision::IsInfinite(v2);
|
||||||
|
if (!isInf1 && !isInf2)
|
||||||
|
{
|
||||||
|
vm = (v1 + v2) / 2.;
|
||||||
|
}
|
||||||
|
else if (isInf1 && !isInf2)
|
||||||
|
{
|
||||||
|
vm = v2 - 1.;
|
||||||
|
}
|
||||||
|
else if(!isInf1 && isInf2)
|
||||||
|
{
|
||||||
|
vm = v1 + 1.;
|
||||||
|
}
|
||||||
|
else //isInf1 && isInf2
|
||||||
|
{
|
||||||
|
vm = 0.;
|
||||||
|
}
|
||||||
|
gp_Pnt aP;
|
||||||
|
gp_Vec aD1, aD2;
|
||||||
|
aBAS.D1(um, vm, aP, aD1, aD2);
|
||||||
|
gp_Vec aNorm = aD1.Crossed(aD2);
|
||||||
|
gp_Dir aPlnNorm = aPln.Position().Direction();
|
||||||
|
if (aNorm.Dot(aPlnNorm) < 0.)
|
||||||
|
{
|
||||||
|
aPlnNorm.Reverse();
|
||||||
|
gp_Ax1 anAx(aPln.Position().Location(), aPlnNorm);
|
||||||
|
aPln.SetAxis(anAx);
|
||||||
|
}
|
||||||
Handle(Geom_Plane) aPlane = new Geom_Plane(aPln);
|
Handle(Geom_Plane) aPlane = new Geom_Plane(aPln);
|
||||||
TopoDS_Face aPlanarFace;
|
TopoDS_Face aPlanarFace;
|
||||||
aBB.MakeFace(aPlanarFace, aPlane, aTolForFace);
|
aBB.MakeFace(aPlanarFace, aPlane, aTolForFace);
|
||||||
|
@@ -1157,82 +1157,97 @@ void BSplCLib::MergeBSplineKnots
|
|||||||
index,
|
index,
|
||||||
num_knots ;
|
num_knots ;
|
||||||
if (StartValue < EndValue - Tolerance) {
|
if (StartValue < EndValue - Tolerance) {
|
||||||
TColStd_Array1OfReal knots1(1,Knots1.Length()) ;
|
TColStd_Array1OfReal knots1(1, Knots1.Length());
|
||||||
TColStd_Array1OfReal knots2(1,Knots2.Length()) ;
|
TColStd_Array1OfReal knots2(1, Knots2.Length());
|
||||||
degree = Degree1 + Degree2 ;
|
degree = Degree1 + Degree2;
|
||||||
index = 1 ;
|
index = 1;
|
||||||
|
|
||||||
for (ii = Knots1.Lower() ; ii <= Knots1.Upper() ; ii++) {
|
for (ii = Knots1.Lower(); ii <= Knots1.Upper(); ii++) {
|
||||||
knots1(index) = Knots1(ii) ;
|
knots1(index) = Knots1(ii);
|
||||||
index += 1 ;
|
index += 1;
|
||||||
}
|
}
|
||||||
index = 1 ;
|
index = 1;
|
||||||
|
|
||||||
for (ii = Knots2.Lower() ; ii <= Knots2.Upper() ; ii++) {
|
for (ii = Knots2.Lower(); ii <= Knots2.Upper(); ii++) {
|
||||||
knots2(index) = Knots2(ii) ;
|
knots2(index) = Knots2(ii);
|
||||||
index += 1 ;
|
index += 1;
|
||||||
}
|
}
|
||||||
BSplCLib::Reparametrize(StartValue,
|
BSplCLib::Reparametrize(StartValue,
|
||||||
EndValue,
|
EndValue,
|
||||||
knots1) ;
|
knots1);
|
||||||
|
|
||||||
BSplCLib::Reparametrize(StartValue,
|
|
||||||
EndValue,
|
|
||||||
knots2) ;
|
|
||||||
num_knots = 0 ;
|
|
||||||
jj = 1 ;
|
|
||||||
|
|
||||||
for (ii = 1 ; ii <= knots1.Length() ; ii++) {
|
BSplCLib::Reparametrize(StartValue,
|
||||||
|
EndValue,
|
||||||
|
knots2);
|
||||||
|
num_knots = 0;
|
||||||
|
jj = 1;
|
||||||
|
|
||||||
|
for (ii = 1; ii <= knots1.Length(); ii++) {
|
||||||
|
|
||||||
while (jj <= knots2.Length() && knots2(jj) <= knots1(ii) - Tolerance) {
|
while (jj <= knots2.Length() && knots2(jj) <= knots1(ii) - Tolerance) {
|
||||||
jj += 1 ;
|
jj += 1;
|
||||||
num_knots += 1 ;
|
num_knots += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (jj <= knots2.Length() && knots2(jj) <= knots1(ii) + Tolerance) {
|
while (jj <= knots2.Length() && knots2(jj) <= knots1(ii) + Tolerance) {
|
||||||
jj += 1 ;
|
jj += 1;
|
||||||
}
|
}
|
||||||
num_knots += 1 ;
|
num_knots += 1;
|
||||||
}
|
}
|
||||||
NewKnots =
|
NewKnots =
|
||||||
new TColStd_HArray1OfReal(1,num_knots) ;
|
new TColStd_HArray1OfReal(1, num_knots);
|
||||||
NewMults =
|
NewMults =
|
||||||
new TColStd_HArray1OfInteger(1,num_knots) ;
|
new TColStd_HArray1OfInteger(1, num_knots);
|
||||||
num_knots = 1 ;
|
num_knots = 1;
|
||||||
jj = 1 ;
|
jj = 1;
|
||||||
|
|
||||||
for (ii = 1 ; ii <= knots1.Length() ; ii++) {
|
for (ii = 1; ii <= knots1.Length(); ii++) {
|
||||||
|
|
||||||
while (jj <= knots2.Length() && knots2(jj) <= knots1(ii) - Tolerance) {
|
while (jj <= knots2.Length() && knots2(jj) <= knots1(ii) - Tolerance) {
|
||||||
NewKnots->ChangeArray1()(num_knots) = knots2(jj) ;
|
NewKnots->ChangeArray1()(num_knots) = knots2(jj);
|
||||||
NewMults->ChangeArray1()(num_knots) = Mults2(jj) + Degree1 ;
|
NewMults->ChangeArray1()(num_knots) = Mults2(jj) + Degree1;
|
||||||
jj += 1 ;
|
jj += 1;
|
||||||
num_knots += 1 ;
|
num_knots += 1;
|
||||||
}
|
}
|
||||||
set_mults_flag = 0 ;
|
set_mults_flag = 0;
|
||||||
|
|
||||||
while (jj <= knots2.Length() && knots2(jj) <= knots1(ii) + Tolerance) {
|
while (jj <= knots2.Length() && knots2(jj) <= knots1(ii) + Tolerance) {
|
||||||
continuity = Min(Degree1 - Mults1(ii), Degree2 - Mults2(jj)) ;
|
continuity = Min(Degree1 - Mults1(ii), Degree2 - Mults2(jj));
|
||||||
set_mults_flag = 1 ;
|
set_mults_flag = 1;
|
||||||
NewMults->ChangeArray1()(num_knots) = degree - continuity ;
|
NewMults->ChangeArray1()(num_knots) = degree - continuity;
|
||||||
jj += 1 ;
|
jj += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
NewKnots->ChangeArray1()(num_knots) = knots1(ii) ;
|
NewKnots->ChangeArray1()(num_knots) = knots1(ii);
|
||||||
if (! set_mults_flag) {
|
if (!set_mults_flag) {
|
||||||
NewMults->ChangeArray1()(num_knots) = Mults1(ii) + Degree2 ;
|
NewMults->ChangeArray1()(num_knots) = Mults1(ii) + Degree2;
|
||||||
}
|
}
|
||||||
num_knots += 1 ;
|
num_knots += 1;
|
||||||
}
|
}
|
||||||
num_knots -= 1 ;
|
num_knots -= 1;
|
||||||
NewMults->ChangeArray1()(1) = degree + 1 ;
|
NewMults->ChangeArray1()(1) = degree + 1;
|
||||||
NewMults->ChangeArray1()(num_knots) = degree + 1 ;
|
NewMults->ChangeArray1()(num_knots) = degree + 1;
|
||||||
index = 0 ;
|
index = 0;
|
||||||
|
|
||||||
for (ii = 1 ; ii <= num_knots ; ii++) {
|
for (ii = 1; ii <= num_knots; ii++) {
|
||||||
index += NewMults->Value(ii) ;
|
index += NewMults->Value(ii);
|
||||||
}
|
}
|
||||||
NumPoles = index - degree - 1 ;
|
NumPoles = index - degree - 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
degree = Degree1 + Degree2;
|
||||||
|
num_knots = 2;
|
||||||
|
NewKnots =
|
||||||
|
new TColStd_HArray1OfReal(1, num_knots);
|
||||||
|
NewKnots->ChangeArray1()(1) = StartValue;
|
||||||
|
NewKnots->ChangeArray1()(num_knots) = EndValue;
|
||||||
|
|
||||||
|
NewMults =
|
||||||
|
new TColStd_HArray1OfInteger(1, num_knots);
|
||||||
|
NewMults->ChangeArray1()(1) = degree + 1;
|
||||||
|
NewMults->ChangeArray1()(num_knots) = degree + 1;
|
||||||
|
NumPoles = BSplCLib::NbPoles(degree, Standard_False, NewMults->Array1());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -37,9 +37,7 @@ Draft_FaceInfo::Draft_FaceInfo (const Handle(Geom_Surface)& S,\
|
|||||||
const Standard_Boolean HasNewGeometry):
|
const Standard_Boolean HasNewGeometry):
|
||||||
myNewGeom(HasNewGeometry)
|
myNewGeom(HasNewGeometry)
|
||||||
{
|
{
|
||||||
Handle(Geom_RectangularTrimmedSurface) T = Handle(Geom_RectangularTrimmedSurface)::DownCast(S);
|
myGeom = S;
|
||||||
if (!T.IsNull()) myGeom = T->BasisSurface();
|
|
||||||
else myGeom = S;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -481,7 +481,7 @@ Standard_Boolean Draft_Modification::Propagate ()
|
|||||||
Handle(Geom_Surface)::DownCast(S->Transformed(L.Transformation()));
|
Handle(Geom_Surface)::DownCast(S->Transformed(L.Transformation()));
|
||||||
|
|
||||||
const Handle(Standard_Type)& typs = S->DynamicType();
|
const Handle(Standard_Type)& typs = S->DynamicType();
|
||||||
if (typs == STANDARD_TYPE(Geom_CylindricalSurface) ||
|
if (/*typs == STANDARD_TYPE(Geom_CylindricalSurface) ||*/
|
||||||
typs == STANDARD_TYPE(Geom_ConicalSurface)) {
|
typs == STANDARD_TYPE(Geom_ConicalSurface)) {
|
||||||
Standard_Real umin,umax,vmin,vmax;
|
Standard_Real umin,umax,vmin,vmax;
|
||||||
BRepTools::UVBounds(F,umin,umax,vmin,vmax);
|
BRepTools::UVBounds(F,umin,umax,vmin,vmax);
|
||||||
@@ -1062,7 +1062,11 @@ void Draft_Modification::Perform ()
|
|||||||
//Find the first curve to glue
|
//Find the first curve to glue
|
||||||
TColGeom_SequenceOfCurve Candidates;
|
TColGeom_SequenceOfCurve Candidates;
|
||||||
if (S1->DynamicType() == STANDARD_TYPE(Geom_CylindricalSurface) ||
|
if (S1->DynamicType() == STANDARD_TYPE(Geom_CylindricalSurface) ||
|
||||||
S1->DynamicType() == STANDARD_TYPE(Geom_ConicalSurface))
|
S1->DynamicType() == STANDARD_TYPE(Geom_ConicalSurface) ||
|
||||||
|
S1->DynamicType() == STANDARD_TYPE(Geom_RectangularTrimmedSurface) &&
|
||||||
|
Handle(Geom_RectangularTrimmedSurface)::DownCast(S1)->BasisSurface()->DynamicType() == STANDARD_TYPE(Geom_CylindricalSurface) ||
|
||||||
|
S1->DynamicType() == STANDARD_TYPE(Geom_RectangularTrimmedSurface) &&
|
||||||
|
Handle(Geom_RectangularTrimmedSurface)::DownCast(S1)->BasisSurface()->DynamicType() == STANDARD_TYPE(Geom_ConicalSurface))
|
||||||
{
|
{
|
||||||
for (i = 1; i <= i2s.NbLines(); i++)
|
for (i = 1; i <= i2s.NbLines(); i++)
|
||||||
{
|
{
|
||||||
|
@@ -27,7 +27,7 @@
|
|||||||
// intended for use from debugger prompt (Command Window in Visual Studio)
|
// intended for use from debugger prompt (Command Window in Visual Studio)
|
||||||
|
|
||||||
//! Save geometric object identified by pointer to handle
|
//! Save geometric object identified by pointer to handle
|
||||||
const char* DrawTrSurf_Set (const char* theNameStr, void* theHandlePtr)
|
Standard_EXPORT const char* DrawTrSurf_Set (const char* theNameStr, void* theHandlePtr)
|
||||||
{
|
{
|
||||||
if (theNameStr == 0 || theHandlePtr == 0)
|
if (theNameStr == 0 || theHandlePtr == 0)
|
||||||
{
|
{
|
||||||
@@ -57,7 +57,7 @@ const char* DrawTrSurf_Set (const char* theNameStr, void* theHandlePtr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! Set point to DRAW variable
|
//! Set point to DRAW variable
|
||||||
const char* DrawTrSurf_SetPnt (const char* theNameStr, void* thePntPtr)
|
Standard_EXPORT const char* DrawTrSurf_SetPnt (const char* theNameStr, void* thePntPtr)
|
||||||
{
|
{
|
||||||
if (theNameStr == 0 || thePntPtr == 0)
|
if (theNameStr == 0 || thePntPtr == 0)
|
||||||
{
|
{
|
||||||
@@ -77,7 +77,7 @@ const char* DrawTrSurf_SetPnt (const char* theNameStr, void* thePntPtr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! Set 2d point to DRAW variable
|
//! Set 2d point to DRAW variable
|
||||||
const char* DrawTrSurf_SetPnt2d (const char* theNameStr, void* thePnt2dPtr)
|
Standard_EXPORT const char* DrawTrSurf_SetPnt2d (const char* theNameStr, void* thePnt2dPtr)
|
||||||
{
|
{
|
||||||
if (theNameStr == 0 || thePnt2dPtr == 0)
|
if (theNameStr == 0 || thePnt2dPtr == 0)
|
||||||
{
|
{
|
||||||
@@ -102,17 +102,17 @@ const char* DrawTrSurf_SetPnt2d (const char* theNameStr, void* thePnt2dPtr)
|
|||||||
// work with them (DBX could, on SUN Solaris).
|
// work with them (DBX could, on SUN Solaris).
|
||||||
#ifndef _MSC_VER
|
#ifndef _MSC_VER
|
||||||
|
|
||||||
const char* DrawTrSurf_Set (const char* name, const Handle(Standard_Transient)& G)
|
Standard_EXPORT const char* DrawTrSurf_Set (const char* name, const Handle(Standard_Transient)& G)
|
||||||
{
|
{
|
||||||
return DrawTrSurf_Set (name, (void*)&G);
|
return DrawTrSurf_Set (name, (void*)&G);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DrawTrSurf_Set (const char* theName, const gp_Pnt& thePnt)
|
Standard_EXPORT const char* DrawTrSurf_Set (const char* theName, const gp_Pnt& thePnt)
|
||||||
{
|
{
|
||||||
return DrawTrSurf_SetPnt (theName, (void*)&thePnt);
|
return DrawTrSurf_SetPnt (theName, (void*)&thePnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DrawTrSurf_Set (const char* theName, const gp_Pnt2d& thePnt2d)
|
Standard_EXPORT const char* DrawTrSurf_Set (const char* theName, const gp_Pnt2d& thePnt2d)
|
||||||
{
|
{
|
||||||
return DrawTrSurf_SetPnt2d (theName, (void*)&thePnt2d);
|
return DrawTrSurf_SetPnt2d (theName, (void*)&thePnt2d);
|
||||||
}
|
}
|
||||||
|
@@ -674,7 +674,10 @@ void Extrema_ExtCC::PrepareParallelResult(const Standard_Real theUt11,
|
|||||||
Extrema_ExtPElC ExtPCir(aPCirc2,
|
Extrema_ExtPElC ExtPCir(aPCirc2,
|
||||||
Extrema_CurveTool::Circle (*myC[0]),
|
Extrema_CurveTool::Circle (*myC[0]),
|
||||||
Precision::Confusion(), theUt11, theUt12);
|
Precision::Confusion(), theUt11, theUt12);
|
||||||
|
if (ExtPCir.NbExt() < 1)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
Standard_Real aMinSqD = ExtPCir.SquareDistance(1);
|
Standard_Real aMinSqD = ExtPCir.SquareDistance(1);
|
||||||
for (Standard_Integer anExtID = 2; anExtID <= ExtPCir.NbExt(); anExtID++)
|
for (Standard_Integer anExtID = 2; anExtID <= ExtPCir.NbExt(); anExtID++)
|
||||||
{
|
{
|
||||||
|
@@ -515,7 +515,6 @@ static Handle(Geom2d_BSplineCurve) MultNumandDenom(const Handle(Geom2d_BSplineCu
|
|||||||
Handle(TColStd_HArray1OfReal) resKnots;
|
Handle(TColStd_HArray1OfReal) resKnots;
|
||||||
Handle(TColStd_HArray1OfInteger) resMults;
|
Handle(TColStd_HArray1OfInteger) resMults;
|
||||||
Standard_Real start_value,end_value;
|
Standard_Real start_value,end_value;
|
||||||
Standard_Real tolerance=Precision::Confusion();
|
|
||||||
Standard_Integer resNbPoles,degree,
|
Standard_Integer resNbPoles,degree,
|
||||||
ii,jj,
|
ii,jj,
|
||||||
aStatus;
|
aStatus;
|
||||||
@@ -527,6 +526,7 @@ static Handle(Geom2d_BSplineCurve) MultNumandDenom(const Handle(Geom2d_BSplineCu
|
|||||||
BS->KnotSequence(BSFlatKnots);
|
BS->KnotSequence(BSFlatKnots);
|
||||||
start_value = BSKnots(1);
|
start_value = BSKnots(1);
|
||||||
end_value = BSKnots(BS->NbKnots());
|
end_value = BSKnots(BS->NbKnots());
|
||||||
|
Standard_Real tolerance = 10.*Epsilon(Abs(end_value));
|
||||||
|
|
||||||
a->Knots(aKnots);
|
a->Knots(aKnots);
|
||||||
a->Poles(aPoles);
|
a->Poles(aPoles);
|
||||||
@@ -565,22 +565,6 @@ static Handle(Geom2d_BSplineCurve) MultNumandDenom(const Handle(Geom2d_BSplineCu
|
|||||||
degree,
|
degree,
|
||||||
resDenPoles,
|
resDenPoles,
|
||||||
aStatus);
|
aStatus);
|
||||||
// BSplCLib::FunctionMultiply(law_evaluator,
|
|
||||||
// BS->Degree(),
|
|
||||||
// BSFlatKnots,
|
|
||||||
// BSPoles,
|
|
||||||
// resFlatKnots,
|
|
||||||
// degree,
|
|
||||||
// resNumPoles,
|
|
||||||
// aStatus);
|
|
||||||
// BSplCLib::FunctionMultiply(law_evaluator,
|
|
||||||
// BS->Degree(),
|
|
||||||
// BSFlatKnots,
|
|
||||||
// BSWeights,
|
|
||||||
// resFlatKnots,
|
|
||||||
// degree,
|
|
||||||
// resDenPoles,
|
|
||||||
// aStatus);
|
|
||||||
for (ii=1;ii<=resNbPoles;ii++)
|
for (ii=1;ii<=resNbPoles;ii++)
|
||||||
for(jj=1;jj<=2;jj++)
|
for(jj=1;jj<=2;jj++)
|
||||||
resPoles(ii).SetCoord(jj,resNumPoles(ii).Coord(jj)/resDenPoles(ii));
|
resPoles(ii).SetCoord(jj,resNumPoles(ii).Coord(jj)/resDenPoles(ii));
|
||||||
@@ -1339,24 +1323,22 @@ void Geom2dConvert::ConcatC1(TColGeom2d_Array1OfBSplineCurve& ArrayOf
|
|||||||
Curve1Poles(ii).SetCoord(jj,Curve1Poles(ii).Coord(jj)*Curve1Weights(ii));
|
Curve1Poles(ii).SetCoord(jj,Curve1Poles(ii).Coord(jj)*Curve1Weights(ii));
|
||||||
//POP pour NT
|
//POP pour NT
|
||||||
Geom2dConvert_reparameterise_evaluator ev (aPolynomialCoefficient);
|
Geom2dConvert_reparameterise_evaluator ev (aPolynomialCoefficient);
|
||||||
// BSplCLib::FunctionReparameterise(reparameterise_evaluator,
|
|
||||||
BSplCLib::FunctionReparameterise(ev,
|
BSplCLib::FunctionReparameterise(ev,
|
||||||
Curve1->Degree(),
|
Curve1->Degree(),
|
||||||
Curve1FlatKnots,
|
Curve1FlatKnots,
|
||||||
Curve1Poles,
|
Curve1Poles,
|
||||||
FlatKnots,
|
FlatKnots,
|
||||||
aNewCurveDegree,
|
aNewCurveDegree,
|
||||||
NewPoles,
|
NewPoles,
|
||||||
aStatus
|
aStatus
|
||||||
);
|
);
|
||||||
TColStd_Array1OfReal NewWeights(1, FlatKnots.Length() - (aNewCurveDegree + 1));
|
TColStd_Array1OfReal NewWeights(1, FlatKnots.Length() - (aNewCurveDegree + 1));
|
||||||
// BSplCLib::FunctionReparameterise(reparameterise_evaluator,
|
|
||||||
BSplCLib::FunctionReparameterise(ev,
|
BSplCLib::FunctionReparameterise(ev,
|
||||||
Curve1->Degree(),
|
Curve1->Degree(),
|
||||||
Curve1FlatKnots,
|
Curve1FlatKnots,
|
||||||
Curve1Weights,
|
Curve1Weights,
|
||||||
FlatKnots,
|
FlatKnots,
|
||||||
aNewCurveDegree,
|
aNewCurveDegree,
|
||||||
NewWeights,
|
NewWeights,
|
||||||
aStatus
|
aStatus
|
||||||
);
|
);
|
||||||
|
@@ -276,6 +276,8 @@ GeomFill_SectionPlacement(const Handle(GeomFill_LocationLaw)& L,
|
|||||||
|
|
||||||
Standard_Integer NbLocalPnts = 10;
|
Standard_Integer NbLocalPnts = 10;
|
||||||
Standard_Integer NbPnts = (NbKnots-1) * NbLocalPnts;
|
Standard_Integer NbPnts = (NbKnots-1) * NbLocalPnts;
|
||||||
|
if (NbPnts < 0)
|
||||||
|
NbPnts = 0;
|
||||||
if (I1 != I2)
|
if (I1 != I2)
|
||||||
NbPnts += NbLocalPnts;
|
NbPnts += NbLocalPnts;
|
||||||
if (I3 != I4 && first < BC->Knot(I3))
|
if (I3 != I4 && first < BC->Knot(I3))
|
||||||
|
@@ -30,18 +30,6 @@
|
|||||||
#include <TColgp_Array1OfPnt.hxx>
|
#include <TColgp_Array1OfPnt.hxx>
|
||||||
#include <TColgp_HArray1OfPnt.hxx>
|
#include <TColgp_HArray1OfPnt.hxx>
|
||||||
|
|
||||||
static Standard_Boolean Controle(const TColgp_Array1OfPnt& P,
|
|
||||||
const gp_Pln& Plan,
|
|
||||||
const Standard_Real Tol)
|
|
||||||
{
|
|
||||||
Standard_Integer ii;
|
|
||||||
Standard_Boolean B=Standard_True;
|
|
||||||
|
|
||||||
for (ii=1; ii<=P.Length() && B; ii++)
|
|
||||||
B = (Plan.Distance(P(ii)) < Tol);
|
|
||||||
|
|
||||||
return B;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Standard_Boolean Controle(const TColgp_Array1OfPnt& Poles,
|
static Standard_Boolean Controle(const TColgp_Array1OfPnt& Poles,
|
||||||
const Standard_Real Tol,
|
const Standard_Real Tol,
|
||||||
@@ -49,51 +37,36 @@ static Standard_Boolean Controle(const TColgp_Array1OfPnt& Poles,
|
|||||||
gp_Pln& Plan)
|
gp_Pln& Plan)
|
||||||
{
|
{
|
||||||
Standard_Boolean IsPlan = Standard_False;
|
Standard_Boolean IsPlan = Standard_False;
|
||||||
Standard_Boolean Essai = Standard_True;
|
|
||||||
Standard_Real gx,gy,gz;
|
Standard_Real gx,gy,gz;
|
||||||
Standard_Integer Nb = Poles.Length();
|
gp_Pnt Bary;
|
||||||
gp_Pnt Bary;
|
|
||||||
gp_Dir DX, DY;
|
gp_Dir DX, DY;
|
||||||
|
Standard_Real aTolSingular = Precision::Confusion();
|
||||||
|
|
||||||
|
|
||||||
if (Nb > 10) {
|
GeomLib::Inertia(Poles, Bary, DX, DY, gx, gy, gz);
|
||||||
// Test allege (pour une rejection rapide)
|
if (gz < Tol && gy > aTolSingular) {
|
||||||
TColgp_Array1OfPnt Aux(1,5);
|
gp_Pnt P;
|
||||||
Aux(1) = Poles(1);
|
gp_Vec DU, DV;
|
||||||
Aux(2) = Poles(Nb/3);
|
Standard_Real umin, umax, vmin, vmax;
|
||||||
Aux(3) = Poles(Nb/2);
|
S->Bounds(umin, umax, vmin, vmax);
|
||||||
Aux(4) = Poles(Nb/2+Nb/3);
|
S->D1((umin + umax) / 2, (vmin + vmax) / 2, P, DU, DV);
|
||||||
Aux(5) = Poles(Nb);
|
// On prend DX le plus proche possible de DU
|
||||||
GeomLib::Inertia(Aux, Bary, DX, DY, gx, gy, gz);
|
gp_Dir du(DU);
|
||||||
Essai = (gz<Tol);
|
Standard_Real Angle1 = du.Angle(DX);
|
||||||
}
|
Standard_Real Angle2 = du.Angle(DY);
|
||||||
|
if (Angle1 > M_PI / 2) Angle1 = M_PI - Angle1;
|
||||||
if (Essai) { // Test Grandeur nature...
|
if (Angle2 > M_PI / 2) Angle2 = M_PI - Angle2;
|
||||||
GeomLib::Inertia(Poles, Bary, DX, DY, gx, gy, gz);
|
if (Angle2 < Angle1) {
|
||||||
if (gz<Tol && gy>Tol) {
|
du = DY; DY = DX; DX = du;
|
||||||
gp_Pnt P;
|
|
||||||
gp_Vec DU, DV;
|
|
||||||
Standard_Real umin, umax, vmin, vmax;
|
|
||||||
S->Bounds(umin, umax, vmin, vmax);
|
|
||||||
S->D1( (umin+umax)/2, (vmin+vmax)/2, P, DU, DV);
|
|
||||||
// On prend DX le plus proche possible de DU
|
|
||||||
gp_Dir du(DU);
|
|
||||||
Standard_Real Angle1 = du.Angle(DX);
|
|
||||||
Standard_Real Angle2 = du.Angle(DY);
|
|
||||||
if (Angle1 > M_PI/2) Angle1 = M_PI-Angle1;
|
|
||||||
if (Angle2 > M_PI/2) Angle2 = M_PI-Angle2;
|
|
||||||
if (Angle2 < Angle1) {
|
|
||||||
du = DY; DY = DX; DX = du;
|
|
||||||
}
|
|
||||||
if (DX.Angle(DU) > M_PI/2) DX.Reverse();
|
|
||||||
if (DY.Angle(DV) > M_PI/2) DY.Reverse();
|
|
||||||
|
|
||||||
gp_Ax3 axe(Bary, DX^DY, DX);
|
|
||||||
Plan.SetPosition(axe);
|
|
||||||
Plan.SetLocation(Bary);
|
|
||||||
IsPlan = Standard_True;
|
|
||||||
}
|
}
|
||||||
}
|
if (DX.Angle(DU) > M_PI / 2) DX.Reverse();
|
||||||
|
if (DY.Angle(DV) > M_PI / 2) DY.Reverse();
|
||||||
|
|
||||||
|
gp_Ax3 axe(Bary, DX^DY, DX);
|
||||||
|
Plan.SetPosition(axe);
|
||||||
|
Plan.SetLocation(Bary);
|
||||||
|
IsPlan = Standard_True;
|
||||||
|
}
|
||||||
return IsPlan;
|
return IsPlan;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,8 +79,6 @@ static Standard_Boolean Controle(const Handle(Geom_Curve)& C,
|
|||||||
GeomAbs_CurveType Type;
|
GeomAbs_CurveType Type;
|
||||||
GeomAdaptor_Curve AC(C);
|
GeomAdaptor_Curve AC(C);
|
||||||
Type = AC.GetType();
|
Type = AC.GetType();
|
||||||
Handle(TColgp_HArray1OfPnt) TabP;
|
|
||||||
TabP.Nullify();
|
|
||||||
|
|
||||||
switch (Type) {
|
switch (Type) {
|
||||||
case GeomAbs_Line :
|
case GeomAbs_Line :
|
||||||
@@ -131,40 +102,27 @@ static Standard_Boolean Controle(const Handle(Geom_Curve)& C,
|
|||||||
case GeomAbs_BezierCurve:
|
case GeomAbs_BezierCurve:
|
||||||
{
|
{
|
||||||
Nb = AC.NbPoles();
|
Nb = AC.NbPoles();
|
||||||
Handle (Geom_BezierCurve) BZ = AC.Bezier();
|
|
||||||
TabP = new (TColgp_HArray1OfPnt) (1, AC.NbPoles());
|
|
||||||
for (ii=1; ii<=Nb; ii++)
|
|
||||||
TabP->SetValue(ii, BZ->Pole(ii));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GeomAbs_BSplineCurve:
|
case GeomAbs_BSplineCurve:
|
||||||
{
|
{
|
||||||
Nb = AC.NbPoles();
|
Nb = AC.NbPoles();
|
||||||
Handle (Geom_BSplineCurve) BZ = AC.BSpline();
|
|
||||||
TabP = new (TColgp_HArray1OfPnt) (1, AC.NbPoles());
|
|
||||||
for (ii=1; ii<=Nb; ii++)
|
|
||||||
TabP->SetValue(ii, BZ->Pole(ii));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default :
|
default :
|
||||||
{
|
{
|
||||||
Nb = 8 + 3*AC.NbIntervals(GeomAbs_CN);
|
Nb = 8 + 3*AC.NbIntervals(GeomAbs_CN);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TabP.IsNull()) {
|
|
||||||
Standard_Real u, du, f, l, d;
|
|
||||||
f = AC.FirstParameter();
|
|
||||||
l = AC.LastParameter();
|
|
||||||
du = (l-f)/(Nb-1);
|
|
||||||
for (ii=1; ii<=Nb && B ; ii++) {
|
|
||||||
u = (ii-1)*du + f;
|
|
||||||
d = Plan.Distance(C->Value(u));
|
|
||||||
B = (d < Tol);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
B = Controle(TabP->Array1(), Plan, Tol);
|
Standard_Real u, du, f, l, d;
|
||||||
|
f = AC.FirstParameter();
|
||||||
|
l = AC.LastParameter();
|
||||||
|
du = (l - f) / (Nb - 1);
|
||||||
|
for (ii = 1; ii <= Nb && B; ii++) {
|
||||||
|
u = (ii - 1)*du + f;
|
||||||
|
d = Plan.Distance(C->Value(u));
|
||||||
|
B = d < Tol;
|
||||||
}
|
}
|
||||||
|
|
||||||
return B;
|
return B;
|
||||||
@@ -196,30 +154,6 @@ GeomLib_IsPlanarSurface::GeomLib_IsPlanarSurface(const Handle(Geom_Surface)& S,
|
|||||||
IsPlan = Standard_False;
|
IsPlan = Standard_False;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GeomAbs_BezierSurface :
|
|
||||||
case GeomAbs_BSplineSurface :
|
|
||||||
{
|
|
||||||
Standard_Integer ii, jj, kk,
|
|
||||||
NbU = AS.NbUPoles(), NbV = AS.NbVPoles();
|
|
||||||
TColgp_Array1OfPnt Poles(1, NbU*NbV);
|
|
||||||
if (Type == GeomAbs_BezierSurface) {
|
|
||||||
Handle(Geom_BezierSurface) BZ;
|
|
||||||
BZ = AS.Bezier();
|
|
||||||
for(ii=1, kk=1; ii<=NbU; ii++)
|
|
||||||
for(jj=1; jj<=NbV; jj++,kk++)
|
|
||||||
Poles(kk) = BZ->Pole(ii,jj);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Handle(Geom_BSplineSurface) BS;
|
|
||||||
BS = AS.BSpline();
|
|
||||||
for(ii=1, kk=1; ii<=NbU; ii++)
|
|
||||||
for(jj=1; jj<=NbV; jj++,kk++)
|
|
||||||
Poles(kk) = BS->Pole(ii,jj);
|
|
||||||
}
|
|
||||||
|
|
||||||
IsPlan = Controle(Poles, Tol, S, myPlan);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GeomAbs_SurfaceOfRevolution :
|
case GeomAbs_SurfaceOfRevolution :
|
||||||
{
|
{
|
||||||
@@ -299,7 +233,7 @@ GeomLib_IsPlanarSurface::GeomLib_IsPlanarSurface(const Handle(Geom_Surface)& S,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
default :
|
default :
|
||||||
{
|
{
|
||||||
Standard_Integer NbU,NbV, ii, jj, kk;
|
Standard_Integer NbU,NbV, ii, jj, kk;
|
||||||
NbU = 8 + 3*AS.NbUIntervals(GeomAbs_CN);
|
NbU = 8 + 3*AS.NbUIntervals(GeomAbs_CN);
|
||||||
|
@@ -4359,6 +4359,120 @@ static Standard_Integer QACheckBends(Draw_Interpretor& theDI,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Standard_Integer OCC26441(Draw_Interpretor& theDi, Standard_Integer theNbArgs, const char** theArgVec)
|
||||||
|
{
|
||||||
|
if (theNbArgs < 3)
|
||||||
|
{
|
||||||
|
theDi << "Syntax error: wrong number of arguments!\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const TopoDS_Shape& aShape = DBRep::Get(theArgVec[1]);
|
||||||
|
if (aShape.IsNull())
|
||||||
|
{
|
||||||
|
theDi << " Null Shape is not allowed here\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
const TopoDS_Shape& aRefShape = DBRep::Get(theArgVec[2]);
|
||||||
|
if (aRefShape.IsNull())
|
||||||
|
{
|
||||||
|
theDi << " Null Shape is not allowed here\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if(aShape.ShapeType() != aRefShape.ShapeType())
|
||||||
|
{
|
||||||
|
theDi << " Shape types are not the same\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Standard_Real anEps = Precision::Confusion();
|
||||||
|
if (theNbArgs > 3)
|
||||||
|
{
|
||||||
|
anEps = Draw::Atof(theArgVec[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
Standard_Boolean isAllDiff = Standard_False;
|
||||||
|
if (theNbArgs > 4)
|
||||||
|
{
|
||||||
|
Standard_Integer Inc = Draw::Atoi(theArgVec[4]);
|
||||||
|
if (Inc > 0)
|
||||||
|
isAllDiff = Standard_True;
|
||||||
|
}
|
||||||
|
|
||||||
|
BRep_Builder aBB;
|
||||||
|
TopExp_Explorer anExp, anExpRef;
|
||||||
|
Standard_Real aMaxE = 0., aMaxV = 0.;
|
||||||
|
TopTools_MapOfShape aChecked;
|
||||||
|
TopoDS_Vertex aV[2], aRefV[2];
|
||||||
|
|
||||||
|
//Checking edge and vertex tolerances
|
||||||
|
TopoDS_Compound aBadEdges;
|
||||||
|
aBB.MakeCompound(aBadEdges);
|
||||||
|
TopoDS_Compound aBadVerts;
|
||||||
|
aBB.MakeCompound(aBadVerts);
|
||||||
|
anExp.Init(aShape, TopAbs_EDGE);
|
||||||
|
anExpRef.Init(aRefShape, TopAbs_EDGE);
|
||||||
|
for (; anExpRef.More(); anExpRef.Next())
|
||||||
|
{
|
||||||
|
const TopoDS_Edge& aRefE = TopoDS::Edge(anExpRef.Current());
|
||||||
|
if (!anExp.More())
|
||||||
|
{
|
||||||
|
theDi << " Different number of edges\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
const TopoDS_Edge& anE = TopoDS::Edge(anExp.Current());
|
||||||
|
if (!aChecked.Add(anE))
|
||||||
|
continue;
|
||||||
|
Standard_Real aTolRef = BRep_Tool::Tolerance(aRefE);
|
||||||
|
Standard_Real aTol = BRep_Tool::Tolerance(anE);
|
||||||
|
Standard_Real aDiff = aTol - aTolRef;
|
||||||
|
if (isAllDiff && aDiff < 0)
|
||||||
|
aDiff = -aDiff;
|
||||||
|
if (aDiff > anEps)
|
||||||
|
{
|
||||||
|
if (aDiff > aMaxE)
|
||||||
|
aMaxE = aDiff;
|
||||||
|
|
||||||
|
aBB.Add(aBadEdges, anE);
|
||||||
|
}
|
||||||
|
TopExp::Vertices(aRefE, aRefV[0], aRefV[1]);
|
||||||
|
TopExp::Vertices(anE, aV[0], aV[1]);
|
||||||
|
|
||||||
|
for (int i = 0; i < 2; ++i)
|
||||||
|
{
|
||||||
|
if (aRefV[i].IsNull())
|
||||||
|
continue;
|
||||||
|
if (!aChecked.Add(aV[i]))
|
||||||
|
continue;
|
||||||
|
aTolRef = BRep_Tool::Tolerance(aRefV[i]);
|
||||||
|
aTol = BRep_Tool::Tolerance(aV[i]);
|
||||||
|
aDiff = aTol - aTolRef;
|
||||||
|
if (aDiff > anEps)
|
||||||
|
{
|
||||||
|
if (aDiff > aMaxV)
|
||||||
|
aMaxV = aDiff;
|
||||||
|
|
||||||
|
aBB.Add(aBadVerts, aV[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
anExp.Next();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aMaxE > anEps)
|
||||||
|
{
|
||||||
|
theDi << " Maximal difference for edges : " << aMaxE << "\n";
|
||||||
|
DBRep::Set("BadEdges", aBadEdges);
|
||||||
|
}
|
||||||
|
if (aMaxV > anEps)
|
||||||
|
{
|
||||||
|
theDi << " Maximal difference for vertices : " << aMaxV << "\n";
|
||||||
|
DBRep::Set("BadVerts", aBadVerts);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void QABugs::Commands_20(Draw_Interpretor& theCommands) {
|
void QABugs::Commands_20(Draw_Interpretor& theCommands) {
|
||||||
@@ -4466,6 +4580,10 @@ void QABugs::Commands_20(Draw_Interpretor& theCommands) {
|
|||||||
"QACheckBends curve [CosMaxAngle [theNbPoints]]",
|
"QACheckBends curve [CosMaxAngle [theNbPoints]]",
|
||||||
__FILE__,
|
__FILE__,
|
||||||
QACheckBends, group);
|
QACheckBends, group);
|
||||||
|
theCommands.Add("OCC26441",
|
||||||
|
"OCC26441 shape ref_shape [tol [all_diff 0/1]] \nif all_diff = 0, only icreasing tolerances is considered" ,
|
||||||
|
__FILE__,
|
||||||
|
OCC26441, group);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@@ -221,6 +221,10 @@
|
|||||||
#include <StepVisual_TessellatedCurveSet.hxx>
|
#include <StepVisual_TessellatedCurveSet.hxx>
|
||||||
#include <StepVisual_CoordinatesList.hxx>
|
#include <StepVisual_CoordinatesList.hxx>
|
||||||
#include <NCollection_Vector.hxx>
|
#include <NCollection_Vector.hxx>
|
||||||
|
#include <StepVisual_OverRidingStyledItem.hxx>
|
||||||
|
#include <StepVisual_ContextDependentOverRidingStyledItem.hxx>
|
||||||
|
#include <StepRepr_ShapeRepresentationRelationshipWithTransformation.hxx>
|
||||||
|
#include <StepRepr_ItemDefinedTransformation.hxx>
|
||||||
|
|
||||||
#include <TColgp_HArray1OfXYZ.hxx>
|
#include <TColgp_HArray1OfXYZ.hxx>
|
||||||
#include <BRepBuilderAPI_MakeEdge.hxx>
|
#include <BRepBuilderAPI_MakeEdge.hxx>
|
||||||
@@ -937,6 +941,306 @@ static void propagateColorToParts(const Handle(XCAFDoc_ShapeTool)& theSTool,
|
|||||||
propagateColorToParts(theSTool, theCTool, anOriginalL);
|
propagateColorToParts(theSTool, theCTool, anOriginalL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : SetAssemblyComponentStyle
|
||||||
|
//purpose : auxiliary: set override style for assembly components
|
||||||
|
//=======================================================================
|
||||||
|
|
||||||
|
static void SetAssemblyComponentStyle(const Handle(Transfer_TransientProcess) &theTP,
|
||||||
|
const Handle(XCAFDoc_ColorTool)& theCTool,
|
||||||
|
const STEPConstruct_Styles& theStyles,
|
||||||
|
const Handle(StepVisual_ContextDependentOverRidingStyledItem)& theStyle)
|
||||||
|
{
|
||||||
|
if (theStyle.IsNull()) return;
|
||||||
|
|
||||||
|
Handle(StepVisual_Colour) aSurfCol, aBoundCol, aCurveCol, aRenderCol;
|
||||||
|
Standard_Real aRenderTransp;
|
||||||
|
// check if it is component style
|
||||||
|
Standard_Boolean anIsComponent = Standard_False;
|
||||||
|
if (!theStyles.GetColors(theStyle, aSurfCol, aBoundCol, aCurveCol, aRenderCol, aRenderTransp, anIsComponent))
|
||||||
|
return;
|
||||||
|
|
||||||
|
const Interface_Graph& aGraph = theTP->Graph();
|
||||||
|
TopLoc_Location aLoc; // init;
|
||||||
|
// find shape
|
||||||
|
TopoDS_Shape aShape;
|
||||||
|
Handle(Transfer_Binder) aBinder;
|
||||||
|
Handle(StepShape_ShapeRepresentation) aRepr = Handle(StepShape_ShapeRepresentation)::DownCast(theStyle->ItemAP242 ().Value ());
|
||||||
|
if (aRepr.IsNull())
|
||||||
|
return;
|
||||||
|
Handle(StepRepr_ShapeRepresentationRelationship) aSRR;
|
||||||
|
Interface_EntityIterator aSubs = theTP->Graph().Sharings(aRepr);
|
||||||
|
for (aSubs.Start(); aSubs.More(); aSubs.Next()) {
|
||||||
|
const Handle(Standard_Transient)& aSubsVal = aSubs.Value();
|
||||||
|
if (aSubsVal->IsKind (STANDARD_TYPE(StepRepr_ShapeRepresentationRelationship)))
|
||||||
|
{
|
||||||
|
// NB: C cast is used instead of DownCast() to improve performance on some cases.
|
||||||
|
// This saves ~10% of elapsed time on "testgrid perf de bug29* -parallel 0".
|
||||||
|
aSRR = (StepRepr_ShapeRepresentationRelationship*)(aSubsVal.get());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
aBinder = theTP->Find(aSRR);
|
||||||
|
if (!aBinder.IsNull() ) {
|
||||||
|
aShape = TransferBRep::ShapeResult (aBinder);
|
||||||
|
}
|
||||||
|
if (aShape.IsNull())
|
||||||
|
return;
|
||||||
|
|
||||||
|
//get transformation
|
||||||
|
aSubs = aGraph.Shareds (theStyle);
|
||||||
|
aSubs.Start();
|
||||||
|
for(; aSubs.More(); aSubs.Next())
|
||||||
|
{
|
||||||
|
Handle(StepRepr_ShapeRepresentationRelationshipWithTransformation) aRelation = Handle(StepRepr_ShapeRepresentationRelationshipWithTransformation)::DownCast (aSubs.Value ());
|
||||||
|
if(aRelation.IsNull()) continue;
|
||||||
|
|
||||||
|
auto aTransf = aRelation->TransformationOperator ();
|
||||||
|
if(auto anItemTransf = aTransf.ItemDefinedTransformation ())
|
||||||
|
{
|
||||||
|
Handle(StepGeom_Axis2Placement3d) anAxp1 = Handle(StepGeom_Axis2Placement3d)::DownCast(anItemTransf->TransformItem1 ());
|
||||||
|
Handle(StepGeom_Axis2Placement3d) anAxp2 = Handle(StepGeom_Axis2Placement3d)::DownCast(anItemTransf->TransformItem2 ());
|
||||||
|
|
||||||
|
if(!anAxp1.IsNull() && !anAxp2.IsNull())
|
||||||
|
{
|
||||||
|
Handle(Geom_Axis2Placement) anOrig = StepToGeom::MakeAxis2Placement (anAxp1);
|
||||||
|
Handle(Geom_Axis2Placement) aTarg = StepToGeom::MakeAxis2Placement (anAxp2);
|
||||||
|
gp_Ax3 anAx3Orig(anOrig->Ax2());
|
||||||
|
gp_Ax3 anAx3Targ(aTarg->Ax2());
|
||||||
|
|
||||||
|
gp_Trsf aTr1;
|
||||||
|
aTr1.SetTransformation(anAx3Targ, anAx3Orig);
|
||||||
|
TopLoc_Location aLoc1 (aTr1);
|
||||||
|
aLoc = aLoc.Multiplied(aLoc1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
aShape.Location( aLoc, Standard_False );
|
||||||
|
|
||||||
|
if(!aSurfCol.IsNull() || !aBoundCol.IsNull() || !aCurveCol.IsNull() || !aRenderCol.IsNull())
|
||||||
|
{
|
||||||
|
Quantity_Color aSCol,aBCol,aCCol,aRCol;
|
||||||
|
Quantity_ColorRGBA aFullSCol;
|
||||||
|
if(!aSurfCol.IsNull()) {
|
||||||
|
theStyles.DecodeColor(aSurfCol,aSCol);
|
||||||
|
aFullSCol = Quantity_ColorRGBA(aSCol);
|
||||||
|
}
|
||||||
|
if(!aBoundCol.IsNull())
|
||||||
|
theStyles.DecodeColor(aBoundCol,aBCol);
|
||||||
|
if(!aCurveCol.IsNull())
|
||||||
|
theStyles.DecodeColor(aCurveCol,aCCol);
|
||||||
|
if(!aRenderCol.IsNull()) {
|
||||||
|
theStyles.DecodeColor(aRenderCol,aRCol);
|
||||||
|
aFullSCol = Quantity_ColorRGBA(aRCol,static_cast<float>(1.0f - aRenderTransp));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!aSurfCol.IsNull() || !aRenderCol.IsNull())
|
||||||
|
theCTool->SetInstanceColor(aShape,XCAFDoc_ColorSurf,aFullSCol);
|
||||||
|
if(!aBoundCol.IsNull())
|
||||||
|
theCTool->SetInstanceColor(aShape,XCAFDoc_ColorCurv,aBCol);
|
||||||
|
if(!aCurveCol.IsNull())
|
||||||
|
theCTool->SetInstanceColor(aShape,XCAFDoc_ColorCurv,aCCol);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : SetStyle
|
||||||
|
//purpose : auxiliary: set style for parts and instances
|
||||||
|
//=======================================================================
|
||||||
|
|
||||||
|
static void SetStyle(const Handle(XSControl_WorkSession) &theWS,
|
||||||
|
const XCAFDoc_DataMapOfShapeLabel& theMap,
|
||||||
|
const Handle(XCAFDoc_ColorTool)& theCTool,
|
||||||
|
const Handle(XCAFDoc_ShapeTool)& theSTool,
|
||||||
|
const STEPConstruct_Styles& theStyles,
|
||||||
|
const Handle(TColStd_HSequenceOfTransient)& theHSeqOfInvisStyle,
|
||||||
|
const Handle(StepVisual_StyledItem)& theStyle)
|
||||||
|
{
|
||||||
|
if (theStyle.IsNull()) return;
|
||||||
|
|
||||||
|
const Handle(Transfer_TransientProcess) &aTP = theWS->TransferReader()->TransientProcess();
|
||||||
|
if (Handle(StepVisual_OverRidingStyledItem) anOverridingStyle = Handle(StepVisual_OverRidingStyledItem)::DownCast (theStyle))
|
||||||
|
{
|
||||||
|
SetStyle (theWS, theMap, theCTool, theSTool, theStyles, theHSeqOfInvisStyle, anOverridingStyle->OverRiddenStyle ());
|
||||||
|
if (Handle(StepVisual_ContextDependentOverRidingStyledItem) anAssemblyComponentStyle = Handle(StepVisual_ContextDependentOverRidingStyledItem)::DownCast (theStyle))
|
||||||
|
{
|
||||||
|
SetAssemblyComponentStyle (aTP, theCTool, theStyles,anAssemblyComponentStyle);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Standard_Boolean anIsVisible = Standard_True;
|
||||||
|
// check the visibility of styled item.
|
||||||
|
for (Standard_Integer si = 1; si <= theHSeqOfInvisStyle->Length(); si++) {
|
||||||
|
if (theStyle != theHSeqOfInvisStyle->Value(si))
|
||||||
|
continue;
|
||||||
|
// found that current style is invisible.
|
||||||
|
anIsVisible = Standard_False;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Handle(StepVisual_Colour) aSurfCol, aBoundCol, aCurveCol, aRenderCol;
|
||||||
|
Standard_Real aRenderTransp;
|
||||||
|
// check if it is component style
|
||||||
|
Standard_Boolean anIsComponent = Standard_False;
|
||||||
|
if (!theStyles.GetColors(theStyle, aSurfCol, aBoundCol, aCurveCol, aRenderCol, aRenderTransp, anIsComponent) && anIsVisible)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// collect styled items
|
||||||
|
NCollection_Vector<StepVisual_StyledItemTarget> anItems;
|
||||||
|
if (!theStyle->ItemAP242().IsNull()) {
|
||||||
|
anItems.Append(theStyle->ItemAP242());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Standard_Integer itemIt = 0; itemIt < anItems.Length(); itemIt++) {
|
||||||
|
Standard_Integer anIndex = aTP->MapIndex(anItems.Value(itemIt).Value());
|
||||||
|
TopoDS_Shape aS;
|
||||||
|
if (anIndex > 0) {
|
||||||
|
Handle(Transfer_Binder) aBinder = aTP->MapItem(anIndex);
|
||||||
|
aS = TransferBRep::ShapeResult(aBinder);
|
||||||
|
}
|
||||||
|
Standard_Boolean isSkipSHUOstyle = Standard_False;
|
||||||
|
// take shape with real location.
|
||||||
|
while (anIsComponent) {
|
||||||
|
// take SR of NAUO
|
||||||
|
Handle(StepShape_ShapeRepresentation) aSR;
|
||||||
|
findStyledSR(theStyle, aSR);
|
||||||
|
// search for SR along model
|
||||||
|
if (aSR.IsNull())
|
||||||
|
break;
|
||||||
|
Interface_EntityIterator aSubs = theWS->HGraph()->Graph().Sharings(aSR);
|
||||||
|
Handle(StepShape_ShapeDefinitionRepresentation) aSDR;
|
||||||
|
for (aSubs.Start(); aSubs.More(); aSubs.Next()) {
|
||||||
|
aSDR = Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(aSubs.Value());
|
||||||
|
if (aSDR.IsNull())
|
||||||
|
continue;
|
||||||
|
StepRepr_RepresentedDefinition aPDSselect = aSDR->Definition();
|
||||||
|
Handle(StepRepr_ProductDefinitionShape) PDS =
|
||||||
|
Handle(StepRepr_ProductDefinitionShape)::DownCast(aPDSselect.PropertyDefinition());
|
||||||
|
if (PDS.IsNull())
|
||||||
|
continue;
|
||||||
|
StepRepr_CharacterizedDefinition aCharDef = PDS->Definition();
|
||||||
|
|
||||||
|
Handle(StepRepr_AssemblyComponentUsage) ACU =
|
||||||
|
Handle(StepRepr_AssemblyComponentUsage)::DownCast(aCharDef.ProductDefinitionRelationship());
|
||||||
|
if (ACU.IsNull())
|
||||||
|
continue;
|
||||||
|
// PTV 10.02.2003 skip styled item that refer to SHUO
|
||||||
|
if (ACU->IsKind(STANDARD_TYPE(StepRepr_SpecifiedHigherUsageOccurrence))) {
|
||||||
|
isSkipSHUOstyle = Standard_True;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Handle(StepRepr_NextAssemblyUsageOccurrence) NAUO =
|
||||||
|
Handle(StepRepr_NextAssemblyUsageOccurrence)::DownCast(ACU);
|
||||||
|
if (NAUO.IsNull())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
TopoDS_Shape aSh;
|
||||||
|
// PTV 10.02.2003 to find component of assembly CORRECTLY
|
||||||
|
STEPConstruct_Tool aTool(theWS);
|
||||||
|
TDF_Label aShLab = STEPCAFControl_Reader::FindInstance(NAUO, theCTool->ShapeTool(), aTool, theMap);
|
||||||
|
aSh = theCTool->ShapeTool()->GetShape(aShLab);
|
||||||
|
if (!aSh.IsNull()) {
|
||||||
|
aS = aSh;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (isSkipSHUOstyle)
|
||||||
|
continue; // skip styled item which refer to SHUO
|
||||||
|
|
||||||
|
if (aS.IsNull())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!aSurfCol.IsNull() || !aBoundCol.IsNull() || !aCurveCol.IsNull() || !aRenderCol.IsNull() || !anIsVisible)
|
||||||
|
{
|
||||||
|
TDF_Label aL;
|
||||||
|
Standard_Boolean isFound = theSTool->SearchUsingMap(aS, aL, Standard_False, Standard_True);
|
||||||
|
if (!aSurfCol.IsNull() || !aBoundCol.IsNull() || !aCurveCol.IsNull() || !aRenderCol.IsNull())
|
||||||
|
{
|
||||||
|
Quantity_Color aSCol, aBCol, aCCol, aRCol;
|
||||||
|
Quantity_ColorRGBA aFullSCol;
|
||||||
|
if (!aSurfCol.IsNull()) {
|
||||||
|
theStyles.DecodeColor(aSurfCol, aSCol);
|
||||||
|
aFullSCol = Quantity_ColorRGBA(aSCol);
|
||||||
|
}
|
||||||
|
if (!aBoundCol.IsNull())
|
||||||
|
theStyles.DecodeColor(aBoundCol, aBCol);
|
||||||
|
if (!aCurveCol.IsNull())
|
||||||
|
theStyles.DecodeColor(aCurveCol, aCCol);
|
||||||
|
if (!aRenderCol.IsNull()) {
|
||||||
|
theStyles.DecodeColor(aRenderCol, aRCol);
|
||||||
|
aFullSCol = Quantity_ColorRGBA(aRCol, static_cast<float>(1.0f - aRenderTransp));
|
||||||
|
}
|
||||||
|
if (isFound)
|
||||||
|
{
|
||||||
|
if (!aSurfCol.IsNull() || !aRenderCol.IsNull())
|
||||||
|
theCTool->SetColor(aL, aFullSCol, XCAFDoc_ColorSurf);
|
||||||
|
if (!aBoundCol.IsNull())
|
||||||
|
theCTool->SetColor(aL, aBCol, XCAFDoc_ColorCurv);
|
||||||
|
if (!aCurveCol.IsNull())
|
||||||
|
theCTool->SetColor(aL, aCCol, XCAFDoc_ColorCurv);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (TopoDS_Iterator it(aS); it.More(); it.Next())
|
||||||
|
{
|
||||||
|
TDF_Label aL1;
|
||||||
|
if (theSTool->SearchUsingMap(it.Value(), aL1, Standard_False, Standard_True))
|
||||||
|
{
|
||||||
|
if (!aSurfCol.IsNull() || !aRenderCol.IsNull())
|
||||||
|
theCTool->SetColor(aL1, aFullSCol, XCAFDoc_ColorSurf);
|
||||||
|
if (!aBoundCol.IsNull())
|
||||||
|
theCTool->SetColor(aL1, aBCol, XCAFDoc_ColorCurv);
|
||||||
|
if (!aCurveCol.IsNull())
|
||||||
|
theCTool->SetColor(aL1, aCCol, XCAFDoc_ColorCurv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!anIsVisible)
|
||||||
|
{
|
||||||
|
// sets the invisibility for shape.
|
||||||
|
if (isFound)
|
||||||
|
theCTool->SetVisibility(aL, Standard_False);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : IsOverriden
|
||||||
|
//purpose : auxiliary: check that style is overridden
|
||||||
|
//=======================================================================
|
||||||
|
|
||||||
|
static Standard_Boolean IsOverriden(const Interface_Graph& theGraph,
|
||||||
|
const Handle(StepVisual_StyledItem)& theStyle,
|
||||||
|
Standard_Boolean theIsRoot)
|
||||||
|
{
|
||||||
|
Interface_EntityIterator aSubs = theGraph.Sharings (theStyle);
|
||||||
|
aSubs.Start();
|
||||||
|
for(; aSubs.More(); aSubs.Next())
|
||||||
|
{
|
||||||
|
Handle(StepVisual_OverRidingStyledItem) anOverRidingStyle = Handle(StepVisual_OverRidingStyledItem)::DownCast (aSubs.Value ());
|
||||||
|
if(!anOverRidingStyle.IsNull())
|
||||||
|
{
|
||||||
|
if(!theIsRoot)
|
||||||
|
{
|
||||||
|
return Standard_True;
|
||||||
|
}
|
||||||
|
// for root style returns true only if it is overridden by other root style
|
||||||
|
auto anItem = anOverRidingStyle->ItemAP242 ().Value ();
|
||||||
|
if(!anItem.IsNull() && anItem->IsKind(STANDARD_TYPE(StepShape_ShapeRepresentation)))
|
||||||
|
{
|
||||||
|
return Standard_True;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Standard_False;
|
||||||
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : ReadColors
|
//function : ReadColors
|
||||||
//purpose :
|
//purpose :
|
||||||
@@ -961,152 +1265,36 @@ Standard_Boolean STEPCAFControl_Reader::ReadColors(const Handle(XSControl_WorkSe
|
|||||||
Handle(XCAFDoc_ShapeTool) STool = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
|
Handle(XCAFDoc_ShapeTool) STool = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
|
||||||
if (STool.IsNull()) return Standard_False;
|
if (STool.IsNull()) return Standard_False;
|
||||||
|
|
||||||
|
const Interface_Graph& aGraph = Styles.Graph ();
|
||||||
|
|
||||||
// parse and search for color attributes
|
// parse and search for color attributes
|
||||||
Standard_Integer nb = Styles.NbStyles();
|
Standard_Integer nb = Styles.NbRootStyles();
|
||||||
for (Standard_Integer i = 1; i <= nb; i++) {
|
// apply root styles earlier, as they can be overridden
|
||||||
Handle(StepVisual_StyledItem) style = Styles.Style(i);
|
// function IsOverriden for root style returns true only if it is overridden by other root style
|
||||||
if (style.IsNull()) continue;
|
Standard_Boolean anIsRootStyle = Standard_True;
|
||||||
|
for(Standard_Integer i = 1; i <= nb; i++)
|
||||||
Standard_Boolean IsVisible = Standard_True;
|
{
|
||||||
// check the visibility of styled item.
|
Handle(StepVisual_StyledItem) Style = Styles.RootStyle(i);
|
||||||
for (Standard_Integer si = 1; si <= aHSeqOfInvisStyle->Length(); si++) {
|
// check that style is overridden by other root style
|
||||||
if (style != aHSeqOfInvisStyle->Value(si))
|
if (!IsOverriden (aGraph, Style, anIsRootStyle))
|
||||||
continue;
|
{
|
||||||
// found that current style is invisible.
|
SetStyle (WS, myMap, CTool, STool, Styles, aHSeqOfInvisStyle, Style);
|
||||||
IsVisible = Standard_False;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
Handle(StepVisual_Colour) SurfCol, BoundCol, CurveCol, RenderCol;
|
|
||||||
Standard_Real RenderTransp;
|
|
||||||
// check if it is component style
|
|
||||||
Standard_Boolean IsComponent = Standard_False;
|
|
||||||
if (!Styles.GetColors(style, SurfCol, BoundCol, CurveCol, RenderCol, RenderTransp, IsComponent) && IsVisible)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// collect styled items
|
|
||||||
NCollection_Vector<StepVisual_StyledItemTarget> anItems;
|
|
||||||
if (!style->ItemAP242().IsNull()) {
|
|
||||||
anItems.Append(style->ItemAP242());
|
|
||||||
}
|
|
||||||
|
|
||||||
const Handle(Transfer_TransientProcess) &TP = WS->TransferReader()->TransientProcess();
|
|
||||||
for (Standard_Integer itemIt = 0; itemIt < anItems.Length(); itemIt++) {
|
|
||||||
Standard_Integer index = TP->MapIndex(anItems.Value(itemIt).Value());
|
|
||||||
TopoDS_Shape S;
|
|
||||||
if (index > 0) {
|
|
||||||
Handle(Transfer_Binder) binder = TP->MapItem(index);
|
|
||||||
S = TransferBRep::ShapeResult(binder);
|
|
||||||
}
|
|
||||||
Standard_Boolean isSkipSHUOstyle = Standard_False;
|
|
||||||
// take shape with real location.
|
|
||||||
while (IsComponent) {
|
|
||||||
// take SR of NAUO
|
|
||||||
Handle(StepShape_ShapeRepresentation) aSR;
|
|
||||||
findStyledSR(style, aSR);
|
|
||||||
// search for SR along model
|
|
||||||
if (aSR.IsNull())
|
|
||||||
break;
|
|
||||||
Interface_EntityIterator subs = WS->HGraph()->Graph().Sharings(aSR);
|
|
||||||
Handle(StepShape_ShapeDefinitionRepresentation) aSDR;
|
|
||||||
for (subs.Start(); subs.More(); subs.Next()) {
|
|
||||||
aSDR = Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(subs.Value());
|
|
||||||
if (aSDR.IsNull())
|
|
||||||
continue;
|
|
||||||
StepRepr_RepresentedDefinition aPDSselect = aSDR->Definition();
|
|
||||||
Handle(StepRepr_ProductDefinitionShape) PDS =
|
|
||||||
Handle(StepRepr_ProductDefinitionShape)::DownCast(aPDSselect.PropertyDefinition());
|
|
||||||
if (PDS.IsNull())
|
|
||||||
continue;
|
|
||||||
StepRepr_CharacterizedDefinition aCharDef = PDS->Definition();
|
|
||||||
|
|
||||||
Handle(StepRepr_AssemblyComponentUsage) ACU =
|
|
||||||
Handle(StepRepr_AssemblyComponentUsage)::DownCast(aCharDef.ProductDefinitionRelationship());
|
|
||||||
if (ACU.IsNull())
|
|
||||||
continue;
|
|
||||||
// PTV 10.02.2003 skip styled item that refer to SHUO
|
|
||||||
if (ACU->IsKind(STANDARD_TYPE(StepRepr_SpecifiedHigherUsageOccurrence))) {
|
|
||||||
isSkipSHUOstyle = Standard_True;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Handle(StepRepr_NextAssemblyUsageOccurrence) NAUO =
|
|
||||||
Handle(StepRepr_NextAssemblyUsageOccurrence)::DownCast(ACU);
|
|
||||||
if (NAUO.IsNull())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
TopoDS_Shape aSh;
|
|
||||||
// PTV 10.02.2003 to find component of assembly CORRECTLY
|
|
||||||
STEPConstruct_Tool Tool(WS);
|
|
||||||
TDF_Label aShLab = FindInstance(NAUO, CTool->ShapeTool(), Tool, myMap);
|
|
||||||
aSh = CTool->ShapeTool()->GetShape(aShLab);
|
|
||||||
if (!aSh.IsNull()) {
|
|
||||||
S = aSh;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (isSkipSHUOstyle)
|
|
||||||
continue; // skip styled item which refer to SHUO
|
|
||||||
|
|
||||||
if (S.IsNull())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!SurfCol.IsNull() || !BoundCol.IsNull() || !CurveCol.IsNull() || !RenderCol.IsNull() || !IsVisible)
|
|
||||||
{
|
|
||||||
TDF_Label aL;
|
|
||||||
Standard_Boolean isFound = STool->SearchUsingMap(S, aL, Standard_False, Standard_True);
|
|
||||||
if (!SurfCol.IsNull() || !BoundCol.IsNull() || !CurveCol.IsNull() || !RenderCol.IsNull())
|
|
||||||
{
|
|
||||||
Quantity_Color aSCol, aBCol, aCCol, aRCol;
|
|
||||||
Quantity_ColorRGBA aFullSCol;
|
|
||||||
if (!SurfCol.IsNull()) {
|
|
||||||
Styles.DecodeColor(SurfCol, aSCol);
|
|
||||||
aFullSCol = Quantity_ColorRGBA(aSCol);
|
|
||||||
}
|
|
||||||
if (!BoundCol.IsNull())
|
|
||||||
Styles.DecodeColor(BoundCol, aBCol);
|
|
||||||
if (!CurveCol.IsNull())
|
|
||||||
Styles.DecodeColor(CurveCol, aCCol);
|
|
||||||
if (!RenderCol.IsNull()) {
|
|
||||||
Styles.DecodeColor(RenderCol, aRCol);
|
|
||||||
aFullSCol = Quantity_ColorRGBA(aRCol, static_cast<float>(1.0f - RenderTransp));
|
|
||||||
}
|
|
||||||
if (isFound)
|
|
||||||
{
|
|
||||||
if (!SurfCol.IsNull() || !RenderCol.IsNull())
|
|
||||||
CTool->SetColor(aL, aFullSCol, XCAFDoc_ColorSurf);
|
|
||||||
if (!BoundCol.IsNull())
|
|
||||||
CTool->SetColor(aL, aBCol, XCAFDoc_ColorCurv);
|
|
||||||
if (!CurveCol.IsNull())
|
|
||||||
CTool->SetColor(aL, aCCol, XCAFDoc_ColorCurv);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (TopoDS_Iterator it(S); it.More(); it.Next())
|
|
||||||
{
|
|
||||||
TDF_Label aL1;
|
|
||||||
if (STool->SearchUsingMap(it.Value(), aL1, Standard_False, Standard_True))
|
|
||||||
{
|
|
||||||
if (!SurfCol.IsNull() || !RenderCol.IsNull())
|
|
||||||
CTool->SetColor(aL1, aFullSCol, XCAFDoc_ColorSurf);
|
|
||||||
if (!BoundCol.IsNull())
|
|
||||||
CTool->SetColor(aL1, aBCol, XCAFDoc_ColorCurv);
|
|
||||||
if (!CurveCol.IsNull())
|
|
||||||
CTool->SetColor(aL1, aCCol, XCAFDoc_ColorCurv);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!IsVisible)
|
|
||||||
{
|
|
||||||
// sets the invisibility for shape.
|
|
||||||
if (isFound)
|
|
||||||
CTool->SetVisibility(aL, Standard_False);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nb = Styles.NbStyles();
|
||||||
|
// apply leaf styles, they can override root styles
|
||||||
|
anIsRootStyle = Standard_False;
|
||||||
|
for(Standard_Integer i = 1; i <= nb; i++)
|
||||||
|
{
|
||||||
|
Handle(StepVisual_StyledItem) Style = Styles.Style(i);
|
||||||
|
// check that style is overridden
|
||||||
|
if (!IsOverriden (aGraph, Style, anIsRootStyle))
|
||||||
|
{
|
||||||
|
SetStyle (WS, myMap, CTool, STool, Styles, aHSeqOfInvisStyle, Style);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
CTool->ReverseChainsOfTreeNodes();
|
CTool->ReverseChainsOfTreeNodes();
|
||||||
|
|
||||||
// some colors can be attached to assemblies, propagate them to components
|
// some colors can be attached to assemblies, propagate them to components
|
||||||
|
@@ -68,6 +68,8 @@
|
|||||||
#include <XSControl_TransferReader.hxx>
|
#include <XSControl_TransferReader.hxx>
|
||||||
#include <XSControl_TransferWriter.hxx>
|
#include <XSControl_TransferWriter.hxx>
|
||||||
#include <XSControl_WorkSession.hxx>
|
#include <XSControl_WorkSession.hxx>
|
||||||
|
#include <StepVisual_ContextDependentOverRidingStyledItem.hxx>
|
||||||
|
#include <StepShape_ShapeRepresentation.hxx>
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : STEPConstruct_Styles
|
//function : STEPConstruct_Styles
|
||||||
@@ -124,6 +126,26 @@ Handle(StepVisual_StyledItem) STEPConstruct_Styles::Style (const Standard_Intege
|
|||||||
return Handle(StepVisual_StyledItem)::DownCast ( myStyles.FindKey(i) );
|
return Handle(StepVisual_StyledItem)::DownCast ( myStyles.FindKey(i) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : NbRootStyles
|
||||||
|
//purpose :
|
||||||
|
//=======================================================================
|
||||||
|
|
||||||
|
Standard_Integer STEPConstruct_Styles::NbRootStyles () const
|
||||||
|
{
|
||||||
|
return myRootStyles.Extent();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : RootStyle
|
||||||
|
//purpose :
|
||||||
|
//=======================================================================
|
||||||
|
|
||||||
|
Handle(StepVisual_StyledItem) STEPConstruct_Styles::RootStyle (const Standard_Integer i) const
|
||||||
|
{
|
||||||
|
return Handle(StepVisual_StyledItem)::DownCast ( myRootStyles.FindKey(i) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : ClearStyles
|
//function : ClearStyles
|
||||||
@@ -134,6 +156,7 @@ void STEPConstruct_Styles::ClearStyles ()
|
|||||||
{
|
{
|
||||||
myStyles.Clear();
|
myStyles.Clear();
|
||||||
myPSA.Clear();
|
myPSA.Clear();
|
||||||
|
myRootStyles.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -344,13 +367,15 @@ Standard_Boolean STEPConstruct_Styles::LoadStyles ()
|
|||||||
{
|
{
|
||||||
myStyles.Clear();
|
myStyles.Clear();
|
||||||
myPSA.Clear();
|
myPSA.Clear();
|
||||||
|
myRootStyles.Clear();
|
||||||
|
|
||||||
// find all MDGPRs and DMs and collect all defined styles in myStyles
|
// find all MDGPRs and DMs and collect all defined styles in myStyles
|
||||||
Handle(Interface_InterfaceModel) model = Model();
|
Handle(Interface_InterfaceModel) model = Model();
|
||||||
Standard_Integer nb = model->NbEntities();
|
Standard_Integer nb = model->NbEntities();
|
||||||
Handle(Standard_Type) tMDGPR = STANDARD_TYPE(StepVisual_MechanicalDesignGeometricPresentationRepresentation);
|
Handle(Standard_Type) tMDGPR = STANDARD_TYPE(StepVisual_MechanicalDesignGeometricPresentationRepresentation);
|
||||||
Handle(Standard_Type) tDM = STANDARD_TYPE(StepVisual_DraughtingModel);
|
Handle(Standard_Type) tDM = STANDARD_TYPE(StepVisual_DraughtingModel);
|
||||||
Handle(Standard_Type) tSI = STANDARD_TYPE(StepVisual_StyledItem);
|
Handle(Standard_Type) tSI = STANDARD_TYPE(StepVisual_StyledItem);
|
||||||
|
Handle(Standard_Type) tSR = STANDARD_TYPE(StepShape_ShapeRepresentation);
|
||||||
for (Standard_Integer i = 1; i <= nb; i ++)
|
for (Standard_Integer i = 1; i <= nb; i ++)
|
||||||
{
|
{
|
||||||
Handle(Standard_Transient) enti = model->Value(i);
|
Handle(Standard_Transient) enti = model->Value(i);
|
||||||
@@ -364,13 +389,26 @@ Standard_Boolean STEPConstruct_Styles::LoadStyles ()
|
|||||||
Handle(StepVisual_StyledItem) style =
|
Handle(StepVisual_StyledItem) style =
|
||||||
Handle(StepVisual_StyledItem)::DownCast ( container->ItemsValue(j) );
|
Handle(StepVisual_StyledItem)::DownCast ( container->ItemsValue(j) );
|
||||||
if ( style.IsNull() ) continue;
|
if ( style.IsNull() ) continue;
|
||||||
myStyles.Add ( style );
|
auto anItem = style->ItemAP242 ().Value ();
|
||||||
|
if (!anItem.IsNull() && anItem->IsKind(tSR))
|
||||||
|
{
|
||||||
|
myRootStyles.Add (style);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
myStyles.Add (style);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (enti->DynamicType() == tSI)
|
else if (enti->IsKind (STANDARD_TYPE(StepVisual_StyledItem)))
|
||||||
{
|
{
|
||||||
Handle(StepVisual_StyledItem) aStyledItem = Handle(StepVisual_StyledItem)::DownCast (enti);
|
Handle(StepVisual_StyledItem) aStyledItem = Handle(StepVisual_StyledItem)::DownCast (enti);
|
||||||
if (!myStyles.Contains (aStyledItem))
|
auto anItem = aStyledItem->ItemAP242 ().Value ();
|
||||||
|
if (!anItem.IsNull() && anItem->IsKind(tSR) && !myRootStyles.Contains (aStyledItem))
|
||||||
|
{
|
||||||
|
myRootStyles.Add (aStyledItem);
|
||||||
|
}
|
||||||
|
else if (!myStyles.Contains (aStyledItem))
|
||||||
{
|
{
|
||||||
myStyles.Add (aStyledItem);
|
myStyles.Add (aStyledItem);
|
||||||
}
|
}
|
||||||
|
@@ -69,6 +69,12 @@ public:
|
|||||||
|
|
||||||
//! Returns style with given index
|
//! Returns style with given index
|
||||||
Standard_EXPORT Handle(StepVisual_StyledItem) Style (const Standard_Integer i) const;
|
Standard_EXPORT Handle(StepVisual_StyledItem) Style (const Standard_Integer i) const;
|
||||||
|
|
||||||
|
//! Returns number of override styles
|
||||||
|
Standard_EXPORT Standard_Integer NbRootStyles() const;
|
||||||
|
|
||||||
|
//! Returns override style with given index
|
||||||
|
Standard_EXPORT Handle(StepVisual_StyledItem) RootStyle (const Standard_Integer i) const;
|
||||||
|
|
||||||
//! Clears all defined styles and PSA sequence
|
//! Clears all defined styles and PSA sequence
|
||||||
Standard_EXPORT void ClearStyles();
|
Standard_EXPORT void ClearStyles();
|
||||||
@@ -159,6 +165,7 @@ private:
|
|||||||
|
|
||||||
TColStd_IndexedDataMapOfTransientTransient myMapOfStyles;
|
TColStd_IndexedDataMapOfTransientTransient myMapOfStyles;
|
||||||
TColStd_IndexedMapOfTransient myStyles;
|
TColStd_IndexedMapOfTransient myStyles;
|
||||||
|
TColStd_IndexedMapOfTransient myRootStyles;
|
||||||
TColStd_SequenceOfTransient myPSA;
|
TColStd_SequenceOfTransient myPSA;
|
||||||
|
|
||||||
|
|
||||||
|
@@ -239,6 +239,7 @@ STEPControl_Controller::STEPControl_Controller ()
|
|||||||
Interface_Static::Init ("XSTEP", "FromSTEP.FixShape.FixNonAdjacentIntersectingEdgesMode", 't', "-1");
|
Interface_Static::Init ("XSTEP", "FromSTEP.FixShape.FixNonAdjacentIntersectingEdgesMode", 't', "-1");
|
||||||
Interface_Static::Init ("XSTEP", "FromSTEP.FixShape.FixVertexPositionMode", 't', "0");
|
Interface_Static::Init ("XSTEP", "FromSTEP.FixShape.FixVertexPositionMode", 't', "0");
|
||||||
Interface_Static::Init ("XSTEP", "FromSTEP.FixShape.FixVertexToleranceMode", 't', "-1");
|
Interface_Static::Init ("XSTEP", "FromSTEP.FixShape.FixVertexToleranceMode", 't', "-1");
|
||||||
|
Interface_Static::Init ("XSTEP", "FromSTEP.FixFaceSize.Tolerance", 't', "1.e-7");
|
||||||
|
|
||||||
// ika 28.07.16: Parameter to read all top level solids and shells,
|
// ika 28.07.16: Parameter to read all top level solids and shells,
|
||||||
// should be used only in case of invalid shape_representation without links to shapes.
|
// should be used only in case of invalid shape_representation without links to shapes.
|
||||||
|
@@ -753,7 +753,25 @@ static void ReconstructMissedSeam(const TopTools_SequenceOfShape& theRemovedEdge
|
|||||||
if ((theUperiod != 0. && aUdiff > theUperiod/2) ||
|
if ((theUperiod != 0. && aUdiff > theUperiod/2) ||
|
||||||
(theVperiod != 0. && aVdiff > theVperiod/2))
|
(theVperiod != 0. && aVdiff > theVperiod/2))
|
||||||
{
|
{
|
||||||
anEdge.Reverse();
|
if (aLastVertex.IsSame(theCurVertex) || (theUperiod != 0. && theVperiod != 0.))
|
||||||
|
{
|
||||||
|
anEdge.Reverse();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TopAbs_Orientation anOri = anEdge.Orientation();
|
||||||
|
anEdge.Orientation(TopAbs_FORWARD);
|
||||||
|
Handle(Geom2d_Curve) aPC1 = BRep_Tool::CurveOnSurface(anEdge, theFrefFace, Param1, Param2);
|
||||||
|
anEdge.Reverse();
|
||||||
|
Handle(Geom2d_Curve) aPC2 = BRep_Tool::CurveOnSurface(anEdge, theFrefFace, Param1, Param2);
|
||||||
|
anEdge.Reverse(); // again FORWARD
|
||||||
|
TopLoc_Location aLoc;
|
||||||
|
BRep_Builder aBB;
|
||||||
|
Standard_Real aTol = BRep_Tool::Tolerance(anEdge);
|
||||||
|
const Handle(Geom_Surface)& aSurf = BRep_Tool::Surface(theFrefFace, aLoc);
|
||||||
|
aBB.UpdateEdge(anEdge, aPC2, aPC1, aSurf, aLoc, aTol);
|
||||||
|
anEdge.Orientation(anOri);
|
||||||
|
}
|
||||||
aPC = BRep_Tool::CurveOnSurface(anEdge, theFrefFace, Param1, Param2);
|
aPC = BRep_Tool::CurveOnSurface(anEdge, theFrefFace, Param1, Param2);
|
||||||
aParam = (anEdge.Orientation() == TopAbs_FORWARD)? Param1 : Param2;
|
aParam = (anEdge.Orientation() == TopAbs_FORWARD)? Param1 : Param2;
|
||||||
aPoint = aPC->Value(aParam);
|
aPoint = aPC->Value(aParam);
|
||||||
@@ -2745,6 +2763,26 @@ void ShapeUpgrade_UnifySameDomain::UnifyFaces()
|
|||||||
for (Standard_Integer i = 1; i <= aFaceMap.Extent(); i++)
|
for (Standard_Integer i = 1; i <= aFaceMap.Extent(); i++)
|
||||||
TopExp::MapShapesAndAncestors (aFaceMap(i), TopAbs_EDGE, TopAbs_FACE, aGMapEdgeFaces);
|
TopExp::MapShapesAndAncestors (aFaceMap(i), TopAbs_EDGE, TopAbs_FACE, aGMapEdgeFaces);
|
||||||
|
|
||||||
|
// creating map of face shells for the whole shape to avoid
|
||||||
|
// unification of faces belonging to the different shells
|
||||||
|
DataMapOfShapeMapOfShape aGMapFaceShells;
|
||||||
|
for (TopExp_Explorer anExp (myShape, TopAbs_SHELL); anExp.More(); anExp.Next())
|
||||||
|
{
|
||||||
|
const TopoDS_Shape& aShell = anExp.Current();
|
||||||
|
for (TopoDS_Iterator anItF (aShell); anItF.More(); anItF.Next())
|
||||||
|
{
|
||||||
|
const TopoDS_Shape& aF = anItF.Value();
|
||||||
|
if (TopTools_MapOfShape* pShells = aGMapFaceShells.ChangeSeek (aF))
|
||||||
|
{
|
||||||
|
pShells->Add (aShell);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
(aGMapFaceShells.Bound (aF, TopTools_MapOfShape()))->Add (aShell);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// creating map of free boundaries
|
// creating map of free boundaries
|
||||||
TopTools_MapOfShape aFreeBoundMap;
|
TopTools_MapOfShape aFreeBoundMap;
|
||||||
// look at only shells not belonging to solids
|
// look at only shells not belonging to solids
|
||||||
@@ -2766,7 +2804,7 @@ void ShapeUpgrade_UnifySameDomain::UnifyFaces()
|
|||||||
// unify faces in each shell separately
|
// unify faces in each shell separately
|
||||||
TopExp_Explorer exps;
|
TopExp_Explorer exps;
|
||||||
for (exps.Init(myShape, TopAbs_SHELL); exps.More(); exps.Next())
|
for (exps.Init(myShape, TopAbs_SHELL); exps.More(); exps.Next())
|
||||||
IntUnifyFaces(exps.Current(), aGMapEdgeFaces, aFreeBoundMap);
|
IntUnifyFaces(exps.Current(), aGMapEdgeFaces, aGMapFaceShells, aFreeBoundMap);
|
||||||
|
|
||||||
// gather all faces out of shells in one compound and unify them at once
|
// gather all faces out of shells in one compound and unify them at once
|
||||||
BRep_Builder aBB;
|
BRep_Builder aBB;
|
||||||
@@ -2777,7 +2815,10 @@ void ShapeUpgrade_UnifySameDomain::UnifyFaces()
|
|||||||
aBB.Add(aCmp, exps.Current());
|
aBB.Add(aCmp, exps.Current());
|
||||||
|
|
||||||
if (nbf > 0)
|
if (nbf > 0)
|
||||||
IntUnifyFaces(aCmp, aGMapEdgeFaces, aFreeBoundMap);
|
{
|
||||||
|
// No connection to shells, thus no need to pass the face-shell map
|
||||||
|
IntUnifyFaces(aCmp, aGMapEdgeFaces, DataMapOfShapeMapOfShape(), aFreeBoundMap);
|
||||||
|
}
|
||||||
|
|
||||||
myShape = myContext->Apply(myShape);
|
myShape = myContext->Apply(myShape);
|
||||||
}
|
}
|
||||||
@@ -2800,13 +2841,52 @@ static void SetFixWireModes(ShapeFix_Face& theSff)
|
|||||||
aFixWire->FixSmallMode() = 0;
|
aFixWire->FixSmallMode() = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : isSameSets
|
||||||
|
//purpose : Compares two sets of shapes. Returns true if they are the same,
|
||||||
|
// false otherwise.
|
||||||
|
//=======================================================================
|
||||||
|
|
||||||
|
template<class Container>
|
||||||
|
static Standard_Boolean isSameSets(const Container* theFShells1,
|
||||||
|
const Container* theFShells2)
|
||||||
|
{
|
||||||
|
// If both are null - no problem
|
||||||
|
if (theFShells1 == nullptr && theFShells2 == nullptr)
|
||||||
|
{
|
||||||
|
return Standard_True;
|
||||||
|
}
|
||||||
|
// If only one is null - not the same
|
||||||
|
if (theFShells1 == nullptr || theFShells2 == nullptr)
|
||||||
|
{
|
||||||
|
return Standard_False;
|
||||||
|
}
|
||||||
|
// Both not null
|
||||||
|
if (theFShells1->Extent() != theFShells2->Extent())
|
||||||
|
{
|
||||||
|
return Standard_False;
|
||||||
|
}
|
||||||
|
// number of shells in each set should be very small in normal cases - max 2.
|
||||||
|
// thus just check if all objects of one are contained in the other and vice versa.
|
||||||
|
for (typename Container::Iterator it1(*theFShells1), it2(*theFShells2);
|
||||||
|
it1.More() && it2.More(); it1.Next(), it2.Next())
|
||||||
|
{
|
||||||
|
if (!theFShells1->Contains(it2.Value()) || !theFShells2->Contains(it1.Value()))
|
||||||
|
{
|
||||||
|
return Standard_False;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Standard_True;
|
||||||
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : IntUnifyFaces
|
//function : IntUnifyFaces
|
||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
|
|
||||||
void ShapeUpgrade_UnifySameDomain::IntUnifyFaces(const TopoDS_Shape& theInpShape,
|
void ShapeUpgrade_UnifySameDomain::IntUnifyFaces(const TopoDS_Shape& theInpShape,
|
||||||
TopTools_IndexedDataMapOfShapeListOfShape& theGMapEdgeFaces,
|
const TopTools_IndexedDataMapOfShapeListOfShape& theGMapEdgeFaces,
|
||||||
|
const DataMapOfShapeMapOfShape& theGMapFaceShells,
|
||||||
const TopTools_MapOfShape& theFreeBoundMap)
|
const TopTools_MapOfShape& theFreeBoundMap)
|
||||||
{
|
{
|
||||||
// creating map of edge faces for the shape
|
// creating map of edge faces for the shape
|
||||||
@@ -2855,6 +2935,9 @@ void ShapeUpgrade_UnifySameDomain::IntUnifyFaces(const TopoDS_Shape& theInpShape
|
|||||||
Standard_Real Uperiod = (aBaseSurface->IsUPeriodic())? aBaseSurface->UPeriod() : 0.;
|
Standard_Real Uperiod = (aBaseSurface->IsUPeriodic())? aBaseSurface->UPeriod() : 0.;
|
||||||
Standard_Real Vperiod = (aBaseSurface->IsVPeriodic())? aBaseSurface->VPeriod() : 0.;
|
Standard_Real Vperiod = (aBaseSurface->IsVPeriodic())? aBaseSurface->VPeriod() : 0.;
|
||||||
|
|
||||||
|
// Get shells connected to the face (in normal cases should not be more than 2)
|
||||||
|
const TopTools_MapOfShape* pFShells1 = theGMapFaceShells.Seek (aFace);
|
||||||
|
|
||||||
// find adjacent faces to union
|
// find adjacent faces to union
|
||||||
Standard_Integer i;
|
Standard_Integer i;
|
||||||
for (i = 1; i <= edges.Length(); i++) {
|
for (i = 1; i <= edges.Length(); i++) {
|
||||||
@@ -2903,6 +2986,15 @@ void ShapeUpgrade_UnifySameDomain::IntUnifyFaces(const TopoDS_Shape& theInpShape
|
|||||||
if (aProcessed.Contains(aCheckedFace))
|
if (aProcessed.Contains(aCheckedFace))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
// Get shells connected to the checked face
|
||||||
|
const TopTools_MapOfShape* pFShells2 = theGMapFaceShells.Seek (aCheckedFace);
|
||||||
|
// Faces can be unified only if the shells of faces connected to
|
||||||
|
// these faces are the same. Otherwise, topology would be broken.
|
||||||
|
if (!isSameSets (pFShells1, pFShells2))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (bCheckNormals) {
|
if (bCheckNormals) {
|
||||||
// get normal of checked face using the same parameter on edge
|
// get normal of checked face using the same parameter on edge
|
||||||
gp_Dir aDN2;
|
gp_Dir aDN2;
|
||||||
|
@@ -70,6 +70,7 @@ class ShapeUpgrade_UnifySameDomain : public Standard_Transient
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
typedef NCollection_DataMap<TopoDS_Shape, Handle(Geom_Plane), TopTools_ShapeMapHasher> DataMapOfFacePlane;
|
typedef NCollection_DataMap<TopoDS_Shape, Handle(Geom_Plane), TopTools_ShapeMapHasher> DataMapOfFacePlane;
|
||||||
|
typedef NCollection_DataMap<TopoDS_Shape, TopTools_MapOfShape, TopTools_ShapeMapHasher> DataMapOfShapeMapOfShape;
|
||||||
|
|
||||||
//! Empty constructor
|
//! Empty constructor
|
||||||
Standard_EXPORT ShapeUpgrade_UnifySameDomain();
|
Standard_EXPORT ShapeUpgrade_UnifySameDomain();
|
||||||
@@ -168,7 +169,8 @@ protected:
|
|||||||
Standard_EXPORT void UnifyEdges();
|
Standard_EXPORT void UnifyEdges();
|
||||||
|
|
||||||
void IntUnifyFaces(const TopoDS_Shape& theInpShape,
|
void IntUnifyFaces(const TopoDS_Shape& theInpShape,
|
||||||
TopTools_IndexedDataMapOfShapeListOfShape& theGMapEdgeFaces,
|
const TopTools_IndexedDataMapOfShapeListOfShape& theGMapEdgeFaces,
|
||||||
|
const DataMapOfShapeMapOfShape& theGMapFaceShells,
|
||||||
const TopTools_MapOfShape& theFreeBoundMap);
|
const TopTools_MapOfShape& theFreeBoundMap);
|
||||||
|
|
||||||
//! Splits the sequence of edges into the sequence of chains
|
//! Splits the sequence of edges into the sequence of chains
|
||||||
|
@@ -48,6 +48,7 @@
|
|||||||
#include <XCAFDoc_GraphNode.hxx>
|
#include <XCAFDoc_GraphNode.hxx>
|
||||||
#include <XCAFDoc_Location.hxx>
|
#include <XCAFDoc_Location.hxx>
|
||||||
#include <XCAFDoc_ShapeMapTool.hxx>
|
#include <XCAFDoc_ShapeMapTool.hxx>
|
||||||
|
#include <TopLoc_Datum3D.hxx>
|
||||||
|
|
||||||
IMPLEMENT_DERIVED_ATTRIBUTE_WITH_TYPE(XCAFDoc_ShapeTool,TDataStd_GenericEmpty,"xcaf","ShapeTool")
|
IMPLEMENT_DERIVED_ATTRIBUTE_WITH_TYPE(XCAFDoc_ShapeTool,TDataStd_GenericEmpty,"xcaf","ShapeTool")
|
||||||
|
|
||||||
@@ -1602,6 +1603,33 @@ Standard_Boolean XCAFDoc_ShapeTool::RemoveSHUO (const TDF_Label& L) const
|
|||||||
//purpose : auxiliary
|
//purpose : auxiliary
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
|
|
||||||
|
static Standard_Boolean IsEqual (const TopLoc_Location& theLoc1, const TopLoc_Location& theLoc2)
|
||||||
|
{
|
||||||
|
if (theLoc1.IsEqual (theLoc2)) {return Standard_True; }
|
||||||
|
if (theLoc1.IsIdentity() || theLoc2.IsIdentity()) {return Standard_False; }
|
||||||
|
const Handle(TopLoc_Datum3D)& aDatum1 = theLoc1.FirstDatum();
|
||||||
|
const Handle(TopLoc_Datum3D)& aDatum2 = theLoc2.FirstDatum();
|
||||||
|
if (aDatum1 && aDatum2)
|
||||||
|
{
|
||||||
|
NCollection_Mat4<double> aMat41;
|
||||||
|
NCollection_Mat4<double> aMat42;
|
||||||
|
theLoc1.FirstDatum()->Transformation().GetMat4(aMat41);
|
||||||
|
theLoc2.FirstDatum()->Transformation().GetMat4(aMat42);
|
||||||
|
if ( !aMat41.IsEqual (aMat42)) {return Standard_False; }
|
||||||
|
}
|
||||||
|
else if (aDatum1 || aDatum2) {return Standard_False; }
|
||||||
|
if (theLoc1.FirstPower() != theLoc2.FirstPower() ) {return Standard_False; }
|
||||||
|
else { return IsEqual (theLoc1.NextLocation(), theLoc2.NextLocation());}
|
||||||
|
}
|
||||||
|
|
||||||
|
static Standard_Boolean IsSame (const TopoDS_Shape& theShape1, const TopoDS_Shape& theShape2)
|
||||||
|
{
|
||||||
|
|
||||||
|
return theShape1.TShape() == theShape2.TShape()
|
||||||
|
&& theShape1.Orientation() == theShape2.Orientation()
|
||||||
|
&& IsEqual (theShape1.Location(), theShape2.Location());
|
||||||
|
}
|
||||||
|
|
||||||
static Standard_Boolean checkForShape (const TopoDS_Shape& theShape,
|
static Standard_Boolean checkForShape (const TopoDS_Shape& theShape,
|
||||||
const TopoDS_Shape& theCurSh,
|
const TopoDS_Shape& theCurSh,
|
||||||
const TDF_Label& theUserL,
|
const TDF_Label& theUserL,
|
||||||
@@ -1616,7 +1644,7 @@ static Standard_Boolean checkForShape (const TopoDS_Shape& theShape,
|
|||||||
aCompLoc = aCompLoc.Multiplied( theCurSh.Location() );
|
aCompLoc = aCompLoc.Multiplied( theCurSh.Location() );
|
||||||
aSupLoc = aSupLoc.Multiplied( aCompLoc );
|
aSupLoc = aSupLoc.Multiplied( aCompLoc );
|
||||||
aCopySh.Location( aSupLoc, Standard_False );
|
aCopySh.Location( aSupLoc, Standard_False );
|
||||||
if ( aCopySh.IsSame( theShape ) ) {
|
if ( IsSame ( theShape, aCopySh ) ) {
|
||||||
theLabels.Prepend( theUserL );
|
theLabels.Prepend( theUserL );
|
||||||
return Standard_True;
|
return Standard_True;
|
||||||
}
|
}
|
||||||
|
@@ -3,6 +3,8 @@
|
|||||||
#
|
#
|
||||||
#Create 3 torus
|
#Create 3 torus
|
||||||
|
|
||||||
|
puts "TODO CR33225 Linux: Error : The area of result shape is 138625, expected 197700"
|
||||||
|
|
||||||
ptorus a0 100 20
|
ptorus a0 100 20
|
||||||
tcopy a0 a1
|
tcopy a0 a1
|
||||||
tcopy a0 a2
|
tcopy a0 a2
|
||||||
|
@@ -1,24 +0,0 @@
|
|||||||
puts "==========="
|
|
||||||
puts "OCC114"
|
|
||||||
puts "==========="
|
|
||||||
|
|
||||||
# Max number of iterations for computing memory leackage
|
|
||||||
set i_max 10
|
|
||||||
puts "Amount of iterations is $i_max"
|
|
||||||
|
|
||||||
NewDocument D BinOcaf
|
|
||||||
UndoLimit D 10
|
|
||||||
|
|
||||||
restore [locate_data_file OCC294.brep] s
|
|
||||||
|
|
||||||
set listmem {}
|
|
||||||
for {set i 1} {${i} <= ${i_max}} {incr i} {
|
|
||||||
|
|
||||||
OpenCommand D
|
|
||||||
SetShape D 0:1 s
|
|
||||||
AbortCommand D
|
|
||||||
|
|
||||||
# check memory usage (with tolerance equal to half page size)
|
|
||||||
lappend listmem [meminfo h]
|
|
||||||
checktrend $listmem 50 50 "Memory leak detected"
|
|
||||||
}
|
|
@@ -1,17 +0,0 @@
|
|||||||
puts "==========="
|
|
||||||
puts "OCC26293"
|
|
||||||
puts "==========="
|
|
||||||
puts ""
|
|
||||||
#################################
|
|
||||||
# Error opening the document
|
|
||||||
#################################
|
|
||||||
|
|
||||||
Open [locate_data_file bug26293_all_geom.sgd] D
|
|
||||||
vinit
|
|
||||||
for {set i 1} {$i < 1065} {incr i} {
|
|
||||||
if { ![catch {GetShape D 0:1:$i:1:1:2 res$i}] } {
|
|
||||||
vdisplay res$i
|
|
||||||
}
|
|
||||||
}
|
|
||||||
vfit
|
|
||||||
checkview -screenshot -3d -path ${imagedir}/${test_image}.png
|
|
@@ -1,3 +1,5 @@
|
|||||||
|
puts "TODO ?CR33225 Windows: Failed class "
|
||||||
|
|
||||||
pload QAcommands
|
pload QAcommands
|
||||||
|
|
||||||
QANTestStlIterators
|
QANTestStlIterators
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
puts "TODO ?СК33225 Linux: Checking trend failed "
|
||||||
puts "TODO ?OCC7287 Linux: Tcl Exception: Memory leak detected"
|
puts "TODO ?OCC7287 Linux: Tcl Exception: Memory leak detected"
|
||||||
puts "TODO ?OCC7287 Linux: TEST INCOMPLETE"
|
puts "TODO ?OCC7287 Linux: TEST INCOMPLETE"
|
||||||
puts "TODO ?OCC7287 MacOS: Tcl Exception: Memory leak detected"
|
puts "TODO ?OCC7287 MacOS: Tcl Exception: Memory leak detected"
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
puts "TODO ?CR332257287 Linux: Checking trend failed: mean delta per step = 9432.0, sigma = 4220.013270121316, expected delta = 0"
|
||||||
puts "TODO ?OCC7287 Linux: Tcl Exception: Memory leak detected"
|
puts "TODO ?OCC7287 Linux: Tcl Exception: Memory leak detected"
|
||||||
puts "TODO ?OCC7287 Linux: TEST INCOMPLETE"
|
puts "TODO ?OCC7287 Linux: TEST INCOMPLETE"
|
||||||
puts "TODO ?OCC7287 MacOS: Tcl Exception: Memory leak detected"
|
puts "TODO ?OCC7287 MacOS: Tcl Exception: Memory leak detected"
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
puts "TODO ?CR33225 Linux: Checking trend failed: mean delta per step = 7408.0, sigma = 2737.917456754312, expected delta = 0"
|
||||||
puts "TODO ?OCC7287 Linux: Tcl Exception: Memory leak detected"
|
puts "TODO ?OCC7287 Linux: Tcl Exception: Memory leak detected"
|
||||||
puts "TODO ?OCC7287 Linux: TEST INCOMPLETE"
|
puts "TODO ?OCC7287 Linux: TEST INCOMPLETE"
|
||||||
puts "TODO ?OCC7287 MacOS: Tcl Exception: Memory leak detected"
|
puts "TODO ?OCC7287 MacOS: Tcl Exception: Memory leak detected"
|
||||||
|
71
tests/bugs/heal/bug33171_1
Normal file
71
tests/bugs/heal/bug33171_1
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
puts "========================"
|
||||||
|
puts " 0033171: Modeling Algorithms - Invalid result of faces unification"
|
||||||
|
puts "========================"
|
||||||
|
puts ""
|
||||||
|
|
||||||
|
# make outer prism
|
||||||
|
polyline p 0 0 0 10 0 0 10 10 0 0 10 0 0 0 0
|
||||||
|
mkplane f p
|
||||||
|
prism s f 0 0 5
|
||||||
|
|
||||||
|
# make section shells
|
||||||
|
polyline p1 3 10 0 3 7 0 6 7 0 6 3 0 10 3 0
|
||||||
|
polyline p2 6 7 0 10 7 0
|
||||||
|
polyline p3 8 7 0 8 10 0
|
||||||
|
polyline p4 0 5 0 10 5 0
|
||||||
|
|
||||||
|
prism sh1 p1 0 0 5
|
||||||
|
prism sh2 p2 0 0 5
|
||||||
|
prism sh3 p3 0 0 5
|
||||||
|
prism sh4 p4 0 0 5
|
||||||
|
|
||||||
|
# split the prism
|
||||||
|
bclearobjects
|
||||||
|
bcleartools
|
||||||
|
baddobjects s
|
||||||
|
baddtools sh1 sh2 sh3 sh4
|
||||||
|
bfillds
|
||||||
|
bsplit r
|
||||||
|
|
||||||
|
checkshape r
|
||||||
|
if {![regexp "This shape seems to be OK" [bopcheck r]]} {
|
||||||
|
puts "Error: invalid shape after split"
|
||||||
|
}
|
||||||
|
|
||||||
|
# try to unify faces in the result compound
|
||||||
|
unifysamedom ru1 r
|
||||||
|
unifysamedom ru2 r +i
|
||||||
|
|
||||||
|
checkshape ru1
|
||||||
|
checkshape ru2
|
||||||
|
|
||||||
|
checknbshapes ru1 -ref [nbshapes r -t] -t
|
||||||
|
checknbshapes ru2 -ref [nbshapes r -t] -t
|
||||||
|
|
||||||
|
if {![regexp "This shape seems to be OK" [bopcheck ru1]]} {
|
||||||
|
puts "Error: invalid shape after faces unification"
|
||||||
|
}
|
||||||
|
if {![regexp "This shape seems to be OK" [bopcheck ru2]]} {
|
||||||
|
puts "Error: invalid shape after faces unification"
|
||||||
|
}
|
||||||
|
|
||||||
|
# make compound of shells
|
||||||
|
eval compound [explode r] shs
|
||||||
|
|
||||||
|
unifysamedom shsu1 r
|
||||||
|
unifysamedom shsu2 r +i
|
||||||
|
|
||||||
|
checkshape shsu1
|
||||||
|
checkshape shsu2
|
||||||
|
|
||||||
|
checknbshapes shsu1 -ref [nbshapes shs -t] -t
|
||||||
|
checknbshapes shsu2 -ref [nbshapes shs -t] -t
|
||||||
|
|
||||||
|
if {![regexp "This shape seems to be OK" [bopcheck shsu1]]} {
|
||||||
|
puts "Error: invalid shape after faces unification"
|
||||||
|
}
|
||||||
|
if {![regexp "This shape seems to be OK" [bopcheck shsu2]]} {
|
||||||
|
puts "Error: invalid shape after faces unification"
|
||||||
|
}
|
||||||
|
|
||||||
|
checkview -display ru2 -2d -path ${imagedir}/${test_image}.png
|
57
tests/bugs/heal/bug33171_2
Normal file
57
tests/bugs/heal/bug33171_2
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
puts "========================"
|
||||||
|
puts " 0033171: Modeling Algorithms - Invalid result of faces unification"
|
||||||
|
puts "========================"
|
||||||
|
puts ""
|
||||||
|
|
||||||
|
# make two solids
|
||||||
|
box b1 10 10 5
|
||||||
|
box b2 10 0 0 5 5 5
|
||||||
|
# make shared
|
||||||
|
bclearobjects
|
||||||
|
bcleartools
|
||||||
|
baddobjects b1 b2
|
||||||
|
bfillds
|
||||||
|
bbuild r
|
||||||
|
|
||||||
|
checkshape r
|
||||||
|
if {![regexp "This shape seems to be OK" [bopcheck r]]} {
|
||||||
|
puts "Error: invalid shape after fuse"
|
||||||
|
}
|
||||||
|
|
||||||
|
# try to unify faces in the result compound
|
||||||
|
unifysamedom ru1 r
|
||||||
|
unifysamedom ru2 r +i
|
||||||
|
|
||||||
|
checkshape ru1
|
||||||
|
checkshape ru2
|
||||||
|
|
||||||
|
checknbshapes ru1 -ref [nbshapes r -t] -t
|
||||||
|
checknbshapes ru2 -ref [nbshapes r -t] -t
|
||||||
|
|
||||||
|
if {![regexp "This shape seems to be OK" [bopcheck ru1]]} {
|
||||||
|
puts "Error: invalid shape after faces unification"
|
||||||
|
}
|
||||||
|
if {![regexp "This shape seems to be OK" [bopcheck ru2]]} {
|
||||||
|
puts "Error: invalid shape after faces unification"
|
||||||
|
}
|
||||||
|
|
||||||
|
# make compound of shells
|
||||||
|
eval compound [explode r] shs
|
||||||
|
|
||||||
|
unifysamedom shsu1 r
|
||||||
|
unifysamedom shsu2 r +i
|
||||||
|
|
||||||
|
checkshape shsu1
|
||||||
|
checkshape shsu2
|
||||||
|
|
||||||
|
checknbshapes shsu1 -ref [nbshapes shs -t] -t
|
||||||
|
checknbshapes shsu2 -ref [nbshapes shs -t] -t
|
||||||
|
|
||||||
|
if {![regexp "This shape seems to be OK" [bopcheck shsu1]]} {
|
||||||
|
puts "Error: invalid shape after faces unification"
|
||||||
|
}
|
||||||
|
if {![regexp "This shape seems to be OK" [bopcheck shsu2]]} {
|
||||||
|
puts "Error: invalid shape after faces unification"
|
||||||
|
}
|
||||||
|
|
||||||
|
checkview -display ru2 -2d -path ${imagedir}/${test_image}.png
|
19
tests/bugs/heal/bug33193
Normal file
19
tests/bugs/heal/bug33193
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
puts "========================================="
|
||||||
|
puts "0033193: Modeling Algorithms - Regression: UnifySameDomain raises SIGSEGV"
|
||||||
|
puts "========================================="
|
||||||
|
puts ""
|
||||||
|
|
||||||
|
restore [locate_data_file bug33193.brep] a
|
||||||
|
|
||||||
|
unifysamedom result a
|
||||||
|
|
||||||
|
checkshape result
|
||||||
|
|
||||||
|
checknbshapes result -t -solid 1 -shell 1 -face 152 -wire 202 -edge 411 -vertex 273
|
||||||
|
|
||||||
|
set tolres [checkmaxtol result]
|
||||||
|
|
||||||
|
if { ${tolres} > 1.26e-7} {
|
||||||
|
puts "Error: bad tolerance of result"
|
||||||
|
}
|
||||||
|
|
@@ -1,18 +0,0 @@
|
|||||||
puts "======="
|
|
||||||
puts "0032424: Mesh - Slow triangulation of a simple shape."
|
|
||||||
puts "======="
|
|
||||||
puts ""
|
|
||||||
cpulimit 3
|
|
||||||
|
|
||||||
restore [locate_data_file bug32424.brep] result
|
|
||||||
|
|
||||||
incmesh result 0.17 -a 20
|
|
||||||
|
|
||||||
checktrinfo result -tri 2360 -nod 1302
|
|
||||||
|
|
||||||
vinit
|
|
||||||
vdefaults -autoTriang 0
|
|
||||||
vsetdispmode 1
|
|
||||||
vdisplay result
|
|
||||||
vfit
|
|
||||||
checkview -screenshot -3d -path ${imagedir}/${test_image}.png
|
|
@@ -1,7 +1,12 @@
|
|||||||
|
puts "TODO CR33225 Linux: Error : The command is not valid. The area is 0."
|
||||||
|
puts "TODO CR33225 Linux: Error : The area of result shape is 0, expected 177462"
|
||||||
|
puts "TODO CR33225 Linux: is WRONG because number of "
|
||||||
|
|
||||||
puts "============"
|
puts "============"
|
||||||
puts "OCC19071"
|
puts "OCC19071"
|
||||||
puts "============"
|
puts "============"
|
||||||
puts ""
|
puts ""
|
||||||
|
|
||||||
#######################################################################
|
#######################################################################
|
||||||
# The MakeFuse or the MakePartition function crash together on 2 torus
|
# The MakeFuse or the MakePartition function crash together on 2 torus
|
||||||
#######################################################################
|
#######################################################################
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
puts "TODO CR30351 Windows: Faulty OCC25199: Bad tolerance edge generated by blend algorithm"
|
puts "TODO CR30351 Windows: Faulty OCC25199: Bad tolerance edge generated by blend algorithm"
|
||||||
|
puts "TODO CR33225 Linux: Faulty OCC25199: Bad tolerance edge generated by blend algorithm"
|
||||||
|
|
||||||
puts "============"
|
puts "============"
|
||||||
puts "OCC25199"
|
puts "OCC25199"
|
||||||
|
@@ -1,20 +0,0 @@
|
|||||||
puts "========"
|
|
||||||
puts "OCC26616"
|
|
||||||
puts "========"
|
|
||||||
puts ""
|
|
||||||
############################################
|
|
||||||
# Memory leak in IntTools_Context::Hatcher
|
|
||||||
############################################
|
|
||||||
|
|
||||||
restore [locate_data_file OCC26635_t0.brep] t0
|
|
||||||
restore [locate_data_file OCC26635_t1.brep] t1
|
|
||||||
|
|
||||||
bfuse res t0 t1
|
|
||||||
|
|
||||||
set listmem {}
|
|
||||||
for {set i 1} {$i < 10} {incr i} {
|
|
||||||
bfuse res t0 t1
|
|
||||||
|
|
||||||
lappend listmem [meminfo h]
|
|
||||||
checktrend $listmem 0 64 "Memory leak detected"
|
|
||||||
}
|
|
@@ -3,6 +3,8 @@ puts "OCC27884: Modeling Algorithms - Possible improvement for 2d classifier"
|
|||||||
puts "================================================================="
|
puts "================================================================="
|
||||||
puts ""
|
puts ""
|
||||||
|
|
||||||
|
puts "TODO ?CR33225 Windows: Error: algorithm slowed down"
|
||||||
|
|
||||||
pload ALL
|
pload ALL
|
||||||
pload QAcommands
|
pload QAcommands
|
||||||
|
|
||||||
|
@@ -1,3 +1,5 @@
|
|||||||
|
puts "TODO ?CR33225 Windows: extra characters after close-quote "
|
||||||
|
|
||||||
puts "========"
|
puts "========"
|
||||||
puts "OCC29293"
|
puts "OCC29293"
|
||||||
puts "========"
|
puts "========"
|
||||||
|
@@ -1,48 +0,0 @@
|
|||||||
puts "========"
|
|
||||||
puts "0029843: Modeling Algorithms - Boolean FUSE produces incorrect result"
|
|
||||||
puts "========"
|
|
||||||
puts ""
|
|
||||||
|
|
||||||
restore [locate_data_file bug29843.brep] s
|
|
||||||
|
|
||||||
explode s
|
|
||||||
bclearobjects
|
|
||||||
bcleartools
|
|
||||||
baddobjects s_1
|
|
||||||
baddtools s_2
|
|
||||||
bfillds
|
|
||||||
|
|
||||||
bbop r_0 0
|
|
||||||
bbop r_1 1
|
|
||||||
bbop r_2 2
|
|
||||||
bbop r_3 3
|
|
||||||
bbop r_4 4
|
|
||||||
bbuild r_5
|
|
||||||
|
|
||||||
foreach i { 0 1 2 3 4 5} {
|
|
||||||
checkshape r_$i
|
|
||||||
if {![regexp "OK" [bopcheck r_$i]]} {
|
|
||||||
puts "Error: r_$i is self-intersecting shape"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
checkprops r_0 -s 9.84429 -v 0.639311
|
|
||||||
checknbshapes r_0 -wire 7 -face 5 -shell 1 -solid 1 -t
|
|
||||||
|
|
||||||
checkprops r_1 -s 2121.39 -v 612.41
|
|
||||||
checknbshapes r_1 -wire 38 -face 32 -shell 2 -solid 1 -t
|
|
||||||
|
|
||||||
checkprops r_2 -s 2113.85 -v 611.569
|
|
||||||
checknbshapes r_2 -wire 32 -face 26 -shell 2 -solid 1 -t
|
|
||||||
|
|
||||||
checkprops r_3 -s 15.9893 -v 0.215264
|
|
||||||
checknbshapes r_3 -wire 11 -face 9 -shell 2 -solid 2 -t
|
|
||||||
|
|
||||||
checkprops r_4 -l 24.9725
|
|
||||||
checksection r_4 -r 2
|
|
||||||
|
|
||||||
checkprops r_5 -s 2139.68 -v 612.402
|
|
||||||
checknbshapes r_5 -wire 44 -face 36 -shell 5 -solid 4 -t
|
|
||||||
|
|
||||||
checkview -display r_0 -2d -path ${imagedir}/${test_image}.png
|
|
||||||
|
|
@@ -2,7 +2,7 @@ puts "================================================="
|
|||||||
puts "0030054: BRepOffset_MakeOffset fails to build joints in intersection mode"
|
puts "0030054: BRepOffset_MakeOffset fails to build joints in intersection mode"
|
||||||
puts "================================================="
|
puts "================================================="
|
||||||
puts ""
|
puts ""
|
||||||
|
puts "TODO OCC33166 ALL: Faulty shapes"
|
||||||
restore [locate_data_file bug30054.brep] a
|
restore [locate_data_file bug30054.brep] a
|
||||||
|
|
||||||
thickshell result a 1 i
|
thickshell result a 1 i
|
||||||
|
40
tests/bugs/modalg_8/bug26441
Normal file
40
tests/bugs/modalg_8/bug26441
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
puts "============"
|
||||||
|
puts "0026441: Modeling Algorithms - BRepOffset_MakeOffset affects original shape"
|
||||||
|
puts "============"
|
||||||
|
puts ""
|
||||||
|
|
||||||
|
pload QAcommands
|
||||||
|
restore [locate_data_file bug26440_plate.brep] sh
|
||||||
|
|
||||||
|
tcopy sh sh_ref
|
||||||
|
thickshell result sh 160
|
||||||
|
|
||||||
|
checkprops result -s 2.40831e+07
|
||||||
|
checkshape result
|
||||||
|
|
||||||
|
set nbshapes_expected "
|
||||||
|
Number of shapes in shape
|
||||||
|
VERTEX : 196
|
||||||
|
EDGE : 308
|
||||||
|
WIRE : 110
|
||||||
|
FACE : 110
|
||||||
|
SHELL : 1
|
||||||
|
SOLID : 1
|
||||||
|
COMPSOLID : 0
|
||||||
|
COMPOUND : 0
|
||||||
|
SHAPE : 726
|
||||||
|
"
|
||||||
|
checknbshapes result -ref ${nbshapes_expected} -t -m "solid construction"
|
||||||
|
if { [info exist BadEdges] } {
|
||||||
|
unset BadEdges
|
||||||
|
}
|
||||||
|
if { [info exist BadVerts] } {
|
||||||
|
unset BadVerts
|
||||||
|
}
|
||||||
|
|
||||||
|
OCC26441 sh sh_ref 1.e-7 1
|
||||||
|
|
||||||
|
if { [isdraw BadEdges] || [isdraw BadVerts]} {
|
||||||
|
puts "Error: tolerances of some subshapes of initial shape are changed"
|
||||||
|
}
|
||||||
|
|
72
tests/bugs/modalg_8/bug32857
Normal file
72
tests/bugs/modalg_8/bug32857
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
puts "================"
|
||||||
|
puts "0032857: Problem when finding the intersection between a new face made after a draft and the inner face of body"
|
||||||
|
puts "================"
|
||||||
|
puts ""
|
||||||
|
# Script reproducing the problematic draft case in FreeCAD issue #2497
|
||||||
|
#Category: Modeling
|
||||||
|
#Title: OCCT Tutorial pocketed ring
|
||||||
|
|
||||||
|
pload MODELING VISUALIZATION
|
||||||
|
|
||||||
|
# Set basic dimensions. Problems appear when inner_rad < pocket_center.
|
||||||
|
dset height 10
|
||||||
|
dset inner_rad 39
|
||||||
|
dset outer_rad 50
|
||||||
|
dset pocket_center 40
|
||||||
|
dset pocket_rad 20
|
||||||
|
dset pocket_depth 5
|
||||||
|
|
||||||
|
# Construct base profile (the "my_ring")
|
||||||
|
puts "Constructing my_ring..."
|
||||||
|
|
||||||
|
circle c_inner 0 0 0 0 0 1 inner_rad
|
||||||
|
circle c_outer 0 0 0 0 0 1 outer_rad
|
||||||
|
mkedge e_inner c_inner
|
||||||
|
mkedge e_outer c_outer
|
||||||
|
wire w_inner e_inner
|
||||||
|
wire w_outer e_outer
|
||||||
|
|
||||||
|
plane p0
|
||||||
|
mkface my_ring_inner_base p0 w_inner
|
||||||
|
mkface my_ring_outer_base p0 w_outer
|
||||||
|
|
||||||
|
prism my_ring_inner my_ring_inner_base 0 0 height
|
||||||
|
prism my_ring_outer my_ring_outer_base 0 0 height
|
||||||
|
|
||||||
|
bcut my_ring my_ring_outer my_ring_inner
|
||||||
|
|
||||||
|
# Make the pocket
|
||||||
|
puts "Constructing pocket..."
|
||||||
|
|
||||||
|
circle pocket_base pocket_center 0 0 0 0 1 pocket_rad
|
||||||
|
mkedge pocket_base pocket_base
|
||||||
|
wire pocket_base pocket_base
|
||||||
|
|
||||||
|
mkface pocket_base p0 pocket_base
|
||||||
|
|
||||||
|
prism my_pocket pocket_base 0 0 pocket_depth
|
||||||
|
|
||||||
|
# Make the cut
|
||||||
|
puts "Making the cut"
|
||||||
|
|
||||||
|
bcut slotted_ring my_ring my_pocket
|
||||||
|
|
||||||
|
explode slotted_ring F
|
||||||
|
|
||||||
|
# Make the draft
|
||||||
|
puts "Drafting the face"
|
||||||
|
|
||||||
|
# Found face by trial and error: slotted_ring_3
|
||||||
|
# Perform the draft
|
||||||
|
depouille slotted_ring_with_draft slotted_ring 0 0 -1 slotted_ring_3 44 0 1 0 0 0 1
|
||||||
|
|
||||||
|
#checking result
|
||||||
|
checkshape slotted_ring_with_draft
|
||||||
|
checknbshapes slotted_ring_with_draft -shape 48 -vertex 12 -edge 18 -face 7 -wire 8
|
||||||
|
checkprops slotted_ring_with_draft -s 11466.5 -v 28662.9
|
||||||
|
|
||||||
|
puts "Showing result..."
|
||||||
|
|
||||||
|
# Display result
|
||||||
|
checkview -display slotted_ring_with_draft -2d -path ${imagedir}/${test_image}.png
|
||||||
|
|
15
tests/bugs/modalg_8/bug33173
Normal file
15
tests/bugs/modalg_8/bug33173
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
puts "========"
|
||||||
|
puts "0033173: Modeling Algorithms - Regression in BRepExtrema_DistShapeShape causing Standard_OutOfRange"
|
||||||
|
puts "========"
|
||||||
|
puts ""
|
||||||
|
|
||||||
|
set MinDistExpected 7.049107166484117e-07
|
||||||
|
restore [locate_data_file bug33173.brep] s
|
||||||
|
explode s
|
||||||
|
distmini dm s_1 s_2
|
||||||
|
if {[isdraw dm]} {
|
||||||
|
checkreal MinDist $MinDistExpected [dval dm_val] 1.e-7 .01
|
||||||
|
} else {
|
||||||
|
puts "Error: distmini failed"
|
||||||
|
}
|
||||||
|
|
9
tests/bugs/modalg_8/bug33179
Normal file
9
tests/bugs/modalg_8/bug33179
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
puts "================================"
|
||||||
|
puts "0033179: Modeling Algorithms - Crash in in ShapeFix_Shape with the attached object, when healing for fixing SameParameterFlag"
|
||||||
|
puts "================================"
|
||||||
|
|
||||||
|
restore [locate_data_file bug33179.brep] s
|
||||||
|
|
||||||
|
fsameparameter s
|
||||||
|
checkshape s
|
||||||
|
|
@@ -2,6 +2,9 @@ puts "========"
|
|||||||
puts "OCC162"
|
puts "OCC162"
|
||||||
puts "========"
|
puts "========"
|
||||||
|
|
||||||
|
puts "TODO ?CR33225 Linux: Checking trend failed "
|
||||||
|
puts "TODO ?CR33225 Linux: Tcl Exception: Memory leak detected"
|
||||||
|
|
||||||
pload QAcommands
|
pload QAcommands
|
||||||
pload XDE
|
pload XDE
|
||||||
|
|
||||||
|
27
tests/bugs/step/bug27122
Normal file
27
tests/bugs/step/bug27122
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
puts "================"
|
||||||
|
puts "OCC27122"
|
||||||
|
puts "================"
|
||||||
|
puts ""
|
||||||
|
#####################################################################
|
||||||
|
# STEP import regression: invalid shapes are produced during model translation due to huge face tolerance
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
pload XDE
|
||||||
|
|
||||||
|
# Empty resource file name to take params from InterfaceStatic
|
||||||
|
param "read.step.resource.name" "\"\""
|
||||||
|
# Add FixFaceSize operator
|
||||||
|
param "FromSTEP.exec.op" FixShape,FixFaceSize
|
||||||
|
# Set a tolerance exceeding the size of the problem face to FixFaceSize operator
|
||||||
|
param "FromSTEP.FixFaceSize.Tolerance" 0.0508
|
||||||
|
|
||||||
|
stepread [locate_data_file bug27122_280696.stp] a *
|
||||||
|
|
||||||
|
# restore old params
|
||||||
|
param "read.step.resource.name" STEP
|
||||||
|
param "FromSTEP.exec.op" FixShape
|
||||||
|
param "FromSTEP.FixFaceSize.Tolerance" 1.e-7
|
||||||
|
|
||||||
|
checknbshapes a_1 -t -face 10
|
||||||
|
|
||||||
|
checkview -display a_1 -3d -path ${imagedir}/${test_image}.png
|
58
tests/bugs/step/bug32977
Normal file
58
tests/bugs/step/bug32977
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
puts "===================================="
|
||||||
|
puts "0032977: OCC V7.5, V7.6 cannot read STEP color correctly for the root label, but v6.8 can"
|
||||||
|
puts "===================================="
|
||||||
|
puts ""
|
||||||
|
|
||||||
|
pload ALL
|
||||||
|
|
||||||
|
# Read files
|
||||||
|
# Check colors number
|
||||||
|
|
||||||
|
ReadStep D1 [locate_data_file bug32977_1.stp]
|
||||||
|
set info1 [XStat D1]
|
||||||
|
regexp {Number +of +colors += +([-0-9.+eE]+)} $info1 full nbcolor
|
||||||
|
regexp {Number +of +colors += +[-0-9.+eE]+\n([^\n]*)} $info1 full colors
|
||||||
|
if {[string compare ${colors} "RED BLACK GRAY74 GRAY26 "] != 0} {
|
||||||
|
puts "Error: not expected colors ${colors}"
|
||||||
|
}
|
||||||
|
if {$nbcolor != 4} {
|
||||||
|
puts "Error: not expected number of colors"
|
||||||
|
}
|
||||||
|
|
||||||
|
ReadStep D2 [locate_data_file bug32977_2.step]
|
||||||
|
set info2 [XStat D2]
|
||||||
|
regexp {Number +of +colors += +([-0-9.+eE]+)} $info2 full nbcolor
|
||||||
|
regexp {Number +of +colors += +[-0-9.+eE]+\n([^\n]*)} $info2 full colors
|
||||||
|
if {[string compare ${colors} "LIGHTSTEELBLUE2 WHITE VIOLETRED3 GRAY25 "] != 0} {
|
||||||
|
puts "Error: not expected colors ${colors}"
|
||||||
|
}
|
||||||
|
if {$nbcolor != 4} {
|
||||||
|
puts "Error: not expected number of colors"
|
||||||
|
}
|
||||||
|
|
||||||
|
ReadStep D3 [locate_data_file trj10_pm8-id-214.stp]
|
||||||
|
set info3 [XStat D3]
|
||||||
|
regexp {Number +of +colors += +([-0-9.+eE]+)} $info3 full nbcolor
|
||||||
|
regexp {Number +of +colors += +[-0-9.+eE]+\n([^\n]*)} $info3 full colors
|
||||||
|
if {[string compare ${colors} "MAGENTA RED ORANGERED ORANGE DEEPSKYBLUE2 GREEN "] != 0} {
|
||||||
|
puts "Error: not expected colors ${colors}"
|
||||||
|
}
|
||||||
|
if {$nbcolor != 6} {
|
||||||
|
puts "Error: not expected number of colors"
|
||||||
|
}
|
||||||
|
|
||||||
|
vinit View1
|
||||||
|
XDisplay D1 -dispmode 1
|
||||||
|
vfit
|
||||||
|
checkview -screenshot -3d -path ${imagedir}/${test_image}1.png
|
||||||
|
|
||||||
|
vclear
|
||||||
|
XDisplay D2 -dispmode 1
|
||||||
|
vfit
|
||||||
|
checkview -screenshot -3d -path ${imagedir}/${test_image}2.png
|
||||||
|
|
||||||
|
vclear
|
||||||
|
XDisplay D3 -dispmode 1
|
||||||
|
vfit
|
||||||
|
checkview -screenshot -3d -path ${imagedir}/${test_image}3.png
|
||||||
|
|
@@ -1,4 +1,5 @@
|
|||||||
puts "TODO OCC24156 MacOS: Error: unsupported locale specification"
|
puts "TODO OCC24156 MacOS: Error: unsupported locale specification"
|
||||||
|
puts "TODO CR33225 Linux: Error: unsupported locale specification"
|
||||||
|
|
||||||
# Test for issue #22898 and other functionality that can be affected by locale.
|
# Test for issue #22898 and other functionality that can be affected by locale.
|
||||||
# Just run multiple conversions of the shape to and from different formats and
|
# Just run multiple conversions of the shape to and from different formats and
|
||||||
|
30
tests/cr/bugs/bug33170
Normal file
30
tests/cr/bugs/bug33170
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
puts "============"
|
||||||
|
puts "0033170: Modeling Algorithms - Checking for canonical geometry: plane detection problems"
|
||||||
|
puts "============"
|
||||||
|
puts ""
|
||||||
|
|
||||||
|
set ExpectGap 0.0051495320504590563
|
||||||
|
brestore [locate_data_file bug33170.brep] f
|
||||||
|
set log1 [getanasurf asurf1 f pln 0.006]
|
||||||
|
regexp {Gap = +([-0-9.+eE]+)} $log1 full gap1
|
||||||
|
if {[isdraw asurf1]} {
|
||||||
|
set log [dump asurf1]
|
||||||
|
if { [regexp {Plane} $log ] != 1 } {
|
||||||
|
puts "Error: surface is not a plane"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
puts "Error: required surface is not got"
|
||||||
|
}
|
||||||
|
checkreal FoundGap1 $gap1 $ExpectGap 1.0e-9 0.0
|
||||||
|
#
|
||||||
|
set log2 [getanasurf asurf2 f pln 1.]
|
||||||
|
regexp {Gap = +([-0-9.+eE]+)} $log1 full gap2
|
||||||
|
if {[isdraw asurf2]} {
|
||||||
|
set log [dump asurf2]
|
||||||
|
if { [regexp {Plane} $log ] != 1 } {
|
||||||
|
puts "Error: surface is not a plane"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
puts "Error: required surface is not got"
|
||||||
|
}
|
||||||
|
checkreal FoundGap2 $gap2 $ExpectGap 1.0e-9 0.0
|
@@ -1,2 +1,3 @@
|
|||||||
001 base
|
001 base
|
||||||
002 approx
|
002 approx
|
||||||
|
003 bugs
|
||||||
|
@@ -8,10 +8,10 @@ CHECKSHAPE : Wires = 0 ( 0 ) Faces = 0 ( 0 ) Shells = 0 ( 0 ) So
|
|||||||
NBSHAPES : Solid = 3 ( 3 ) Shell = 3 ( 3 ) Face = 492 ( 492 )
|
NBSHAPES : Solid = 3 ( 3 ) Shell = 3 ( 3 ) Face = 492 ( 492 )
|
||||||
STATSHAPE : Solid = 57 ( 57 ) Shell = 57 ( 57 ) Face = 1894 ( 1894 ) FreeWire = 0 ( 0 )
|
STATSHAPE : Solid = 57 ( 57 ) Shell = 57 ( 57 ) Face = 1894 ( 1894 ) FreeWire = 0 ( 0 )
|
||||||
TOLERANCE : MaxTol = 1e-007 ( 1e-007 ) AvgTol = 1e-007 ( 1e-007 )
|
TOLERANCE : MaxTol = 1e-007 ( 1e-007 ) AvgTol = 1e-007 ( 1e-007 )
|
||||||
LABELS : N0Labels = 5 ( 5 ) N1Labels = 31 ( 31 ) N2Labels = 0 ( 0 ) TotalLabels = 36 ( 36 ) NameLabels = 36 ( 36 ) ColorLabels = 3 ( 3 ) LayerLabels = 0 ( 0 )
|
LABELS : N0Labels = 5 ( 5 ) N1Labels = 32 ( 32 ) N2Labels = 0 ( 0 ) TotalLabels = 37 ( 37 ) NameLabels = 36 ( 36 ) ColorLabels = 4 ( 4 ) LayerLabels = 0 ( 0 )
|
||||||
PROPS : Centroid = 0 ( 0 ) Volume = 0 ( 0 ) Area = 0 ( 0 )
|
PROPS : Centroid = 0 ( 0 ) Volume = 0 ( 0 ) Area = 0 ( 0 )
|
||||||
NCOLORS : NColors = 3 ( 3 )
|
NCOLORS : NColors = 4 ( 4 )
|
||||||
COLORS : Colors = CYAN GREEN YELLOW ( CYAN GREEN YELLOW )
|
COLORS : Colors = CYAN GREEN RED YELLOW ( CYAN GREEN RED YELLOW )
|
||||||
NLAYERS : NLayers = 0 ( 0 )
|
NLAYERS : NLayers = 0 ( 0 )
|
||||||
LAYERS : Layers = ( )
|
LAYERS : Layers = ( )
|
||||||
|
|
||||||
|
@@ -8,10 +8,10 @@ CHECKSHAPE : Wires = 0 ( 0 ) Faces = 0 ( 0 ) Shells = 0 ( 0 ) So
|
|||||||
NBSHAPES : Solid = 3 ( 3 ) Shell = 3 ( 3 ) Face = 492 ( 492 )
|
NBSHAPES : Solid = 3 ( 3 ) Shell = 3 ( 3 ) Face = 492 ( 492 )
|
||||||
STATSHAPE : Solid = 57 ( 57 ) Shell = 57 ( 57 ) Face = 1894 ( 1894 ) FreeWire = 0 ( 0 )
|
STATSHAPE : Solid = 57 ( 57 ) Shell = 57 ( 57 ) Face = 1894 ( 1894 ) FreeWire = 0 ( 0 )
|
||||||
TOLERANCE : MaxTol = 1e-007 ( 1e-007 ) AvgTol = 1e-007 ( 1e-007 )
|
TOLERANCE : MaxTol = 1e-007 ( 1e-007 ) AvgTol = 1e-007 ( 1e-007 )
|
||||||
LABELS : N0Labels = 5 ( 5 ) N1Labels = 31 ( 31 ) N2Labels = 0 ( 0 ) TotalLabels = 36 ( 36 ) NameLabels = 36 ( 36 ) ColorLabels = 3 ( 3 ) LayerLabels = 0 ( 0 )
|
LABELS : N0Labels = 5 ( 5 ) N1Labels = 32 ( 32 ) N2Labels = 0 ( 0 ) TotalLabels = 37 ( 37 ) NameLabels = 36 ( 36 ) ColorLabels = 4 ( 4 ) LayerLabels = 0 ( 0 )
|
||||||
PROPS : Centroid = 0 ( 0 ) Volume = 0 ( 0 ) Area = 0 ( 0 )
|
PROPS : Centroid = 0 ( 0 ) Volume = 0 ( 0 ) Area = 0 ( 0 )
|
||||||
NCOLORS : NColors = 3 ( 3 )
|
NCOLORS : NColors = 4 ( 4 )
|
||||||
COLORS : Colors = CYAN GREEN YELLOW ( CYAN GREEN YELLOW )
|
COLORS : Colors = CYAN GREEN RED YELLOW ( CYAN GREEN RED YELLOW )
|
||||||
NLAYERS : NLayers = 0 ( 0 )
|
NLAYERS : NLayers = 0 ( 0 )
|
||||||
LAYERS : Layers = ( )
|
LAYERS : Layers = ( )
|
||||||
|
|
||||||
|
@@ -1,16 +0,0 @@
|
|||||||
puts "========"
|
|
||||||
puts "0032867: Data Exchange - Implement Draco compression for writing glTF"
|
|
||||||
puts "Test case exporting model into glb (binary glTF) file."
|
|
||||||
puts "========"
|
|
||||||
|
|
||||||
Close D0 -silent
|
|
||||||
ReadGltf D0 [locate_data_file bug32867_010.glb]
|
|
||||||
|
|
||||||
set aGltfFile1 "${imagedir}/${casename}_tmp1.glb"
|
|
||||||
set aGltfFile2 "${imagedir}/${casename}_tmp2.glb"
|
|
||||||
|
|
||||||
WriteGltf D0 "$aGltfFile1" -draco on -mergefaces
|
|
||||||
WriteGltf D0 "$aGltfFile2" -draco on
|
|
||||||
|
|
||||||
ReadGltf D1 "$aGltfFile1"
|
|
||||||
ReadGltf D "$aGltfFile2"
|
|
@@ -1,16 +0,0 @@
|
|||||||
puts "========"
|
|
||||||
puts "0032867: Data Exchange - Implement Draco compression for writing glTF"
|
|
||||||
puts "Test case exporting model into glb (binary glTF) file."
|
|
||||||
puts "========"
|
|
||||||
|
|
||||||
Close D0 -silent
|
|
||||||
ReadGltf D0 [locate_data_file bug32867_Diamond.glb]
|
|
||||||
|
|
||||||
set aGltfFile1 "${imagedir}/${casename}_tmp1.glb"
|
|
||||||
set aGltfFile2 "${imagedir}/${casename}_tmp2.glb"
|
|
||||||
|
|
||||||
WriteGltf D0 "$aGltfFile1" -draco on
|
|
||||||
WriteGltf D0 "$aGltfFile2" -draco on -mergefaces
|
|
||||||
|
|
||||||
ReadGltf D1 "$aGltfFile1"
|
|
||||||
ReadGltf D "$aGltfFile2"
|
|
@@ -1,18 +0,0 @@
|
|||||||
puts "========"
|
|
||||||
puts "0032867: Data Exchange - Implement Draco compression for writing glTF"
|
|
||||||
puts "Test case exporting model into glb (binary glTF) file."
|
|
||||||
puts "========"
|
|
||||||
|
|
||||||
Close D0 -silent
|
|
||||||
ReadStep D0 [locate_data_file as1-oc-214-mat.stp]
|
|
||||||
XGetOneShape ss D0
|
|
||||||
incmesh ss 1.0
|
|
||||||
|
|
||||||
set aGltfFile1 "${imagedir}/${casename}_tmp1.glb"
|
|
||||||
set aGltfFile2 "${imagedir}/${casename}_tmp2.glb"
|
|
||||||
|
|
||||||
WriteGltf D0 "$aGltfFile1" -draco on
|
|
||||||
WriteGltf D0 "$aGltfFile2" -draco on -mergefaces
|
|
||||||
|
|
||||||
ReadGltf D1 "$aGltfFile1"
|
|
||||||
ReadGltf D "$aGltfFile2"
|
|
@@ -1,16 +0,0 @@
|
|||||||
puts "========"
|
|
||||||
puts "0032867: Data Exchange - Implement Draco compression for writing glTF"
|
|
||||||
puts "Test case exporting model into glb (binary glTF) file."
|
|
||||||
puts "========"
|
|
||||||
|
|
||||||
restore [locate_data_file bearing.brep] b
|
|
||||||
incmesh b 0.1
|
|
||||||
|
|
||||||
set aGltfFile1 "${imagedir}/${casename}_tmp1.glb"
|
|
||||||
set aGltfFile2 "${imagedir}/${casename}_tmp2.glb"
|
|
||||||
|
|
||||||
WriteGltf b "$aGltfFile1" -draco on
|
|
||||||
WriteGltf b "$aGltfFile2" -draco on -mergefaces
|
|
||||||
|
|
||||||
ReadGltf D0 "$aGltfFile1"
|
|
||||||
ReadGltf D "$aGltfFile2"
|
|
@@ -1,16 +0,0 @@
|
|||||||
puts "========"
|
|
||||||
puts "0032867: Data Exchange - Implement Draco compression for writing glTF"
|
|
||||||
puts "Test case exporting model into glb (binary glTF) file."
|
|
||||||
puts "========"
|
|
||||||
|
|
||||||
Close D0 -silent
|
|
||||||
ReadGltf D0 [locate_data_file bug32867_bull.glb]
|
|
||||||
|
|
||||||
set aGltfFile1 "${imagedir}/${casename}_tmp1.glb"
|
|
||||||
set aGltfFile2 "${imagedir}/${casename}_tmp2.glb"
|
|
||||||
|
|
||||||
WriteGltf D0 "$aGltfFile1" -draco on
|
|
||||||
WriteGltf D0 "$aGltfFile2" -draco on -mergefaces
|
|
||||||
|
|
||||||
ReadGltf D1 "$aGltfFile1"
|
|
||||||
ReadGltf D "$aGltfFile2"
|
|
@@ -1,13 +0,0 @@
|
|||||||
puts "========"
|
|
||||||
puts "0032867: Data Exchange - Implement Draco compression for writing glTF"
|
|
||||||
puts "Test case exporting model into glb (binary glTF) file."
|
|
||||||
puts "========"
|
|
||||||
|
|
||||||
Close D0 -silent
|
|
||||||
ReadGltf D0 [locate_data_file bug32867_bull.glb]
|
|
||||||
|
|
||||||
set aGltfFile1 "${imagedir}/${casename}_tmp1.glb"
|
|
||||||
|
|
||||||
WriteGltf D0 "$aGltfFile1" -draco on -parallel
|
|
||||||
|
|
||||||
ReadGltf D "$aGltfFile1"
|
|
@@ -1,18 +0,0 @@
|
|||||||
puts "========"
|
|
||||||
puts "0032867: Data Exchange - Implement Draco compression for writing glTF"
|
|
||||||
puts "Test case exporting model into glb (binary glTF) file."
|
|
||||||
puts "========"
|
|
||||||
|
|
||||||
Close D0 -silent
|
|
||||||
ReadStep D0 [locate_data_file screw.step]
|
|
||||||
XGetOneShape ss D0
|
|
||||||
incmesh ss 1.0
|
|
||||||
|
|
||||||
set aGltfFile1 "${imagedir}/${casename}_tmp1.glb"
|
|
||||||
set aGltfFile2 "${imagedir}/${casename}_tmp2.glb"
|
|
||||||
|
|
||||||
WriteGltf D0 "$aGltfFile1" -draco on -mergefaces
|
|
||||||
WriteGltf D0 "$aGltfFile2" -draco on
|
|
||||||
|
|
||||||
ReadGltf D1 "$aGltfFile1"
|
|
||||||
ReadGltf D "$aGltfFile2"
|
|
@@ -1,17 +0,0 @@
|
|||||||
puts "========"
|
|
||||||
puts "0032867: Data Exchange - Implement Draco compression for writing glTF"
|
|
||||||
puts "Test case exporting model into glb (binary glTF) file."
|
|
||||||
puts "========"
|
|
||||||
|
|
||||||
ReadStep D0 [locate_data_file ec_soapbox-A.stp]
|
|
||||||
XGetOneShape ss D0
|
|
||||||
incmesh ss 1.0
|
|
||||||
|
|
||||||
set aGltfFile1 "${imagedir}/${casename}_tmp1.glb"
|
|
||||||
set aGltfFile2 "${imagedir}/${casename}_tmp2.glb"
|
|
||||||
|
|
||||||
WriteGltf D0 "$aGltfFile1" -draco on
|
|
||||||
WriteGltf D0 "$aGltfFile2" -draco on -mergefaces
|
|
||||||
|
|
||||||
ReadGltf D1 "$aGltfFile1"
|
|
||||||
ReadGltf D "$aGltfFile2"
|
|
@@ -1,20 +0,0 @@
|
|||||||
puts "========"
|
|
||||||
puts "0032867: Data Exchange - Implement Draco compression for writing glTF"
|
|
||||||
puts "Test case exporting model into glb (binary glTF) file."
|
|
||||||
puts "========"
|
|
||||||
|
|
||||||
Close D0 -silent
|
|
||||||
ReadGltf D0 [locate_data_file bug32867_test.glb]
|
|
||||||
|
|
||||||
set aGltfFile1 "${imagedir}/${casename}_tmp1.glb"
|
|
||||||
set aGltfFile2 "${imagedir}/${casename}_tmp2.glb"
|
|
||||||
|
|
||||||
WriteGltf D0 "$aGltfFile1" -draco on
|
|
||||||
WriteGltf D0 "$aGltfFile2" -draco on -mergefaces
|
|
||||||
|
|
||||||
ReadGltf D1 "$aGltfFile1"
|
|
||||||
XGetOneShape s1 D1
|
|
||||||
checktrinfo s1 -tri 9366
|
|
||||||
ReadGltf D "$aGltfFile2"
|
|
||||||
XGetOneShape s2 D
|
|
||||||
checktrinfo s2 -tri 9366
|
|
@@ -1,8 +0,0 @@
|
|||||||
puts "REQUIRED All: Faulty shapes in variables faulty_1 to faulty_6101"
|
|
||||||
puts "=========="
|
|
||||||
puts "0032448: Provide exact validating (as option) using GeomLib_CheckCurveOnSurface"
|
|
||||||
puts "=========="
|
|
||||||
puts ""
|
|
||||||
|
|
||||||
restore [locate_data_file OCC54.brep] b
|
|
||||||
checkshape b -exact -parallel
|
|
@@ -1,5 +1,5 @@
|
|||||||
puts "TODO OCC30286 Windows: Error : The length of result shape is 404.004, expected 404.386"
|
puts "TODO OCC30286 Windows: Error : The length of result shape is 404.004, expected 404.386"
|
||||||
puts "TODO OCC30286 Linux: Error : The length of result shape is 404.492, expected 404.386"
|
puts "TODO CR33225 Linux: Error : The length of result shape is 404.004, expected 404.386"
|
||||||
|
|
||||||
polyline f1 0 0 0 0 -10 0 100 -10 0 100 0 0 0 0 0
|
polyline f1 0 0 0 0 -10 0 100 -10 0 100 0 0 0 0 0
|
||||||
polyline f2 100 0 0 110 0 0 110 100 0 100 100 0 100 0 0
|
polyline f2 100 0 0 110 0 0 110 100 0 100 100 0 100 0 0
|
||||||
|
29
tests/lowalgos/proximity/D4
Normal file
29
tests/lowalgos/proximity/D4
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
puts "============"
|
||||||
|
puts "0033144: Modeling Algorithms - Wrong result of Shape Proximity"
|
||||||
|
puts "==========="
|
||||||
|
puts ""
|
||||||
|
|
||||||
|
sphere s1 0 1 0 0 0 1 1
|
||||||
|
trimu s1 s1 0 pi
|
||||||
|
mkface fs1 s1
|
||||||
|
incmesh fs1 1e-3
|
||||||
|
|
||||||
|
plane p1 0 0 0 0 1 0
|
||||||
|
trim p1 p1 -1 1 -1 1
|
||||||
|
mkface f2 p1
|
||||||
|
incmesh f2 1e-3
|
||||||
|
|
||||||
|
set log [proximity fs1 f2 -value -profile]
|
||||||
|
|
||||||
|
regexp {Proximity value: ([0-9+-.eE]*)} $log full val;
|
||||||
|
|
||||||
|
set tol 1.e-2
|
||||||
|
set expected 2.0
|
||||||
|
|
||||||
|
regexp {Status of ProxPnt1 on ([A-Za-z0-9._-]*) : ([A-Za-z]*)} $log full val1 val2
|
||||||
|
set status1 ${val2}
|
||||||
|
set expected_status1 Middle
|
||||||
|
|
||||||
|
regexp {Status of ProxPnt2 on ([A-Za-z0-9._-]*) : ([A-Za-z]*)} $log full val1 val2
|
||||||
|
set status2 ${val2}
|
||||||
|
set expected_status2 Middle
|
@@ -1,26 +1,23 @@
|
|||||||
puts "============"
|
puts "============"
|
||||||
puts "0033017: Implement an algorithm to find a proximity between a pair of shapes"
|
puts "0033144: Modeling Algorithms - Wrong result of Shape Proximity"
|
||||||
puts "==========="
|
puts "==========="
|
||||||
puts ""
|
puts ""
|
||||||
|
|
||||||
plane p1 0 0 0 0 0 1
|
restore [locate_data_file bug33144_e1.brep] e1
|
||||||
trim p1 p1 -1 1 -1 1
|
restore [locate_data_file bug33144_e2.brep] e2
|
||||||
mkface f1 p1
|
|
||||||
incmesh f1 1.e-3
|
|
||||||
|
|
||||||
circle c 0 0 1 1
|
incmesh e1 1e-3
|
||||||
mkedge e1 c
|
incmesh e2 1e-3
|
||||||
incmesh e1 1.e-3
|
|
||||||
|
|
||||||
set log [proximity f1 e1 -value -profile]
|
set log [proximity e1 e2 -value -profile]
|
||||||
regexp {Proximity value: ([0-9+-.eE]*)} $log full val;
|
regexp {Proximity value: ([0-9+-.eE]*)} $log full val;
|
||||||
|
|
||||||
set tol 1.e-3
|
set tol 1.e-3
|
||||||
set expected 1.0
|
set expected 0.6996
|
||||||
|
|
||||||
regexp {Status of ProxPnt1 on ([A-Za-z0-9._-]*) : ([A-Za-z]*)} $log full val1 val2
|
regexp {Status of ProxPnt1 on ([A-Za-z0-9._-]*) : ([A-Za-z]*)} $log full val1 val2
|
||||||
set status1 ${val2}
|
set status1 ${val2}
|
||||||
set expected_status1 Border
|
set expected_status1 Middle
|
||||||
|
|
||||||
regexp {Status of ProxPnt2 on ([A-Za-z0-9._-]*) : ([A-Za-z]*)} $log full val1 val2
|
regexp {Status of ProxPnt2 on ([A-Za-z0-9._-]*) : ([A-Za-z]*)} $log full val1 val2
|
||||||
set status2 ${val2}
|
set status2 ${val2}
|
@@ -1,6 +1,6 @@
|
|||||||
puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done."
|
puts "TODO OCC26556 ALL: Error : The volume"
|
||||||
puts "TODO OCC23748 ALL: Error: The command cannot be built"
|
puts "TODO OCC26556 ALL: Faulty shapes"
|
||||||
puts "TODO OCC26556 ALL: Error : The offset cannot be built."
|
puts "TODO OCC26556 ALL: Error : The area"
|
||||||
|
|
||||||
pcone s 5 0 12 270
|
pcone s 5 0 12 270
|
||||||
|
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
puts "TODO OCC25406 ALL: Error : The volume of result shape is"
|
puts "TODO OCC25406 ALL: Error : The volume of result shape is"
|
||||||
puts "TODO OCC25406 ALL: Error: bsection of the result and s is not equal to zero"
|
puts "TODO OCC25406 ALL: Error: bsection of the result and s is not equal to zero"
|
||||||
|
puts "TODO OCC25406 ALL: Faulty shapes"
|
||||||
|
|
||||||
ellipse w1 0 0 0 15 10
|
ellipse w1 0 0 0 15 10
|
||||||
mkedge w1 w1 0 pi/2
|
mkedge w1 w1 0 pi/2
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
puts "TODO OCC23068 ALL: Error : The volume of result shape "
|
puts "TODO OCC23068 ALL: Error : The volume of result shape "
|
||||||
puts "TODO OCC25406 ALL: Error: bsection of the result and s is not equal to zero"
|
|
||||||
|
|
||||||
pcone s 5 0 12 270
|
pcone s 5 0 12 270
|
||||||
|
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
puts "TODO OCC23068 ALL: Error : The volume of result shape is"
|
puts "TODO OCC23068 ALL: Error : The volume of result shape is"
|
||||||
puts "TODO OCC23068 ALL: Error: bsection of the result and s is not equal to zero"
|
puts "TODO OCC23068 ALL: Error: bsection of the result and s is not equal to zero"
|
||||||
|
puts "TODO OCC23068 ALL: Faulty shapes"
|
||||||
|
|
||||||
ellipse w1 0 0 0 15 10
|
ellipse w1 0 0 0 15 10
|
||||||
mkedge w1 w1 0 pi/2
|
mkedge w1 w1 0 pi/2
|
||||||
|
@@ -1,43 +0,0 @@
|
|||||||
puts "============"
|
|
||||||
puts "0032606: Visualization - add a shader for sky"
|
|
||||||
puts "============"
|
|
||||||
puts ""
|
|
||||||
|
|
||||||
set THE_DIM 256
|
|
||||||
|
|
||||||
pload MODELING VISUALIZATION
|
|
||||||
psphere s 1
|
|
||||||
|
|
||||||
vinit View1 -width 768 -height 512
|
|
||||||
vcamera -persp -fovy 120
|
|
||||||
|
|
||||||
chrono t restart
|
|
||||||
vbackground -skydome -size $THE_DIM -cloud 0.3 -sunDir 1.0 0.5 0.0 -time 10 -fog 0.3
|
|
||||||
chrono t show
|
|
||||||
vaxo
|
|
||||||
vdump $imagedir/${casename}_day.png
|
|
||||||
|
|
||||||
chrono t restart
|
|
||||||
vbackground -skydome -size $THE_DIM -cloud 0.3 -sunDir 1.0 -0.5 0.0 -time -10 -fog 0.05
|
|
||||||
chrono t show
|
|
||||||
vaxo
|
|
||||||
vdump $imagedir/${casename}_night.png
|
|
||||||
|
|
||||||
chrono t restart
|
|
||||||
vbackground -skydome -size $THE_DIM -cloud 0.15 -sunDir 1.0 0.15 0.0 -time 10
|
|
||||||
chrono t show
|
|
||||||
vaxo
|
|
||||||
vdump $imagedir/${casename}_sunset.png
|
|
||||||
|
|
||||||
chrono t restart
|
|
||||||
vbackground -skydome -size $THE_DIM
|
|
||||||
chrono t show
|
|
||||||
vaxo
|
|
||||||
vdump $imagedir/${casename}_defaults.png
|
|
||||||
|
|
||||||
vdisplay -dispMode 1 s
|
|
||||||
vfit
|
|
||||||
vaspects s -material SILVER
|
|
||||||
vrenderparams -shadingModel pbr
|
|
||||||
vlight headlight -enabled 0
|
|
||||||
vdump $imagedir/${casename}_pbr.png
|
|
@@ -1,33 +0,0 @@
|
|||||||
puts "========"
|
|
||||||
puts "OCC25679: Visualization, TKOpenGl - View frustum culling clips wrong objects"
|
|
||||||
puts "========"
|
|
||||||
puts ""
|
|
||||||
|
|
||||||
pload MODELING VISUALIZATION
|
|
||||||
|
|
||||||
set LINES_IN_ROW 50
|
|
||||||
|
|
||||||
set aNoCulling $imagedir/${casename}_without.png
|
|
||||||
set aWithCulling $imagedir/${casename}_with.png
|
|
||||||
set aDiff $imagedir/${casename}_diff.png
|
|
||||||
|
|
||||||
vinit View1
|
|
||||||
|
|
||||||
for {set i 0} {$i < $LINES_IN_ROW} {incr i} {
|
|
||||||
for {set j 0} {$j < $LINES_IN_ROW} {incr j} {
|
|
||||||
set aLineName "line"
|
|
||||||
append aLineName [expr $i * $LINES_IN_ROW + $j]
|
|
||||||
vline $aLineName 0 0 0 1 0 0
|
|
||||||
vsetlocation $aLineName [expr $i * 3] [expr $j * 3] 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
vfit
|
|
||||||
|
|
||||||
vrenderparams -frustumculling on
|
|
||||||
vdump $aWithCulling
|
|
||||||
vrenderparams -frustumculling off
|
|
||||||
vdump $aNoCulling
|
|
||||||
|
|
||||||
set aDiffRes [diffimage $aWithCulling $aNoCulling 0.1 0 0 $aDiff]
|
|
||||||
if {$aDiffRes != 0} { puts "ERROR : Test failed: there is a difference between images rendered with and without frustum culling" }
|
|
@@ -1,53 +0,0 @@
|
|||||||
puts "========"
|
|
||||||
puts "OCC25201: Visualization - Implementing soft shadows and ambient occlusion in OCCT ray-tracing core"
|
|
||||||
puts "========"
|
|
||||||
|
|
||||||
pload MODELING VISUALIZATION
|
|
||||||
|
|
||||||
# custom shapes
|
|
||||||
set aShape1 [locate_data_file occ/Top.brep]
|
|
||||||
set aShape2 [locate_data_file occ/Bottom.brep]
|
|
||||||
|
|
||||||
# setup 3D viewer content
|
|
||||||
vinit name=View1 w=512 h=512
|
|
||||||
vglinfo
|
|
||||||
|
|
||||||
vvbo 0
|
|
||||||
vsetdispmode 1
|
|
||||||
vbackground -gradient B4C8FF B4B4B4 -gradientMode VERTICAL
|
|
||||||
vtextureenv on 4
|
|
||||||
restore $aShape1 s1
|
|
||||||
restore $aShape2 s2
|
|
||||||
vdisplay s1 s2
|
|
||||||
vsetmaterial s1 Gold
|
|
||||||
vsetmaterial s2 Silver
|
|
||||||
vsetlocation s1 0.0 0.1 0.0
|
|
||||||
vlight -change 0 -dir 0.667 -0.667 -0.333 -smoothAngle 6 -intensity 100
|
|
||||||
vturnview 3.0 -1.2 -0.1
|
|
||||||
vfit
|
|
||||||
|
|
||||||
# activate path tracing
|
|
||||||
vrenderparams -raytrace
|
|
||||||
vrenderparams -gi
|
|
||||||
vrenderparams -rayDepth 12
|
|
||||||
|
|
||||||
set aModeNum 0
|
|
||||||
|
|
||||||
vbsdf s1 roughness 6400
|
|
||||||
|
|
||||||
vfps 200
|
|
||||||
vdump $imagedir/${casename}_${aModeNum}.png
|
|
||||||
incr aModeNum
|
|
||||||
|
|
||||||
vsetmaterial s1 glass
|
|
||||||
vbsdf s1 absorpcoeff 1.0
|
|
||||||
|
|
||||||
vfps 200
|
|
||||||
vdump $imagedir/${casename}_${aModeNum}.png
|
|
||||||
incr aModeNum
|
|
||||||
|
|
||||||
vsetmaterial s2 plaster
|
|
||||||
|
|
||||||
vfps 200
|
|
||||||
vdump $imagedir/${casename}_${aModeNum}.png
|
|
||||||
incr aModeNum
|
|
@@ -1,10 +0,0 @@
|
|||||||
puts "========"
|
|
||||||
puts "Ray Tracing - check depth-of-field"
|
|
||||||
puts "========"
|
|
||||||
|
|
||||||
source $env(CSF_OCCTSamplesPath)/tcl/pathtrace_cube.tcl
|
|
||||||
|
|
||||||
vrenderparams -ray -gi -rayDepth 10 -iss
|
|
||||||
vrenderparams -aperture 0.1 -focal 2.0
|
|
||||||
vfps 200
|
|
||||||
vdump ${imagedir}/${casename}.png
|
|
@@ -1,16 +0,0 @@
|
|||||||
puts "========"
|
|
||||||
puts "Ray Tracing - check depth-of-field"
|
|
||||||
puts "========"
|
|
||||||
|
|
||||||
source $env(CSF_OCCTSamplesPath)/tcl/pathtrace_cube.tcl
|
|
||||||
|
|
||||||
vrenderparams -ray -gi -rayDepth 10 -iss
|
|
||||||
vrenderparams -aperture 0.1 -focal 2.0
|
|
||||||
|
|
||||||
# activate stereo
|
|
||||||
vstereo on
|
|
||||||
vstereo -mode anaglyph
|
|
||||||
vcamera -iod 0.1
|
|
||||||
vfit
|
|
||||||
vfps 200
|
|
||||||
vdump ${imagedir}/${casename}.png -stereo blend
|
|
@@ -1,34 +0,0 @@
|
|||||||
puts "========"
|
|
||||||
puts "0031275: Visualization, TKOpenGl - handle normal-map texture with Path-Tracing"
|
|
||||||
puts "========"
|
|
||||||
|
|
||||||
pload XDE OCAF MODELING VISUALIZATION
|
|
||||||
Close D -silent
|
|
||||||
ReadGltf D [locate_data_file bug31275_SphereWithNormalMap.glb]
|
|
||||||
|
|
||||||
vclear
|
|
||||||
vinit v -w 1024 -h 1024
|
|
||||||
vbackground -cubemap [locate_data_file Circus_CubeMap_V.png]
|
|
||||||
vcamera -persp
|
|
||||||
vlight -clear
|
|
||||||
vlight -add ambient
|
|
||||||
XDisplay -dispmode 1 D
|
|
||||||
vback
|
|
||||||
vfit
|
|
||||||
|
|
||||||
vrenderparams -ignoreNormalMap on
|
|
||||||
vrenderparams -ray -gi -rayDepth 10
|
|
||||||
vfps 200
|
|
||||||
vdump ${imagedir}/${casename}_without_normal_map.png
|
|
||||||
|
|
||||||
vrenderparams -ignoreNormalMap off
|
|
||||||
vfps 200
|
|
||||||
vdump ${imagedir}/${casename}_with_normal_map_back.png
|
|
||||||
|
|
||||||
vfront
|
|
||||||
vfps 200
|
|
||||||
vdump ${imagedir}/${casename}_with_normal_map_front.png
|
|
||||||
|
|
||||||
vlight -add positional -pos 0 0 0 -head 1 -intensity 10
|
|
||||||
vfps 200
|
|
||||||
vdump ${imagedir}/${casename}_point_light.png
|
|
@@ -1,43 +0,0 @@
|
|||||||
puts "========"
|
|
||||||
puts "0031225: Visualization, TKOpenGl - support cubemap for environment texture within Ray-Tracing"
|
|
||||||
puts "Spheres grid with different roughness values"
|
|
||||||
puts "========"
|
|
||||||
|
|
||||||
cpulimit 600
|
|
||||||
|
|
||||||
pload MODELING VISUALIZATION
|
|
||||||
vclear
|
|
||||||
vclose ALL
|
|
||||||
source $env(CSF_OCCTSamplesPath)/tcl/vis_pbr_spheres.tcl
|
|
||||||
|
|
||||||
vrenderparams -ray -gi -rayDepth 10
|
|
||||||
vcamera -ortho
|
|
||||||
vfit
|
|
||||||
vlight -change 1 -intensity 0.0001
|
|
||||||
vfps 200
|
|
||||||
vdump $::imagedir/${::casename}_ortho0.png
|
|
||||||
|
|
||||||
vlight -change 1 -intensity 0.3
|
|
||||||
vfps 200
|
|
||||||
vdump $::imagedir/${::casename}_ortho30.png
|
|
||||||
|
|
||||||
vcamera -persp
|
|
||||||
vfit
|
|
||||||
vlight -change 1 -intensity 0.0001
|
|
||||||
vfps 200
|
|
||||||
vdump $::imagedir/${::casename}_persp0.png
|
|
||||||
|
|
||||||
vlight -change 1 -intensity 0.3
|
|
||||||
vfps 200
|
|
||||||
vdump $::imagedir/${::casename}_persp30.png
|
|
||||||
|
|
||||||
set aCubeMap [locate_data_file Circus_CubeMap_V.png]
|
|
||||||
vlight -change 1 -intensity 1
|
|
||||||
vbackground -cubemap $aCubeMap
|
|
||||||
vcamera -ortho
|
|
||||||
vfps 200
|
|
||||||
vdump $::imagedir/${::casename}_orthoenv.png
|
|
||||||
|
|
||||||
vcamera -persp
|
|
||||||
vfps 200
|
|
||||||
vdump $::imagedir/${::casename}_perspenv.png
|
|
@@ -1,13 +0,0 @@
|
|||||||
puts "============"
|
|
||||||
puts "Visualization - Path Tracing, Ball sample"
|
|
||||||
puts "============"
|
|
||||||
puts ""
|
|
||||||
|
|
||||||
source $env(CSF_OCCTSamplesPath)/tcl/pathtrace_ball.tcl
|
|
||||||
|
|
||||||
vtexture ball 21 -scale 0.1 0.1
|
|
||||||
vsetmaterial ball plaster
|
|
||||||
vbsdf ball -coatFresnel Constant 0.0
|
|
||||||
|
|
||||||
vfps 100
|
|
||||||
vdump $imagedir/${casename}_zoom.png
|
|
@@ -1,20 +0,0 @@
|
|||||||
puts "============"
|
|
||||||
puts "Visualization - Path Tracing, Ball sample (ISS mode)"
|
|
||||||
puts "============"
|
|
||||||
puts ""
|
|
||||||
|
|
||||||
cpulimit 1000
|
|
||||||
|
|
||||||
source $env(CSF_OCCTSamplesPath)/tcl/pathtrace_ball.tcl
|
|
||||||
|
|
||||||
vrenderparams -iss -nbtiles 64
|
|
||||||
vfps 1024
|
|
||||||
vdump $imagedir/${casename}_iss_64.png
|
|
||||||
|
|
||||||
vrenderparams -iss -nbtiles 256
|
|
||||||
vfps 256
|
|
||||||
vdump $imagedir/${casename}_iss_256.png
|
|
||||||
|
|
||||||
vrenderparams -iss -nbtiles 1024
|
|
||||||
vfps 64
|
|
||||||
vdump $imagedir/${casename}_iss_1024.png
|
|
@@ -1,13 +0,0 @@
|
|||||||
puts "============"
|
|
||||||
puts "0031135: Visualization, TKOpenGl - texture sRGB -> linear conversion is applied twice by Path Tracer"
|
|
||||||
puts "============"
|
|
||||||
puts ""
|
|
||||||
|
|
||||||
source $env(CSF_OCCTSamplesPath)/tcl/pathtrace_ball.tcl
|
|
||||||
|
|
||||||
vtexture ball 11 -scale 0.1 0.1
|
|
||||||
vsetmaterial ball plaster
|
|
||||||
vbsdf ball -coatFresnel Constant 0.0
|
|
||||||
|
|
||||||
vfps 100
|
|
||||||
vdump $imagedir/${casename}_zoom.png
|
|
@@ -1,8 +0,0 @@
|
|||||||
puts "============"
|
|
||||||
puts "Visualization - Path Tracing, Cube sample"
|
|
||||||
puts "============"
|
|
||||||
puts ""
|
|
||||||
|
|
||||||
source $env(CSF_OCCTSamplesPath)/tcl/pathtrace_cube.tcl
|
|
||||||
vfps 200
|
|
||||||
vdump ${imagedir}/${casename}.png
|
|
@@ -1,22 +0,0 @@
|
|||||||
puts "============"
|
|
||||||
puts "Visualization - Path Tracing, Cube sample with radiance clamping"
|
|
||||||
puts "============"
|
|
||||||
puts ""
|
|
||||||
|
|
||||||
source $env(CSF_OCCTSamplesPath)/tcl/pathtrace_cube.tcl
|
|
||||||
|
|
||||||
vrenderparams -maxrad 1.0
|
|
||||||
vfps 100
|
|
||||||
vdump $imagedir/${casename}_1.png
|
|
||||||
|
|
||||||
vrenderparams -maxrad 2.0
|
|
||||||
vfps 100
|
|
||||||
vdump $imagedir/${casename}_2.png
|
|
||||||
|
|
||||||
vrenderparams -maxrad 10.0
|
|
||||||
vfps 100
|
|
||||||
vdump $imagedir/${casename}_10.png
|
|
||||||
|
|
||||||
vrenderparams -maxrad 100.0
|
|
||||||
vfps 100
|
|
||||||
vdump $imagedir/${casename}_100.png
|
|
@@ -1,19 +0,0 @@
|
|||||||
puts "============"
|
|
||||||
puts "Visualization - Path Tracing, Cube sample"
|
|
||||||
puts "============"
|
|
||||||
puts ""
|
|
||||||
|
|
||||||
source $env(CSF_OCCTSamplesPath)/tcl/pathtrace_cube.tcl
|
|
||||||
|
|
||||||
vaxo
|
|
||||||
vfit
|
|
||||||
vfps 100
|
|
||||||
|
|
||||||
# Dump image produced with one-sided BSDFs
|
|
||||||
vdump $imagedir/${casename}_onesided.png
|
|
||||||
|
|
||||||
vrenderparams -twoside
|
|
||||||
vfps 100
|
|
||||||
|
|
||||||
# Dump image produced with two-sided BSDFs
|
|
||||||
vdump $imagedir/${casename}_twosided.png
|
|
@@ -1,7 +0,0 @@
|
|||||||
puts "============"
|
|
||||||
puts "Visualization - Path Tracing, Materials sample"
|
|
||||||
puts "============"
|
|
||||||
puts ""
|
|
||||||
|
|
||||||
source $env(CSF_OCCTSamplesPath)/tcl/pathtrace_materials.tcl
|
|
||||||
vdump $imagedir/${casename}_materials.png
|
|
@@ -1,14 +0,0 @@
|
|||||||
puts "========"
|
|
||||||
puts "Ray Tracing - check tone mapping"
|
|
||||||
puts "========"
|
|
||||||
|
|
||||||
source $env(CSF_OCCTSamplesPath)/tcl/pathtrace_cube.tcl
|
|
||||||
|
|
||||||
vrenderparams -ray -gi -rayDepth 10 -iss
|
|
||||||
|
|
||||||
vrenderparams -tonemapping filmic
|
|
||||||
vrenderparams -exposure -1.0
|
|
||||||
vrenderparams -whitepoint 7.0
|
|
||||||
vfit
|
|
||||||
vfps 200
|
|
||||||
vdump ${imagedir}/${casename}.png
|
|
@@ -1,34 +0,0 @@
|
|||||||
puts "========"
|
|
||||||
puts "0030700: Visualization, TKOpenGl - support PBR Metallic-Roughness shading model"
|
|
||||||
puts "Spheres grid with different roughness values"
|
|
||||||
puts "========"
|
|
||||||
|
|
||||||
pload MODELING VISUALIZATION
|
|
||||||
|
|
||||||
# PBR doesn't work with Compatible Profile on macOS
|
|
||||||
if { $::tcl_platform(os) == "Darwin" } { vcaps -core }
|
|
||||||
|
|
||||||
vclear
|
|
||||||
vclose ALL
|
|
||||||
source $env(CSF_OCCTSamplesPath)/tcl/vis_pbr_spheres.tcl
|
|
||||||
|
|
||||||
vcamera -ortho
|
|
||||||
vfit
|
|
||||||
vlight -change 1 -intensity 0.0001
|
|
||||||
vdump $::imagedir/${::casename}_ortho0.png
|
|
||||||
vlight -change 1 -intensity 0.3
|
|
||||||
vdump $::imagedir/${::casename}_ortho30.png
|
|
||||||
vcamera -persp
|
|
||||||
vfit
|
|
||||||
vlight -change 1 -intensity 0.0001
|
|
||||||
vdump $::imagedir/${::casename}_persp0.png
|
|
||||||
vlight -change 1 -intensity 0.3
|
|
||||||
vdump $::imagedir/${::casename}_persp30.png
|
|
||||||
|
|
||||||
set aCubeMap [locate_data_file Circus_CubeMap_V.png]
|
|
||||||
vlight -change 1 -intensity 1
|
|
||||||
vbackground -cubemap $aCubeMap
|
|
||||||
vcamera -ortho
|
|
||||||
vdump $::imagedir/${::casename}_orthoenv.png
|
|
||||||
vcamera -persp
|
|
||||||
vdump $::imagedir/${::casename}_perspenv.png
|
|
@@ -1,68 +0,0 @@
|
|||||||
puts "========"
|
|
||||||
puts "Test various Shading Models assigned per-object"
|
|
||||||
puts "========"
|
|
||||||
|
|
||||||
pload MODELING VISUALIZATION
|
|
||||||
|
|
||||||
# PBR doesn't work with Compatible Profile on macOS
|
|
||||||
#if { $::tcl_platform(os) == "Darwin" } { vcaps -core }
|
|
||||||
|
|
||||||
# setup viewer
|
|
||||||
vclear
|
|
||||||
vclose ALL
|
|
||||||
vinit View1 -width 912 -height 912
|
|
||||||
|
|
||||||
# define spheres with a rough triangulation to easily distinguish Shading Models
|
|
||||||
psphere p0 10
|
|
||||||
copytranslate p11 p0 0 0 0
|
|
||||||
copytranslate p12 p0 40 0 0
|
|
||||||
copytranslate p21 p0 0 20 0
|
|
||||||
copytranslate p22 p0 40 20 0
|
|
||||||
copytranslate p31 p0 0 40 0
|
|
||||||
copytranslate p32 p0 40 40 0
|
|
||||||
compound p11 p12 p21 p22 p31 p32 ss
|
|
||||||
incmesh ss 1
|
|
||||||
vdefaults -autoTriang 0
|
|
||||||
|
|
||||||
# display objects
|
|
||||||
vdisplay -dispMode 1 p11 p12 p21 p22 p31 p32
|
|
||||||
vdrawparray p41 triangles v 0 55 0 v 0 75 0 v 20 55 0 v 0 55 0 v 0 75 0 v 0 55 20 v 0 55 0 v 0 55 20 v 20 55 0 v 0 75 0 v 0 55 20 v 20 55 0
|
|
||||||
vdrawparray p42 triangles v 40 55 0 v 40 75 0 v 60 55 0 v 40 55 0 v 40 75 0 v 40 55 20 v 40 55 0 v 40 55 20 v 60 55 0 v 40 75 0 v 40 55 20 v 60 55 0
|
|
||||||
vtop
|
|
||||||
vrotate -0.9 0.1 0
|
|
||||||
vfit
|
|
||||||
|
|
||||||
vcaps -ffp 1
|
|
||||||
vdump $::imagedir/${::casename}_defaults_ffp.png
|
|
||||||
|
|
||||||
vcaps -ffp 0
|
|
||||||
vdump $::imagedir/${::casename}_defaults.png
|
|
||||||
|
|
||||||
# customize shading models
|
|
||||||
vaspects p11 -setShadingModel VERTEX
|
|
||||||
vdrawtext t11 Graphic3d_TOSM_VERTEX -pos 10 5 10 -color RED -aspect BOLD
|
|
||||||
vaspects p12 -setShadingModel FRAGMENT
|
|
||||||
vdrawtext t12 Graphic3d_TOSM_FRAGMENT -pos 50 5 10 -color RED -aspect BOLD
|
|
||||||
|
|
||||||
vaspects p21 -setShadingModel PBR
|
|
||||||
vdrawtext t21 Graphic3d_TOSM_PBR -pos 10 25 10 -color RED -aspect BOLD
|
|
||||||
vaspects p22 -setShadingModel PBR_FACET
|
|
||||||
vdrawtext t22 Graphic3d_TOSM_PBR_FACET -pos 50 25 10 -color RED -aspect BOLD
|
|
||||||
|
|
||||||
vaspects p31 -setShadingModel UNLIT
|
|
||||||
vdrawtext t31 Graphic3d_TOSM_UNLIT -pos 10 45 10 -color RED -aspect BOLD
|
|
||||||
vaspects p32 -setShadingModel FACET
|
|
||||||
vdrawtext t32 Graphic3d_TOSM_FACET -pos 50 45 10 -color RED -aspect BOLD
|
|
||||||
vaspects p41 -setShadingModel VERTEX
|
|
||||||
vdrawtext t41 Graphic3d_TOSM_VERTEX -pos 10 65 10 -color RED -aspect BOLD
|
|
||||||
vaspects p42 -setShadingModel FACET
|
|
||||||
vdrawtext t42 Graphic3d_TOSM_FACET -pos 50 65 10 -color RED -aspect BOLD
|
|
||||||
vdisplay -topmost t11 t12 t21 t22 t31 t32 t41 t42
|
|
||||||
|
|
||||||
vcaps -ffp 1
|
|
||||||
vdump $::imagedir/${::casename}_ffp.png
|
|
||||||
|
|
||||||
vcaps -ffp 0
|
|
||||||
vlight -change 1 -intensity 0.1
|
|
||||||
vrenderparams -shadingModel pbr
|
|
||||||
vdump $::imagedir/${::casename}.png
|
|
@@ -1,36 +0,0 @@
|
|||||||
puts "============"
|
|
||||||
puts "0031478: Visualization, TKOpenGl - allow uploading Cubemap in compressed DDS format when supported by GPU"
|
|
||||||
puts "============"
|
|
||||||
puts ""
|
|
||||||
|
|
||||||
pload MODELING VISUALIZATION
|
|
||||||
|
|
||||||
if { $::tcl_platform(os) == "Darwin" } {
|
|
||||||
# PBR doesn't work with Compatible Profile on macOS
|
|
||||||
vcaps -core
|
|
||||||
}
|
|
||||||
if { [vdriver -default] == "TKOpenGles" } {
|
|
||||||
puts "Skipping test case 'DDS texture': OpenGL ES does not support sRGB S3TC_DXT1 texture format"
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
set aCubeMapPNG [locate_data_file cubemap_labels.png]
|
|
||||||
set aCubeMapDDS [locate_data_file cubemap_labels.dds]
|
|
||||||
|
|
||||||
box b 1 2 3
|
|
||||||
psphere s 1
|
|
||||||
|
|
||||||
vclear
|
|
||||||
vinit View1 -w 512 -h 512
|
|
||||||
vcamera -fovy 100
|
|
||||||
vzbufftrihedron
|
|
||||||
#vdisplay -dispMode 1 b
|
|
||||||
vdisplay -dispMode 1 s
|
|
||||||
vfit
|
|
||||||
|
|
||||||
vrenderparams -shadingModel pbr
|
|
||||||
vbackground -cubemap $aCubeMapPNG -invertedz
|
|
||||||
vdump $imagedir/${casename}_png.png
|
|
||||||
|
|
||||||
vbackground -cubemap $aCubeMapDDS -invertedz
|
|
||||||
vdump $imagedir/${casename}_dds.png
|
|
@@ -1,25 +0,0 @@
|
|||||||
puts "============"
|
|
||||||
puts "0032590: Visualization, V3d_View - improve API for setting Image Based Lighting"
|
|
||||||
puts "============"
|
|
||||||
puts ""
|
|
||||||
|
|
||||||
set aCubeMapLabs [locate_data_file cubemap_labels.png]
|
|
||||||
|
|
||||||
pload MODELING VISUALIZATION
|
|
||||||
|
|
||||||
# PBR doesn't work with Compatible Profile on macOS
|
|
||||||
if { $::tcl_platform(os) == "Darwin" } { vcaps -core }
|
|
||||||
|
|
||||||
vclear
|
|
||||||
vclose ALL
|
|
||||||
source $env(CSF_OCCTSamplesPath)/tcl/vis_pbr_spheres.tcl
|
|
||||||
vcamera -fovy 100
|
|
||||||
|
|
||||||
vbackground -cubemap $aCubeMapLabs -pbrEnv noIBL
|
|
||||||
vdump $imagedir/${casename}_1.png
|
|
||||||
|
|
||||||
vbackground -pbrEnv IBL
|
|
||||||
vdump $imagedir/${casename}_2.png
|
|
||||||
|
|
||||||
vbackground BLACK -pbrEnv KEEP
|
|
||||||
vdump $imagedir/${casename}_3.png
|
|
@@ -1,31 +0,0 @@
|
|||||||
puts "========"
|
|
||||||
puts "0031302: Visualization, TKOpenGl - wrong tangent space calculation for normal maps"
|
|
||||||
puts "Test for tangent space orientation."
|
|
||||||
puts "========"
|
|
||||||
|
|
||||||
pload XDE OCAF MODELING VISUALIZATION
|
|
||||||
|
|
||||||
# PBR doesn't work with Compatible Profile on macOS
|
|
||||||
if { $::tcl_platform(os) == "Darwin" } { vcaps -core }
|
|
||||||
|
|
||||||
vclear
|
|
||||||
vclose ALL
|
|
||||||
|
|
||||||
vinit v -w 1024 -h 1024
|
|
||||||
vcamera -persp
|
|
||||||
vbackground -cubemap [locate_data_file Circus_CubeMap_V.png]
|
|
||||||
vrenderparams -shadingModel PBR
|
|
||||||
|
|
||||||
vlight -clear
|
|
||||||
vlight -add ambient
|
|
||||||
|
|
||||||
Close D -silent
|
|
||||||
ReadGltf D [locate_data_file bug31302_NormalTangentTest.gltf]
|
|
||||||
XDisplay -dispmode 1 D
|
|
||||||
|
|
||||||
vfront
|
|
||||||
vfit
|
|
||||||
vdump $imagedir/${casename}_front.png
|
|
||||||
|
|
||||||
vback
|
|
||||||
vdump $imagedir/${casename}_back.png
|
|
@@ -1,51 +0,0 @@
|
|||||||
puts "========"
|
|
||||||
puts "0031284: Visualization - XCAFDoc_VisMaterialPBR lacks Index of Refraction"
|
|
||||||
puts "========"
|
|
||||||
|
|
||||||
pload MODELING XDE OCAF VISUALIZATION
|
|
||||||
if { $::tcl_platform(os) == "Darwin" } { vcaps -core }
|
|
||||||
|
|
||||||
box b 0.5 1.0 -0.5 3 1 1
|
|
||||||
psphere s1 0.5
|
|
||||||
psphere s2 0.5
|
|
||||||
psphere s3 0.5
|
|
||||||
ttranslate s1 1 0 0
|
|
||||||
ttranslate s2 2 0 0
|
|
||||||
ttranslate s3 3 0 0
|
|
||||||
Close D -silent
|
|
||||||
XNewDoc D
|
|
||||||
set l0 [XAddShape D b 0]
|
|
||||||
set l1 [XAddShape D s1 0]
|
|
||||||
set l2 [XAddShape D s2 0]
|
|
||||||
set l3 [XAddShape D s3 0]
|
|
||||||
XAddVisMaterial D m1 -baseColor GREEN -refractionIndex 1.0 -transparency 0.5 -metallic 0 -roughness 0
|
|
||||||
XAddVisMaterial D m2 -baseColor GREEN -refractionIndex 1.3 -transparency 0.5 -metallic 0 -roughness 0
|
|
||||||
XAddVisMaterial D m3 -baseColor GREEN -refractionIndex 2.5 -transparency 0.5 -metallic 0 -roughness 0
|
|
||||||
XSetVisMaterial D $l1 m1
|
|
||||||
XSetVisMaterial D $l2 m2
|
|
||||||
XSetVisMaterial D $l3 m3
|
|
||||||
|
|
||||||
vclear
|
|
||||||
vinit View1
|
|
||||||
vcamera -persp
|
|
||||||
vfront
|
|
||||||
XDisplay -dispMode 1 D
|
|
||||||
vfit
|
|
||||||
vviewparams -scale 245 -proj -0 -0.75 -0.66 -up 0 -0.66 0.75 -at 2.0 0.84 0.04
|
|
||||||
vlight -change 0 -intensity 2.5
|
|
||||||
vlight -change 1 -intensity 1.0
|
|
||||||
set aCubeMap [locate_data_file Circus_CubeMap_V.png]
|
|
||||||
vbackground -cubemap $aCubeMap
|
|
||||||
|
|
||||||
vrenderparams -shadingModel PBR -raster
|
|
||||||
vdump $imagedir/${casename}_pbr.png
|
|
||||||
|
|
||||||
if { ![string match "OpenGL ES 2.0*" [vglinfo VERSION]] && ![string match "OpenGL ES 3.0*" [vglinfo VERSION]] } {
|
|
||||||
vrenderparams -raytrace -gi 0 -reflections 1 -rayDepth 10
|
|
||||||
vfps 200
|
|
||||||
vdump $imagedir/${casename}_rt.png
|
|
||||||
|
|
||||||
vrenderparams -raytrace -gi 1
|
|
||||||
vfps 200
|
|
||||||
vdump $imagedir/${casename}_pt.png
|
|
||||||
}
|
|
@@ -3,6 +3,8 @@ puts "Testing performance of Strtod() vs. standard strtod()"
|
|||||||
puts "================================================================="
|
puts "================================================================="
|
||||||
puts ""
|
puts ""
|
||||||
|
|
||||||
|
puts "TODO ?CR33225 Linux: is expected to be at least "
|
||||||
|
|
||||||
pload QAcommands
|
pload QAcommands
|
||||||
|
|
||||||
# Check that performance of Strtod() and Atof() is at least twice better
|
# Check that performance of Strtod() and Atof() is at least twice better
|
||||||
|
18
tests/pipe/bugs/bug32818
Normal file
18
tests/pipe/bugs/bug32818
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
puts "========"
|
||||||
|
puts "0032818: Modeling Algorithms - Result of sweep operation is invalid"
|
||||||
|
puts "========"
|
||||||
|
puts ""
|
||||||
|
|
||||||
|
restore [locate_data_file bug32818.brep]
|
||||||
|
explode bug32818
|
||||||
|
renamevar bug32818_1 p
|
||||||
|
renamevar bug32818_2 pr
|
||||||
|
|
||||||
|
mksweep p
|
||||||
|
setsweep -CF
|
||||||
|
addsweep pr
|
||||||
|
|
||||||
|
buildsweep result -R -S
|
||||||
|
|
||||||
|
checkshape result
|
||||||
|
checknbshapes result -vertex 80 -edge 160 -wire 80 -face 80 -shell 1 -solid 1
|
@@ -1,3 +0,0 @@
|
|||||||
if { [array get Draw_Groups "TOOLS Check commands"] == "" } {
|
|
||||||
pload TOOLS
|
|
||||||
}
|
|
@@ -1,12 +0,0 @@
|
|||||||
pload DCAF
|
|
||||||
pload INSPECTOR
|
|
||||||
|
|
||||||
NewDocument Doc BinOcaf
|
|
||||||
|
|
||||||
set aSetAttr1 100
|
|
||||||
set aLabel 0:2
|
|
||||||
SetInteger Doc ${aLabel} ${aSetAttr1}
|
|
||||||
|
|
||||||
tinspector -plugins dfbrowser
|
|
||||||
tinspector -update
|
|
||||||
|
|
@@ -1,23 +0,0 @@
|
|||||||
pload DCAF VISUALIZATION INSPECTOR
|
|
||||||
|
|
||||||
NewDocument D BinOcaf
|
|
||||||
tinspector -plugins dfbrowser
|
|
||||||
|
|
||||||
cpulimit 300
|
|
||||||
UndoLimit D 100
|
|
||||||
|
|
||||||
NewCommand D
|
|
||||||
|
|
||||||
NewCommand D
|
|
||||||
|
|
||||||
set B2 [AddObject D]
|
|
||||||
set F2 [AddFunction D $B2 Box]
|
|
||||||
BoxDX D $B2 190
|
|
||||||
BoxDY D $B2 290
|
|
||||||
BoxDZ D $B2 390
|
|
||||||
|
|
||||||
InitLogBook D
|
|
||||||
AddDriver D Box Attach Cyl
|
|
||||||
ComputeFun D $F2
|
|
||||||
|
|
||||||
tinspector -update
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user