From 215f2387c80d5f42d8e3d45325aca829e2a04814 Mon Sep 17 00:00:00 2001 From: enk Date: Wed, 9 Nov 2005 13:49:28 +0000 Subject: [PATCH] Improvement : Bug PAL10401 wrong sens in cut line --- src/VISUGUI/VISU_msg_en.po | 3 + src/VISUGUI/VisuGUI_CutLinesDlg.cxx | 116 +++++++++++++++++++++++++++- src/VISUGUI/VisuGUI_CutLinesDlg.h | 7 +- src/VISU_I/VISU_CutLines_i.cc | 93 ++++++++++++++++++++++ src/VISU_I/VISU_CutLines_i.hh | 10 +++ 5 files changed, 225 insertions(+), 4 deletions(-) diff --git a/src/VISUGUI/VISU_msg_en.po b/src/VISUGUI/VISU_msg_en.po index 86d82f65..6c875d5a 100644 --- a/src/VISUGUI/VISU_msg_en.po +++ b/src/VISUGUI/VISU_msg_en.po @@ -301,6 +301,9 @@ msgstr "There is no data for animation" msgid "LBL_SHOW_PREVIEW" msgstr "Show preview" +msgid "VisuGUI_CutLinesDlg::LBL_INVERT_CURVES" +msgstr "Invert all curves" + msgid "LBL_GENERATE_TABLE" msgstr "Generate Data Table" diff --git a/src/VISUGUI/VisuGUI_CutLinesDlg.cxx b/src/VISUGUI/VisuGUI_CutLinesDlg.cxx index a9204857..dc34304c 100644 --- a/src/VISUGUI/VisuGUI_CutLinesDlg.cxx +++ b/src/VISUGUI/VisuGUI_CutLinesDlg.cxx @@ -28,6 +28,12 @@ #include #include #include +#include +#include +#include +#include +#include +#include using namespace std; @@ -41,7 +47,7 @@ bool VisuGUI_CutLinesDlg::MYGenerateCurve = true; VisuGUI_CutLinesDlg::VisuGUI_CutLinesDlg(bool theIsCreation) : QDialog( QAD_Application::getDesktop(), "VisuGUI_CutLinesDlg", false, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose), - myPreviewActor(0), + myPreviewActor(0),myPreviewActorGlyphs(0), myStudy(QAD_Application::getDesktop()->getActiveStudy()) { myStudyFrame = myStudy -> getActiveStudyFrame(); @@ -68,6 +74,8 @@ VisuGUI_CutLinesDlg::VisuGUI_CutLinesDlg(bool theIsCreation) QRadioButton* aBxy = new QRadioButton( tr( "|| X-Y" ), mySelPlane); // 0 QRadioButton* aByz = new QRadioButton( tr( "|| Y-Z" ), mySelPlane); // 1 QRadioButton* aBzx = new QRadioButton( tr( "|| Z-X" ), mySelPlane); // 2 + aBxy->setChecked(false); + aByz->setChecked(false); aBzx->setChecked(true); aPlaneLayout->addWidget( mySelPlane ); @@ -122,6 +130,9 @@ VisuGUI_CutLinesDlg::VisuGUI_CutLinesDlg(bool theIsCreation) aPlaneLayout->addStretch(); + myAllCurvesInvertedCheck = new QCheckBox(tr("LBL_INVERT_CURVES"), aPlanePane); + myAllCurvesInvertedCheck->setChecked(false); + aPlaneLayout->addWidget(myAllCurvesInvertedCheck); aTabPane->addTab( aPlanePane, tr("LBL_LINES_PLANE") ); @@ -219,6 +230,7 @@ VisuGUI_CutLinesDlg::VisuGUI_CutLinesDlg(bool theIsCreation) connect( th, SIGNAL( clicked(int)), this, SLOT( setDefault(int) ) ); connect( myPosSpn2, SIGNAL( valueChanged( double )), this, SLOT( DrawTable( ) ) ); connect( myPreviewCheck, SIGNAL( toggled( bool )), this, SLOT( onPreviewCheck( bool ) ) ); + connect(myAllCurvesInvertedCheck, SIGNAL(toggled(bool)),this, SLOT(onAllCurvesInvertedCheck(bool))); connect( myPosTable, SIGNAL(valueChanged(int, int)), this, SLOT(onValueChanged(int, int)) ); connect( myRotXSpn, SIGNAL( valueChanged( double )), this, SLOT( onRotation( double ) ) ); connect( myRotYSpn, SIGNAL( valueChanged( double )), this, SLOT( onRotation( double ) ) ); @@ -263,6 +275,8 @@ void VisuGUI_CutLinesDlg::initFromPrsObject(VISU::CutLines_i* thePrs) { hasInit = true; myCutLines = new VISU::CutLines_i(thePrs->GetResult(),false); myCutLines->SameAs(thePrs); + myCutLines->CopyCurvesInverted(thePrs->GetCurvesInverted()); + if (myCutLines->IsAllCurvesInverted()) myAllCurvesInvertedCheck->setChecked(true); myBasePlanePos->setText( QString::number(myCutLines->GetBasePlanePosition()) ); myCBSetDef->setChecked(thePrs->IsDefault()); DrawTable(); @@ -296,6 +310,8 @@ int VisuGUI_CutLinesDlg::storeToPrsObject(VISU::CutLines_i* thePrs) { thePrs->SetLinePosition( i, myPosTable->text( i, 0 ).toDouble() ); else thePrs->SetDefaultPosition(i); } + if (myAllCurvesInvertedCheck->isChecked()) + thePrs->SetAllCurvesInverted(true); return 1; } @@ -311,20 +327,29 @@ void VisuGUI_CutLinesDlg::createPlanes() { aPlaneMapper->SetInput(aPolyData->GetOutput()); aPlaneMapper->ScalarVisibilityOff(); + myPreviewActorGlyphs = myPreviewActorGlyphs = SALOME_Actor::New(); + myPreviewActorGlyphs->PickableOff(); + updateGlyphs(false); + myPreviewActor = SALOME_Actor::New(); myPreviewActor->PickableOff(); myPreviewActor->SetMapper(aPlaneMapper); aPlaneMapper->Delete(); GET_VTK_VIEWFRAME(myStudy)->AddActor(myPreviewActor); + GET_VTK_VIEWFRAME(myStudy)->AddActor(myPreviewActorGlyphs); } //------------------------------------------------------------------------------ void VisuGUI_CutLinesDlg::deletePlanes() { if (myPreviewActor == 0) return; - if (VTKViewer_ViewFrame* vf = GET_VTK_VIEWFRAME(myStudy)) + if (VTKViewer_ViewFrame* vf = GET_VTK_VIEWFRAME(myStudy)){ vf->RemoveActor(myPreviewActor); + vf->RemoveActor(myPreviewActorGlyphs); + } myPreviewActor->Delete(); myPreviewActor = 0; + myPreviewActorGlyphs->Delete(); + myPreviewActorGlyphs = 0; } @@ -470,6 +495,78 @@ void VisuGUI_CutLinesDlg::DrawTable() } } +void VisuGUI_CutLinesDlg::updateGlyphs(bool update){ + if (myPreviewActorGlyphs == 0 ) return; + const float *aDirLn = myCutLines->GetCutLinesPL()->GetDirLn(); + const float *aBasePnt = myCutLines->GetCutLinesPL()->GetBasePnt(); + float aSecondPnt[3]; + float aBoundCenter[3]; + + vtkAppendPolyData* aPolyData = myCutLines->GetCutLinesPL()->GetAppendPolyData(); + vtkDataSetMapper* aPlaneMapper = vtkDataSetMapper::New(); + aPlaneMapper->SetInput(aPolyData->GetOutput()); + float bounds[6]; + aPlaneMapper->GetBounds(bounds); + + for(int i=0; i<3; i++) aBoundCenter[i] = (bounds[i*2] + bounds[i*2+1])/2.0; + for(int i=0; i<3; i++){ + if (myAllCurvesInvertedCheck->isChecked()) + aSecondPnt[i] = aBasePnt[i] + aDirLn[i]; + else + aSecondPnt[i] = -aBasePnt[i] - aDirLn[i]; + } + + float max_bound = 0; + max_bound < bounds[1]-bounds[0] ? max_bound = bounds[1] - bounds[0] : max_bound = max_bound; + max_bound < bounds[3]-bounds[2] ? max_bound = bounds[3] - bounds[2] : max_bound = max_bound; + max_bound < bounds[5]-bounds[4] ? max_bound = bounds[5] - bounds[4] : max_bound = max_bound; + + vtkPolyData* profile = vtkPolyData::New(); + vtkPoints* aPoints = vtkPoints::New(); + vtkGlyph3D* glyphs = vtkGlyph3D::New(); + vtkFloatArray *aFloatArray = vtkFloatArray::New(); + vtkGlyphSource2D* source = vtkGlyphSource2D::New(); + + source->FilledOn(); + source->SetCenter(aBoundCenter); + source->SetGlyphTypeToArrow(); + + aPoints->InsertNextPoint(aBasePnt); + profile->SetPoints(aPoints); + + aFloatArray->SetNumberOfComponents(3); + for(int i=0; i<3 ;i++) + aFloatArray->InsertNextValue(aSecondPnt[i]); + + vtkDataSetAttributes* aDataSetAttributes; + aDataSetAttributes = profile->GetPointData(); + aDataSetAttributes->SetVectors(aFloatArray); + + glyphs->SetScaleFactor(0.25*max_bound); + glyphs->SetVectorModeToUseVector(); + glyphs->SetScaleModeToScaleByVector(); + glyphs->SetInput(profile); + glyphs->SetSource(source->GetOutput()); + + vtkPolyDataMapper* aGlyphsMapper = vtkPolyDataMapper::New(); + aGlyphsMapper->ScalarVisibilityOff(); + aGlyphsMapper->SetInput(glyphs->GetOutput()); + + myPreviewActorGlyphs->SetMapper(aGlyphsMapper); + + profile->Delete(); + glyphs->Delete(); + aPoints->Delete(); + aGlyphsMapper->Delete(); + aFloatArray->Delete(); + source->Delete(); + aPlaneMapper->Delete(); + + if (VTKViewer_ViewFrame* vf = GET_VTK_VIEWFRAME(myStudy)) + if (myPreviewCheck->isChecked()) + vf->Repaint(); +} + //------------------------------------------------------------------------------ void VisuGUI_CutLinesDlg::setDefault(int all) { @@ -695,6 +792,21 @@ void VisuGUI_CutLinesDlg::onPreviewCheck(bool thePreview) { } } +/*! Inverting all curves in the table + */ +void VisuGUI_CutLinesDlg::onAllCurvesInvertedCheck(bool theInvert) +{ + if (myAllCurvesInvertedCheck->isChecked()){ + myCutLines->SetAllCurvesInverted(true); + myPrs->SetAllCurvesInverted(true); + } + else { + myCutLines->SetAllCurvesInverted(false); + myPrs->SetAllCurvesInverted(false); + } + updateGlyphs(true); +} + void VisuGUI_CutLinesDlg::onRotation(double theValue) { if (myCutLines == NULL) return; if (VTKViewer_ViewFrame* vf = GET_VTK_VIEWFRAME(myStudy)) { diff --git a/src/VISUGUI/VisuGUI_CutLinesDlg.h b/src/VISUGUI/VisuGUI_CutLinesDlg.h index d9f3d9b9..b9370594 100644 --- a/src/VISUGUI/VisuGUI_CutLinesDlg.h +++ b/src/VISUGUI/VisuGUI_CutLinesDlg.h @@ -49,11 +49,12 @@ private slots: void onRotation(double theValue); void onPlanePos(const QString& theValue); void onFrameActivated(QAD_StudyFrame* ); + void onAllCurvesInvertedCheck(bool theInvert); private: void createPlanes(); void deletePlanes(); - + void updateGlyphs(bool update); QHButtonGroup* mySelPlane; QAD_SpinBoxDbl* myRotXSpn; @@ -86,8 +87,10 @@ private: void setOrientation2( const VISU::CutPlanes::Orientation orient); SALOME_Actor* myPreviewActor; + SALOME_Actor* myPreviewActorGlyphs; QCheckBox* myPreviewCheck; - + QCheckBox* myAllCurvesInvertedCheck; + VISU::CutLines_i* myPrs; QAD_Study *myStudy; diff --git a/src/VISU_I/VISU_CutLines_i.cc b/src/VISU_I/VISU_CutLines_i.cc index 8adb5adb..d1cdbae9 100644 --- a/src/VISU_I/VISU_CutLines_i.cc +++ b/src/VISU_I/VISU_CutLines_i.cc @@ -83,6 +83,12 @@ void VISU::CutLines_i::SameAs(const CutLines_i* theOrigin){ VISU::ScalarMap_i::SameAs(theOrigin); } +/*! Copy map to /a myMapCurvesInverted. + * \param theCurves - map + */ +void VISU::CutLines_i::CopyCurvesInverted(const TCurvesInv& theCurves){ + myMapCurvesInverted = theCurves; +} VISU::Storable* VISU::CutLines_i::Create(const char* theMeshName, VISU::Entity theEntity, const char* theFieldName, int theIteration) @@ -114,6 +120,20 @@ VISU::Storable* VISU::CutLines_i::Restore(const Storable::TRestoringMap& theMap) if(aCondList[i].toInt() == 0) SetLinePosition(i,aPosList[i].toDouble()); + // Restoring the map - \a myMapCurvesInverted + QStringList aMapCurvesInverted = QStringList::split("|",VISU::Storable::FindValue(theMap,"myMapCurvesInverted") ); + if (aMapCurvesInverted.count() == GetNbLines()){ + for(int i = 0, iEnd = GetNbLines(); i < iEnd ; i++){ + if(aMapCurvesInverted[i].toInt()) + SetCurveInverted(i,true); + else + SetCurveInverted(i,false); + } + } else { + for(int i = 0, iEnd = GetNbLines(); i < iEnd ; i++) + SetCurveInverted(i,false); + } + return ScalarMap_i::Restore(theMap); } @@ -142,6 +162,12 @@ void VISU::CutLines_i::ToStream(std::ostringstream& theStr){ } Storable::DataToStream( theStr, "myLinePosition", aStrPos.latin1()); Storable::DataToStream( theStr, "myLineCondition", aStrCon.latin1()); + + // Storing the map - \a myMapCurvesInverted + QString aStrCurvesInverted; + for(int i = 0, iEnd = GetNbLines(); i < iEnd; i++) + aStrCurvesInverted.append(QString::number(IsCurveInverted(i)) + "|"); + Storable::DataToStream( theStr, "myMapCurvesInverted", aStrCurvesInverted.latin1()); } VISU::CutLines_i::~CutLines_i(){ @@ -232,6 +258,38 @@ CORBA::Boolean VISU::CutLines_i::IsDefaultPosition(CORBA::Long thePlaneNumber){ return myCutLinesPL->IsPartDefault(thePlaneNumber); } +/*! Invert all curves of corresponding table + * see void VISU::CutLines_i::SetCurveInverted(CORBA::Long theCurveNumber,CORBA::Boolean theInvert) + * \param theInvert - Invert all curves, if value is TRUE, else not. + */ +void VISU::CutLines_i::SetAllCurvesInverted(CORBA::Boolean theInvert){ + for (int i=0; iSetNbParts(theNb); @@ -317,6 +375,41 @@ void VISU::CutLines_i::BuildTableOfReal(SALOMEDS::SObject_ptr theSObject){ } if(aXYMapCont.size() == 0) throw std::runtime_error("CutPlanes_i::BuildTableOfReal aXYMapCont.size() == 0 !!!"); + + { + // Invertion all curves in the table, which has inversion flag is TRUE (see \a myMapCurvesInverted) + for(int iLine=0; iLine < iLineEnd; iLine++){ + if (!IsCurveInverted(iLine)) continue; + TXYMap aNewXYMap; + TXYMap& aXYMap = aXYMapCont[iLine]; + TXYMap::const_iterator aXYMapIter = aXYMap.begin(); + std::list XKeys; + for (;aXYMapIter != aXYMap.end() ; aXYMapIter++) XKeys.push_back(aXYMapIter->first); + XKeys.sort(); + if (XKeys.size() > 1) { + float a_first_indx = XKeys.front(); + float a_last_indx = XKeys.back(); + if (a_first_indx > a_last_indx){ + XKeys.reverse(); + float tmp = a_first_indx; + a_first_indx = a_last_indx; + a_last_indx = tmp; + } + std::list::const_iterator aIter = XKeys.begin(); + for (int k=0;k= 0 and aDist<=1.0 + aNewXYMap[1.0 - *aIter] = aXYMap[*aIter]; + } + TXYMap::const_iterator aNewXYMapIter = aNewXYMap.begin(); + aXYMap.clear(); + for (;aNewXYMapIter != aNewXYMap.end();aNewXYMapIter++) { + aXYMap[aNewXYMapIter->first] = aNewXYMapIter->second; + } + } + } + } //Resorting of theXYMap TXYMapCont::iterator aXYMapContIter = aXYMapCont.begin(); for(; aXYMapContIter != aXYMapCont.end(); aXYMapContIter++){ diff --git a/src/VISU_I/VISU_CutLines_i.hh b/src/VISU_I/VISU_CutLines_i.hh index 5d697a7f..986e8d73 100644 --- a/src/VISU_I/VISU_CutLines_i.hh +++ b/src/VISU_I/VISU_CutLines_i.hh @@ -82,15 +82,25 @@ namespace VISU{ virtual void SetDefaultPosition(CORBA::Long thePlaneNumber); virtual CORBA::Boolean IsDefaultPosition(CORBA::Long thePlaneNumber); + virtual void SetAllCurvesInverted(CORBA::Boolean theInvert); + virtual CORBA::Boolean IsAllCurvesInverted(); + virtual void SetCurveInverted(CORBA::Long theCurveNumber,CORBA::Boolean theInvert); + virtual CORBA::Boolean IsCurveInverted(CORBA::Long theCurveNumber); + virtual void SetNbLines(CORBA::Long theNb); virtual CORBA::Long GetNbLines(); typedef VISU::CutLines TInterface; VISU_CutLinesPL* GetCutLinesPL(){ return myCutLinesPL;} + + typedef std::map TCurvesInv; + TCurvesInv GetCurvesInverted() {return myMapCurvesInverted;} + void CopyCurvesInverted(const TCurvesInv& theCurves); protected: virtual void DoHook(); VISU_CutLinesPL *myCutLinesPL; + TCurvesInv myMapCurvesInverted; public: static int IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, -- 2.39.2