0022758: [EDF] Creation of a face from a surface and limiting edges

This commit is contained in:
skv 2014-10-16 18:31:50 +04:00 committed by vsr
parent 121ed59dc2
commit 7933d72800
19 changed files with 426 additions and 46 deletions

View File

@ -36,11 +36,13 @@ face1 = geompy.MakeFace(wire, isPlanarFace)
# create faces from two wires # create faces from two wires
face2 = geompy.MakeFaceWires([wire, sketcher1],isPlanarFace) face2 = geompy.MakeFaceWires([wire, sketcher1],isPlanarFace)
face3 = geompy.MakeFaces([sketcher2, sketcher3],isPlanarFace) face3 = geompy.MakeFaces([sketcher2, sketcher3],isPlanarFace)
face4 = geompy.MakeFaceFromSurface(face1, sketcher1)
# add objects in the study # add objects in the study
id_face1 = geompy.addToStudy(face1,"Face1") id_face1 = geompy.addToStudy(face1,"Face1")
id_face2 = geompy.addToStudy(face2,"Face2") id_face2 = geompy.addToStudy(face2,"Face2")
id_face3 = geompy.addToStudy(face3,"Face3") id_face3 = geompy.addToStudy(face3,"Face3")
id_face4 = geompy.addToStudy(face4,"Face4")
# display the faces # display the faces
gg.createAndDisplayGO(id_face1) gg.createAndDisplayGO(id_face1)
@ -52,3 +54,6 @@ gg.setTransparency(id_face2,0.2)
gg.createAndDisplayGO(id_face3) gg.createAndDisplayGO(id_face3)
gg.setDisplayMode(id_face3,1) gg.setDisplayMode(id_face3,1)
gg.setTransparency(id_face3,0.2) gg.setTransparency(id_face3,0.2)
gg.createAndDisplayGO(id_face4)
gg.setDisplayMode(id_face4,1)
gg.setTransparency(id_face4,0.2)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -5,10 +5,12 @@
To create a \b Face in the <b>Main Menu</b> select <b>New Entity - > To create a \b Face in the <b>Main Menu</b> select <b>New Entity - >
Build - > Face</b> Build - > Face</b>
\n To create a \b Face you need to select input shape(s). The list of \n There are two algorithms to create a \b Face.
input shapes can include shapes of any type; if the shapes are nor \n Each time the \b Result of the operation will be a GEOM_Object
wires or edges, the algorithm extracts all edges from (face).
the input shapes and works on the obtaineed edges.
\n Firstly, to create a \b Face you need to select input shape(s). The list of
input shapes can include shapes of type \b Edge or \b Wire.
\n The edges and wires do not necessarily have to be closed, the \n The edges and wires do not necessarily have to be closed, the
algorithm automatically builds a wire of maximum length from all algorithm automatically builds a wire of maximum length from all
given edges and wires. If it founds multiple closed wires, it can given edges and wires. If it founds multiple closed wires, it can
@ -26,6 +28,15 @@ face or nothing if it is impossible.
\image html neo-obj4.png \image html neo-obj4.png
\n Secondly, it is possible to create a face based on another face's surface and bounded by a wire.
\n The \b Result will be a \b GEOM_Object (FACE).
\n <b>TUI Command:</b> <em>geompy.MakeFaceFromSurface(theFace, theWire)</em>
\n <b>Arguments:</b> Name + 1 face + 1 wire.
\image html neo-obj4_2.png
\n <b>Example:</b> \n <b>Example:</b>
\image html facesn1.png \image html facesn1.png

View File

