To implement issue 0019962: MakePipeBiNormalAlongAxis implementation.

This commit is contained in:
akl 2008-09-29 07:32:29 +00:00
parent dc0102b3ab
commit 0c6f0114a9
11 changed files with 299 additions and 28 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

View File

@ -4,7 +4,7 @@
To generate a \b Pipe in the <b>Main Menu</b> select <b>New Entity - > Generation - > Extrusion along a path</b>
\n To create an extruded \b Pipe shape, you need to define the <b>Base
\n Firstly, to create an extruded \b Pipe shape, you can define the <b>Base
Object</b> (vertex, edge, planar wire, face or shell), which will be extruded
and the <b>Path Object</b> (edge or wire) along which the <b>Base
Object</b> will be extruded.
@ -18,12 +18,30 @@ definition of the path.
\image html pipe.png
\n Secondly, you can define the <b>Base
Object</b> (edge, planar wire or face), which will be extruded,
the <b>Path Object</b> (edge or wire) along which the <b>Base
Object</b> will be extruded and the <b>Vector</b> (edge or wire)
to keep constant angular relations between the sections and this one.
\n The \b Result of the operation will be a GEOM_Object (edge, face, shell,
solid or compsolid).
\n <b>TUI Command:</b> <em>geompy.MakePipeBiNormalAlongVector(baseShape, pathShape, binormalShape)</em>
\n <b>Arguments:</b> Name + 1 shape (edge, planar wire or face)
serving as base object + 1 shape (edge or wire) for
definition of the path + 1 shape (edge or wire) to set a fixed
BiNormal direction to perform the extrusion.
\image html pipe2.png
<b>Example:</b>
\image html pipe_wire_edgesn.png
\image html pipesn.png
\image html pipebinormalsn.png
Our <b>TUI Scripts</b> provide you with useful examples of creation of
\ref tui_creation_pipe "Complex Geometric Objects".

View File

@ -543,4 +543,84 @@ gg.createAndDisplayGO(id_pipe)
gg.setDisplayMode(id_pipe,1)
\endcode
\anchor tui_creation_pipe_binormal_along_vector
<br><h2>Creation of a PipeBiNormalAlongVector</h2>
\code
def MakeHelix(radius, height, rotation, direction):
# - create a helix -
radius = 1.0 * radius
height = 1.0 * height
rotation = 1.0 * rotation
if direction > 0:
direction = +1
else:
direction = -1
pass
from math import sqrt
length_z = height
length_xy = radius*rotation
length = sqrt(length_z*length_z + length_xy*length_xy)
import geompy
nb_steps = 1
epsilon = 1.0e-6
while 1:
z_step = height / nb_steps
angle_step = rotation / nb_steps
z = 0.0
angle = 0.0
helix_points = []
for n in range(nb_steps+1):
from math import cos, sin
x = radius * cos(angle)
y = radius * sin(angle)
p = geompy.MakeVertex(x, y, z)
helix_points.append( p )
z += z_step
angle += direction * angle_step
pass
helix = geompy.MakeInterpol(helix_points)
length_test = geompy.BasicProperties(helix)[0]
prec = abs(length-length_test)/length
# print nb_steps, length_test, prec
if prec < epsilon:
break
nb_steps *= 2
pass
return helix
def MakeSpring(radius, height, rotation, direction, thread_radius, base_rotation=0.0):
# - create a pipe -
thread_radius = 1.0 * thread_radius
# create a helix
helix = MakeHelix(radius, height, rotation, direction)
# base in the (Ox, Oz) plane
import geompy
p0 = geompy.MakeVertex(radius-3*thread_radius, 0.0, -thread_radius)
p1 = geompy.MakeVertex(radius+3*thread_radius, 0.0, -thread_radius)
p2 = geompy.MakeVertex(radius+3*thread_radius, 0.0, +thread_radius)
p3 = geompy.MakeVertex(radius-3*thread_radius, 0.0, +thread_radius)
e0 = geompy.MakeEdge(p0, p1)
e1 = geompy.MakeEdge(p1, p2)
e2 = geompy.MakeEdge(p2, p3)
e3 = geompy.MakeEdge(p3, p0)
w = geompy.MakeWire([e0, e1, e2, e3])
# create a base face
base = geompy.MakeFace(w, True)
# create a binormal vector
binormal = geompy.MakeVectorDXDYDZ(0.0, 0.0, 10.0)
# create a pipe
spring = geompy.MakePipeBiNormalAlongVector(base, helix, binormal)
# Publish in the study
geompy.addToStudy(base, "base")
geompy.addToStudy(helix, "helix")
geompy.addToStudy(binormal, "binormal")
geompy.addToStudy(spring, "spring")
return spring
from math import pi
spring = MakeSpring(50, 100, 2*pi, 1, 5, pi/2)
\endcode
*/

