mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-09 13:22:24 +03:00
Compare commits
3 Commits
CR30868
...
CR32857_us
Author | SHA1 | Date | |
---|---|---|---|
|
f53c218335 | ||
|
acaaf4f598 | ||
|
7b98ef4e57 |
@@ -309,74 +309,6 @@ Handle(Geom_Surface) BRepOffset::CollapseSingularities (const Handle(Geom_Surfac
|
||||
}
|
||||
}
|
||||
|
||||
if (aPoles.RowLength() > 2 && aPoles.ColLength() > 2)
|
||||
{
|
||||
// Check if the adjacent sides of the surfaces are collapsed, i.e. if normal is
|
||||
// is impossible to compute in the 'corners'
|
||||
// If such corner is found, move the pole outside a bit, to make the 'corner' more obvious
|
||||
|
||||
// We are dealing with four points:
|
||||
// (UMin, VMin), (UMin, VMax), (UMax, VMin), (UMax, VMax)
|
||||
// or (1, 1), (1, NbVPoles), (NbUPoles, 1), (NbUPoles, NbUPoles)
|
||||
|
||||
Handle(Geom_Surface)& aSurf = aCopy.IsNull() ? aBSpline : aCopy;
|
||||
|
||||
Standard_Real anU[2], aV[2];
|
||||
aBSpline->Bounds (anU[0], anU[1], aV[0], aV[1]);
|
||||
|
||||
Standard_Integer aCornerPoleUIndex[2] = { aPoles.LowerRow(), aPoles.UpperRow() };
|
||||
Standard_Integer aCornerPoleVIndex[2] = { aPoles.LowerCol(), aPoles.UpperCol() };
|
||||
|
||||
Standard_Integer aPoleInsideUIndex[2] = { aCornerPoleUIndex[0] + 1, aCornerPoleUIndex[1] - 1 };
|
||||
Standard_Integer aPoleInsideVIndex[2] = { aCornerPoleVIndex[0] + 1, aCornerPoleVIndex[1] - 1 };
|
||||
|
||||
for (int iU = 0; iU < 2; ++iU)
|
||||
{
|
||||
for (int iV = 0; iV < 2; ++iV)
|
||||
{
|
||||
gp_Pnt aP;
|
||||
gp_Vec aDU, aDV;
|
||||
aSurf->D1 (anU[iU], aV[iV], aP, aDU, aDV);
|
||||
|
||||
gp_Vec aSNorm = aDU ^ aDV;
|
||||
if (aSNorm.SquareMagnitude() < thePrecision * thePrecision)
|
||||
{
|
||||
if (aCopy.IsNull())
|
||||
{
|
||||
aCopy = Handle (Geom_BSplineSurface)::DownCast (theSurface->Copy());
|
||||
aSurf = aCopy;
|
||||
}
|
||||
|
||||
// Move the pole outside surface
|
||||
|
||||
// Get the nearest pole inside
|
||||
gp_Pnt aPInside = aPoles.Value (aPoleInsideUIndex[iU], aPoleInsideVIndex[iV]);
|
||||
gp_Vec aVecOutside (aPInside, aP);
|
||||
|
||||
aDU.Rotate (gp_Ax1 (aP, aDU ^ aVecOutside), M_PI_2);
|
||||
aDV.Rotate (gp_Ax1 (aP, aDV ^ aVecOutside), M_PI_2);
|
||||
|
||||
aVecOutside = (aDU + aDV).Normalized();
|
||||
|
||||
int k = 1;
|
||||
while (aSNorm.SquareMagnitude() < thePrecision * thePrecision && k <= 1024)
|
||||
{
|
||||
k *= 2;
|
||||
aP.Translate (k * Precision::Confusion() * aVecOutside);
|
||||
aCopy->SetPole (aCornerPoleUIndex[iU], aCornerPoleVIndex[iV], aP);
|
||||
|
||||
aCopy->D1 (anU[iU], aV[iV], aP, aDU, aDV);
|
||||
gp_Vec aN1 = aDU ^ aDV;
|
||||
|
||||
//if (aN1 * aSNorm < 0.0)
|
||||
// break;
|
||||
aSNorm = aN1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (! aCopy.IsNull())
|
||||
return aCopy;
|
||||
}
|
||||
|
@@ -37,9 +37,7 @@ Draft_FaceInfo::Draft_FaceInfo (const Handle(Geom_Surface)& S,\
|
||||
const Standard_Boolean HasNewGeometry):
|
||||
myNewGeom(HasNewGeometry)
|
||||
{
|
||||
Handle(Geom_RectangularTrimmedSurface) T = Handle(Geom_RectangularTrimmedSurface)::DownCast(S);
|
||||
if (!T.IsNull()) myGeom = T->BasisSurface();
|
||||
else myGeom = S;
|
||||
myGeom = S;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -481,7 +481,7 @@ Standard_Boolean Draft_Modification::Propagate ()
|
||||
Handle(Geom_Surface)::DownCast(S->Transformed(L.Transformation()));
|
||||
|
||||
const Handle(Standard_Type)& typs = S->DynamicType();
|
||||
if (typs == STANDARD_TYPE(Geom_CylindricalSurface) ||
|
||||
if (/*typs == STANDARD_TYPE(Geom_CylindricalSurface) ||*/
|
||||
typs == STANDARD_TYPE(Geom_ConicalSurface)) {
|
||||
Standard_Real 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
|
||||
TColGeom_SequenceOfCurve Candidates;
|
||||
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++)
|
||||
{
|
||||
|
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
|
||||
|
Reference in New Issue
Block a user