//
// File : GEOM_Gen.idl
// Author : Sergey RUIN
-//
+
#ifndef __GEOM_GEN__
#define __GEOM_GEN__
* Remove all seam and degenerated edges from \a theShape.
* Unite faces and edges, sharing one surface.
* \param theShape The compound or single solid to remove irregular edges from.
+ * \param theOptimumNbFaces If more than zero, unite faces only for those solids,
+ * that have more than theOptimumNbFaces faces. If zero, unite faces always,
+ * regardsless their quantity in the solid. If negative, do not unite faces at all.
+ * For blocks repairing recommended value is 6.
* \return Improved shape.
*/
- GEOM_Object RemoveExtraEdges (in GEOM_Object theShape);
+ GEOM_Object RemoveExtraEdges (in GEOM_Object theShape,
+ in long theOptimumNbFaces);
/*!
* Check, if the given shape is a blocks compound.
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
-// File: BlockFix_BlockFixAPI.cxx
-// Created: Tue Dec 7 11:59:05 2004
-// Author: Pavel DURANDIN
-//
+// File: BlockFix_BlockFixAPI.cxx
+// Created: Tue Dec 7 11:59:05 2004
+// Author: Pavel DURANDIN
+
#include <BlockFix_BlockFixAPI.ixx>
#include <BlockFix.hxx>
#include <BlockFix_UnionFaces.hxx>
//=======================================================================
//function : ShapeConvert_CanonicAPI
-//purpose :
+//purpose :
//=======================================================================
BlockFix_BlockFixAPI::BlockFix_BlockFixAPI()
{
myTolerance = Precision::Confusion();
+ myOptimumNbFaces = 6;
}
//=======================================================================
//function : Perform
-//purpose :
+//purpose :
//=======================================================================
-void BlockFix_BlockFixAPI::Perform()
+void BlockFix_BlockFixAPI::Perform()
{
-
// processing spheres with degenerativities
TopoDS_Shape aShape = Shape();
myShape = BlockFix::RotateSphereSpace(aShape,myTolerance);
-
+
// faces unification
BlockFix_UnionFaces aFaceUnifier;
aFaceUnifier.GetTolerance() = myTolerance;
- TopoDS_Shape aResult;
- aResult = aFaceUnifier.Perform(myShape);
-
-
+ aFaceUnifier.GetOptimumNbFaces() = myOptimumNbFaces;
+ TopoDS_Shape aResult = aFaceUnifier.Perform(myShape);
+
BlockFix_UnionEdges anEdgeUnifier;
myShape = anEdgeUnifier.Perform(aResult,myTolerance);
-
+
TopoDS_Shape aRes = BlockFix::FixRanges(myShape,myTolerance);
myShape = aRes;
-
}
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
+
#ifndef _BlockFix_BlockFixAPI_HeaderFile
#define _BlockFix_BlockFixAPI_HeaderFile
#ifndef _MMgt_TShared_HeaderFile
#include <MMgt_TShared.hxx>
#endif
+
class ShapeBuild_ReShape;
class TopoDS_Shape;
-class BlockFix_BlockFixAPI : public MMgt_TShared {
-
+class BlockFix_BlockFixAPI : public MMgt_TShared
+{
public:
-
- void* operator new(size_t,void* anAddress)
- {
- return anAddress;
- }
- void* operator new(size_t size)
- {
- return Standard::Allocate(size);
- }
- void operator delete(void *anAddress)
- {
- if (anAddress) Standard::Free((Standard_Address&)anAddress);
- }
- // Methods PUBLIC
- //
-Standard_EXPORT BlockFix_BlockFixAPI();
- void SetShape(const TopoDS_Shape& Shape) ;
-Standard_EXPORT void Perform() ;
+ void* operator new(size_t,void* anAddress)
+ {
+ return anAddress;
+ }
+ void* operator new(size_t size)
+ {
+ return Standard::Allocate(size);
+ }
+ void operator delete(void *anAddress)
+ {
+ if (anAddress) Standard::Free((Standard_Address&)anAddress);
+ }
+
+ // Methods PUBLIC
+ //
+ Standard_EXPORT BlockFix_BlockFixAPI();
+ void SetShape(const TopoDS_Shape& Shape);
+ Standard_EXPORT void Perform();
TopoDS_Shape Shape() const;
- Handle_ShapeBuild_ReShape& Context() ;
- Standard_Real& Tolerance() ;
-Standard_EXPORT ~BlockFix_BlockFixAPI();
-
-
-
-
- // Type management
- //
- Standard_EXPORT friend Handle_Standard_Type& BlockFix_BlockFixAPI_Type_();
- Standard_EXPORT const Handle(Standard_Type)& DynamicType() const;
- Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)&) const;
-
-protected:
-
- // Methods PROTECTED
- //
-
-
- // Fields PROTECTED
- //
+ Handle_ShapeBuild_ReShape& Context();
+ Standard_Real& Tolerance();
+ Standard_Integer& OptimumNbFaces();
+ Standard_EXPORT ~BlockFix_BlockFixAPI();
+ // Type management
+ //
+ Standard_EXPORT friend Handle_Standard_Type& BlockFix_BlockFixAPI_Type_();
+ Standard_EXPORT const Handle(Standard_Type)& DynamicType() const;
+ Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)&) const;
private:
-
- // Methods PRIVATE
- //
-
-
- // Fields PRIVATE
- //
-Handle_ShapeBuild_ReShape myContext;
-TopoDS_Shape myShape;
-Standard_Real myTolerance;
-
-
+ // Fields PRIVATE
+ //
+ Handle_ShapeBuild_ReShape myContext;
+ TopoDS_Shape myShape;
+ Standard_Real myTolerance;
+ Standard_Integer myOptimumNbFaces;
};
-
#include <BlockFix_BlockFixAPI.lxx>
-
-
-// other Inline functions and methods (like "C++: function call" methods)
-//
-
-
#endif
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
+
#include <BlockFix_BlockFixAPI.hxx>
//=======================================================================
-//function : Shape
+//function : SetShape
//purpose :
//=======================================================================
{
return myShape;
}
-
+
//=======================================================================
//function : Context
//purpose :
{
return myContext;
}
-
+
//=======================================================================
//function : Tolerance
//purpose :
{
return myTolerance;
}
-
+
+//=======================================================================
+//function : OptimumNbFaces
+//purpose :
+//=======================================================================
+
+inline Standard_Integer& BlockFix_BlockFixAPI::OptimumNbFaces()
+{
+ return myOptimumNbFaces;
+}
#include <BlockFix_CheckTool.ixx>
+//#include <BlockFix_UnionEdges.hxx>
+//#include <BlockFix_UnionFaces.hxx>
+
#include <BRep_Tool.hxx>
-#include <BlockFix_UnionEdges.hxx>
-#include <BlockFix_UnionFaces.hxx>
+
#include <TopExp.hxx>
#include <TopExp_Explorer.hxx>
#include <TopoDS.hxx>
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
-// File: BlockFix_UnionFaces.cxx
-// Created: Tue Dec 7 17:15:42 2004
-// Author: Pavel DURANDIN
-//
+// File: BlockFix_UnionFaces.cxx
+// Created: Tue Dec 7 17:15:42 2004
+// Author: Pavel DURANDIN
#include <BlockFix_UnionFaces.ixx>
#include <TopoDS.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Wire.hxx>
-#include <TopoDS_Face.hxx>
+#include <TopoDS_Face.hxx>
#include <TopoDS_Solid.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Shell.hxx>
#include <gp_XY.hxx>
#include <gp_Pnt2d.hxx>
-
+
//=======================================================================
//function : BlockFix_UnionFaces
-//purpose :
+//purpose :
//=======================================================================
BlockFix_UnionFaces::BlockFix_UnionFaces()
- : myTolerance(Precision::Confusion())
+ : myTolerance(Precision::Confusion()),
+ myOptimumNbFaces(6)
{
}
//=======================================================================
-//function : GetTolearnce
-//purpose :
+//function : GetTolerance
+//purpose :
//=======================================================================
Standard_Real& BlockFix_UnionFaces::GetTolerance()
}
+//=======================================================================
+//function : GetOptimumNbFaces
+//purpose :
+//=======================================================================
+
+Standard_Integer& BlockFix_UnionFaces::GetOptimumNbFaces()
+{
+ return myOptimumNbFaces;
+}
+
+
//=======================================================================
//function : AddOrdinaryEdges
//purpose : auxilary
for(Standard_Integer i = 1; i <= edges.Length(); i++) {
TopoDS_Shape current = edges(i);
if(aNewEdges.Contains(current)) {
-
+
aNewEdges.Remove(current);
edges.Remove(i);
i--;
-
+
if(!isDropped) {
isDropped = Standard_True;
anIndex = i;
}
}
}
-
+
//add edges to the sequemce
for(TopTools_MapIteratorOfMapOfShape anIter(aNewEdges); anIter.More(); anIter.Next())
edges.Append(anIter.Key());
-
+
return isDropped;
}
static Handle(Geom_Surface) ClearRts(const Handle(Geom_Surface)& aSurface)
{
if(aSurface->IsKind(STANDARD_TYPE(Geom_RectangularTrimmedSurface))) {
- Handle(Geom_RectangularTrimmedSurface) rts =
+ Handle(Geom_RectangularTrimmedSurface) rts =
Handle(Geom_RectangularTrimmedSurface)::DownCast(aSurface);
return rts->BasisSurface();
}
//=======================================================================
//function : Perform
-//purpose :
+//purpose :
//=======================================================================
TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape)
nbf++;
}
+ bool doUnion = ((myOptimumNbFaces == 0) ||
+ ((myOptimumNbFaces > 0) && (nbf > myOptimumNbFaces)));
+
// processing each face
mapF.Clear();
- for (exp.Init(aSolid, TopAbs_FACE); exp.More() && nbf > 6; exp.Next()) {
+ for (exp.Init(aSolid, TopAbs_FACE); exp.More() && doUnion; exp.Next()) {
TopoDS_Face aFace = TopoDS::Face(exp.Current().Oriented(TopAbs_FORWARD));
if (aProcessed.Contains(aFace))
TopoDS_Edge edge = TopoDS::Edge(edges(i));
if (BRep_Tool::Degenerated(edge))
continue;
-
+
const TopTools_ListOfShape& aList = aMapEdgeFaces.FindFromKey(edge);
TopTools_ListIteratorOfListOfShape anIter(aList);
for (; anIter.More(); anIter.Next()) {
TopoDS_Face anCheckedFace = TopoDS::Face(anIter.Value().Oriented(TopAbs_FORWARD));
if (anCheckedFace.IsSame(aFace))
continue;
-
+
if (aProcessed.Contains(anCheckedFace))
continue;
-
+
if (IsSameDomain(aFace,anCheckedFace)) {
-
+
if (aList.Extent() != 2) {
// non mainfold case is not processed
continue;
}
-
+
// replacing pcurves
TopoDS_Face aMockUpFace;
BRep_Builder B;
B.MakeFace(aMockUpFace,aBaseSurface,aBaseLocation,0.);
MovePCurves(aMockUpFace,anCheckedFace);
-
+
if (AddOrdinaryEdges(edges,aMockUpFace,dummy)) {
// sequence edges is modified
i = dummy;
}
-
+
faces.Append(anCheckedFace);
aProcessed.Add(anCheckedFace);
break;
}
}
}
-
+
// all faces collected in the sequence. Perform union of faces
if (faces.Length() > 1) {
NbModif++;
BRep_Builder B;
B.MakeFace(aResult,aBaseSurface,aBaseLocation,0);
Standard_Integer nbWires = 0;
-
+
// connecting wires
while (edges.Length()>0) {
-
+
Standard_Boolean isEdge3d = Standard_False;
nbWires++;
TopTools_MapOfShape aVertices;
TopoDS_Wire aWire;
B.MakeWire(aWire);
-
+
TopoDS_Edge anEdge = TopoDS::Edge(edges(1));
edges.Remove(1);
-
+
isEdge3d |= !BRep_Tool::Degenerated(anEdge);
B.Add(aWire,anEdge);
TopoDS_Vertex V1,V2;
TopExp::Vertices(anEdge,V1,V2);
aVertices.Add(V1);
aVertices.Add(V2);
-
+
Standard_Boolean isNewFound = Standard_False;
do {
isNewFound = Standard_False;
}
}
} while (isNewFound);
-
+
// sorting any type of edges
aWire = TopoDS::Wire(aContext->Apply(aWire));
-
+
TopoDS_Face tmpF = TopoDS::Face(aContext->Apply(faces(1).Oriented(TopAbs_FORWARD)));
Handle(ShapeFix_Wire) sfw = new ShapeFix_Wire(aWire,tmpF,Precision::Confusion());
sfw->FixReorder();
sawo.Add(c2d->Value(f).XY(),c2d->Value(l).XY());
}
sawo.Perform();
-
+
// constructind one degenerative edge
gp_XY aStart, anEnd, tmp;
Standard_Integer nbFirst = sawo.Ordered(1);
TopoDS_Edge E = sbe.CopyReplaceVertices(anOrigE,aDummyV,aDummyV);
sawo.XY(nbFirst,aStart,tmp);
sawo.XY(sawo.Ordered(aLastEdge),tmp,anEnd);
-
+
gp_XY aVec = anEnd-aStart;
Handle(Geom2d_Line) aLine = new Geom2d_Line(aStart,gp_Dir2d(anEnd-aStart));
sff.SetContext(aContext);
// Applying the fixes
sff.Perform();
- if(sff.Status(ShapeExtend_FAIL))
+ if(sff.Status(ShapeExtend_FAIL))
hasFailed = Standard_True;
-
+
// breaking down to several faces
TopoDS_Shape theResult = aContext->Apply(aResult);
for (TopExp_Explorer aFaceExp (theResult,TopAbs_FACE); aFaceExp.More(); aFaceExp.Next()) {
grid->SetValue ( 1, 1, aBaseSurface );
Handle(ShapeExtend_CompositeSurface) G = new ShapeExtend_CompositeSurface ( grid );
ShapeFix_ComposeShell CompShell;
- CompShell.Init ( G, aBaseLocation, aCurrent, ::Precision::Confusion() );//myPrecision
+ CompShell.Init ( G, aBaseLocation, aCurrent, ::Precision::Confusion() );//myPrecision
CompShell.SetContext( aContext );
-
+
TopTools_SequenceOfShape parts;
ShapeFix_SequenceOfWireSegment wires;
for(TopExp_Explorer W_Exp(aCurrent,TopAbs_WIRE);W_Exp.More();W_Exp.Next()) {
- Handle(ShapeExtend_WireData) sbwd =
+ Handle(ShapeExtend_WireData) sbwd =
new ShapeExtend_WireData ( TopoDS::Wire(W_Exp.Current() ));
ShapeFix_WireSegment seg ( sbwd, TopAbs_REVERSED );
wires.Append(seg);
}
-
+
CompShell.DispatchWires ( parts,wires );
for (Standard_Integer j=1; j <= parts.Length(); j++ ) {
ShapeFix_Face aFixOrient(TopoDS::Face(parts(j)));
aFixOrient.SetContext(aContext);
aFixOrient.FixOrientation();
}
-
+
TopoDS_Shape CompRes;
if ( faces.Length() !=1 ) {
TopoDS_Shell S;
B.MakeShell ( S );
- for ( i=1; i <= parts.Length(); i++ )
+ for ( i=1; i <= parts.Length(); i++ )
B.Add ( S, parts(i) );
CompRes = S;
}
else CompRes = parts(1);
-
+
aContext->Replace(aCurrent,CompRes);
}
-
+
// remove the remaining faces
for(i = 2; i <= faces.Length(); i++)
aContext->Remove(faces(i));
sfw->SetMinTolerance(myTolerance);
sfw->SetMaxTolerance(Max(1.,myTolerance*1000.));
sfw->SetFace(aFace);
- for (TopoDS_Iterator iter (aFace,Standard_False); iter.More(); iter.Next()) {
+ for (TopoDS_Iterator iter (aFace,Standard_False); iter.More(); iter.Next()) {
TopoDS_Wire wire = TopoDS::Wire(iter.Value());
sfw->Load(wire);
sfw->FixReorder();
//=======================================================================
//function : IsSameDomain
-//purpose :
+//purpose :
//=======================================================================
Standard_Boolean BlockFix_UnionFaces::IsSameDomain(const TopoDS_Face& aFace,
//checking the same handless
TopLoc_Location L1, L2;
Handle(Geom_Surface) S1, S2;
-
+
S1 = BRep_Tool::Surface(aFace,L1);
S2 = BRep_Tool::Surface(aCheckedFace,L2);
-
+
if (S1 == S2 && L1 == L2)
return true;
//=======================================================================
//function : MovePCurves
-//purpose :
+//purpose :
//=======================================================================
void BlockFix_UnionFaces::MovePCurves(TopoDS_Face& aTarget,
{
BRep_Builder B;
for(TopExp_Explorer wexp(aSource,TopAbs_WIRE);wexp.More();wexp.Next()) {
- Handle(ShapeFix_Wire) sfw = new ShapeFix_Wire(TopoDS::Wire(wexp.Current()),
+ Handle(ShapeFix_Wire) sfw = new ShapeFix_Wire(TopoDS::Wire(wexp.Current()),
aTarget, Precision::Confusion());
sfw->FixReorder();
Standard_Boolean isReoredFailed = sfw->StatusReorder ( ShapeExtend_FAIL );
sfw->FixEdgeCurves();
if(isReoredFailed)
continue;
-
+
sfw->FixShifted();
sfw->FixDegenerated();
-
+
// remove degenerated edges from not degenerated points
ShapeAnalysis_Edge sae;
Handle(ShapeExtend_WireData) sewd = sfw->WireData();
i--;
}
}
-
+
TopoDS_Wire ResWire = sfw->Wire();
B.Add(aTarget,ResWire);
}
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
+
#ifndef _BlockFix_UnionFaces_HeaderFile
#define _BlockFix_UnionFaces_HeaderFile
#ifndef _Standard_Boolean_HeaderFile
#include <Standard_Boolean.hxx>
#endif
-class TopoDS_Shape;
-class TopoDS_Face;
-
-
#ifndef _Standard_HeaderFile
#include <Standard.hxx>
#endif
#include <Standard_Macro.hxx>
#endif
-class BlockFix_UnionFaces {
+class TopoDS_Shape;
+class TopoDS_Face;
+class BlockFix_UnionFaces
+{
public:
-
- void* operator new(size_t,void* anAddress)
- {
- return anAddress;
- }
- void* operator new(size_t size)
- {
- return Standard::Allocate(size);
- }
- void operator delete(void *anAddress)
- {
- if (anAddress) Standard::Free((Standard_Address&)anAddress);
- }
- // Methods PUBLIC
- //
-Standard_EXPORT BlockFix_UnionFaces();
-Standard_EXPORT Standard_Real& GetTolerance() ;
-Standard_EXPORT TopoDS_Shape Perform(const TopoDS_Shape& Shape) ;
-Standard_EXPORT virtual Standard_Boolean IsSameDomain(const TopoDS_Face& aFace,const TopoDS_Face& aChekedFace) const;
-Standard_EXPORT virtual void MovePCurves(TopoDS_Face& aTarget,const TopoDS_Face& aSource) const;
-
-
-
-
-
-protected:
-
- // Methods PROTECTED
- //
-
-
- // Fields PROTECTED
- //
-
+ void* operator new(size_t,void* anAddress)
+ {
+ return anAddress;
+ }
+ void* operator new(size_t size)
+ {
+ return Standard::Allocate(size);
+ }
+ void operator delete(void *anAddress)
+ {
+ if (anAddress) Standard::Free((Standard_Address&)anAddress);
+ }
+
+ // Methods PUBLIC
+ //
+ Standard_EXPORT BlockFix_UnionFaces();
+
+ Standard_EXPORT Standard_Real& GetTolerance();
+
+ /* \brief To get/set the OptimumNbFaces parameter
+ *
+ * If a being processed solid has less than OptimumNbFaces
+ * faces, no union will be performed.
+ * By default this parameter is set to 6 (to correctly
+ * process blocks - hexahedral solids)
+ * Special values: 0 - do all possible unions, regardless the faces quantity,
+ * negative - do not perform any unions, regardless the faces quantity.
+ *
+ */
+ Standard_EXPORT Standard_Integer& GetOptimumNbFaces();
+
+ Standard_EXPORT TopoDS_Shape Perform(const TopoDS_Shape& Shape);
+
+ Standard_EXPORT virtual Standard_Boolean IsSameDomain(const TopoDS_Face& aFace,
+ const TopoDS_Face& aChekedFace) const;
+ Standard_EXPORT virtual void MovePCurves(TopoDS_Face& aTarget,
+ const TopoDS_Face& aSource) const;
private:
-
- // Methods PRIVATE
- //
-
-
- // Fields PRIVATE
- //
-Standard_Real myTolerance;
-
-
+ // Fields PRIVATE
+ //
+ Standard_Real myTolerance;
+ Standard_Integer myOptimumNbFaces;
};
-
-
-
-
-// other Inline functions and methods (like "C++: function call" methods)
-//
-
-
#endif
gp_Pnt& aP2,
IntTools_Context& aCtx)
{
- Standard_Boolean bIsDone=Standard_False;
+ Standard_Boolean bIsDone = Standard_False;
Standard_Real aT2;
TopAbs_ShapeEnum aType;
//
- aType=aS.ShapeType();
- switch(aType) {
- case TopAbs_EDGE: {
- const TopoDS_Edge& aE2=TopoDS::Edge(aS);
- //
- bIsDone=aCtx.ProjectPointOnEdge(aP1, aE2, aT2);
- if (!bIsDone) {
- return bIsDone;
+ aType = aS.ShapeType();
+ switch (aType)
+ {
+ case TopAbs_EDGE:
+ {
+ cout << "$$$ case TopAbs_EDGE" << endl;
+ const TopoDS_Edge& aE2 = TopoDS::Edge(aS);
+ //
+ if (BRep_Tool::Degenerated(aE2)) { // jfa
+ cout << "$$$ Degenerated" << endl;
+ return Standard_True;
+ }
+ else {
+ Standard_Real f, l;
+ Handle(Geom_Curve) aC3D = BRep_Tool::Curve (aE2, f, l);
+ if (aC3D.IsNull()) {
+ cout << "$$$ aC3D.IsNull()" << endl;
+ return Standard_True;
+ }
+ bIsDone = aCtx.ProjectPointOnEdge(aP1, aE2, aT2);
+ }
+ if (!bIsDone) {
+ cout << "$$$ !bIsDone" << endl;
+ return bIsDone;
+ }
+ //
+ GEOMAlgo_Tools::PointOnEdge(aE2, aT2, aP2);
}
- //
- GEOMAlgo_Tools::PointOnEdge(aE2, aT2, aP2);
- }
break;
//
- case TopAbs_FACE: {
- const TopoDS_Face& aF2=TopoDS::Face(aS);
- GeomAPI_ProjectPointOnSurf& aProj=aCtx.ProjPS(aF2);
- //
- aProj.Perform(aP1);
- bIsDone=aProj.IsDone();
- if (!bIsDone) {
- return bIsDone;
+ case TopAbs_FACE:
+ {
+ const TopoDS_Face& aF2 = TopoDS::Face(aS);
+ GeomAPI_ProjectPointOnSurf& aProj = aCtx.ProjPS(aF2);
+ //
+ aProj.Perform(aP1);
+ bIsDone = aProj.IsDone();
+ if (!bIsDone) {
+ return bIsDone;
+ }
+ //
+ aP2 = aProj.NearestPoint();
}
- //
- aP2=aProj.NearestPoint();
- }
break;
//
default:
break; // Err
- }
+ }
return bIsDone;
}
//=======================================================================
<source>GEOM_REMOVE_EXTRA_EDGES</source>
<translation>Object to remove extra edges</translation>
</message>
+ <message>
+ <source>GEOM_RMEE_UNION_FACES</source>
+ <translation>Union faces, laying on common surface</translation>
+ </message>
<message>
<source>REMOVE_EXTRA_EDGES_NEW_OBJ_NAME</source>
<translation>NoExtraEdges</translation>
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
+
#include <Standard_Stream.hxx>
#include <BRepOffsetAPI_MakeFilling.hxx>
// 1. Improve solids with seam and/or degenerated edges
BlockFix_BlockFixAPI aTool;
//aTool.Tolerance() = toler;
+ aTool.OptimumNbFaces() = aCI.GetOptimumNbFaces();
aTool.SetShape(aBlockOrComp);
aTool.Perform();
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
-//NOTE: This is an interface to a function for the Blocks Multi-Transformations.
-//
+//NOTE: This is an interface to a functions for the Blocks Multi-Transformations and repairing
+
#include "GEOM_Function.hxx"
#define TRSF_ORIGIN 1
#define TRSF_FACE_2_V 6
#define TRSF_NBITER_V 7
+#define TRSF_NB_FACES 8
+
class GEOMImpl_IBlockTrsf
{
public:
void SetNbIterU (int theNbIter) { _func->SetInteger(TRSF_NBITER_U, theNbIter); }
void SetNbIterV (int theNbIter) { _func->SetInteger(TRSF_NBITER_V, theNbIter); }
+ void SetOptimumNbFaces (int theNbFaces) { _func->SetInteger(TRSF_NB_FACES, theNbFaces); }
+
int GetFace1U () { return _func->GetInteger(TRSF_FACE_1_U); }
int GetFace2U () { return _func->GetInteger(TRSF_FACE_2_U); }
int GetFace1V () { return _func->GetInteger(TRSF_FACE_1_V); }
int GetNbIterU() { return _func->GetInteger(TRSF_NBITER_U); }
int GetNbIterV() { return _func->GetInteger(TRSF_NBITER_V); }
+ int GetOptimumNbFaces() { return _func->GetInteger(TRSF_NB_FACES); }
+
private:
Handle(GEOM_Function) _func;
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
+
#ifdef WNT
#pragma warning( disable:4786 )
#endif
*/
//=============================================================================
Handle(GEOM_Object) GEOMImpl_IBlocksOperations::RemoveExtraEdges
- (Handle(GEOM_Object) theObject)
+ (Handle(GEOM_Object) theObject,
+ const Standard_Integer theOptimumNbFaces)
{
SetErrorCode(KO);
GEOMImpl_IBlockTrsf aTI (aFunction);
aTI.SetOriginal(aLastFunction);
+ aTI.SetOptimumNbFaces(theOptimumNbFaces);
//Compute the fixed shape
try {
GEOMImpl_IBlockTrsf aTI (aFunction);
aTI.SetOriginal(aLastFunction);
+ aTI.SetOptimumNbFaces(6);
//Compute the fixed shape
try {
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
+
#ifndef _GEOMImpl_IBlocksOperations_HXX_
#define _GEOMImpl_IBlocksOperations_HXX_
Standard_EXPORT TCollection_AsciiString PrintBCErrors (Handle(GEOM_Object) theCompound,
const std::list<BCError>& theErrors);
- Standard_EXPORT Handle(GEOM_Object) RemoveExtraEdges (Handle(GEOM_Object) theShape);
+ Standard_EXPORT Handle(GEOM_Object) RemoveExtraEdges (Handle(GEOM_Object) theShape,
+ const Standard_Integer theOptimumNbFaces = 6);
Standard_EXPORT Handle(GEOM_Object) CheckAndImprove (Handle(GEOM_Object) theCompound);
* RemoveExtraEdges
*/
//=============================================================================
-GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::RemoveExtraEdges (GEOM::GEOM_Object_ptr theShape)
+GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::RemoveExtraEdges
+ (GEOM::GEOM_Object_ptr theShape,
+ CORBA::Long theOptimumNbFaces)
{
GEOM::GEOM_Object_var aGEOMObject;
if (aShape.IsNull()) return aGEOMObject._retn();
//Get the result
- Handle(GEOM_Object) anObject =
- GetOperations()->RemoveExtraEdges(aShape);
+ Handle(GEOM_Object) anObject = GetOperations()->RemoveExtraEdges(aShape, theOptimumNbFaces);
if (!GetOperations()->IsDone() || anObject.IsNull())
return aGEOMObject._retn();
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
+
#ifndef _GEOM_IBlocksOperations_i_HeaderFile
#define _GEOM_IBlocksOperations_i_HeaderFile
char* PrintBCErrors (GEOM::GEOM_Object_ptr theCompound,
const GEOM::GEOM_IBlocksOperations::BCErrors& theErrors);
- GEOM::GEOM_Object_ptr RemoveExtraEdges (GEOM::GEOM_Object_ptr theShape);
+ GEOM::GEOM_Object_ptr RemoveExtraEdges (GEOM::GEOM_Object_ptr theShape,
+ CORBA::Long theOptimumNbFaces);
GEOM::GEOM_Object_ptr CheckAndImprove (GEOM::GEOM_Object_ptr theCompound);
# Unite faces and edges, sharing one surface. It means that
# this faces must have references to one C++ surface object (handle).
# @param theShape The compound or single solid to remove irregular edges from.
+ # @param theOptimumNbFaces If more than zero, unite faces only for those solids,
+ # that have more than theOptimumNbFaces faces. If zero, unite faces always,
+ # regardsless their quantity in the solid. If negative (the default value),
+ # do not unite faces at all. For blocks repairing recommended value is 6.
# @return Improved shape.
#
# @ref swig_RemoveExtraEdges "Example"
- def RemoveExtraEdges(self,theShape):
+ def RemoveExtraEdges(self,theShape,theOptimumNbFaces=-1):
# Example: see GEOM_TestOthers.py
- anObj = self.BlocksOp.RemoveExtraEdges(theShape)
+ anObj = self.BlocksOp.RemoveExtraEdges(theShape,theOptimumNbFaces)
RaiseIfFailed("RemoveExtraEdges", self.BlocksOp)
return anObj
// GEOM RepairGUI : GUI for Geometry component
// File : RepairGUI_RemoveExtraEdgesDlg.cxx
// Author : Michael Zorin, Open CASCADE S.A.S.
-//
+
#include "RepairGUI_RemoveExtraEdgesDlg.h"
#include <DlgRef.h>
mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose );
mainFrame()->RadioButton3->close();
- GroupPoints = new DlgRef_1Sel( centralWidget() );
+ GroupPoints = new DlgRef_1Sel1Check( centralWidget() );
+
GroupPoints->GroupBox1->setTitle( tr( "GEOM_REMOVE_EXTRA_EDGES" ) );
GroupPoints->TextLabel1->setText( tr( "GEOM_SELECTED_SHAPE" ) );
GroupPoints->PushButton1->setIcon( image1 );
GroupPoints->LineEdit1->setReadOnly( true );
+ GroupPoints->CheckButton1->setText( tr( "GEOM_RMEE_UNION_FACES" ) );
+
QVBoxLayout* layout = new QVBoxLayout( centralWidget() );
layout->setMargin( 0 ); layout->setSpacing( 6 );
layout->addWidget( GroupPoints );
myOkObject = false;
+ GroupPoints->CheckButton1->setChecked( false );
+
activateSelection();
mainFrame()->GroupBoxPublish->show();
bool RepairGUI_RemoveExtraEdgesDlg::execute( ObjectList& objects )
{
GEOM::GEOM_Object_var anObj;
-
- anObj = GEOM::GEOM_IBlocksOperations::_narrow( getOperation() )->RemoveExtraEdges( myObject );
-
- if ( !anObj->_is_nil() )
- objects.push_back( anObj._retn() );
+
+ int nbFacesOptimum = -1; // -1 means do not union faces
+ if (GroupPoints->CheckButton1->isChecked())
+ nbFacesOptimum = 0; // 0 means union all faces, that possible
+ anObj = GEOM::GEOM_IBlocksOperations::_narrow(getOperation())->RemoveExtraEdges
+ (myObject, nbFacesOptimum);
+
+ if (!anObj->_is_nil())
+ objects.push_back(anObj._retn());
return true;
}
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
-// GEOM GEOMGUI : GUI for Geometry component
+// GEOM GEOMGUI : GUI for Geometry component
// File : RepairGUI_RemoveExtraEdgesDlg.h
// Author : Michael ZORIN, Open CASCADE S.A.S.
-//
+
#ifndef REPAIRGUI_REMOVEEXTRAEDGESDLG_H
#define REPAIRGUI_REMOVEEXTRAEDGESDLG_H
#include <GEOMBase_Skeleton.h>
-class DlgRef_1Sel;
+class DlgRef_1Sel1Check;
//=================================================================================
// class : RepairGUI_RemoveExtraEdgesDlg
GEOM::GEOM_Object_var myObject;
bool myOkObject;
- DlgRef_1Sel* GroupPoints;
+ DlgRef_1Sel1Check* GroupPoints;
private slots:
void ClickOnOk();