View File

@ -1031,3 +1031,40 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeShellsWithoutPath
return GetObject(anObject);
}
//=============================================================================
/*!
* MakePipeBiNormalAlongVector
*/
//=============================================================================
GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeBiNormalAlongVector
(GEOM::GEOM_Object_ptr theBase,
GEOM::GEOM_Object_ptr thePath,
GEOM::GEOM_Object_ptr theVec)
{
GEOM::GEOM_Object_var aGEOMObject;
//Set a not done flag
GetOperations()->SetNotDone();
if (theBase == NULL || thePath == NULL || theVec == NULL) return aGEOMObject._retn();
//Get the reference objects
Handle(GEOM_Object) aBase = GetOperations()->GetEngine()->GetObject
(theBase->GetStudyID(), theBase->GetEntry());
Handle(GEOM_Object) aPath = GetOperations()->GetEngine()->GetObject
(thePath->GetStudyID(), thePath->GetEntry());
Handle(GEOM_Object) aVec = GetOperations()->GetEngine()->GetObject
(theVec->GetStudyID(), theVec->GetEntry());
if (aBase.IsNull() || aPath.IsNull() || aVec.IsNull()) return aGEOMObject._retn();
//Create the Pipe
Handle(GEOM_Object) anObject =
GetOperations()->MakePipeBiNormalAlongVector(aBase, aPath, aVec);
if (!GetOperations()->IsDone() || anObject.IsNull())
return aGEOMObject._retn();
return GetObject(anObject);
}

View File

@ -156,6 +156,10 @@ class GEOM_I_EXPORT GEOM_I3DPrimOperations_i :
GEOM::GEOM_Object_ptr MakePipeShellsWithoutPath(const GEOM::ListOfGO& theBases,
const GEOM::ListOfGO& theLocations);
GEOM::GEOM_Object_ptr MakePipeBiNormalAlongVector (GEOM::GEOM_Object_ptr theBase,
GEOM::GEOM_Object_ptr thePath,
GEOM::GEOM_Object_ptr theVec);
::GEOMImpl_I3DPrimOperations* GetOperations()
{ return (::GEOMImpl_I3DPrimOperations*)GetImpl(); }
};

View File

@ -1222,6 +1222,24 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePipeShellsWithoutPath
}
//=============================================================================
// MakePipe:
//=============================================================================
GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePipeBiNormalAlongVector
(GEOM::GEOM_Object_ptr theBase,
GEOM::GEOM_Object_ptr thePath,
GEOM::GEOM_Object_ptr theVec)
{
beginService( " GEOM_Superv_i::MakePipeBiNormalAlongVector" );
MESSAGE("GEOM_Superv_i::MakePipeBiNormalAlongVector");
get3DPrimOp();
GEOM::GEOM_Object_ptr anObj =
my3DPrimOp->MakePipeBiNormalAlongVector(theBase, thePath, theVec);
endService( " GEOM_Superv_i::MakePipeBiNormalAlongVector" );
return anObj;
}
//=============================================================================
// MakeFuse:
//=============================================================================

View File

