mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-21 10:13:43 +03:00
0026406: BRepPrimAPI_MakeRevol crash when rotating Paraboloid face.
Test-case for issue #26406
This commit is contained in:
parent
679d4fa8ca
commit
4f0fb8b396
@ -37,10 +37,10 @@
|
|||||||
//=======================================================================
|
//=======================================================================
|
||||||
BRepSweep_NumLinearRegularSweep::BRepSweep_NumLinearRegularSweep
|
BRepSweep_NumLinearRegularSweep::BRepSweep_NumLinearRegularSweep
|
||||||
(const BRepSweep_Builder& aBuilder,
|
(const BRepSweep_Builder& aBuilder,
|
||||||
const TopoDS_Shape& aGenShape,
|
const TopoDS_Shape& aGenShape,
|
||||||
const Sweep_NumShape& aDirShape):
|
const Sweep_NumShape& aDirShape):
|
||||||
|
|
||||||
myBuilder(aBuilder),
|
myBuilder(aBuilder),
|
||||||
myGenShape(aGenShape),
|
myGenShape(aGenShape),
|
||||||
myDirWire(aDirShape),
|
myDirWire(aDirShape),
|
||||||
|
|
||||||
@ -52,9 +52,9 @@ BRepSweep_NumLinearRegularSweep::BRepSweep_NumLinearRegularSweep
|
|||||||
// *****************************************************************
|
// *****************************************************************
|
||||||
|
|
||||||
myShapes(1,myGenShapeTool.NbShapes(),
|
myShapes(1,myGenShapeTool.NbShapes(),
|
||||||
1,myDirShapeTool.NbShapes()),
|
1,myDirShapeTool.NbShapes()),
|
||||||
myBuiltShapes(1,myGenShapeTool.NbShapes(),
|
myBuiltShapes(1,myGenShapeTool.NbShapes(),
|
||||||
1,myDirShapeTool.NbShapes())
|
1,myDirShapeTool.NbShapes())
|
||||||
{
|
{
|
||||||
myBuiltShapes.Init(Standard_False);
|
myBuiltShapes.Init(Standard_False);
|
||||||
}
|
}
|
||||||
@ -91,7 +91,7 @@ TopoDS_Shape BRepSweep_NumLinearRegularSweep::Shape ()
|
|||||||
TopoDS_Shape BRepSweep_NumLinearRegularSweep::Shape (const TopoDS_Shape& aGenS)
|
TopoDS_Shape BRepSweep_NumLinearRegularSweep::Shape (const TopoDS_Shape& aGenS)
|
||||||
{
|
{
|
||||||
if (myGenShapeTool.Index(aGenS) != 0 &&
|
if (myGenShapeTool.Index(aGenS) != 0 &&
|
||||||
HasShape(aGenS,myDirWire)) return Shape(aGenS,myDirWire);
|
HasShape(aGenS,myDirWire)) return Shape(aGenS,myDirWire);
|
||||||
else {
|
else {
|
||||||
TopoDS_Shape bidon;
|
TopoDS_Shape bidon;
|
||||||
return bidon;
|
return bidon;
|
||||||
@ -105,7 +105,7 @@ TopoDS_Shape BRepSweep_NumLinearRegularSweep::Shape (const TopoDS_Shape& aGenS)
|
|||||||
//=======================================================================
|
//=======================================================================
|
||||||
|
|
||||||
TopoDS_Shape BRepSweep_NumLinearRegularSweep::Shape (const TopoDS_Shape& aGenS,
|
TopoDS_Shape BRepSweep_NumLinearRegularSweep::Shape (const TopoDS_Shape& aGenS,
|
||||||
const Sweep_NumShape& aDirS)
|
const Sweep_NumShape& aDirS)
|
||||||
{
|
{
|
||||||
Standard_Integer iGenS = myGenShapeTool.Index(aGenS);
|
Standard_Integer iGenS = myGenShapeTool.Index(aGenS);
|
||||||
Standard_Integer iDirS = myDirShapeTool.Index(aDirS);
|
Standard_Integer iDirS = myDirShapeTool.Index(aDirS);
|
||||||
@ -122,80 +122,80 @@ TopoDS_Shape BRepSweep_NumLinearRegularSweep::Shape (const TopoDS_Shape& aGenS,
|
|||||||
TopAbs_ShapeEnum aGenSType = myGenShapeTool.Type(aGenS);
|
TopAbs_ShapeEnum aGenSType = myGenShapeTool.Type(aGenS);
|
||||||
switch (aGenSType){
|
switch (aGenSType){
|
||||||
case TopAbs_VERTEX :
|
case TopAbs_VERTEX :
|
||||||
myShapes(iGenS,iDirS)=MakeEmptyVertex(aGenS,aDirS);
|
myShapes(iGenS,iDirS)=MakeEmptyVertex(aGenS,aDirS);
|
||||||
break;
|
break;
|
||||||
case TopAbs_EDGE :
|
case TopAbs_EDGE :
|
||||||
myShapes(iGenS,iDirS)=MakeEmptyGeneratingEdge(aGenS,aDirS);
|
myShapes(iGenS,iDirS)=MakeEmptyGeneratingEdge(aGenS,aDirS);
|
||||||
break;
|
break;
|
||||||
case TopAbs_WIRE :
|
case TopAbs_WIRE :
|
||||||
myBuilder.MakeWire(myShapes(iGenS,iDirS));
|
myBuilder.MakeWire(myShapes(iGenS,iDirS));
|
||||||
break;
|
break;
|
||||||
case TopAbs_FACE :
|
case TopAbs_FACE :
|
||||||
myShapes(iGenS,iDirS)=MakeEmptyFace(aGenS,aDirS);
|
myShapes(iGenS,iDirS)=MakeEmptyFace(aGenS,aDirS);
|
||||||
break;
|
break;
|
||||||
case TopAbs_SHELL :
|
case TopAbs_SHELL :
|
||||||
myBuilder.MakeShell(myShapes(iGenS,iDirS));
|
myBuilder.MakeShell(myShapes(iGenS,iDirS));
|
||||||
break;
|
break;
|
||||||
case TopAbs_SOLID :
|
case TopAbs_SOLID :
|
||||||
Standard_NoSuchObject::Raise("Solids are not Processed");
|
Standard_NoSuchObject::Raise("Solids are not Processed");
|
||||||
break;
|
break;
|
||||||
case TopAbs_COMPSOLID :
|
case TopAbs_COMPSOLID :
|
||||||
Standard_NoSuchObject::Raise("Solids are not Processed");
|
Standard_NoSuchObject::Raise("Solids are not Processed");
|
||||||
break;
|
break;
|
||||||
case TopAbs_COMPOUND :
|
case TopAbs_COMPOUND :
|
||||||
myBuilder.MakeCompound(myShapes(iGenS,iDirS));
|
myBuilder.MakeCompound(myShapes(iGenS,iDirS));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Standard_NoSuchObject::Raise("Unknown Shape");
|
Standard_NoSuchObject::Raise("Unknown Shape");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
bGenS = aGenS;
|
bGenS = aGenS;
|
||||||
myGenShapeTool.SetOrientation(bGenS,TopAbs_FORWARD);
|
myGenShapeTool.SetOrientation(bGenS,TopAbs_FORWARD);
|
||||||
for (It.Init(bGenS);It.More();It.Next()){
|
for (It.Init(bGenS);It.More();It.Next()){
|
||||||
subGenS = It.Value();
|
subGenS = It.Value();
|
||||||
Or = It.Orientation();
|
Or = It.Orientation();
|
||||||
if(HasShape(subGenS,aDirS)){
|
if(HasShape(subGenS,aDirS)){
|
||||||
newShape = Shape(subGenS,aDirS);
|
newShape = Shape(subGenS,aDirS);
|
||||||
if (GGDShapeIsToAdd(myShapes(iGenS,iDirS),newShape,
|
if (GGDShapeIsToAdd(myShapes(iGenS,iDirS),newShape,
|
||||||
aGenS,subGenS,aDirS)){
|
aGenS,subGenS,aDirS)){
|
||||||
//Les "planchers" doivent etre construits par les
|
//Les "planchers" doivent etre construits par les
|
||||||
//fonctions de construcion geometrique identiquement
|
//fonctions de construcion geometrique identiquement
|
||||||
//au shape generateur.
|
//au shape generateur.
|
||||||
//On leur recolle juste une orientation pour etre bien
|
//On leur recolle juste une orientation pour etre bien
|
||||||
//sur.
|
//sur.
|
||||||
|
|
||||||
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
|
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
|
||||||
TopAbs_ShapeEnum subGenSType = myGenShapeTool.Type(subGenS);
|
TopAbs_ShapeEnum subGenSType = myGenShapeTool.Type(subGenS);
|
||||||
if (aGenSType==TopAbs_FACE){
|
if (aGenSType==TopAbs_FACE){
|
||||||
if(subGenSType==TopAbs_VERTEX){
|
if(subGenSType==TopAbs_VERTEX){
|
||||||
SetParameters(myShapes(iGenS,iDirS),
|
SetParameters(myShapes(iGenS,iDirS),
|
||||||
newShape,aGenS,subGenS,aDirS);
|
newShape,aGenS,subGenS,aDirS);
|
||||||
}
|
}
|
||||||
else if(subGenSType==TopAbs_EDGE){
|
else if(subGenSType==TopAbs_EDGE){
|
||||||
SetPCurve(myShapes(iGenS,iDirS),newShape,
|
SetPCurve(myShapes(iGenS,iDirS),newShape,
|
||||||
aGenS,subGenS,aDirS,Or);
|
aGenS,subGenS,aDirS,Or);
|
||||||
}
|
}
|
||||||
else if(subGenSType==TopAbs_WIRE){
|
else if(subGenSType==TopAbs_WIRE){
|
||||||
BRepSweep_Iterator Jt;
|
BRepSweep_Iterator Jt;
|
||||||
cGenS = subGenS;
|
cGenS = subGenS;
|
||||||
myGenShapeTool.SetOrientation(cGenS,TopAbs_FORWARD);
|
myGenShapeTool.SetOrientation(cGenS,TopAbs_FORWARD);
|
||||||
for (Jt.Init(cGenS);Jt.More();Jt.Next()){
|
for (Jt.Init(cGenS);Jt.More();Jt.Next()){
|
||||||
subsubGenS = Jt.Value();
|
subsubGenS = Jt.Value();
|
||||||
Pr = Jt.Orientation();
|
Pr = Jt.Orientation();
|
||||||
if(HasShape(subsubGenS,aDirS)){
|
if(HasShape(subsubGenS,aDirS)){
|
||||||
TopoDS_Shape newsubEdge = Shape(subsubGenS,aDirS);
|
TopoDS_Shape newsubEdge = Shape(subsubGenS,aDirS);
|
||||||
SetPCurve(myShapes(iGenS,iDirS),newsubEdge,
|
SetPCurve(myShapes(iGenS,iDirS),newsubEdge,
|
||||||
aGenS,subsubGenS,aDirS,Pr);
|
aGenS,subsubGenS,aDirS,Pr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(aGenSType==TopAbs_EDGE){
|
else if(aGenSType==TopAbs_EDGE){
|
||||||
SetGeneratingParameter(myShapes(iGenS,iDirS),
|
SetGeneratingParameter(myShapes(iGenS,iDirS),
|
||||||
newShape,bGenS,subGenS,aDirS);
|
newShape,bGenS,subGenS,aDirS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (myDirShapeTool.Type(aDirS)==TopAbs_EDGE){
|
else if (myDirShapeTool.Type(aDirS)==TopAbs_EDGE){
|
||||||
@ -206,201 +206,201 @@ TopoDS_Shape BRepSweep_NumLinearRegularSweep::Shape (const TopoDS_Shape& aGenS,
|
|||||||
Standard_Boolean sepwires = Standard_False;
|
Standard_Boolean sepwires = Standard_False;
|
||||||
switch (aGenSType){
|
switch (aGenSType){
|
||||||
case TopAbs_VERTEX :
|
case TopAbs_VERTEX :
|
||||||
myShapes(iGenS,iDirS)=MakeEmptyDirectingEdge(aGenS,aDirS);
|
myShapes(iGenS,iDirS)=MakeEmptyDirectingEdge(aGenS,aDirS);
|
||||||
break;
|
break;
|
||||||
case TopAbs_EDGE :
|
case TopAbs_EDGE :
|
||||||
//On cree un wire intermediaire qui contient tous les edges
|
//On cree un wire intermediaire qui contient tous les edges
|
||||||
//du montant (face) du Shape pour le cas standard, et une
|
//du montant (face) du Shape pour le cas standard, et une
|
||||||
//sequence de wires pour les cas merdiques necessitant des
|
//sequence de wires pour les cas merdiques necessitant des
|
||||||
//wires independants.
|
//wires independants.
|
||||||
myBuilder.MakeWire(newWire);
|
myBuilder.MakeWire(newWire);
|
||||||
myShapes(iGenS,iDirS)=MakeEmptyFace(aGenS,aDirS);
|
myShapes(iGenS,iDirS)=MakeEmptyFace(aGenS,aDirS);
|
||||||
break;
|
break;
|
||||||
case TopAbs_WIRE :
|
case TopAbs_WIRE :
|
||||||
myBuilder.MakeShell(myShapes(iGenS,iDirS));
|
myBuilder.MakeShell(myShapes(iGenS,iDirS));
|
||||||
break;
|
break;
|
||||||
case TopAbs_FACE :
|
case TopAbs_FACE :
|
||||||
//On cree un shell intermediaire dans lequel on jette toutes
|
//On cree un shell intermediaire dans lequel on jette toutes
|
||||||
//les faces en direct, pour eviter les empilages compliques
|
//les faces en direct, pour eviter les empilages compliques
|
||||||
//de shells et sous shells dans la structure du solide.
|
//de shells et sous shells dans la structure du solide.
|
||||||
myBuilder.MakeShell(newShell);
|
myBuilder.MakeShell(newShell);
|
||||||
myBuilder.MakeSolid(myShapes(iGenS,iDirS));
|
myBuilder.MakeSolid(myShapes(iGenS,iDirS));
|
||||||
break;
|
break;
|
||||||
case TopAbs_SHELL :
|
case TopAbs_SHELL :
|
||||||
myBuilder.MakeCompSolid(myShapes(iGenS,iDirS));
|
myBuilder.MakeCompSolid(myShapes(iGenS,iDirS));
|
||||||
break;
|
break;
|
||||||
case TopAbs_SOLID :
|
case TopAbs_SOLID :
|
||||||
Standard_NoSuchObject::Raise("Solids are not Processed");
|
Standard_NoSuchObject::Raise("Solids are not Processed");
|
||||||
break;
|
break;
|
||||||
case TopAbs_COMPSOLID :
|
case TopAbs_COMPSOLID :
|
||||||
Standard_NoSuchObject::Raise("Solids are not Processed");
|
Standard_NoSuchObject::Raise("Solids are not Processed");
|
||||||
break;
|
break;
|
||||||
case TopAbs_COMPOUND :
|
case TopAbs_COMPOUND :
|
||||||
myBuilder.MakeCompound(myShapes(iGenS,iDirS));
|
myBuilder.MakeCompound(myShapes(iGenS,iDirS));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Standard_NoSuchObject::Raise("Unknown Shape");
|
Standard_NoSuchObject::Raise("Unknown Shape");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
bGenS = aGenS;
|
bGenS = aGenS;
|
||||||
myGenShapeTool.SetOrientation(bGenS,TopAbs_FORWARD);
|
myGenShapeTool.SetOrientation(bGenS,TopAbs_FORWARD);
|
||||||
for (It.Init(bGenS);It.More();It.Next()){
|
for (It.Init(bGenS);It.More();It.Next()){
|
||||||
subGenS = It.Value();
|
subGenS = It.Value();
|
||||||
if(HasShape(subGenS,aDirS)){
|
if(HasShape(subGenS,aDirS)){
|
||||||
newShape = Shape(subGenS,aDirS);
|
newShape = Shape(subGenS,aDirS);
|
||||||
if (GGDShapeIsToAdd(myShapes(iGenS,iDirS),newShape,
|
if (GGDShapeIsToAdd(myShapes(iGenS,iDirS),newShape,
|
||||||
aGenS,subGenS,aDirS)){
|
aGenS,subGenS,aDirS)){
|
||||||
TopAbs_ShapeEnum subGenSType = myGenShapeTool.Type(subGenS);
|
TopAbs_ShapeEnum subGenSType = myGenShapeTool.Type(subGenS);
|
||||||
if (aGenSType==TopAbs_EDGE){
|
if (aGenSType==TopAbs_EDGE){
|
||||||
Or = It.Orientation();
|
Or = It.Orientation();
|
||||||
if (SeparatedWires(myShapes(iGenS,iDirS),newShape,
|
if (SeparatedWires(myShapes(iGenS,iDirS),newShape,
|
||||||
aGenS,subGenS,aDirS)){
|
aGenS,subGenS,aDirS)){
|
||||||
sepwires = Standard_True;
|
sepwires = Standard_True;
|
||||||
TopoDS_Shape wi;
|
TopoDS_Shape wi;
|
||||||
myBuilder.MakeWire(wi);
|
myBuilder.MakeWire(wi);
|
||||||
myBuilder.Add(wi,newShape,Or);
|
myBuilder.Add(wi,newShape,Or);
|
||||||
wi.Closed(BRep_Tool::IsClosed(wi));
|
wi.Closed(BRep_Tool::IsClosed(wi));
|
||||||
WireSeq.Append(wi);
|
WireSeq.Append(wi);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
myBuilder.Add(newWire,newShape,Or);
|
myBuilder.Add(newWire,newShape,Or);
|
||||||
}
|
}
|
||||||
SetDirectingPCurve (myShapes(iGenS,iDirS),
|
SetDirectingPCurve (myShapes(iGenS,iDirS),
|
||||||
newShape,bGenS,subGenS,aDirS,Or);
|
newShape,bGenS,subGenS,aDirS,Or);
|
||||||
}
|
}
|
||||||
else if (aGenSType==TopAbs_WIRE){
|
else if (aGenSType==TopAbs_WIRE){
|
||||||
Or = It.Orientation();
|
Or = It.Orientation();
|
||||||
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
|
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
|
||||||
}
|
}
|
||||||
else if (aGenSType==TopAbs_FACE){
|
else if (aGenSType==TopAbs_FACE){
|
||||||
Or = It.Orientation();
|
Or = It.Orientation();
|
||||||
if(subGenSType == TopAbs_WIRE) {
|
if(subGenSType == TopAbs_WIRE) {
|
||||||
for (Lt.Init(newShape);Lt.More();Lt.Next()){
|
for (Lt.Init(newShape);Lt.More();Lt.Next()){
|
||||||
myBuilder.Add(newShell,Lt.Value(),
|
myBuilder.Add(newShell,Lt.Value(),
|
||||||
TopAbs::Compose(Lt.Orientation(),Or));
|
TopAbs::Compose(Lt.Orientation(),Or));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(subGenSType == TopAbs_EDGE) {
|
else if(subGenSType == TopAbs_EDGE) {
|
||||||
myBuilder.Add(newShell,newShape,Or);
|
myBuilder.Add(newShell,newShape,Or);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(aGenSType == TopAbs_SHELL){
|
else if(aGenSType == TopAbs_SHELL){
|
||||||
Or = TopAbs_FORWARD;
|
Or = TopAbs_FORWARD;
|
||||||
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
|
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
|
||||||
}
|
}
|
||||||
else if(aGenSType == TopAbs_COMPOUND){
|
else if(aGenSType == TopAbs_COMPOUND){
|
||||||
Or = TopAbs_FORWARD;
|
Or = TopAbs_FORWARD;
|
||||||
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
|
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
Or = It.Orientation();
|
Or = It.Orientation();
|
||||||
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
|
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bDirS = aDirS;
|
bDirS = aDirS;
|
||||||
for (Kt.Init(bDirS);Kt.More();Kt.Next()){
|
for (Kt.Init(bDirS);Kt.More();Kt.Next()){
|
||||||
subDirS = Kt.Value();
|
subDirS = Kt.Value();
|
||||||
if(HasShape(aGenS,subDirS)){
|
if(HasShape(aGenS,subDirS)){
|
||||||
newShape = Shape(aGenS,subDirS);
|
newShape = Shape(aGenS,subDirS);
|
||||||
if (GDDShapeIsToAdd(myShapes(iGenS,iDirS),newShape,
|
if (GDDShapeIsToAdd(myShapes(iGenS,iDirS),newShape,
|
||||||
aGenS,aDirS,subDirS)){
|
aGenS,aDirS,subDirS)){
|
||||||
if (aGenSType==TopAbs_EDGE){
|
if (aGenSType==TopAbs_EDGE){
|
||||||
Or = TopAbs::Reverse(Kt.Orientation());
|
Or = TopAbs::Reverse(Kt.Orientation());
|
||||||
myBuilder.Add(newWire,newShape,Or);
|
myBuilder.Add(newWire,newShape,Or);
|
||||||
SetGeneratingPCurve
|
SetGeneratingPCurve
|
||||||
(myShapes(iGenS,iDirS),newShape,aGenS,aDirS,subDirS,Or);
|
(myShapes(iGenS,iDirS),newShape,aGenS,aDirS,subDirS,Or);
|
||||||
}
|
}
|
||||||
else if(aGenSType==TopAbs_VERTEX){
|
else if(aGenSType==TopAbs_VERTEX){
|
||||||
Or = Kt.Orientation();
|
Or = Kt.Orientation();
|
||||||
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
|
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
|
||||||
SetDirectingParameter
|
SetDirectingParameter
|
||||||
(myShapes(iGenS,iDirS),newShape,aGenS,aDirS,subDirS);
|
(myShapes(iGenS,iDirS),newShape,aGenS,aDirS,subDirS);
|
||||||
}
|
}
|
||||||
else if(aGenSType==TopAbs_FACE){
|
else if(aGenSType==TopAbs_FACE){
|
||||||
Or = Kt.Orientation();
|
Or = Kt.Orientation();
|
||||||
myBuilder.Add(newShell,newShape,Or);
|
myBuilder.Add(newShell,newShape,Or);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (aGenSType==TopAbs_EDGE){
|
if (aGenSType==TopAbs_EDGE){
|
||||||
if (sepwires){
|
if (sepwires){
|
||||||
for(Standard_Integer ij = 1;ij <= WireSeq.Length();ij++){
|
for(Standard_Integer ij = 1;ij <= WireSeq.Length();ij++){
|
||||||
myBuilder.Add(myShapes(iGenS,iDirS),WireSeq.Value(ij));
|
myBuilder.Add(myShapes(iGenS,iDirS),WireSeq.Value(ij));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
newWire.Closed(BRep_Tool::IsClosed(newWire));
|
newWire.Closed(BRep_Tool::IsClosed(newWire));
|
||||||
myBuilder.Add(myShapes(iGenS,iDirS),newWire);
|
myBuilder.Add(myShapes(iGenS,iDirS),newWire);
|
||||||
}
|
}
|
||||||
myBuiltShapes(iGenS,iDirS) = Standard_True;
|
myBuiltShapes(iGenS,iDirS) = Standard_True;
|
||||||
SetContinuity(aGenS,aDirS);
|
SetContinuity(aGenS,aDirS);
|
||||||
}
|
}
|
||||||
if (aGenSType==TopAbs_WIRE){
|
if (aGenSType==TopAbs_WIRE){
|
||||||
SetContinuity(aGenS,aDirS);
|
SetContinuity(aGenS,aDirS);
|
||||||
}
|
}
|
||||||
if (aGenSType==TopAbs_FACE){
|
if (aGenSType==TopAbs_FACE){
|
||||||
newShell.Closed (BRep_Tool::IsClosed (newShell));
|
newShell.Closed (BRep_Tool::IsClosed (newShell));
|
||||||
TopoDS_Shape temp = SplitShell(newShell);
|
TopoDS_Shape temp = SplitShell(newShell);
|
||||||
TopAbs_Orientation Or = DirectSolid(aGenS,aDirS);
|
TopAbs_Orientation Or = DirectSolid(aGenS,aDirS);
|
||||||
Lt.Init(temp);
|
Lt.Init(temp);
|
||||||
if(Lt.More()) Lt.Next();
|
if(Lt.More()) Lt.Next();
|
||||||
if(Lt.More()){
|
if(Lt.More()){
|
||||||
for (Lt.Init(temp);Lt.More();Lt.Next()){
|
for (Lt.Init(temp);Lt.More();Lt.Next()){
|
||||||
myBuilder.Add(myShapes(iGenS,iDirS),Lt.Value(),Or);
|
myBuilder.Add(myShapes(iGenS,iDirS),Lt.Value(),Or);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else myBuilder.Add(myShapes(iGenS,iDirS),newShell,Or);
|
else myBuilder.Add(myShapes(iGenS,iDirS),newShell,Or);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (myDirShapeTool.Type(aDirS)==TopAbs_WIRE){
|
else if (myDirShapeTool.Type(aDirS)==TopAbs_WIRE){
|
||||||
TopAbs_ShapeEnum aGenSType = myGenShapeTool.Type(aGenS);
|
TopAbs_ShapeEnum aGenSType = myGenShapeTool.Type(aGenS);
|
||||||
switch (aGenSType){
|
switch (aGenSType){
|
||||||
case TopAbs_VERTEX :
|
case TopAbs_VERTEX :
|
||||||
myBuilder.MakeWire(myShapes(iGenS,iDirS));
|
myBuilder.MakeWire(myShapes(iGenS,iDirS));
|
||||||
break;
|
break;
|
||||||
case TopAbs_EDGE :
|
case TopAbs_EDGE :
|
||||||
myBuilder.MakeShell(myShapes(iGenS,iDirS));
|
myBuilder.MakeShell(myShapes(iGenS,iDirS));
|
||||||
break;
|
break;
|
||||||
case TopAbs_WIRE :
|
case TopAbs_WIRE :
|
||||||
myBuilder.MakeShell(myShapes(iGenS,iDirS));
|
myBuilder.MakeShell(myShapes(iGenS,iDirS));
|
||||||
break;
|
break;
|
||||||
case TopAbs_FACE :
|
case TopAbs_FACE :
|
||||||
myBuilder.MakeCompSolid(myShapes(iGenS,iDirS));
|
myBuilder.MakeCompSolid(myShapes(iGenS,iDirS));
|
||||||
break;
|
break;
|
||||||
case TopAbs_SHELL :
|
case TopAbs_SHELL :
|
||||||
myBuilder.MakeCompSolid(myShapes(iGenS,iDirS));
|
myBuilder.MakeCompSolid(myShapes(iGenS,iDirS));
|
||||||
break;
|
break;
|
||||||
case TopAbs_SOLID :
|
case TopAbs_SOLID :
|
||||||
Standard_NoSuchObject::Raise("Solids are not Processed");
|
Standard_NoSuchObject::Raise("Solids are not Processed");
|
||||||
break;
|
break;
|
||||||
case TopAbs_COMPSOLID :
|
case TopAbs_COMPSOLID :
|
||||||
Standard_NoSuchObject::Raise("Solids are not Processed");
|
Standard_NoSuchObject::Raise("Solids are not Processed");
|
||||||
break;
|
break;
|
||||||
case TopAbs_COMPOUND :
|
case TopAbs_COMPOUND :
|
||||||
myBuilder.MakeCompound(myShapes(iGenS,iDirS));
|
myBuilder.MakeCompound(myShapes(iGenS,iDirS));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Standard_NoSuchObject::Raise("Unknown Shape");
|
Standard_NoSuchObject::Raise("Unknown Shape");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
bDirS = aDirS;
|
bDirS = aDirS;
|
||||||
for (Kt.Init(aDirS);Kt.More();Kt.Next()){
|
for (Kt.Init(aDirS);Kt.More();Kt.Next()){
|
||||||
subDirS = Kt.Value();
|
subDirS = Kt.Value();
|
||||||
if(HasShape(aGenS,subDirS)){
|
if(HasShape(aGenS,subDirS)){
|
||||||
Or = Kt.Orientation();
|
Or = Kt.Orientation();
|
||||||
newShape = Shape(aGenS,subDirS);
|
newShape = Shape(aGenS,subDirS);
|
||||||
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
|
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
myBuiltShapes(iGenS,iDirS) = Standard_True;
|
myBuiltShapes(iGenS,iDirS) = Standard_True;
|
||||||
}
|
}
|
||||||
// Change the "Closed" flag only for Wires and Shells
|
// Change the "Closed" flag only for Wires and Shells
|
||||||
if (myShapes(iGenS, iDirS).ShapeType() == TopAbs_WIRE ||
|
if (myShapes(iGenS, iDirS).ShapeType() == TopAbs_WIRE ||
|
||||||
myShapes(iGenS, iDirS).ShapeType() == TopAbs_SHELL)
|
myShapes(iGenS, iDirS).ShapeType() == TopAbs_SHELL)
|
||||||
myShapes(iGenS,iDirS).Closed (BRep_Tool::IsClosed (myShapes(iGenS,iDirS)));
|
myShapes(iGenS,iDirS).Closed (BRep_Tool::IsClosed (myShapes(iGenS,iDirS)));
|
||||||
return myShapes(iGenS,iDirS);
|
return myShapes(iGenS,iDirS);
|
||||||
}
|
}
|
||||||
|
@ -66,6 +66,8 @@
|
|||||||
#include <TopoDS_Shape.hxx>
|
#include <TopoDS_Shape.hxx>
|
||||||
#include <TopoDS_Vertex.hxx>
|
#include <TopoDS_Vertex.hxx>
|
||||||
|
|
||||||
|
|
||||||
|
#include <TopExp_Explorer.hxx>
|
||||||
static Standard_Real ComputeTolerance(TopoDS_Edge& E,
|
static Standard_Real ComputeTolerance(TopoDS_Edge& E,
|
||||||
const TopoDS_Face& F,
|
const TopoDS_Face& F,
|
||||||
const Handle(Geom2d_Curve)& C)
|
const Handle(Geom2d_Curve)& C)
|
||||||
@ -221,14 +223,26 @@ TopoDS_Shape BRepSweep_Rotation::MakeEmptyGeneratingEdge
|
|||||||
const Sweep_NumShape& aDirV)
|
const Sweep_NumShape& aDirV)
|
||||||
{
|
{
|
||||||
//call in case of construction with copy, or only when meridian touches myaxe.
|
//call in case of construction with copy, or only when meridian touches myaxe.
|
||||||
Standard_Real First,Last;
|
|
||||||
TopLoc_Location Loc;
|
|
||||||
Handle(Geom_Curve) C = Handle(Geom_Curve)::DownCast
|
|
||||||
(BRep_Tool::Curve(TopoDS::Edge(aGenE),Loc,First,Last)->Copy());
|
|
||||||
C->Transform(Loc.Transformation());
|
|
||||||
TopoDS_Edge E;
|
TopoDS_Edge E;
|
||||||
if(aDirV.Index() == 2) C->Transform(myLocation.Transformation());
|
if(BRep_Tool::Degenerated(TopoDS::Edge(aGenE)))
|
||||||
myBuilder.Builder().MakeEdge(E,C,BRep_Tool::Tolerance(TopoDS::Edge(aGenE)));
|
{
|
||||||
|
myBuilder.Builder().MakeEdge(E);
|
||||||
|
myBuilder.Builder().UpdateEdge(E, BRep_Tool::Tolerance(TopoDS::Edge(aGenE)));
|
||||||
|
myBuilder.Builder().Degenerated(E, Standard_True);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Standard_Real First,Last;
|
||||||
|
TopLoc_Location Loc;
|
||||||
|
Handle(Geom_Curve) C = Handle(Geom_Curve)::DownCast
|
||||||
|
(BRep_Tool::Curve(TopoDS::Edge(aGenE),Loc,First,Last)->Copy());
|
||||||
|
if(!C.IsNull())
|
||||||
|
{
|
||||||
|
C->Transform(Loc.Transformation());
|
||||||
|
if(aDirV.Index() == 2) C->Transform(myLocation.Transformation());
|
||||||
|
}
|
||||||
|
myBuilder.Builder().MakeEdge(E,C,BRep_Tool::Tolerance(TopoDS::Edge(aGenE)));
|
||||||
|
}
|
||||||
if (aDirV.Index() == 1 &&
|
if (aDirV.Index() == 1 &&
|
||||||
IsInvariant(aGenE) &&
|
IsInvariant(aGenE) &&
|
||||||
myDirShapeTool.NbShapes() == 3) {
|
myDirShapeTool.NbShapes() == 3) {
|
||||||
@ -723,6 +737,7 @@ Standard_Boolean BRepSweep_Rotation::GGDShapeIsToAdd
|
|||||||
const TopoDS_Shape& aSubGenS,
|
const TopoDS_Shape& aSubGenS,
|
||||||
const Sweep_NumShape& aDirS )const
|
const Sweep_NumShape& aDirS )const
|
||||||
{
|
{
|
||||||
|
Standard_Boolean aRes = Standard_True;
|
||||||
if (aNewShape.ShapeType()==TopAbs_FACE &&
|
if (aNewShape.ShapeType()==TopAbs_FACE &&
|
||||||
aNewSubShape.ShapeType()==TopAbs_EDGE &&
|
aNewSubShape.ShapeType()==TopAbs_EDGE &&
|
||||||
aGenS.ShapeType()==TopAbs_EDGE &&
|
aGenS.ShapeType()==TopAbs_EDGE &&
|
||||||
@ -734,11 +749,11 @@ Standard_Boolean BRepSweep_Rotation::GGDShapeIsToAdd
|
|||||||
return (!IsInvariant(aSubGenS));
|
return (!IsInvariant(aSubGenS));
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
return Standard_True;
|
return aRes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
return Standard_True;
|
return aRes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -835,20 +850,33 @@ Standard_Boolean BRepSweep_Rotation::HasShape
|
|||||||
const Sweep_NumShape& aDirS)const
|
const Sweep_NumShape& aDirS)const
|
||||||
{
|
{
|
||||||
if(aDirS.Type()==TopAbs_EDGE&&
|
if(aDirS.Type()==TopAbs_EDGE&&
|
||||||
aGenS.ShapeType()==TopAbs_EDGE){
|
aGenS.ShapeType()==TopAbs_EDGE)
|
||||||
|
{
|
||||||
// Verify that the edge has entrails
|
// Verify that the edge has entrails
|
||||||
const TopoDS_Edge& anEdge = TopoDS::Edge(aGenS);
|
const TopoDS_Edge& anEdge = TopoDS::Edge(aGenS);
|
||||||
Standard_Boolean hasGeom = !BRep_Tool::Degenerated(anEdge);
|
//
|
||||||
if (hasGeom)
|
if(BRep_Tool::Degenerated(anEdge)) return Standard_False;
|
||||||
{ // The edge is not degenerated. Check if it has no curve
|
|
||||||
Standard_Real aPFirst, aPLast;
|
Standard_Real aPFirst, aPLast;
|
||||||
TopLoc_Location aLoc;
|
TopLoc_Location aLoc;
|
||||||
Handle(Geom_Curve) aCurve = BRep_Tool::Curve(anEdge, aLoc, aPFirst, aPLast);
|
Handle(Geom_Curve) aCurve = BRep_Tool::Curve(anEdge, aLoc, aPFirst, aPLast);
|
||||||
hasGeom = !aCurve.IsNull();
|
if(aCurve.IsNull()) return Standard_False;
|
||||||
|
|
||||||
|
if(IsInvariant(aGenS)) return Standard_False;
|
||||||
|
|
||||||
|
//Check seem edge
|
||||||
|
TopExp_Explorer FaceExp(myGenShape, TopAbs_FACE);
|
||||||
|
for (;FaceExp.More(); FaceExp.Next()) {
|
||||||
|
TopoDS_Face F = TopoDS::Face(FaceExp.Current());
|
||||||
|
if (BRepTools::IsReallyClosed(anEdge, F))
|
||||||
|
return Standard_False;
|
||||||
}
|
}
|
||||||
return hasGeom && !IsInvariant(aGenS);
|
|
||||||
|
return Standard_True;
|
||||||
|
|
||||||
}
|
}
|
||||||
else{
|
else
|
||||||
|
{
|
||||||
return Standard_True;
|
return Standard_True;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
15
tests/bugs/modalg_6/bug26406
Normal file
15
tests/bugs/modalg_6/bug26406
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
puts "========"
|
||||||
|
puts "OCC26406"
|
||||||
|
puts "========"
|
||||||
|
puts ""
|
||||||
|
#############################################################
|
||||||
|
# BRepPrimAPI_MakeRevol crash when rotating Paraboloid face
|
||||||
|
#############################################################
|
||||||
|
|
||||||
|
smallview
|
||||||
|
|
||||||
|
restore [locate_data_file OCC26406-Paraboloid.brep] p
|
||||||
|
revol r p 0 0 0 0 0 1 180 c
|
||||||
|
checkshape r
|
||||||
|
|
||||||
|
set only_screen_axo 1
|
Loading…
x
Reference in New Issue
Block a user