code refactoring

This commit is contained in:
rnc 2012-03-05 16:03:27 +00:00
parent 87ceb14207
commit ca04383c5a
2 changed files with 106 additions and 84 deletions

View File

@ -196,49 +196,6 @@ Standard_Integer GEOMImpl_PrismDriver::Execute(TFunction_Logbook& log) const
Standard_Boolean isProtrusion = (aCI.GetFuseFlag()==1); Standard_Boolean isProtrusion = (aCI.GetFuseFlag()==1);
// Flag to know wether the feature is a protrusion (fuse) or a depression (cut) // Flag to know wether the feature is a protrusion (fuse) or a depression (cut)
if (anInitShape.ShapeType() == TopAbs_COMPOUND)
{
TopExp_Explorer anExp(anInitShape, TopAbs_SOLID);
int solidCount = 0;
for(;anExp.More();anExp.Next())
{
solidCount++;
if (solidCount > 1)
Standard_ConstructionError::Raise("The input shape is a compound with more than one solid");
}
if (solidCount == 0)
Standard_ConstructionError::Raise("The input shape is a compound without any solid");
}
// if (aSketch.ShapeType() == TopAbs_FACE)
// {
// aFaceBase = TopoDS::Face(aSketch);
// }
// else
// {
TopoDS_Wire aWire = TopoDS_Wire();
if (aSketch.ShapeType() == TopAbs_EDGE)
{
aWire = BRepBuilderAPI_MakeWire(TopoDS::Edge(aSketch));
}
else if (aSketch.ShapeType() == TopAbs_WIRE)
{
aWire = TopoDS::Wire(aSketch);
}
else
{
Standard_ConstructionError::Raise("The input profile is neither a wire, nor edge");
}
TopoDS_Vertex aV1, aV2;
TopExp::Vertices(aWire, aV1, aV2);
if ( !aV1.IsNull() && !aV2.IsNull() && aV1.IsSame(aV2) )
aWire.Closed( true );
if (!aWire.Closed())
Standard_ConstructionError::Raise("The input profile is not closed");
// history of the Base wire (RefBase) // history of the Base wire (RefBase)
Handle(GEOM_Object) aSuppObj; Handle(GEOM_Object) aSuppObj;
TDF_LabelSequence aLabelSeq; TDF_LabelSequence aLabelSeq;
@ -253,46 +210,12 @@ Standard_Integer GEOMImpl_PrismDriver::Execute(TFunction_Logbook& log) const
aSuppObj = GEOM_Object::GetReferencedObject(anArgumentRefLabel); aSuppObj = GEOM_Object::GetReferencedObject(anArgumentRefLabel);
} }
// Construction of the face if the wire hasn't any support face TopoDS_Shape aSupport;
TopoDS_Face aFaceBase = BRepBuilderAPI_MakeFace(aWire);
if(!aSuppObj.IsNull()) // If the wire has a support if(!aSuppObj.IsNull()) // If the wire has a support
{ aSupport = aSuppObj->GetValue();
TopoDS_Shape aSupport = aSuppObj->GetValue();
if (aSupport.ShapeType() == TopAbs_FACE)
{
Handle(Geom_Surface) aSurf = BRep_Tool::Surface(TopoDS::Face(aSupport));
TopoDS_Face aTempFace = BRepBuilderAPI_MakeFace(aSurf, aWire);
if(aTempFace.Orientation() != TopoDS::Face(aSupport).Orientation()) aShape = MakeDraftPrism(anInitShape, aSketch, aHeight, anAngle, isProtrusion, aSupport);
{
aFaceBase=TopoDS::Face(aTempFace.Reversed());
}
else
aFaceBase=aTempFace;
}
}
// }
// Invert height and angle if the operation is an extruded cut
bool invert = !isProtrusion;
// If the face has a reversed orientation invert for extruded boss operations
if(aFaceBase.Orientation() == TopAbs_REVERSED)
invert = isProtrusion;
if(invert)
{
anAngle = -anAngle; // Invert angle and height
aHeight = -aHeight;
}
BRepFeat_MakeDPrism thePrism(anInitShape, aFaceBase, TopoDS_Face(),
anAngle*PI180, isProtrusion, Standard_True);
thePrism.Perform(aHeight);
aShape = thePrism.Shape();
} }
if (aShape.IsNull()) return 0; if (aShape.IsNull()) return 0;
@ -315,12 +238,12 @@ Standard_Integer GEOMImpl_PrismDriver::Execute(TFunction_Logbook& log) const
{ {
aSolid = TopoDS::Solid(anExp.Current()); aSolid = TopoDS::Solid(anExp.Current());
solidNb++; solidNb++;
if (solidNb > 1)
break;
} }
if (solidNb == 1) if (solidNb == 1)
{
aRes = aSolid; aRes = aSolid;
} }
}
aFunction->SetValue(aRes); aFunction->SetValue(aRes);
} }
@ -477,6 +400,98 @@ TopoDS_Shape GEOMImpl_PrismDriver::MakeScaledPrism (const TopoDS_Shape& theShape
return aShape; return aShape;
} }
//=======================================================================
//function : MakeDraftPrism
//purpose :
//=======================================================================
TopoDS_Shape GEOMImpl_PrismDriver::MakeDraftPrism ( const TopoDS_Shape& theInitShape,
const TopoDS_Shape& theBaseShape,
const Standard_Real theHeight,
const Standard_Real theAngle,
bool isProtrusion,
const TopoDS_Shape& theSupport)
{
TopoDS_Shape aShape;
if (theInitShape.ShapeType() == TopAbs_COMPOUND)
{
TopExp_Explorer anExp(theInitShape, TopAbs_SOLID);
int solidCount = 0;
for(;anExp.More();anExp.Next())
{
solidCount++;
if (solidCount > 1)
Standard_ConstructionError::Raise("The input shape is a compound with more than one solid");
}
if (solidCount == 0)
Standard_ConstructionError::Raise("The input shape is a compound without any solid");
}
TopoDS_Wire aWire = TopoDS_Wire();
if (theBaseShape.ShapeType() == TopAbs_EDGE)
{
aWire = BRepBuilderAPI_MakeWire(TopoDS::Edge(theBaseShape));
}
else if (theBaseShape.ShapeType() == TopAbs_WIRE)
{
aWire = TopoDS::Wire(theBaseShape);
}
else
{
Standard_ConstructionError::Raise("The input profile is neither a wire, nor edge");
}
TopoDS_Vertex aV1, aV2;
TopExp::Vertices(aWire, aV1, aV2);
if ( !aV1.IsNull() && !aV2.IsNull() && aV1.IsSame(aV2) )
aWire.Closed( true );
if (!aWire.Closed())
Standard_ConstructionError::Raise("The input profile is not closed");
// Construction of the face if the wire hasn't any support face
TopoDS_Face aFaceBase = BRepBuilderAPI_MakeFace(aWire);
if(!theSupport.IsNull() && theSupport.ShapeType() == TopAbs_FACE) // If the wire has a support
{
Handle(Geom_Surface) aSurf = BRep_Tool::Surface(TopoDS::Face(theSupport));
TopoDS_Face aTempFace = BRepBuilderAPI_MakeFace(aSurf, aWire);
if(aTempFace.Orientation() != TopoDS::Face(theSupport).Orientation())
{
aFaceBase=TopoDS::Face(aTempFace.Reversed());
}
else
aFaceBase=aTempFace;
}
// Invert height and angle if the operation is an extruded cut
bool invert = !isProtrusion;
// If the face has a reversed orientation invert for extruded boss operations
if(aFaceBase.Orientation() == TopAbs_REVERSED)
invert = isProtrusion;
Standard_Real anAngle = theAngle;
Standard_Real aHeight = theHeight;
if(invert)
{
anAngle = -theAngle; // Invert angle and height
aHeight = -theHeight;
}
BRepFeat_MakeDPrism aPrism(theInitShape, aFaceBase, TopoDS_Face(),
anAngle*PI180, isProtrusion, Standard_True);
aPrism.Perform(aHeight);
aShape = aPrism.Shape();
return aShape;
}
//======================================================================= //=======================================================================
//function : GEOMImpl_PrismDriver_Type_ //function : GEOMImpl_PrismDriver_Type_
//purpose : //purpose :

View File

@ -159,6 +159,13 @@ public:
const gp_Pnt& theCDG = gp::Origin(), const gp_Pnt& theCDG = gp::Origin(),
bool isCDG = false); bool isCDG = false);
Standard_EXPORT static TopoDS_Shape MakeDraftPrism (const TopoDS_Shape& theInitShape,
const TopoDS_Shape& theBaseShape,
const Standard_Real theHeight,
const Standard_Real theAngle,
bool isProtrusion,
const TopoDS_Shape& theSupport);
// Type management // Type management