@ -282,6 +282,10 @@ public:
GEOM::GEOM_Object_ptr MakePipeShellsWithoutPath(const GEOM::ListOfGO& theBases,
const GEOM::ListOfGO& theLocations);
GEOM::GEOM_Object_ptr MakePipeBiNormalAlongVector (GEOM::GEOM_Object_ptr theBase,
GEOM::GEOM_Object_ptr thePath,
GEOM::GEOM_Object_ptr theVec);
//-----------------------------------------------------------//
// BooleanOperations //
//-----------------------------------------------------------//

View File

@ -1139,6 +1139,23 @@ class geompyDC(GEOM._objref_GEOM_Gen):
RaiseIfFailed("MakePipeShellsWithoutPath", self.PrimOp)
return anObj
## Create a shape by extrusion of the base shape along
# the path shape with constant bi-normal direction along the given vector.
# The path shape can be a wire or an edge.
# @param theBase Base shape to be extruded.
# @param thePath Path shape to extrude the base shape along it.
# @param theVec Vector defines a constant binormal direction to keep the
# same angle beetween the direction and the sections
# along the sweep surface.
# @return New GEOM_Object, containing the created pipe.
#
# @ref tui_creation_pipe "Example"
def MakePipeBiNormalAlongVector(self,theBase, thePath, theVec):
# Example: see GEOM_TestAll.py
anObj = self.PrimOp.MakePipeBiNormalAlongVector(theBase, thePath, theVec)
RaiseIfFailed("MakePipeBiNormalAlongVector", self.PrimOp)
return anObj
# end of l3_complex
## @}

View File