@ -1924,6 +1924,15 @@ module GEOM
*/ */
GEOM_Object MakeFaceWires (in ListOfGO theWires, in boolean isPlanarWanted); GEOM_Object MakeFaceWires (in ListOfGO theWires, in boolean isPlanarWanted);
/**
* \brief Create a face based on surface of theFace limited by theWire.
* \param theFace the face whose surface is used to create a new face.
* \param theWire closed Wire build the face.
* \return New GEOM_Object, containing the created face.
*/
GEOM_Object MakeFaceFromSurface(in GEOM_Object theFace,
in GEOM_Object theWire);
/*! /*!
* \brief Create a shell from the set of faces and shells. * \brief Create a shell from the set of faces and shells.
* \param theFacesAndShells List of faces and/or shells. * \param theFacesAndShells List of faces and/or shells.

View File

@ -54,6 +54,7 @@ SET( _res_files
build_edge_wire.png build_edge_wire.png
build_edge_curve.png build_edge_curve.png
build_face.png build_face.png
build_face_surface.png
build_shell.png build_shell.png
build_solid.png build_solid.png
build_wire.png build_wire.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 818 B

View File

@ -49,18 +49,20 @@
// TRUE to construct a modal dialog. // TRUE to construct a modal dialog.
//================================================================================= //=================================================================================
BuildGUI_FaceDlg::BuildGUI_FaceDlg( GeometryGUI* theGeometryGUI, QWidget* parent ) BuildGUI_FaceDlg::BuildGUI_FaceDlg( GeometryGUI* theGeometryGUI, QWidget* parent )
: GEOMBase_Skeleton( theGeometryGUI, parent ) : GEOMBase_Skeleton( theGeometryGUI, parent ),
GroupWire (0),
myGroupSurf (0)
{ {
QPixmap image0( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_BUILD_FACE" ) ) ); QPixmap image0( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) );
QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) ); QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_BUILD_FACE" ) ) );
QPixmap image2( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_BUILD_FACE_SURFACE" ) ) );
setWindowTitle( tr( "GEOM_FACE_TITLE" ) ); setWindowTitle( tr( "GEOM_FACE_TITLE" ) );
/***************************************************************/ /***************************************************************/
mainFrame()->GroupConstructors->setTitle( tr( "GEOM_FACE" ) ); mainFrame()->GroupConstructors->setTitle( tr( "GEOM_FACE" ) );
mainFrame()->RadioButton1->setIcon( image0 ); mainFrame()->RadioButton1->setIcon( image1 );
mainFrame()->RadioButton2->setAttribute( Qt::WA_DeleteOnClose ); mainFrame()->RadioButton2->setIcon( image2 );
mainFrame()->RadioButton2->close();
mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose ); mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose );
mainFrame()->RadioButton3->close(); mainFrame()->RadioButton3->close();
@ -69,11 +71,20 @@ BuildGUI_FaceDlg::BuildGUI_FaceDlg( GeometryGUI* theGeometryGUI, QWidget* parent
GroupWire->GroupBox1->setTitle( tr( "GEOM_FACE_FFW" ) ); GroupWire->GroupBox1->setTitle( tr( "GEOM_FACE_FFW" ) );
GroupWire->TextLabel1->setText( tr( "GEOM_OBJECTS" ) ); GroupWire->TextLabel1->setText( tr( "GEOM_OBJECTS" ) );
GroupWire->CheckButton1->setText( tr( "GEOM_FACE_OPT" ) ); GroupWire->CheckButton1->setText( tr( "GEOM_FACE_OPT" ) );
GroupWire->PushButton1->setIcon( image1 ); GroupWire->PushButton1->setIcon( image0 );
myGroupSurf = new DlgRef_2Sel(centralWidget());
myGroupSurf->GroupBox1->setTitle(tr("GEOM_FACE_FROM_SURFACE" ) );
myGroupSurf->TextLabel1->setText(tr("GEOM_FACE"));
myGroupSurf->TextLabel2->setText(tr("GEOM_WIRE"));
myGroupSurf->PushButton1->setIcon(image0);
myGroupSurf->PushButton2->setIcon(image0);
QVBoxLayout* layout = new QVBoxLayout( centralWidget() ); QVBoxLayout* layout = new QVBoxLayout( centralWidget() );
layout->setMargin( 0 ); layout->setSpacing( 6 ); layout->setMargin( 0 ); layout->setSpacing( 6 );
layout->addWidget( GroupWire ); layout->addWidget( GroupWire );
layout->addWidget(myGroupSurf);
/***************************************************************/ /***************************************************************/
setHelpFileName("create_face_page.html"); setHelpFileName("create_face_page.html");
@ -102,27 +113,79 @@ void BuildGUI_FaceDlg::Init()
/* init variables */ /* init variables */
myEditCurrentArgument = GroupWire->LineEdit1; myEditCurrentArgument = GroupWire->LineEdit1;
GroupWire->LineEdit1->setReadOnly( true ); GroupWire->LineEdit1->setReadOnly( true );
myGroupSurf->LineEdit1->setReadOnly( true );
myGroupSurf->LineEdit2->setReadOnly( true );
GroupWire->CheckButton1->setChecked( true ); GroupWire->CheckButton1->setChecked( true );
myWires.clear(); myWires.clear();
myFace.nullify();
TColStd_MapOfInteger aMap; myWire.nullify();
aMap.Add( GEOM_EDGE );
aMap.Add( GEOM_WIRE );
globalSelection( aMap );
/* signals and slots connections */ /* signals and slots connections */
connect(myGeomGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
connect(myGeomGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel()));
connect(this, SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int)));
connect( buttonOk(), SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); connect( buttonOk(), SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) );
connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) );
connect( GroupWire->LineEdit1, SIGNAL( returnPressed()), this, SLOT( LineEditReturnPressed() ) ); connect( GroupWire->LineEdit1, SIGNAL( returnPressed()), this, SLOT( LineEditReturnPressed() ) );
connect( GroupWire->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); connect( GroupWire->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) );
connect( myGroupSurf->LineEdit1, SIGNAL( returnPressed()), this, SLOT( LineEditReturnPressed() ) );
connect( myGroupSurf->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) );
connect( myGroupSurf->LineEdit2, SIGNAL( returnPressed()), this, SLOT( LineEditReturnPressed() ) );
connect( myGroupSurf->PushButton2, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) );
connect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr(), connect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr(),
SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
initName( tr( "GEOM_FACE" ) ); initName( tr( "GEOM_FACE" ) );
SelectionIntoArgument();
ConstructorsClicked(0);
} }
//=================================================================================
// function : ConstructorsClicked()
// purpose : Radio button management
//=================================================================================
void BuildGUI_FaceDlg::ConstructorsClicked(int constructorId)
{
switch (constructorId) {
case 0:
{
TColStd_MapOfInteger aMap;
aMap.Add(GEOM_EDGE);
aMap.Add(GEOM_WIRE);
globalSelection(aMap);
myEditCurrentArgument = GroupWire->LineEdit1;
GroupWire->LineEdit1->setText("");
GroupWire->show();
myGroupSurf->hide();
break;
}
case 1:
{
globalSelection(GEOM_FACE); // For the first element.
myEditCurrentArgument = myGroupSurf->LineEdit1;
myGroupSurf->LineEdit1->setText("");
myGroupSurf->PushButton1->setDown(true);
myGroupSurf->PushButton2->setDown(false);
GroupWire->hide();
myGroupSurf->show();
break;
}
}
myWires.clear();
myFace.nullify();
myWire.nullify();
qApp->processEvents();
updateGeometry();
resize(minimumSizeHint());
SelectionIntoArgument();
}
//================================================================================= //=================================================================================
// function : ClickOnOk() // function : ClickOnOk()
@ -156,6 +219,7 @@ bool BuildGUI_FaceDlg::ClickOnApply()
//================================================================================= //=================================================================================
void BuildGUI_FaceDlg::SelectionIntoArgument() void BuildGUI_FaceDlg::SelectionIntoArgument()
{ {
if (myEditCurrentArgument == GroupWire->LineEdit1) {
myEditCurrentArgument->setText( "" ); myEditCurrentArgument->setText( "" );
QList<TopAbs_ShapeEnum> types; QList<TopAbs_ShapeEnum> types;
@ -166,6 +230,33 @@ void BuildGUI_FaceDlg::SelectionIntoArgument()
QString aName = myWires.count() > 1 ? QString( "%1_objects").arg( myWires.count() ) : GEOMBase::GetName( myWires[0].get() ); QString aName = myWires.count() > 1 ? QString( "%1_objects").arg( myWires.count() ) : GEOMBase::GetName( myWires[0].get() );
myEditCurrentArgument->setText( aName ); myEditCurrentArgument->setText( aName );
} }
} else if (myEditCurrentArgument == myGroupSurf->LineEdit1 ||
myEditCurrentArgument == myGroupSurf->LineEdit2) {
const bool isEditFace = myEditCurrentArgument == myGroupSurf->LineEdit1;
const TopAbs_ShapeEnum aType = isEditFace ? TopAbs_FACE : TopAbs_WIRE;
GEOM::GeomObjPtr aSelectedObject = getSelected(aType);
GEOM::GeomObjPtr &anObj = isEditFace ? myFace : myWire;
if (aSelectedObject) {
myEditCurrentArgument->setText(GEOMBase::GetName(aSelectedObject.get()));
anObj = aSelectedObject;
} else {
myEditCurrentArgument->setText("");
anObj.nullify();
}
if (isEditFace) {
if (myFace && !myWire) {
myGroupSurf->PushButton2->click();
}
} else {
if (!myFace && myWire) {
myGroupSurf->PushButton1->click();
}
}
}
displayPreview(true);
} }
@ -176,18 +267,33 @@ void BuildGUI_FaceDlg::SelectionIntoArgument()
void BuildGUI_FaceDlg::SetEditCurrentArgument() void BuildGUI_FaceDlg::SetEditCurrentArgument()
{ {
QPushButton* send = (QPushButton*)sender(); QPushButton* send = (QPushButton*)sender();
if ( send != GroupWire->PushButton1 )
return;
if (send == GroupWire->PushButton1) {
TColStd_MapOfInteger aMap; TColStd_MapOfInteger aMap;
aMap.Add(GEOM_EDGE); aMap.Add(GEOM_EDGE);
aMap.Add(GEOM_WIRE); aMap.Add(GEOM_WIRE);
globalSelection(aMap); globalSelection(aMap);
myEditCurrentArgument = GroupWire->LineEdit1; myEditCurrentArgument = GroupWire->LineEdit1;
}
else if (send == myGroupSurf->PushButton1) {
globalSelection(GEOM_FACE);
myEditCurrentArgument = myGroupSurf->LineEdit1;
myGroupSurf->PushButton2->setDown(false);
myGroupSurf->LineEdit2->setEnabled(false);
}
else if (send == myGroupSurf->PushButton2) {
globalSelection(GEOM_WIRE);
myEditCurrentArgument = myGroupSurf->LineEdit2;
myGroupSurf->PushButton1->setDown(false);
myGroupSurf->LineEdit1->setEnabled(false);
}
// enable line edit
myEditCurrentArgument->setEnabled(true);
myEditCurrentArgument->setFocus(); myEditCurrentArgument->setFocus();
SelectionIntoArgument(); send->setDown(true);
displayPreview(true);
} }
@ -198,12 +304,11 @@ void BuildGUI_FaceDlg::SetEditCurrentArgument()
void BuildGUI_FaceDlg::ActivateThisDialog() void BuildGUI_FaceDlg::ActivateThisDialog()
{ {
GEOMBase_Skeleton::ActivateThisDialog(); GEOMBase_Skeleton::ActivateThisDialog();
connect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr(),
SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
TColStd_MapOfInteger aMap; this, SLOT(SelectionIntoArgument()));
aMap.Add( GEOM_EDGE );
aMap.Add( GEOM_WIRE ); ConstructorsClicked(getConstructorId());
globalSelection( aMap );
} }
@ -232,7 +337,20 @@ GEOM::GEOM_IOperations_ptr BuildGUI_FaceDlg::createOperation()
//================================================================================= //=================================================================================
bool BuildGUI_FaceDlg::isValid( QString& ) bool BuildGUI_FaceDlg::isValid( QString& )
{ {
return !myWires.isEmpty(); bool ok = false;
switch (getConstructorId()) {
case 0:
ok = !myWires.isEmpty();
break;
case 1:
ok = myFace && myWire;
break;
default:
break;
}
return ok;
} }
//================================================================================= //=================================================================================
@ -241,14 +359,32 @@ bool BuildGUI_FaceDlg::isValid( QString& )
//================================================================================= //=================================================================================
bool BuildGUI_FaceDlg::execute( ObjectList& objects ) bool BuildGUI_FaceDlg::execute( ObjectList& objects )
{ {
bool res = false;
GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow( getOperation() ); GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow( getOperation() );
GEOM::GEOM_Object_var anObj;
switch (getConstructorId()) {
case 0:
{
GEOM::ListOfGO_var objlist = new GEOM::ListOfGO(); GEOM::ListOfGO_var objlist = new GEOM::ListOfGO();
objlist->length( myWires.count() );
for ( int i = 0; i < myWires.count(); i++ )
objlist[i] = myWires[i].copy();
GEOM::GEOM_Object_var anObj = anOper->MakeFaceWires( objlist.in(), GroupWire->CheckButton1->isChecked() ); objlist->length( myWires.count() );
for ( int i = 0; i < myWires.count(); i++ ) {
objlist[i] = myWires[i].copy();
}
anObj = anOper->MakeFaceWires( objlist.in(), GroupWire->CheckButton1->isChecked() );
res = true;
}
break;
case 1:
anObj = anOper->MakeFaceFromSurface(myFace.get(), myWire.get());
res = true;
break;
default:
break;
}
if (!anObj->_is_nil()) { if (!anObj->_is_nil()) {
objects.push_back(anObj._retn()); objects.push_back(anObj._retn());
@ -262,5 +398,5 @@ bool BuildGUI_FaceDlg::execute( ObjectList& objects )
} }
} }
return true; return res;
} }

