0022749: [EDF] Improvement of Remove Internal Faces operation

This commit is contained in:
eap 2014-10-16 14:36:46 +04:00 committed by vsr
parent dff9617e4b
commit 8345fbb56c
14 changed files with 94 additions and 66 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -5,12 +5,12 @@
\n To <b>Remove internal faces</b> in the <b>Main Menu</b> select \n To <b>Remove internal faces</b> in the <b>Main Menu</b> select
<b>Repair - > Remove internal faces</b>. <b>Repair - > Remove internal faces</b>.
This operation removes all shared faces from a compound to obtain This operation removes all shared faces from given solids to obtain
one or more bigger solids from a set of smaller solids. one or more bigger solids from a set of smaller solids.
\image html remove_webs.png \image html remove_webs.png
\n <b>Arguments:</b> Name + one shape. \n <b>Arguments:</b> Name + one or more shapes containing solids.
\n <b>Advanced option:</b> \n <b>Advanced option:</b>
\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments". \ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments".
@ -19,8 +19,8 @@ faces will stay as is, use \ref glue_faces_operation_page or \ref partition_page
<b>Remove Internal Faces</b> if you need to remove them. <b>Remove Internal Faces</b> if you need to remove them.
\n <b>TUI Command:</b> <br> \n <b>TUI Command:</b> <br>
<em>geompy.RemoveInternalFaces( theCompound )</em>,<br> <em>geompy.RemoveInternalFaces( theSolids )</em>,<br>
where <em>theCompound</em> is a compound of solids. where <em>theSolids</em> is either a compound or a list of solids.
\n Our <b>TUI Scripts</b> provide you with useful examples of the \n Our <b>TUI Scripts</b> provide you with useful examples of the
\ref tui_remove_webs "Remove Internal Faces" functionality usage. \ref tui_remove_webs "Remove Internal Faces" functionality usage.

View File

@ -26,7 +26,7 @@ splits an edge in two.</li>
<li>\subpage change_orientation_operation_page "Change orientation" - <li>\subpage change_orientation_operation_page "Change orientation" -
reverses the normals of the selected faces.</li> reverses the normals of the selected faces.</li>
<li>\subpage remove_webs_operation_page "Remove internal faces" - <li>\subpage remove_webs_operation_page "Remove internal faces" -
rebuilds the topology of a compound of solids by removing the faces rebuilds the topology of solids by removing the faces
are shared by several solids.</li> are shared by several solids.</li>
<li>\subpage remove_extra_edges_operation_page "Remove extra edges" - <li>\subpage remove_extra_edges_operation_page "Remove extra edges" -
removes seam and degenerated edges from the given shape.</li> removes seam and degenerated edges from the given shape.</li>

View File

