EDF 1337: Angles management in the 3D sketcher

First part.
Some pieces of code placed in the GUI will have to be moved to the engine side but it has to be coordinated with issue 21392 (EDF 1631 GEOM: Dump study of sketcher 3D with relatives coordinates )
This commit is contained in:
rnc 2012-07-11 15:13:08 +00:00
parent 4fd9399dcc
commit 98a67e1996
6 changed files with 497 additions and 22 deletions

View File

@ -21,20 +21,25 @@
// File : EntityGUI_3DSketcherDlg.cxx // File : EntityGUI_3DSketcherDlg.cxx
// Author : DMV, OCN // Author : DMV, OCN
// //
#include <cmath>
#include "EntityGUI_3DSketcherDlg.h" #include "EntityGUI_3DSketcherDlg.h"
#include "EntityGUI_Widgets.h" #include "EntityGUI_Widgets.h"
#include <SalomeApp_DoubleSpinBox.h> #include <SalomeApp_DoubleSpinBox.h>
#include <GEOMBase.h> #include <GEOMBase.h>
#include <GeometryGUI.h> #include <GeometryGUI.h>
#include <GEOMImpl_Types.hxx>
#include <Precision.hxx> #include <Precision.hxx>
#include <DlgRef.h> #include <DlgRef.h>
#include <SUIT_Desktop.h>
#include <SUIT_Session.h> #include <SUIT_Session.h>
#include <SUIT_Desktop.h>
#include <SUIT_MessageBox.h> #include <SUIT_MessageBox.h>
#include <SUIT_ResourceMgr.h> #include <SUIT_ResourceMgr.h>
#include <SUIT_ViewWindow.h>
#include <SUIT_ViewManager.h>
#include <SOCC_Prs.h>
#include <SOCC_ViewModel.h>
#include <SalomeApp_Application.h> #include <SalomeApp_Application.h>
#include <LightApp_Application.h> #include <LightApp_Application.h>
#include <LightApp_SelectionMgr.h> #include <LightApp_SelectionMgr.h>
@ -43,7 +48,7 @@
//#include <TopExp.hxx> //#include <TopExp.hxx>
//#include <TopExp_Explorer.hxx> //#include <TopExp_Explorer.hxx>
//#include <TopoDS_Vertex.hxx> //#include <TopoDS_Vertex.hxx>
//#include <TopoDS.hxx> #include <TopoDS.hxx>
#include <TColStd_IndexedMapOfInteger.hxx> #include <TColStd_IndexedMapOfInteger.hxx>
//#include <BRepBuilderAPI_Transform.hxx> //#include <BRepBuilderAPI_Transform.hxx>
//#include <BRepBuilderAPI_MakeWire.hxx> //#include <BRepBuilderAPI_MakeWire.hxx>
@ -51,6 +56,18 @@
#include <BRepBuilderAPI_MakePolygon.hxx> #include <BRepBuilderAPI_MakePolygon.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx> #include <BRepBuilderAPI_MakeEdge.hxx>
#include <AIS_Trihedron.hxx>
#include <AIS_AngleDimension.hxx>
#include <Geom_Axis2Placement.hxx>
#include <Geom_Plane.hxx>
#include <SelectMgr_Selection.hxx>
#include <gce_MakePln.hxx>
// This include must be *AFTER* SOCC_ViewModel.h because
// of the constant ROTATE which is a #define in
// GEOMImpl_Types.hxx and an enum in SOCC_ViewModel.h
#include <GEOMImpl_Types.hxx>
class Locker class Locker
{ {
public: public:
@ -94,10 +111,12 @@ EntityGUI_3DSketcherDlg::EntityGUI_3DSketcherDlg( GeometryGUI* theGeometryGUI, Q
GroupType->GroupBox1->setTitle(tr("GEOM_COORDINATES_TYPE")); GroupType->GroupBox1->setTitle(tr("GEOM_COORDINATES_TYPE"));
GroupType->RadioButton1->setText(tr("GEOM_SKETCHER_ABS")); GroupType->RadioButton1->setText(tr("GEOM_SKETCHER_ABS"));
GroupType->RadioButton2->setText(tr("GEOM_SKETCHER_REL")); GroupType->RadioButton2->setText(tr("GEOM_SKETCHER_REL"));
GroupType->RadioButton3->close(); GroupType->RadioButton3->setText(tr("Angles")); //TODO translation
// GroupType->RadioButton3->close();
myTypeGroup = new QButtonGroup( this ); myTypeGroup = new QButtonGroup( this );
myTypeGroup->addButton( GroupType->RadioButton1, 0 ); myTypeGroup->addButton( GroupType->RadioButton1, 0 );
myTypeGroup->addButton( GroupType->RadioButton2, 1 ); myTypeGroup->addButton( GroupType->RadioButton2, 1 );
myTypeGroup->addButton( GroupType->RadioButton3, 2 );
Group3Spin = new EntityGUI_3Spin( centralWidget() ); Group3Spin = new EntityGUI_3Spin( centralWidget() );
Group3Spin->GroupBox1->setTitle( tr( "GEOM_SKETCHER_VALUES" ) ); Group3Spin->GroupBox1->setTitle( tr( "GEOM_SKETCHER_VALUES" ) );
@ -108,13 +127,19 @@ EntityGUI_3DSketcherDlg::EntityGUI_3DSketcherDlg( GeometryGUI* theGeometryGUI, Q
Group3Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_Y2" ) ); Group3Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_Y2" ) );
Group3Spin->TextLabel3->setText( tr( "GEOM_SKETCHER_Z2" ) ); Group3Spin->TextLabel3->setText( tr( "GEOM_SKETCHER_Z2" ) );
GroupAngles = new EntityGUI_Angles( centralWidget() );
buttonOk()->setText( tr( "GEOM_BUT_END_SKETCH" ) ); buttonOk()->setText( tr( "GEOM_BUT_END_SKETCH" ) );
buttonApply()->setText( tr( "GEOM_BUT_CLOSE_SKETCH" ) ); buttonApply()->setText( tr( "GEOM_BUT_CLOSE_SKETCH" ) );
QVBoxLayout* layout = new QVBoxLayout( centralWidget() ); QVBoxLayout* layout = new QVBoxLayout( centralWidget() );
GroupAngles->buttonApply->setText( tr( "GEOM_SKETCHER_APPLY" ) );
GroupAngles->buttonUndo->setIcon( image1 );
GroupAngles->buttonRedo->setIcon( image2 );
layout->setMargin( 0 ); layout->setSpacing( 6 ); layout->setMargin( 0 ); layout->setSpacing( 6 );
layout->addWidget( GroupType ); layout->addWidget( GroupType );
layout->addWidget( Group3Spin ); layout->addWidget( Group3Spin );
layout->addWidget( GroupAngles );
setHelpFileName( "create_3dsketcher_page.html" ); setHelpFileName( "create_3dsketcher_page.html" );
@ -140,6 +165,7 @@ EntityGUI_3DSketcherDlg::~EntityGUI_3DSketcherDlg()
void EntityGUI_3DSketcherDlg::Init() void EntityGUI_3DSketcherDlg::Init()
{ {
myOK = false; myOK = false;
myOrientation = 1;
localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX );
@ -151,10 +177,24 @@ void EntityGUI_3DSketcherDlg::Init()
initSpinBox( Group3Spin->SpinBox_DY, COORD_MIN, COORD_MAX, step, "length_precision" ); initSpinBox( Group3Spin->SpinBox_DY, COORD_MIN, COORD_MAX, step, "length_precision" );
initSpinBox( Group3Spin->SpinBox_DZ, COORD_MIN, COORD_MAX, step, "length_precision" ); initSpinBox( Group3Spin->SpinBox_DZ, COORD_MIN, COORD_MAX, step, "length_precision" );
initSpinBox( GroupAngles->SpinBox_DA , -180.0, 180.0, step, "angular_precision" );
initSpinBox( GroupAngles->SpinBox_DA2, 0.0, 90.0, step, "angular_precision" );
initSpinBox( GroupAngles->SpinBox_DL, COORD_MIN, COORD_MAX, step, "length_precision" );
Group3Spin->SpinBox_DX->setValue(0.0); Group3Spin->SpinBox_DX->setValue(0.0);
Group3Spin->SpinBox_DY->setValue(0.0); Group3Spin->SpinBox_DY->setValue(0.0);
Group3Spin->SpinBox_DZ->setValue(0.0); Group3Spin->SpinBox_DZ->setValue(0.0);
GroupAngles->SpinBox_DA->setValue(0.0);
GroupAngles->SpinBox_DA2->setValue(0.0);
GroupAngles->SpinBox_DL->setValue(0.0);
GroupAngles->radioButton_1->setChecked(true);
GroupAngles->checkBox->setChecked(false);
GroupAngles->SpinBox_DA2->setEnabled(false);
GroupAngles->hide();
/* signals and slots connections */ /* signals and slots connections */
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() ) );
@ -165,12 +205,25 @@ void EntityGUI_3DSketcherDlg::Init()
connect( Group3Spin->buttonUndo, SIGNAL( clicked() ), this, SLOT( ClickOnUndo() ) ); connect( Group3Spin->buttonUndo, SIGNAL( clicked() ), this, SLOT( ClickOnUndo() ) );
connect( Group3Spin->buttonRedo, SIGNAL( clicked() ), this, SLOT( ClickOnRedo() ) ) ; connect( Group3Spin->buttonRedo, SIGNAL( clicked() ), this, SLOT( ClickOnRedo() ) ) ;
connect( GroupAngles->buttonApply, SIGNAL( clicked() ), this, SLOT( ClickOnAddPoint() ) );
connect( GroupAngles->buttonUndo, SIGNAL( clicked() ), this, SLOT( ClickOnUndo() ) );
connect( GroupAngles->buttonRedo, SIGNAL( clicked() ), this, SLOT( ClickOnRedo() ) ) ;
connect( myTypeGroup, SIGNAL( buttonClicked( int ) ), this, SLOT( TypeClicked( int ) ) ); connect( myTypeGroup, SIGNAL( buttonClicked( int ) ), this, SLOT( TypeClicked( int ) ) );
connect( Group3Spin->SpinBox_DX, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) ); connect( Group3Spin->SpinBox_DX, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) );
connect( Group3Spin->SpinBox_DY, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) ); connect( Group3Spin->SpinBox_DY, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) );
connect( Group3Spin->SpinBox_DZ, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) ); connect( Group3Spin->SpinBox_DZ, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) );
connect( GroupAngles->SpinBox_DA, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) );
connect( GroupAngles->SpinBox_DA2, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) );
connect( GroupAngles->SpinBox_DL, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) );
connect( GroupAngles->radioButton_1, SIGNAL( clicked ( bool ) ), this, SLOT( ButtonClicked(bool) ) ) ;
connect( GroupAngles->radioButton_2, SIGNAL( clicked ( bool ) ), this, SLOT( ButtonClicked(bool) ) ) ;
connect( GroupAngles->radioButton_3, SIGNAL( clicked ( bool ) ), this, SLOT( ButtonClicked(bool) ) ) ;
connect( GroupAngles->checkBox, SIGNAL( clicked ( bool ) ), this, SLOT( AngleChecked (bool) ) ) ;
connect( myGeomGUI, SIGNAL( SignalDefaultStepValueChanged( double ) ), this, SLOT( SetDoubleSpinBoxStep( double ) ) ); connect( myGeomGUI, SIGNAL( SignalDefaultStepValueChanged( double ) ), this, SLOT( SetDoubleSpinBoxStep( double ) ) );
connect( myGeomGUI, SIGNAL( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) ); connect( myGeomGUI, SIGNAL( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) );
@ -190,6 +243,9 @@ void EntityGUI_3DSketcherDlg::TypeClicked( int mode )
{ {
if ( mode == myMode ) return; if ( mode == myMode ) return;
Group3Spin->show();
GroupAngles->hide();
bool blocked = Group3Spin->SpinBox_DX->signalsBlocked(); bool blocked = Group3Spin->SpinBox_DX->signalsBlocked();
Group3Spin->SpinBox_DX->blockSignals(true); Group3Spin->SpinBox_DX->blockSignals(true);
Group3Spin->SpinBox_DY->blockSignals(true); Group3Spin->SpinBox_DY->blockSignals(true);
@ -209,7 +265,7 @@ void EntityGUI_3DSketcherDlg::TypeClicked( int mode )
if ( okz ) Group3Spin->SpinBox_DZ->setValue( xyz.z + Group3Spin->SpinBox_DZ->value() ); if ( okz ) Group3Spin->SpinBox_DZ->setValue( xyz.z + Group3Spin->SpinBox_DZ->value() );
Group3Spin->buttonApply->setFocus(); Group3Spin->buttonApply->setFocus();
} }
else { // DXDY else if ( mode == 1) { // DXDY
Group3Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_DX2" ) ); Group3Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_DX2" ) );
Group3Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_DY2" ) ); Group3Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_DY2" ) );
Group3Spin->TextLabel3->setText( tr( "GEOM_SKETCHER_DZ2" ) ); Group3Spin->TextLabel3->setText( tr( "GEOM_SKETCHER_DZ2" ) );
@ -218,11 +274,18 @@ void EntityGUI_3DSketcherDlg::TypeClicked( int mode )
if ( okz ) Group3Spin->SpinBox_DZ->setValue( Group3Spin->SpinBox_DZ->value() - xyz.z ); if ( okz ) Group3Spin->SpinBox_DZ->setValue( Group3Spin->SpinBox_DZ->value() - xyz.z );
Group3Spin->buttonApply->setFocus(); Group3Spin->buttonApply->setFocus();
} }
else {
Group3Spin->hide();
GroupAngles->show();
}
Group3Spin->SpinBox_DX->blockSignals(blocked); Group3Spin->SpinBox_DX->blockSignals(blocked);
Group3Spin->SpinBox_DY->blockSignals(blocked); Group3Spin->SpinBox_DY->blockSignals(blocked);
Group3Spin->SpinBox_DZ->blockSignals(blocked); Group3Spin->SpinBox_DZ->blockSignals(blocked);
myMode = mode; myMode = mode;
resize(minimumSizeHint());
} }
//================================================================================= //=================================================================================
@ -257,8 +320,11 @@ void EntityGUI_3DSketcherDlg::UpdateButtonsState()
{ {
if ( myPointsList.count() == 0 ) GroupType->RadioButton1->click(); if ( myPointsList.count() == 0 ) GroupType->RadioButton1->click();
GroupType->RadioButton2->setEnabled( myPointsList.count() > 0 ); GroupType->RadioButton2->setEnabled( myPointsList.count() > 0 );
GroupType->RadioButton3->setEnabled( myPointsList.count() > 0 );
Group3Spin->buttonUndo->setEnabled( myPointsList.count() > 0 ); Group3Spin->buttonUndo->setEnabled( myPointsList.count() > 0 );
Group3Spin->buttonRedo->setEnabled( myRedoList.count() > 0 ); Group3Spin->buttonRedo->setEnabled( myRedoList.count() > 0 );
GroupAngles->buttonUndo->setEnabled( myPointsList.count() > 0 );
GroupAngles->buttonRedo->setEnabled( myRedoList.count() > 0 );
} }
//================================================================================= //=================================================================================
@ -385,6 +451,60 @@ void EntityGUI_3DSketcherDlg::ActivateThisDialog()
void EntityGUI_3DSketcherDlg::ValueChangedInSpinBox( double newValue ) void EntityGUI_3DSketcherDlg::ValueChangedInSpinBox( double newValue )
{ {
GEOMBase_Helper::displayPreview( true, false, true, true, myLineWidth ); GEOMBase_Helper::displayPreview( true, false, true, true, myLineWidth );
if(GroupType->RadioButton3->isChecked() && GroupAngles->SpinBox_DL->value()>Precision::Confusion())
{
double anAngle2 = 0.0;
if (GroupAngles->checkBox->isChecked())
anAngle2 = GroupAngles->SpinBox_DA2->value();
displayAngle(GroupAngles->SpinBox_DA->value(), anAngle2, GroupAngles->SpinBox_DL->value(), myOrientation);
}
}
//=================================================================================
// function : AngleChecked()
// purpose :
//=================================================================================
void EntityGUI_3DSketcherDlg::AngleChecked( bool checked )
{
GroupAngles->SpinBox_DA2->setEnabled(checked);
GEOMBase_Helper::displayPreview( true, false, true, true, myLineWidth );
if(GroupAngles->SpinBox_DL->value()>Precision::Confusion())
{
double anAngle2 = 0.0;
if (checked)
anAngle2 = GroupAngles->SpinBox_DA2->value();
displayAngle(GroupAngles->SpinBox_DA->value(), anAngle2, GroupAngles->SpinBox_DL->value(), myOrientation);
}
}
//=================================================================================
// function : ButtonClicked()
// purpose :
//=================================================================================
void EntityGUI_3DSketcherDlg::ButtonClicked( bool checked )
{
GEOMBase_Helper::displayPreview( true, false, true, true, myLineWidth );
if (GroupAngles->radioButton_1->isChecked())
myOrientation = 1;
else if (GroupAngles->radioButton_2->isChecked())
myOrientation = 2;
else
myOrientation = 3;
if(GroupAngles->SpinBox_DL->value()>Precision::Confusion())
{
double anAngle2 = 0.0;
if (GroupAngles->checkBox->isChecked())
anAngle2 = GroupAngles->SpinBox_DA2->value();
displayAngle(GroupAngles->SpinBox_DA->value(), anAngle2, GroupAngles->SpinBox_DL->value(), myOrientation);
}
} }
//================================================================================= //=================================================================================
@ -530,6 +650,40 @@ EntityGUI_3DSketcherDlg::XYZ EntityGUI_3DSketcherDlg::getLastPoint() const
EntityGUI_3DSketcherDlg::XYZ EntityGUI_3DSketcherDlg::getCurrentPoint() const EntityGUI_3DSketcherDlg::XYZ EntityGUI_3DSketcherDlg::getCurrentPoint() const
{ {
XYZ xyz; XYZ xyz;
// Temporary way of doing this. To be changed with ordered improvement of the sketcher
if ( myMode == 2 )
{
double anAngle = GroupAngles->SpinBox_DA->value() * M_PI/180.0;
double anAngle2 = 0.0;
double aLength = GroupAngles->SpinBox_DL->value();
if (GroupAngles->checkBox->isChecked())
anAngle2 = GroupAngles->SpinBox_DA2->value() * M_PI/180.0;
double aProjectedLength = aLength * cos(anAngle2);
xyz = getLastPoint();
if (GroupAngles->radioButton_1->isChecked())
{
xyz.x += aProjectedLength * cos(anAngle);
xyz.y += aProjectedLength * sin(anAngle);
xyz.z += aLength * sin(anAngle2);
}
else if (GroupAngles->radioButton_2->isChecked())
{
xyz.y += aProjectedLength * cos(anAngle);
xyz.z += aProjectedLength * sin(anAngle);
xyz.x += aLength * sin(anAngle2);
}
else
{
xyz.z += aProjectedLength * sin(anAngle);
xyz.x += aProjectedLength * cos(anAngle);
xyz.y += aLength * sin(anAngle2);
}
}
else
{
if ( myMode == 0 ) { if ( myMode == 0 ) {
xyz.x = Group3Spin->SpinBox_DX->value(); xyz.x = Group3Spin->SpinBox_DX->value();
xyz.y = Group3Spin->SpinBox_DY->value(); xyz.y = Group3Spin->SpinBox_DY->value();
@ -544,6 +698,7 @@ EntityGUI_3DSketcherDlg::XYZ EntityGUI_3DSketcherDlg::getCurrentPoint() const
xyz.xt = Group3Spin->SpinBox_DX->text(); xyz.xt = Group3Spin->SpinBox_DX->text();
xyz.yt = Group3Spin->SpinBox_DY->text(); xyz.yt = Group3Spin->SpinBox_DY->text();
xyz.zt = Group3Spin->SpinBox_DZ->text(); xyz.zt = Group3Spin->SpinBox_DZ->text();
}
return xyz; return xyz;
} }
@ -585,15 +740,134 @@ void EntityGUI_3DSketcherDlg::displayPreview( GEOM::GEOM_Object_ptr object,
getDisplayer()->SetColor( Quantity_NOC_VIOLET ); getDisplayer()->SetColor( Quantity_NOC_VIOLET );
aPrs = getDisplayer()->BuildPrs( aLastSegment ); aPrs = getDisplayer()->BuildPrs( aLastSegment );
if ( aPrs != 0 && !aPrs->IsNull() ) if ( aPrs != 0 && !aPrs->IsNull() )
GEOMBase_Helper::displayPreview( aPrs, append, update ); GEOMBase_Helper::displayPreview( aPrs, append, update );
if(GroupType->RadioButton3->isChecked())
displayTrihedron(3);
else
displayTrihedron(2);
getDisplayer()->UnsetName(); getDisplayer()->UnsetName();
// Enable activation of displayed objects // Enable activation of displayed objects
getDisplayer()->SetToActivate( true ); getDisplayer()->SetToActivate( true );
} }
//================================================================
// Function : displayTrihedron()
// Purpose : Method for displaying trihedron
//================================================================
void EntityGUI_3DSketcherDlg::displayTrihedron(int selMode)
{
// Add trihedron to preview
SUIT_ViewWindow* vw = SUIT_Session::session()->activeApplication()->desktop()->activeWindow();
gp_Pnt P(getLastPoint().x,getLastPoint().y,getLastPoint().z);
Handle(Geom_Axis2Placement) anAxis = new Geom_Axis2Placement(P,gp::DZ(),gp::DX());
Handle(AIS_Trihedron) anIO = new AIS_Trihedron(anAxis);
anIO->SetSelectionMode(selMode);
SOCC_Prs* aSPrs = dynamic_cast<SOCC_Prs*>(((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->CreatePrs(0));
if (aSPrs)
{
aSPrs->AddObject(anIO);
GEOMBase_Helper::displayPreview( aSPrs, true, true );
}
}
//================================================================
// Function : displayAngle()
// Purpose : Method for displaying angle dimensions
//================================================================
void EntityGUI_3DSketcherDlg::displayAngle(double theAngle1, double theAngle2, double theLength, int theOrientation)
{
if(Abs(theAngle2 - 90.0) < Precision::Confusion())
return;
// Add trihedron to preview
SUIT_ViewWindow* vw = SUIT_Session::session()->activeApplication()->desktop()->activeWindow();
XYZ Last = getLastPoint();
XYZ Current = getCurrentPoint();
gp_Pnt Last_Pnt(Last.x,Last.y,Last.z);
gp_Pnt Current_Pnt(Current.x,Current.y,Current.z);
gp_Pnt P1, P2; //, P3;
bool twoAngles = GroupAngles->checkBox->isChecked();
switch(theOrientation)
{
case 1: //OXY
{
P1 = gp_Pnt(Last.x + theLength,Last.y,Last.z); // X direction
P2 = gp_Pnt(Last.x + theLength * cos(theAngle1 * M_PI / 180.),
Last.y + theLength * sin(theAngle1 * M_PI / 180.),
Last.z);
// P3 = gp_Pnt(Last.x,Last.y,theLength); // Z direction (normal to the plane)
break;
}
case 2: //OYZ
{
P1 = gp_Pnt(Last.x, Last.y + theLength,Last.z); // Y direction
P2 = gp_Pnt(Last.x,
Last.y + theLength * cos(theAngle1 * M_PI / 180.),
Last.z + theLength * sin(theAngle1 * M_PI / 180.));
// P2 = gp_Pnt(Last.x,Current.y,Current.z); // Projection in OYZ plane
// P3 = gp_Pnt(theLength,Last.y,Last.z); // X direction
break;
}
case 3: //OXZ
{
P1 = gp_Pnt( Last.x + theLength,Last.y,Last.z); // X direction
P2 = gp_Pnt( Last.x + theLength * cos(theAngle1 * M_PI / 180.) ,
Last.y,
Last.z + theLength * sin(theAngle1 * M_PI / 180.));
// P2 = gp_Pnt(Current.x,Last.y,Current.z); // Projection in OXZ plane
// P3 = gp_Pnt(Last.x,theLength,Last.z); // Y direction
break;
}
}
MESSAGE("REPERE1 : Last x ="<<Last.x<<"y ="<<Last.y<<"z ="<<Last.z)
MESSAGE("Current x ="<<Current.x<<"y ="<<Current.y<<"z ="<<Current.z)
TopoDS_Vertex V1 = BRepBuilderAPI_MakeVertex(P1);
TopoDS_Vertex V2 = BRepBuilderAPI_MakeVertex(P2);
TopoDS_Vertex LastV = BRepBuilderAPI_MakeVertex(Last_Pnt);
TopoDS_Vertex CurV = BRepBuilderAPI_MakeVertex(Current_Pnt);
TopoDS_Edge anEdge1 = BRepBuilderAPI_MakeEdge(LastV, V1);
TopoDS_Edge anEdge2 = BRepBuilderAPI_MakeEdge(LastV, V2);
TopoDS_Edge anEdge3 = BRepBuilderAPI_MakeEdge(LastV, CurV);
gce_MakePln gce_MP(Last_Pnt, P1, P2);
Handle(Geom_Plane) aPlane = new Geom_Plane(gce_MP.Value());
Standard_CString aStr = "45°";
Handle(AIS_AngleDimension) anAngleIO = new AIS_AngleDimension(anEdge1, anEdge2, aPlane, theAngle1 * M_PI / 180.,
TCollection_ExtendedString(aStr));
SOCC_Prs* aSPrs = dynamic_cast<SOCC_Prs*>(((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->CreatePrs(0));
if (aSPrs)
{
aSPrs->AddObject(anAngleIO);
if (twoAngles)
{
gce_MakePln gce_MP2(Last_Pnt, P2, Current_Pnt);
Handle(Geom_Plane) aPlane2 = new Geom_Plane(gce_MP2.Value());
Handle(AIS_AngleDimension) anAngle2IO = new AIS_AngleDimension(anEdge2, anEdge3, aPlane2, theAngle2 * M_PI / 180.,
TCollection_ExtendedString(aStr));
aSPrs->AddObject(anAngle2IO);
}
GEOMBase_Helper::displayPreview( aSPrs, true, true );
}
}
//================================================================ //================================================================
// Function : createShapes // Function : createShapes
// Purpose : Create applyed wire, and last segment from entry object // Purpose : Create applyed wire, and last segment from entry object

View File

@ -29,6 +29,7 @@
class QButtonGroup; class QButtonGroup;
class QDoubleSpinBox; class QDoubleSpinBox;
class EntityGUI_3Spin; class EntityGUI_3Spin;
class EntityGUI_Angles;
class DlgRef_3Radio; class DlgRef_3Radio;
#ifndef COORD_MIN #ifndef COORD_MIN
@ -77,6 +78,10 @@ private:
const int = -1, const int = -1,
const int = -1); const int = -1);
void displayTrihedron( int );
void displayAngle( double, double, double, int );
bool createShapes( GEOM::GEOM_Object_ptr, bool createShapes( GEOM::GEOM_Object_ptr,
TopoDS_Shape&, TopoDS_Shape&,
TopoDS_Shape& ); TopoDS_Shape& );
@ -89,10 +94,12 @@ private:
XYZList myRedoList; XYZList myRedoList;
EntityGUI_3Spin* Group3Spin; EntityGUI_3Spin* Group3Spin;
EntityGUI_Angles* GroupAngles;
DlgRef_3Radio* GroupType; DlgRef_3Radio* GroupType;
QButtonGroup* myTypeGroup; QButtonGroup* myTypeGroup;
int myMode; int myMode;
int myOrientation;
bool myOK; bool myOK;
double myLineWidth; double myLineWidth;
GeometryGUI* myGeometryGUI; GeometryGUI* myGeometryGUI;
@ -112,6 +119,8 @@ private slots:
void ActivateThisDialog(); void ActivateThisDialog();
void TypeClicked( int ); void TypeClicked( int );
void ValueChangedInSpinBox( double ); void ValueChangedInSpinBox( double );
void ButtonClicked( bool );
void AngleChecked ( bool );
void SetDoubleSpinBoxStep( double ); void SetDoubleSpinBoxStep( double );
}; };

View File

@ -0,0 +1,161 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>EntityGUI_Angles_QTD</class>
<widget class="QWidget" name="EntityGUI_Angles_QTD">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>351</width>
<height>148</height>
</rect>
</property>
<property name="windowTitle">
<string>EntityGUI_Angles_QTD</string>
</property>
<layout class="QGridLayout">
<property name="margin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QGroupBox" name="GroupBox1">
<property name="title">
<string>Values</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="TextLabel4">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Length</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="SalomeApp_DoubleSpinBox" name="SpinBox_DL"/>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="buttonApply">
<property name="text">
<string>Create</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="TextLabel1">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Angle</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="SalomeApp_DoubleSpinBox" name="SpinBox_DA"/>
</item>
<item row="1" column="2">
<layout class="QGridLayout" name="gridLayout_2">
<property name="margin">
<number>0</number>
</property>
<property name="spacing">
<number>6</number>
</property>
<item row="0" column="1">
<widget class="QPushButton" name="buttonRedo">
<property name="text">
<string>Redo</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QPushButton" name="buttonUndo">
<property name="text">
<string>Undo</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QRadioButton" name="radioButton_1">
<property name="text">
<string>OXY</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButton_2">
<property name="text">
<string>OYZ</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButton_3">
<property name="text">
<string>OXZ</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="checkBox">
<property name="text">
<string>CheckBox</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="SalomeApp_DoubleSpinBox" name="SpinBox_DA2"/>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
<pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
<customwidgets>
<customwidget>
<class>SalomeApp_DoubleSpinBox</class>
<extends>QDoubleSpinBox</extends>
<header location="global">SalomeApp_DoubleSpinBox.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>SpinBox_DL</tabstop>
<tabstop>SpinBox_DA</tabstop>
<tabstop>radioButton_1</tabstop>
<tabstop>radioButton_2</tabstop>
<tabstop>radioButton_3</tabstop>
<tabstop>checkBox</tabstop>
<tabstop>SpinBox_DA2</tabstop>
<tabstop>buttonApply</tabstop>
<tabstop>buttonUndo</tabstop>
<tabstop>buttonRedo</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>

View File

@ -210,6 +210,20 @@ EntityGUI_Point::~EntityGUI_Point()
{ {
} }
//////////////////////////////////////////
// EntityGUI_Angles
//////////////////////////////////////////
EntityGUI_Angles::EntityGUI_Angles( QWidget* parent, Qt::WindowFlags f )
: QWidget( parent, f )
{
setupUi( this );
}
EntityGUI_Angles::~EntityGUI_Angles()
{
}
////////////////////////////////////////// //////////////////////////////////////////
// EntityGUI_Skeleton // EntityGUI_Skeleton
////////////////////////////////////////// //////////////////////////////////////////

View File

@ -222,6 +222,22 @@ public:
QButtonGroup* ButtonGroup; QButtonGroup* ButtonGroup;
}; };
//////////////////////////////////////////
// EntityGUI_Angles
//////////////////////////////////////////
#include "ui_EntityGUI_Angles_QTD.h"
class EntityGUI_Angles : public QWidget,
public Ui::EntityGUI_Angles_QTD
{
Q_OBJECT
public:
EntityGUI_Angles( QWidget* = 0, Qt::WindowFlags = 0 );
~EntityGUI_Angles();
};
////////////////////////////////////////// //////////////////////////////////////////
// EntityGUI_Skeleton // EntityGUI_Skeleton
////////////////////////////////////////// //////////////////////////////////////////

View File

@ -84,7 +84,8 @@ UIC_FILES = \
ui_EntityGUI_Dir1_QTD.h \ ui_EntityGUI_Dir1_QTD.h \
ui_EntityGUI_Dir2_QTD.h \ ui_EntityGUI_Dir2_QTD.h \
ui_EntityGUI_Point_QTD.h \ ui_EntityGUI_Point_QTD.h \
ui_EntityGUI_Skeleton_QTD.h ui_EntityGUI_Skeleton_QTD.h \
ui_EntityGUI_Angles_QTD.h
BUILT_SOURCES = $(UIC_FILES) BUILT_SOURCES = $(UIC_FILES)