@ -55,26 +55,26 @@ GenerationGUI_PipeDlg::GenerationGUI_PipeDlg (GeometryGUI* theGeometryGUI, QWidg
{
QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_PIPE")));
QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT")));
QPixmap image2 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_PIPE_BINORMAL")));
setWindowTitle(tr("GEOM_PIPE_TITLE"));
/***************************************************************/
mainFrame()->GroupConstructors->setTitle(tr("GEOM_PIPE"));
mainFrame()->RadioButton1->setIcon(image0);
mainFrame()->RadioButton2->setAttribute(Qt::WA_DeleteOnClose);
mainFrame()->RadioButton2->close();
mainFrame()->RadioButton2->setIcon(image2);
mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose);
mainFrame()->RadioButton3->close();
GroupPoints = new DlgRef_2Sel(centralWidget());
GroupPoints = new DlgRef_3Sel(centralWidget());
GroupPoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS"));
GroupPoints->TextLabel1->setText(tr("GEOM_BASE_OBJECT"));
GroupPoints->TextLabel2->setText(tr("GEOM_PATH_OBJECT"));
GroupPoints->TextLabel3->setText(tr("GEOM_VECTOR"));
GroupPoints->PushButton1->setIcon(image1);
GroupPoints->PushButton2->setIcon(image1);
GroupPoints->LineEdit1->setReadOnly(true);
GroupPoints->LineEdit2->setReadOnly(true);
GroupPoints->PushButton3->setIcon(image1);
QVBoxLayout* layout = new QVBoxLayout(centralWidget());
layout->setMargin(0); layout->setSpacing(6);
@ -105,28 +105,68 @@ void GenerationGUI_PipeDlg::Init()
// init variables
GroupPoints->LineEdit1->setReadOnly(true);
GroupPoints->LineEdit2->setReadOnly(true);
GroupPoints->LineEdit3->setReadOnly(true);
GroupPoints->LineEdit1->setText("");
GroupPoints->LineEdit2->setText("");
myBase = myPath = GEOM::GEOM_Object::_nil();
myOkBase = myOkPath = false;
GroupPoints->LineEdit3->setText("");
myBase = myPath = myVec = GEOM::GEOM_Object::_nil();
myOkBase = myOkPath = myOkVec = false;
// signals and slots connections
connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk()));
connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));
connect(this, SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int)));
connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
connect(GroupPoints->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
connect(GroupPoints->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed()));
connect(GroupPoints->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed()));
connect(GroupPoints->LineEdit3, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed()));
initName(tr("GEOM_PIPE"));
GroupPoints->TextLabel3->hide();
GroupPoints->PushButton3->hide();
GroupPoints->LineEdit3->hide();
ConstructorsClicked(0);
GroupPoints->PushButton1->click();
SelectionIntoArgument();
}
//=================================================================================
// function : ConstructorsClicked()
// purpose : Radio button management
//=================================================================================
void GenerationGUI_PipeDlg::ConstructorsClicked( int constructorId )
{
erasePreview();
switch (constructorId)
{
case 0:
{
GroupPoints->TextLabel3->hide();
GroupPoints->PushButton3->hide();
GroupPoints->LineEdit3->hide();
break;
}
case 1:
{
GroupPoints->TextLabel3->show();
GroupPoints->PushButton3->show();
GroupPoints->LineEdit3->show();
break;
}
}
displayPreview();
}
//=================================================================================
// function : ClickOnOk()
// purpose :
@ -147,6 +187,8 @@ bool GenerationGUI_PipeDlg::ClickOnApply()
return false;
initName();
if ( getConstructorId() != 1 )
ConstructorsClicked( getConstructorId() );
// activate selection and connect selection manager
GroupPoints->PushButton1->click();
return true;
@ -162,6 +204,7 @@ void GenerationGUI_PipeDlg::SelectionIntoArgument()
myEditCurrentArgument->setText("");
if (myEditCurrentArgument == GroupPoints->LineEdit1) myOkBase = false;
else if (myEditCurrentArgument == GroupPoints->LineEdit2) myOkPath = false;
else if (myEditCurrentArgument == GroupPoints->LineEdit3) myOkVec = false;
LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
SALOME_ListIO aSelList;
@ -187,14 +230,23 @@ void GenerationGUI_PipeDlg::SelectionIntoArgument()
S.ShapeType() == TopAbs_SOLID ||
S.ShapeType() == TopAbs_SHAPE)
return;
if ( getConstructorId() == 1 &&
(S.ShapeType() == TopAbs_SHELL ||
S.ShapeType() == TopAbs_VERTEX))
return;
myBase = aSelectedObject;
myEditCurrentArgument->setText(GEOMBase::GetName(aSelectedObject));
myOkBase = true;
if (!myOkPath)
GroupPoints->PushButton2->click();
else if (!myOkVec)
GroupPoints->PushButton3->click();
}
else if (myEditCurrentArgument == GroupPoints->LineEdit2) {
else if (myEditCurrentArgument == GroupPoints->LineEdit2 ||
myEditCurrentArgument == GroupPoints->LineEdit3) {
myEditCurrentArgument == GroupPoints->LineEdit2 ? myOkPath = false : myOkVec = false;
bool myOk = false;
QString aName = GEOMBase::GetName(aSelectedObject);
if (aSelectedObject != myBase) {
@ -210,27 +262,44 @@ void GenerationGUI_PipeDlg::SelectionIntoArgument()
if (aFindedObject == GEOM::GEOM_Object::_nil()) { // Object not found in study
GEOM::GEOM_IShapesOperations_var aShapesOp =
getGeomEngine()->GetIShapesOperations(getStudyId());
myPath = aShapesOp->GetSubShape(aSelectedObject, anIndex);
myOkPath = true;
aSelectedObject = aShapesOp->GetSubShape(aSelectedObject, anIndex);
myOk = true;
}
else { // get Object from study
myPath = aFindedObject;
myOkPath = true;
aSelectedObject = aFindedObject;
myOk = true;
}
}
else {
myOkPath = true;
myOk = true;
if (S.ShapeType() != TopAbs_EDGE) {
aSelectedObject = GEOM::GEOM_Object::_nil();
aName = "";
myOkPath = false;
myOk = false;
}
myPath = aSelectedObject;
}
if (myEditCurrentArgument == GroupPoints->LineEdit2) {
myPath = aSelectedObject;
myOkPath = myOk;
}
else if (myEditCurrentArgument == GroupPoints->LineEdit3) {
myVec = aSelectedObject;
myOkVec = myOk;
}
}
myEditCurrentArgument->setText(aName);
if (myOkPath && !myOkBase)
GroupPoints->PushButton1->click();
if (myOkPath) {
if (!myOkBase)
GroupPoints->PushButton1->click();
else if (!myOkVec)
GroupPoints->PushButton3->click();
}
else if (myOkVec) {
if (!myOkBase)
GroupPoints->PushButton1->click();
else if (!myOkPath)
GroupPoints->PushButton2->click();
}
}
// clear selection
@ -252,15 +321,22 @@ void GenerationGUI_PipeDlg::SetEditCurrentArgument()
disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
globalSelection(GEOM_ALLSHAPES);
GroupPoints->PushButton1->setDown(false);
GroupPoints->PushButton2->setDown(false);
GroupPoints->PushButton3->setDown(false);
GroupPoints->LineEdit1->setEnabled(false);
GroupPoints->LineEdit2->setEnabled(false);
GroupPoints->LineEdit3->setEnabled(false);
if (send == GroupPoints->PushButton1) {
myEditCurrentArgument = GroupPoints->LineEdit1;
GroupPoints->PushButton2->setDown(false);
GroupPoints->LineEdit2->setEnabled(false);
}
else if (send == GroupPoints->PushButton2) {
myEditCurrentArgument = GroupPoints->LineEdit2;
GroupPoints->PushButton1->setDown(false);
GroupPoints->LineEdit1->setEnabled(false);
localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE);
}
else if(send == GroupPoints->PushButton3) {
myEditCurrentArgument = GroupPoints->LineEdit3;
localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE);
}
@ -285,7 +361,8 @@ void GenerationGUI_PipeDlg::LineEditReturnPressed()
{
QLineEdit* send = (QLineEdit*)sender();
if (send == GroupPoints->LineEdit1 ||
send == GroupPoints->LineEdit2) {
send == GroupPoints->LineEdit2 ||
send == GroupPoints->LineEdit3) {
myEditCurrentArgument = send;
GEOMBase_Skeleton::LineEditReturnPressed();
}
@ -328,7 +405,12 @@ GEOM::GEOM_IOperations_ptr GenerationGUI_PipeDlg::createOperation()
//=================================================================================
bool GenerationGUI_PipeDlg::isValid (QString&)
{
return myOkBase && myOkPath;
switch ( getConstructorId() ) {
case 0 :
return myOkBase && myOkPath;
case 1 :
return myOkBase && myOkPath && myOkVec;
}
}
//=================================================================================
@ -339,7 +421,15 @@ bool GenerationGUI_PipeDlg::execute (ObjectList& objects)
{
GEOM::GEOM_Object_var anObj;
anObj = GEOM::GEOM_I3DPrimOperations::_narrow(getOperation())->MakePipe(myBase, myPath);
switch ( getConstructorId() ) {
case 0 :
anObj = GEOM::GEOM_I3DPrimOperations::_narrow(getOperation())->MakePipe(myBase, myPath);
break;
case 1 :
anObj = GEOM::GEOM_I3DPrimOperations::_narrow(getOperation())->
MakePipeBiNormalAlongVector(myBase, myPath, myVec);
break;
}
if (!anObj->_is_nil())
objects.push_back(anObj._retn());

View File

@ -28,7 +28,7 @@
#include <GEOMBase_Skeleton.h>
class DlgRef_2Sel;
class DlgRef_3Sel;
//=================================================================================
// class : GenerationGUI_PipeDlg
@ -56,10 +56,12 @@ private:
private:
GEOM::GEOM_Object_var myBase; /* Base shape */
GEOM::GEOM_Object_var myPath; /* Shape, defining the path */
GEOM::GEOM_Object_var myVec; /* Vector, defining the constant binormal direction */
bool myOkBase;
bool myOkPath; /* to check when arguments are defined */
bool myOkPath;
bool myOkVec; /* to check when arguments are defined */
DlgRef_2Sel* GroupPoints;
DlgRef_3Sel* GroupPoints;
private slots:
void ClickOnOk();
@ -68,6 +70,7 @@ private slots:
void LineEditReturnPressed();
void SelectionIntoArgument();
void SetEditCurrentArgument();
void ConstructorsClicked( int );
};
#endif // GENERATIONGUI_PIPEDLG_H