View File

@ -31,6 +31,7 @@
#include "GEOM_GenericObjPtr.h" #include "GEOM_GenericObjPtr.h"
class DlgRef_1Sel1Check; class DlgRef_1Sel1Check;
class DlgRef_2Sel;
//================================================================================= //=================================================================================
// class : BuildGUI_FaceDlg // class : BuildGUI_FaceDlg
@ -56,10 +57,14 @@ private:
private: private:
QList<GEOM::GeomObjPtr> myWires; QList<GEOM::GeomObjPtr> myWires;
GEOM::GeomObjPtr myFace;
GEOM::GeomObjPtr myWire;
DlgRef_1Sel1Check* GroupWire; DlgRef_1Sel1Check* GroupWire;
DlgRef_2Sel *myGroupSurf;
private slots: private slots:
void ConstructorsClicked (int);
void ClickOnOk(); void ClickOnOk();
bool ClickOnApply(); bool ClickOnApply();
void ActivateThisDialog(); void ActivateThisDialog();

View File

@ -159,6 +159,10 @@
<source>ICON_DLG_BUILD_FACE</source> <source>ICON_DLG_BUILD_FACE</source>
<translation>build_face.png</translation> <translation>build_face.png</translation>
</message> </message>
<message>
<source>ICON_DLG_BUILD_FACE_SURFACE</source>
<translation>build_face_surface.png</translation>
</message>
<message> <message>
<source>ICON_DLG_FACE_HW</source> <source>ICON_DLG_FACE_HW</source>
<translation>face_hw.png</translation> <translation>face_hw.png</translation>