@ -3705,12 +3705,12 @@ module GEOM
GEOM_Object SewAllowNonManifold(in ListOfGO theObjects, in double theTolerance); GEOM_Object SewAllowNonManifold(in ListOfGO theObjects, in double theTolerance);
/*! /*!
* Rebuild the topology of theCompound of solids by removing * Rebuild the topology of theSolids by removing
* of the faces that are shared by several solids. * the faces that are shared by several solids.
* \param theCompound Shape to be processed. * \param theSolids A list of shapes containing solids to be processed.
* \return New GEOM_Object, containing processed shape. * \return New GEOM_Object, containing processed shape.
*/ */
GEOM_Object RemoveInternalFaces (in GEOM_Object theCompound); GEOM_Object RemoveInternalFaces (in ListOfGO theSolids);
/*! /*!
* \brief Addition of a point to a given edge object. * \brief Addition of a point to a given edge object.

View File

@ -4590,7 +4590,7 @@ Please, select face, shell or solid and try again</translation>
</message> </message>
<message> <message>
<source>GEOM_REMOVE_WEBS</source> <source>GEOM_REMOVE_WEBS</source>
<translation>Compound of solids</translation> <translation>Solids</translation>
</message> </message>
<message> <message>
<source>REMOVE_WEBS_NEW_OBJ_NAME</source> <source>REMOVE_WEBS_NEW_OBJ_NAME</source>

View File

@ -142,7 +142,7 @@ Standard_Integer GEOMImpl_HealingDriver::Execute(TFunction_Logbook& log) const
Sew(&HI, anOriginalShape, aShape, true); Sew(&HI, anOriginalShape, aShape, true);
break; break;
case REMOVE_INTERNAL_FACES: case REMOVE_INTERNAL_FACES:
RemoveInternalFaces(anOriginalShape, aShape); RemoveInternalFaces(&HI, anOriginalShape, aShape);
break; break;
case DIVIDE_EDGE: case DIVIDE_EDGE:
AddPointOnEdge(&HI, anOriginalShape, aShape); AddPointOnEdge(&HI, anOriginalShape, aShape);
@ -470,11 +470,44 @@ Standard_Boolean GEOMImpl_HealingDriver::Sew (GEOMImpl_IHealing* theHI,
//function : RemoveInternalFaces //function : RemoveInternalFaces
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_Boolean GEOMImpl_HealingDriver::RemoveInternalFaces (const TopoDS_Shape& theOriginalShape, Standard_Boolean
GEOMImpl_HealingDriver::RemoveInternalFaces (GEOMImpl_IHealing* theHI,
const TopoDS_Shape& theOriginalShape,
TopoDS_Shape& theOutShape) const TopoDS_Shape& theOutShape) const
{ {
// get all input shapes
TopTools_SequenceOfShape shapeSeq;
shapeSeq.Append( theOriginalShape );
Handle(TColStd_HSequenceOfTransient) otherObjs = theHI->GetShapes();
if ( !otherObjs.IsNull() )
for ( int ind = 1; ind <= otherObjs->Length(); ind++)
{
Handle(GEOM_Function) aRefShape = Handle(GEOM_Function)::DownCast(otherObjs->Value(ind));
TopoDS_Shape aShape = aRefShape->GetValue();
if (aShape.IsNull())
Standard_NullObject::Raise("Null object given");
shapeSeq.Append( aShape );
}
// pass input shapes to the algorithm
GEOMAlgo_RemoverWebs aTool; GEOMAlgo_RemoverWebs aTool;
aTool.SetShape(theOriginalShape); if ( shapeSeq.Length() == 1 )
{
aTool.SetShape( shapeSeq.First() );
}
else
{
TopoDS_Compound solidCompound;
BRep_Builder builder;
builder.MakeCompound( solidCompound );
for ( int ind = 1; ind <= shapeSeq.Length(); ++ind )
for ( TopExp_Explorer so( shapeSeq( ind ), TopAbs_SOLID ); so.More(); so.Next() )
builder.Add( solidCompound, so.Current() );
aTool.SetShape( solidCompound );
}
// run the algorithm
aTool.Perform(); aTool.Perform();
if (aTool.ErrorStatus() == 0) { // OK if (aTool.ErrorStatus() == 0) { // OK
@ -929,7 +962,7 @@ GetCreationInformation(std::string& theOperationName,
break; break;
case REMOVE_INTERNAL_FACES: case REMOVE_INTERNAL_FACES:
theOperationName = "REMOVE_WEBS"; theOperationName = "REMOVE_WEBS";
AddParam( theParams, "Selected shape", aCI.GetOriginal() ); AddParam( theParams, "Selected shapes", aCI.GetOriginalAndShapes() );
break; break;
default: default:
return false; return false;

View File

@ -103,7 +103,7 @@ private:
Standard_Boolean RemoveIntWires( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; Standard_Boolean RemoveIntWires( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const;
Standard_Boolean RemoveHoles ( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; Standard_Boolean RemoveHoles ( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const;
Standard_Boolean Sew ( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape&, Standard_Boolean ) const; Standard_Boolean Sew ( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape&, Standard_Boolean ) const;
Standard_Boolean RemoveInternalFaces ( const TopoDS_Shape&, TopoDS_Shape& ) const; Standard_Boolean RemoveInternalFaces ( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const;
Standard_Boolean AddPointOnEdge( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; Standard_Boolean AddPointOnEdge( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const;
Standard_Boolean ChangeOrientation( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; Standard_Boolean ChangeOrientation( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const;
void LimitTolerance( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; void LimitTolerance( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const;

View File

@ -652,21 +652,26 @@ GEOMImpl_IHealingOperations::Sew (std::list<Handle(GEOM_Object)>& theObjects,
* RemoveInternalFaces * RemoveInternalFaces
*/ */
//============================================================================= //=============================================================================
Handle(GEOM_Object) GEOMImpl_IHealingOperations::RemoveInternalFaces (Handle(GEOM_Object) theObject) Handle(GEOM_Object)
GEOMImpl_IHealingOperations::RemoveInternalFaces (std::list< Handle(GEOM_Object)> & theSolids)
{ {
// set error code, check parameters // set error code, check parameters
SetErrorCode(KO); SetErrorCode(KO);
if (theObject.IsNull()) if (theSolids.empty())
return NULL; return NULL;
Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); Handle(TColStd_HSequenceOfTransient) objects = GEOM_Object::GetLastFunctions( theSolids );
if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be processed if ( objects.IsNull() || objects->IsEmpty() ) {
SetErrorCode("NULL argument shape");
return NULL;
}
// Add a new object // Add a new object
Handle(GEOM_Object) aNewObject = GetEngine()->AddObject(GetDocID(), GEOM_COPY); Handle(GEOM_Object) aNewObject = GetEngine()->AddObject(GetDocID(), GEOM_COPY);
//Add the function //Add the function
Handle(GEOM_Function)
aFunction = aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), REMOVE_INTERNAL_FACES); aFunction = aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), REMOVE_INTERNAL_FACES);
if (aFunction.IsNull()) return NULL; if (aFunction.IsNull()) return NULL;
@ -675,7 +680,8 @@ Handle(GEOM_Object) GEOMImpl_IHealingOperations::RemoveInternalFaces (Handle(GEO
// prepare "data container" class IHealing // prepare "data container" class IHealing
GEOMImpl_IHealing HI (aFunction); GEOMImpl_IHealing HI (aFunction);
HI.SetOriginal(aLastFunction); HI.SetOriginal( theSolids.front()->GetLastFunction() ); objects->Remove(1);
HI.SetShapes( objects );
//Compute the result //Compute the result
try { try {
@ -693,7 +699,7 @@ Handle(GEOM_Object) GEOMImpl_IHealingOperations::RemoveInternalFaces (Handle(GEO
} }
//Make a Python command //Make a Python command
GEOM::TPythonDump(aFunction) << aNewObject << " = geompy.RemoveInternalFaces(" << theObject << ")"; GEOM::TPythonDump(aFunction) << aNewObject << " = geompy.RemoveInternalFaces(" << theSolids << ")";
SetErrorCode(OK); SetErrorCode(OK);
return aNewObject; return aNewObject;

View File

@ -74,7 +74,7 @@ class GEOMImpl_IHealingOperations : public GEOM_IOperations {
double theTolerance, double theTolerance,
bool isAllowNonManifold); bool isAllowNonManifold);
Standard_EXPORT Handle(GEOM_Object) RemoveInternalFaces (Handle(GEOM_Object) theObject); Standard_EXPORT Handle(GEOM_Object) RemoveInternalFaces (std::list< Handle(GEOM_Object)> & theSolids);
Standard_EXPORT Handle(GEOM_Object) DivideEdge( Handle(GEOM_Object) theObject, Standard_EXPORT Handle(GEOM_Object) DivideEdge( Handle(GEOM_Object) theObject,
int theIndex, int theIndex,

View File

@ -377,20 +377,21 @@ GEOM_IHealingOperations_i::SewAllowNonManifold (const GEOM::ListOfGO& theObjects
* RemoveInternalFaces * RemoveInternalFaces
*/ */
//============================================================================= //=============================================================================
GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::RemoveInternalFaces (GEOM::GEOM_Object_ptr theCompound) GEOM::GEOM_Object_ptr
GEOM_IHealingOperations_i::RemoveInternalFaces (const GEOM::ListOfGO& theSolids)
{ {
GEOM::GEOM_Object_var aGEOMObject; GEOM::GEOM_Object_var aGEOMObject;
// Set a not done flag // Set a not done flag
GetOperations()->SetNotDone(); GetOperations()->SetNotDone();
// Get the object // Get the objects
Handle(GEOM_Object) anObject = GetObjectImpl(theCompound); std::list< Handle(GEOM_Object) > aShapes;
if (anObject.IsNull()) if (! GetListOfObjectsImpl( theSolids, aShapes ))
return aGEOMObject._retn(); return aGEOMObject._retn();
// Perform // Perform
Handle(GEOM_Object) aNewObject = GetOperations()->RemoveInternalFaces(anObject); Handle(GEOM_Object) aNewObject = GetOperations()->RemoveInternalFaces(aShapes);
if (!GetOperations()->IsDone() || aNewObject.IsNull()) if (!GetOperations()->IsDone() || aNewObject.IsNull())
return aGEOMObject._retn(); return aGEOMObject._retn();

View File

@ -75,7 +75,7 @@ class GEOM_I_EXPORT GEOM_IHealingOperations_i :
GEOM::GEOM_Object_ptr SewAllowNonManifold (const GEOM::ListOfGO & theObject, GEOM::GEOM_Object_ptr SewAllowNonManifold (const GEOM::ListOfGO & theObject,
CORBA::Double theTolerance); CORBA::Double theTolerance);
GEOM::GEOM_Object_ptr RemoveInternalFaces (GEOM::GEOM_Object_ptr theCompound); GEOM::GEOM_Object_ptr RemoveInternalFaces (const GEOM::ListOfGO& theSolids);
GEOM::GEOM_Object_ptr DivideEdge (GEOM::GEOM_Object_ptr theObject, GEOM::GEOM_Object_ptr DivideEdge (GEOM::GEOM_Object_ptr theObject,
CORBA::Short theIndex, CORBA::Short theIndex,

View File

@ -6399,9 +6399,9 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen):
self._autoPublish(anObj, theName, "sewed") self._autoPublish(anObj, theName, "sewed")
return anObj return anObj
## Rebuild the topology of theCompound of solids by removing ## Rebuild the topology of theSolids by removing
# of the faces that are shared by several solids. # the faces that are shared by several solids.
# @param theCompound Shape to be processed. # @param theSolids A compound or a list of solids to be processed.
# @param theName Object name; when specified, this parameter is used # @param theName Object name; when specified, this parameter is used
# for result publication in the study. Otherwise, if automatic # for result publication in the study. Otherwise, if automatic
# publication is switched on, default value is used for result name. # publication is switched on, default value is used for result name.
@ -6410,13 +6410,13 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen):
# #
# @ref tui_remove_webs "Example" # @ref tui_remove_webs "Example"
@ManageTransactions("HealOp") @ManageTransactions("HealOp")
def RemoveInternalFaces (self, theCompound, theName=None): def RemoveInternalFaces (self, theSolids, theName=None):
""" """
Rebuild the topology of theCompound of solids by removing Rebuild the topology of theSolids by removing
of the faces that are shared by several solids. the faces that are shared by several solids.
Parameters: Parameters:
theCompound Shape to be processed. theSolids A compound or a list of solids to be processed.
theName Object name; when specified, this parameter is used theName Object name; when specified, this parameter is used
for result publication in the study. Otherwise, if automatic for result publication in the study. Otherwise, if automatic
publication is switched on, default value is used for result name. publication is switched on, default value is used for result name.
@ -6425,7 +6425,7 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen):
New GEOM.GEOM_Object, containing processed shape. New GEOM.GEOM_Object, containing processed shape.
""" """
# Example: see GEOM_TestHealing.py # Example: see GEOM_TestHealing.py
anObj = self.HealOp.RemoveInternalFaces(theCompound) anObj = self.HealOp.RemoveInternalFaces(ToList(theSolids))
RaiseIfFailed("RemoveInternalFaces", self.HealOp) RaiseIfFailed("RemoveInternalFaces", self.HealOp)
self._autoPublish(anObj, theName, "removeWebs") self._autoPublish(anObj, theName, "removeWebs")
return anObj return anObj

View File

@ -63,7 +63,7 @@ RepairGUI_RemoveWebsDlg::RepairGUI_RemoveWebsDlg (GeometryGUI* theGeometryGUI, Q
GroupPoints = new DlgRef_1Sel( centralWidget() ); GroupPoints = new DlgRef_1Sel( centralWidget() );
GroupPoints->GroupBox1->setTitle( tr( "GEOM_REMOVE_WEBS" ) ); GroupPoints->GroupBox1->setTitle( tr( "GEOM_REMOVE_WEBS" ) );
GroupPoints->TextLabel1->setText( tr( "GEOM_SELECTED_SHAPE" ) ); GroupPoints->TextLabel1->setText( tr( "GEOM_SELECTED_SHAPES" ) );
GroupPoints->PushButton1->setIcon( image1 ); GroupPoints->PushButton1->setIcon( image1 );
GroupPoints->LineEdit1->setReadOnly( true ); GroupPoints->LineEdit1->setReadOnly( true );
@ -141,7 +141,7 @@ bool RepairGUI_RemoveWebsDlg::ClickOnApply()
initName(); initName();
myEditCurrentArgument->setText(""); myEditCurrentArgument->setText("");
myObject = GEOM::GEOM_Object::_nil(); myObjects.clear();
myOkObject = false; myOkObject = false;
@ -158,33 +158,16 @@ bool RepairGUI_RemoveWebsDlg::ClickOnApply()
void RepairGUI_RemoveWebsDlg::SelectionIntoArgument() void RepairGUI_RemoveWebsDlg::SelectionIntoArgument()
{ {
myEditCurrentArgument->setText( "" ); myEditCurrentArgument->setText( "" );
QString aName; myObjects.clear();
LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
SALOME_ListIO aSelList;
aSelMgr->selectedObjects(aSelList);
if (myEditCurrentArgument == GroupPoints->LineEdit1) {
if (aSelList.Extent() != 1) {
if (myEditCurrentArgument == GroupPoints->LineEdit1)
myOkObject = false; myOkObject = false;
return;
}
}
// nbSel == 1 myObjects = getSelected( TopAbs_SHAPE, -1 );
GEOM::GEOM_Object_ptr aSelectedObject =
GEOMBase::ConvertIOinGEOMObject(aSelList.First());
if (CORBA::is_nil(aSelectedObject)) if ( !myObjects.isEmpty() ) {
return; QString aName = myObjects.count() > 1 ? QString( "%1_objects").arg( myObjects.count() ) : GEOMBase::GetName( myObjects[0].get() );
if (myEditCurrentArgument == GroupPoints->LineEdit1) {
myObject = aSelectedObject;
myOkObject = true; myOkObject = true;
myEditCurrentArgument->setText( aName );
} }
myEditCurrentArgument->setText(GEOMBase::GetName(aSelectedObject));
} }
//================================================================================= //=================================================================================
@ -242,7 +225,7 @@ void RepairGUI_RemoveWebsDlg::enterEvent (QEvent* e)
void RepairGUI_RemoveWebsDlg::activateSelection() void RepairGUI_RemoveWebsDlg::activateSelection()
{ {
TColStd_MapOfInteger aTypes; TColStd_MapOfInteger aTypes;
//aTypes.Add( GEOM_SOLID ); aTypes.Add( GEOM_SOLID );
aTypes.Add( GEOM_COMPOUND ); aTypes.Add( GEOM_COMPOUND );
globalSelection( aTypes ); globalSelection( aTypes );
} }
@ -271,8 +254,13 @@ bool RepairGUI_RemoveWebsDlg::isValid (QString& msg)
//================================================================================= //=================================================================================
bool RepairGUI_RemoveWebsDlg::execute (ObjectList& objects) bool RepairGUI_RemoveWebsDlg::execute (ObjectList& objects)
{ {
GEOM::ListOfGO_var objList = new GEOM::ListOfGO;
objList->length( myObjects.count() );
for ( int i = 0; i < myObjects.count(); ++i )
objList[i] = myObjects[i].copy();
GEOM::GEOM_IHealingOperations_var anOper = GEOM::GEOM_IHealingOperations::_narrow(getOperation()); GEOM::GEOM_IHealingOperations_var anOper = GEOM::GEOM_IHealingOperations::_narrow(getOperation());
GEOM::GEOM_Object_var anObj = anOper->RemoveInternalFaces(myObject); GEOM::GEOM_Object_var anObj = anOper->RemoveInternalFaces(objList);
if (!anObj->_is_nil()) if (!anObj->_is_nil())
objects.push_back(anObj._retn()); objects.push_back(anObj._retn());

View File

@ -52,7 +52,7 @@ private:
void activateSelection(); void activateSelection();
private: private:
GEOM::GEOM_Object_var myObject; QList<GEOM::GeomObjPtr> myObjects;
bool myOkObject; bool myOkObject;
DlgRef_1Sel* GroupPoints; DlgRef_1Sel* GroupPoints;