View File

@ -691,6 +691,10 @@ Please, select face, shell or solid and try again</translation>
<source>GEOM_FACE_FFW</source> <source>GEOM_FACE_FFW</source>
<translation>Face creation from wires and/or edges</translation> <translation>Face creation from wires and/or edges</translation>
</message> </message>
<message>
<source>GEOM_FACE_FROM_SURFACE</source>
<translation>Face creation from surface bounded by wire</translation>
</message>
<message> <message>
<source>GEOM_FACE_OPT</source> <source>GEOM_FACE_OPT</source>
<translation>Try to create a planar face</translation> <translation>Try to create a planar face</translation>

View File

@ -548,6 +548,77 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeFaceWires
return aShape; return aShape;
} }
//=============================================================================
/*!
* MakeFaceFromSurface
*/
//=============================================================================
Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeFaceFromSurface
(Handle(GEOM_Object) theFace,
Handle(GEOM_Object) theWire)
{
SetErrorCode(KO);
//Add a new object
Handle(GEOM_Object) aShape = GetEngine()->AddObject(GetDocID(), GEOM_FACE);
//Add a new function
Handle(GEOM_Function) aFunction =
aShape->AddFunction(GEOMImpl_ShapeDriver::GetID(), FACE_FROM_SURFACE);
if (aFunction.IsNull()) {
return NULL;
}
//Check if the function is set correctly
if (aFunction->GetDriverGUID() != GEOMImpl_ShapeDriver::GetID()) {
return NULL;
}
GEOMImpl_IShapes aCI (aFunction);
Handle(TColStd_HSequenceOfTransient) aShapesSeq =
new TColStd_HSequenceOfTransient;
Handle(GEOM_Function) aRefFace = theFace->GetLastFunction();
Handle(GEOM_Function) aRefWire = theWire->GetLastFunction();
if (aRefFace.IsNull()) {
SetErrorCode("NULL argument face for the face construction");
return NULL;
}
if (aRefWire.IsNull()) {
SetErrorCode("NULL argument wire for the face construction");
return NULL;
}
aShapesSeq->Append(aRefFace);
aShapesSeq->Append(aRefWire);
aCI.SetShapes(aShapesSeq);
//Compute the face
try {
OCC_CATCH_SIGNALS;
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Shape driver failed");
return NULL;
}
}
catch (Standard_Failure) {
Handle(Standard_Failure) aFail = Standard_Failure::Caught();
SetErrorCode(aFail->GetMessageString());
return NULL;
}
//Make a Python command
GEOM::TPythonDump (aFunction) << aShape
<< " = geompy.MakeFaceFromSurface(" << theFace << ", " << theWire << ")";
SetErrorCode(OK);
return aShape;
}
//============================================================================= //=============================================================================
/*! /*!
* MakeShell * MakeShell

View File

@ -85,6 +85,10 @@ class GEOMImpl_IShapesOperations : public GEOM_IOperations
Standard_EXPORT Handle(GEOM_Object) MakeFaceWires (std::list<Handle(GEOM_Object)> theWires, Standard_EXPORT Handle(GEOM_Object) MakeFaceWires (std::list<Handle(GEOM_Object)> theWires,
const bool isPlanarWanted); const bool isPlanarWanted);
Standard_EXPORT Handle(GEOM_Object) MakeFaceFromSurface
(Handle(GEOM_Object) theFace,
Handle(GEOM_Object) theWire);
Standard_EXPORT Handle(GEOM_Object) MakeShell (std::list<Handle(GEOM_Object)> theShapes); Standard_EXPORT Handle(GEOM_Object) MakeShell (std::list<Handle(GEOM_Object)> theShapes);
Standard_EXPORT Handle(GEOM_Object) MakeSolidShells (std::list<Handle(GEOM_Object)> theShells); Standard_EXPORT Handle(GEOM_Object) MakeSolidShells (std::list<Handle(GEOM_Object)> theShells);

View File

@ -42,6 +42,7 @@
#include <BRepAlgo_FaceRestrictor.hxx> #include <BRepAlgo_FaceRestrictor.hxx>
#include <BRepBuilderAPI_Copy.hxx> #include <BRepBuilderAPI_Copy.hxx>
#include <BRepBuilderAPI_Sewing.hxx> #include <BRepBuilderAPI_Sewing.hxx>
#include <BRepBuilderAPI_MakeFace.hxx>
#include <BRepBuilderAPI_MakeWire.hxx> #include <BRepBuilderAPI_MakeWire.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx> #include <BRepBuilderAPI_MakeEdge.hxx>
#include <BRepBuilderAPI_MakeSolid.hxx> #include <BRepBuilderAPI_MakeSolid.hxx>
@ -315,6 +316,44 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const
aShape = C; aShape = C;
} }
} }
else if (aType == FACE_FROM_SURFACE) {
#ifdef RESULT_TYPE_CHECK
anExpectedType = TopAbs_FACE;
#endif
Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes();
if (aShapes.IsNull() == Standard_False) {
Standard_Integer aNbShapes = aShapes->Length();
if (aNbShapes == 2) {
Handle(GEOM_Function) aRefFace =
Handle(GEOM_Function)::DownCast(aShapes->Value(1));
Handle(GEOM_Function) aRefWire =
Handle(GEOM_Function)::DownCast(aShapes->Value(2));
if (aRefFace.IsNull() == Standard_False &&
aRefWire.IsNull() == Standard_False) {
TopoDS_Shape aShFace = aRefFace->GetValue();
TopoDS_Shape aShWire = aRefWire->GetValue();
if (aShFace.IsNull() == Standard_False &&
aShFace.ShapeType() == TopAbs_FACE &&
aShWire.IsNull() == Standard_False &&
aShWire.ShapeType() == TopAbs_WIRE) {
TopoDS_Face aFace = TopoDS::Face(aShFace);
TopoDS_Wire aWire = TopoDS::Wire(aShWire);
Handle(Geom_Surface) aSurf = BRep_Tool::Surface(aFace);
BRepBuilderAPI_MakeFace aMkFace(aSurf, aWire);
if (aMkFace.IsDone()) {
aShape = aMkFace.Shape();
}
}
}
}
}
}
else if (aType == SHELL_FACES) { else if (aType == SHELL_FACES) {
#ifdef RESULT_TYPE_CHECK #ifdef RESULT_TYPE_CHECK
anExpectedType = TopAbs_SHELL; anExpectedType = TopAbs_SHELL;
@ -1268,6 +1307,25 @@ GetCreationInformation(std::string& theOperationName,
AddParam( theParams, "Wires/edges", aCI.GetShapes() ); AddParam( theParams, "Wires/edges", aCI.GetShapes() );
AddParam( theParams, "Is planar wanted", aCI.GetIsPlanar() ); AddParam( theParams, "Is planar wanted", aCI.GetIsPlanar() );
break; break;
case FACE_FROM_SURFACE:
{
theOperationName = "FACE";
Handle(TColStd_HSequenceOfTransient) shapes = aCI.GetShapes();
if (shapes.IsNull() == Standard_False) {
Standard_Integer aNbShapes = shapes->Length();
if (aNbShapes > 0) {
AddParam(theParams, "Face", shapes->Value(1));
if (aNbShapes > 1) {
AddParam(theParams, "Wire", shapes->Value(2));
}
}
}
break;
}
case SHELL_FACES: case SHELL_FACES:
theOperationName = "SHELL"; theOperationName = "SHELL";
AddParam( theParams, "Objects", aCI.GetShapes() ); AddParam( theParams, "Objects", aCI.GetShapes() );

1
src/GEOMImpl/GEOMImpl_Types.hxx Executable file → Normal file
View File

@ -299,6 +299,7 @@
#define EDGE_CURVE_LENGTH 12 #define EDGE_CURVE_LENGTH 12
#define SHAPES_ON_SHAPE 13 #define SHAPES_ON_SHAPE 13
#define SHAPE_ISOLINE 14 #define SHAPE_ISOLINE 14
#define FACE_FROM_SURFACE 15
#define ARCHIMEDE_TYPE 1 #define ARCHIMEDE_TYPE 1

View File

@ -246,6 +246,39 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeFaceWires
return GetObject(anObject); return GetObject(anObject);
} }
//=============================================================================
/*!
* MakeFaceFromSurface
*/
//=============================================================================
GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeFaceFromSurface
(GEOM::GEOM_Object_ptr theFace,
GEOM::GEOM_Object_ptr theWire)
{
GEOM::GEOM_Object_var aGEOMObject;
//Set a not done flag
GetOperations()->SetNotDone();
//Get the reference face and wire
Handle(GEOM_Object) aFace = GetObjectImpl(theFace);
Handle(GEOM_Object) aWire = GetObjectImpl(theWire);
if (aFace.IsNull() || aWire.IsNull()) {
return aGEOMObject._retn();
}
//Create the Face
Handle(GEOM_Object) anObject =
GetOperations()->MakeFaceFromSurface(aFace, aWire);
if (anObject.IsNull()) {
return aGEOMObject._retn();
}
return GetObject(anObject);
}
//============================================================================= //=============================================================================
/*! /*!
* MakeShell * MakeShell

View File

@ -64,6 +64,9 @@ class GEOM_I_EXPORT GEOM_IShapesOperations_i :
GEOM::GEOM_Object_ptr MakeFaceWires (const GEOM::ListOfGO& theWires, GEOM::GEOM_Object_ptr MakeFaceWires (const GEOM::ListOfGO& theWires,
CORBA::Boolean isPlanarWanted); CORBA::Boolean isPlanarWanted);
GEOM::GEOM_Object_ptr MakeFaceFromSurface(GEOM::GEOM_Object_ptr theFace,
GEOM::GEOM_Object_ptr theWire);
GEOM::GEOM_Object_ptr MakeShell (const GEOM::ListOfGO& theFacesAndShells); GEOM::GEOM_Object_ptr MakeShell (const GEOM::ListOfGO& theFacesAndShells);
GEOM::GEOM_Object_ptr MakeSolidShell (GEOM::GEOM_Object_ptr theShell); GEOM::GEOM_Object_ptr MakeSolidShell (GEOM::GEOM_Object_ptr theShell);

View File

@ -178,6 +178,7 @@ def TestAll (geompy, math):
Face2 = geompy.MakeFace(Sketcher, WantPlanarFace) Face2 = geompy.MakeFace(Sketcher, WantPlanarFace)
Face3 = geompy.MakeFaceHW (100., 200., 1) #(2 Doubles, 1 Int)->GEOM_Object Face3 = geompy.MakeFaceHW (100., 200., 1) #(2 Doubles, 1 Int)->GEOM_Object
Face4 = geompy.MakeFaceObjHW (vz, 200., 100.) #(1 GEOM_Object, 2 Doubles)->GEOM_Object Face4 = geompy.MakeFaceObjHW (vz, 200., 100.) #(1 GEOM_Object, 2 Doubles)->GEOM_Object
Face5 = geompy.MakeFaceFromSurface(Face, Sketcher) #(2 GEOM_Objects)->GEOM_Object
Disk = geompy.MakeDiskPntVecR (p0, vz, radius) #(2 GEOM_Object, 1 Double)->GEOM_Object Disk = geompy.MakeDiskPntVecR (p0, vz, radius) #(2 GEOM_Object, 1 Double)->GEOM_Object
Disk2 = geompy.MakeDiskThreePnt(p0, p200, pz) #(3 GEOM_Object)->GEOM_Object Disk2 = geompy.MakeDiskThreePnt(p0, p200, pz) #(3 GEOM_Object)->GEOM_Object
Disk3 = geompy.MakeDiskR(100., 1) #(1 Doubles, 1 Int)->GEOM_Object Disk3 = geompy.MakeDiskR(100., 1) #(1 Doubles, 1 Int)->GEOM_Object
@ -397,6 +398,7 @@ def TestAll (geompy, math):
id_Face2 = geompy.addToStudy(Face2, "Face from Sketcher") id_Face2 = geompy.addToStudy(Face2, "Face from Sketcher")
id_Face3 = geompy.addToStudy(Face3, "Face Height Width") id_Face3 = geompy.addToStudy(Face3, "Face Height Width")
id_Face4 = geompy.addToStudy(Face4, "Face Plane_HW") id_Face4 = geompy.addToStudy(Face4, "Face Plane_HW")
id_Face5 = geompy.addToStudy(Face5, "Face from surface and wire")
id_Disk = geompy.addToStudy(Disk, "Disk PntVecR") id_Disk = geompy.addToStudy(Disk, "Disk PntVecR")
id_Disk2 = geompy.addToStudy(Disk2, "Disk Three Points") id_Disk2 = geompy.addToStudy(Disk2, "Disk Three Points")
id_Disk3 = geompy.addToStudy(Disk3, "Disk OXY Radius") id_Disk3 = geompy.addToStudy(Disk3, "Disk OXY Radius")

View File

@ -4504,6 +4504,39 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen):
anObj = self.MakeFaceWires(theWires, isPlanarWanted, theName) anObj = self.MakeFaceWires(theWires, isPlanarWanted, theName)
return anObj return anObj
## Create a face based on a surface from given face bounded
# by given wire.
# @param theFace the face whose surface is used to create a new face.
# @param theWire the wire that will bound a new face.
# @param theName Object name; when specified, this parameter is used
# for result publication in the study. Otherwise, if automatic
# publication is switched on, default value is used for result name.
#
# @return New GEOM.GEOM_Object, containing the created face.
#
# @ref tui_creation_face "Example"
@ManageTransactions("ShapesOp")
def MakeFaceFromSurface(self, theFace, theWire, theName=None):
"""
Create a face based on a surface from given face bounded
by given wire.
Parameters:
theFace the face whose surface is used to create a new face.
theWire the wire that will bound a new face.
theName Object name; when specified, this parameter is used
for result publication in the study. Otherwise, if automatic
publication is switched on, default value is used for result name.
Returns:
New GEOM.GEOM_Object, containing the created face.
"""
# Example: see GEOM_TestAll.py
anObj = self.ShapesOp.MakeFaceFromSurface(theFace, theWire)
RaiseIfFailed("MakeFaceFromSurface", self.ShapesOp)
self._autoPublish(anObj, theName, "face")
return anObj
## Create a shell from the set of faces and shells. ## Create a shell from the set of faces and shells.
# @param theFacesAndShells List of faces and/or shells. # @param theFacesAndShells List of faces and/or shells.
# @param theName Object name; when specified, this parameter is used # @param theName Object name; when specified, this parameter is used