X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMToolsGUI%2FGEOMToolsGUI.cxx;h=68d4cefd7c956cbb882b0ece4313a8c9e7ad7f86;hb=15e78623e92030e26c218fab844b77f2c4d09d89;hp=a01872173af59d92675500d2c7cc63d7c9f84694;hpb=004197ec827d52331f0d529202eb4e52a1c4388f;p=modules%2Fgeom.git diff --git a/src/GEOMToolsGUI/GEOMToolsGUI.cxx b/src/GEOMToolsGUI/GEOMToolsGUI.cxx index a01872173..68d4cefd7 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI.cxx @@ -1,29 +1,29 @@ -// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE // -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. // -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // GEOM GEOMGUI : GUI for Geometry component // File : GEOMBase_Tools.cxx // Author : Damien COQUERET, Open CASCADE S.A.S. -// + #include "GEOMToolsGUI.h" #include "GEOMToolsGUI_DeleteDlg.h" @@ -78,9 +78,9 @@ static QString getFileName( QWidget* parent, { //QStringList filters; QString aBrepFilter; - for ( FilterMap::const_iterator it = filterMap.begin(); it != filterMap.end(); ++it ) { + for (FilterMap::const_iterator it = filterMap.begin(); it != filterMap.end(); ++it) { //filters.push_back( it.key() ); - if ( it.key().contains( "BREP", Qt::CaseInsensitive ) ) + if (it.key().contains( "BREP", Qt::CaseInsensitive )) aBrepFilter = it.key(); } @@ -90,12 +90,12 @@ static QString getFileName( QWidget* parent, if ( !initial.isEmpty() ) fd->selectFile( initial ); - + if ( showCurrentDirInitially && SUIT_FileDlg::getLastVisitedPath().isEmpty() ) fd->setDirectory( QDir::currentPath() ); fd->setFilters( filters ); - + if ( !lastUsedFilter.isEmpty() && filterMap.contains( lastUsedFilter ) ) { fd->selectFilter( lastUsedFilter ); } @@ -144,19 +144,19 @@ static QStringList getFileNames( QWidget* parent, } } filters.append( QObject::tr( "GEOM_ALL_IMPORT_FILES" ).arg( allFilters.join( " " ) ) ); - + SUIT_FileDlg fd( parent, true, true, true ); - fd.setFileMode( SUIT_FileDlg::ExistingFiles ); + fd.setFileMode( SUIT_FileDlg::ExistingFiles ); if ( !caption.isEmpty() ) fd.setWindowTitle( caption ); if ( !initial.isEmpty() ) fd.selectFile( initial ); - + if ( showCurrentDirInitially && SUIT_FileDlg::getLastVisitedPath().isEmpty() ) fd.setDirectory( QDir::currentPath() ); - + fd.setFilters( filters ); - + if ( !lastUsedFilter.isEmpty() && filterMap.contains( lastUsedFilter ) ) fd.selectFilter( lastUsedFilter ); else if ( !aBrepFilter.isEmpty() ) @@ -208,7 +208,7 @@ static bool inUse( _PTR(Study) study, const QString& component, const QMap::iterator itSO = aSelectedSO.begin(); for ( ; itSO != aSelectedSO.end(); ++itSO ) { - std::vector<_PTR(SObject)> aReferences = study->FindDependances( *itSO ); + std::vector<_PTR(SObject)> aReferences = study->FindDependances( *itSO ); int aRefLength = aReferences.size(); if (aRefLength) { for (int i = 0; i < aRefLength; i++) { @@ -235,11 +235,11 @@ static bool inUse( _PTR(Study) study, const QString& component, const QMapValue() ); CORBA::Object_var corbaObj = GeometryGUI::ClientSObjectToObject( child ); GEOM::GEOM_Object_var geomObj = GEOM::GEOM_Object::_narrow( corbaObj ); - if( CORBA::is_nil( geomObj ) ) + if( CORBA::is_nil( geomObj ) ) continue; GEOM::ListOfGO_var list = geomObj->GetDependency(); - if( list->length() == 0 ) + if( list->length() == 0 ) continue; for( int i = 0; i < list->length(); i++ ) { @@ -257,7 +257,6 @@ static bool inUse( _PTR(Study) study, const QString& component, const QMapactiveApplication()->putInfo(tr("GEOM_PRP_COMMAND").arg(theCommandID)); break; @@ -357,7 +387,6 @@ bool GEOMToolsGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent) return true; } - //=============================================================================== // function : OnEditDelete() // purpose : @@ -381,7 +410,7 @@ void GEOMToolsGUI::OnEditDelete() return; _PTR(Study) aStudy = appStudy->studyDS(); - + // check if study is locked if ( _PTR(AttributeStudyProperties)( aStudy->GetProperties() )->IsLocked() ) { SUIT_MessageBox::warning( app->desktop(), @@ -389,7 +418,7 @@ void GEOMToolsGUI::OnEditDelete() tr("WRN_STUDY_LOCKED") ); return; // study is locked } - + // get GEOM component CORBA::String_var geomIOR = app->orb()->object_to_string( GeometryGUI::GetGeomGen() ); QString geomComp = getParentComponent( aStudy->FindObjectIOR( geomIOR.in() ) ); @@ -398,6 +427,7 @@ void GEOMToolsGUI::OnEditDelete() QMap toBeDeleted; QMap allDeleted; bool isComponentSelected = false; + for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { Handle(SALOME_InteractiveObject) anIObject = It.Value(); if ( !anIObject->hasEntry() ) @@ -416,9 +446,9 @@ void GEOMToolsGUI::OnEditDelete() /////////////////////////////////////////////////////// // if GEOM component is selected, so skip other checks - if ( isComponentSelected ) continue; + if ( isComponentSelected ) continue; /////////////////////////////////////////////////////// - + // check if object is reference _PTR(SObject) refobj; if ( obj && obj->ReferencedObject( refobj ) ) { @@ -446,7 +476,7 @@ void GEOMToolsGUI::OnEditDelete() allDeleted.insert( child->GetID().c_str(), aName ); } } - + // is there is anything to delete? if ( !isComponentSelected && allDeleted.count() <= 0 ) return; // nothing to delete @@ -455,7 +485,7 @@ void GEOMToolsGUI::OnEditDelete() GEOMToolsGUI_DeleteDlg dlg( app->desktop(), allDeleted, isComponentSelected ); if ( !dlg.exec() ) return; // operation is cancelled by user - + // get currently opened views QList views; SALOME_View* view; @@ -467,10 +497,10 @@ void GEOMToolsGUI::OnEditDelete() if ( view ) views.append( view ); } - + _PTR(StudyBuilder) aStudyBuilder (aStudy->NewBuilder()); GEOM_Displayer* disp = new GEOM_Displayer( appStudy ); - + if ( isComponentSelected ) { // GEOM component is selected: delete all objects recursively _PTR(SObject) comp = aStudy->FindObjectID( geomComp.toLatin1().data() ); @@ -504,7 +534,7 @@ void GEOMToolsGUI::OnEditDelete() aStudyBuilder->RemoveObjectWithChildren( obj ); } } - + selected.Clear(); aSelMgr->setSelectedObjects( selected ); getGeometryGUI()->updateObjBrowser(); @@ -572,7 +602,8 @@ bool GEOMToolsGUI::Import() QList< GEOM::GEOM_Object_var > objsForDisplay; - + QStringList anEntryList; + // iterate through all selected files SUIT_MessageBox::StandardButton igesAnswer = SUIT_MessageBox::NoButton; @@ -589,7 +620,7 @@ bool GEOMToolsGUI::Import() // file type is not defined, try to detect QString ext = QFileInfo( fileName ).suffix().toUpper(); QRegExp re( "\\*\\.(\\w+)" ); - for ( FilterMap::const_iterator it = aMap.begin(); + for ( FilterMap::const_iterator it = aMap.begin(); it != aMap.end() && aCurrentType.isEmpty(); ++it ) { int pos = 0; while ( re.indexIn( it.key(), pos ) >= 0 ) { @@ -616,9 +647,45 @@ bool GEOMToolsGUI::Import() CORBA::String_var fileN = fileName.toLatin1().constData(); CORBA::String_var fileT = aCurrentType.toLatin1().constData(); + // jfa 21.08.2012 for mantis issue 21511 (STEP file units) + CORBA::String_var aUnits = aInsOp->ReadValue(fileN, fileT, "LEN_UNITS"); + TCollection_AsciiString aUnitsStr (aUnits.in()); + bool needConvert = true; + if (aUnitsStr.IsEmpty() || aUnitsStr == "UNIT_M") + needConvert = false; + + if (needConvert) { + if (igesAnswer == SUIT_MessageBox::NoToAll) { + // converting for all files is already approved + fileT = (aCurrentType + "_SCALE").toLatin1().constData(); + } + else if (igesAnswer != SUIT_MessageBox::YesToAll) { + SUIT_MessageBox::StandardButtons btns = SUIT_MessageBox::Yes | SUIT_MessageBox::No; + if (i < fileNames.count() - 1) btns = btns | SUIT_MessageBox::YesToAll | SUIT_MessageBox::NoToAll; + igesAnswer = SUIT_MessageBox::question(app->desktop(), + "Question",//tr("WRN_WARNING"), + tr("GEOM_SCALE_DIMENSIONS"), + btns | SUIT_MessageBox::Cancel, + SUIT_MessageBox::No); + switch (igesAnswer) { + case SUIT_MessageBox::Cancel: + return false; // cancel (break) import operation + case SUIT_MessageBox::Yes: + case SUIT_MessageBox::YesToAll: + break; // scaling is confirmed + case SUIT_MessageBox::No: + case SUIT_MessageBox::NoAll: + fileT = (aCurrentType + "_SCALE").toLatin1().constData(); + default: + break; // scaling is rejected + } // switch ( igesAnswer ) + } // if ( igeAnswer != NoToAll ) + } // if ( needConvert ) + + /* // skl 29.05.2009 if ( aCurrentType == "IGES" ) { - GEOM::GEOM_Object_var anObj = aInsOp->Import( fileN, "IGES_UNIT" ); + GEOM::GEOM_Object_var anObj = aInsOp->ImportFile( fileN, "IGES_UNIT" ); bool needConvert = false; TCollection_AsciiString aUnitName = aInsOp->GetErrorCode(); if ( aUnitName.SubString( 1, 4 ) == "UNIT" ) @@ -653,6 +720,9 @@ bool GEOMToolsGUI::Import() } // if ( needConvert ) } // if ( aCurrentType == "IGES" ) else if ( aCurrentType == "ACIS" ) { + */ + + if ( aCurrentType == "ACIS" ) { if ( acisAnswer != SUIT_MessageBox::YesToAll && acisAnswer != SUIT_MessageBox::NoToAll ) { SUIT_MessageBox::StandardButtons btns = SUIT_MessageBox::Yes | SUIT_MessageBox::No; if ( i < fileNames.count()-1 ) btns = btns | SUIT_MessageBox::YesToAll | SUIT_MessageBox::NoToAll; @@ -665,21 +735,25 @@ bool GEOMToolsGUI::Import() return false; // cancel (break) import operation } // if ( acisAnswer != YesToAll && acisAnswer != NoToAll ) } // else if ( aCurrentType == "ACIS" ) - - GEOM::GEOM_Object_var anObj = aInsOp->Import( fileN, fileT ); + + // IMPORT + GEOM::GEOM_Object_var anObj = aInsOp->ImportFile( fileN, fileT ); if ( !anObj->_is_nil() && aInsOp->IsDone() ) { - QString aPublishObjName = + QString aPublishObjName = GEOMBase::GetDefaultName( SUIT_Tools::file( fileName, /*withExten=*/true ) ); - + SALOMEDS::Study_var aDSStudy = GeometryGUI::ClientStudyToStudy( aStudy ); - GeometryGUI::GetGeomGen()->PublishInStudy( aDSStudy, - SALOMEDS::SObject::_nil(), - anObj, - aPublishObjName.toLatin1().constData() ); - + SALOMEDS::SObject_var aSO = + GeometryGUI::GetGeomGen()->PublishInStudy( aDSStudy, + SALOMEDS::SObject::_nil(), + anObj, + aPublishObjName.toLatin1().constData() ); + if ( ( !aSO->_is_nil() ) ) + anEntryList.append( aSO->GetID() ); + objsForDisplay.append( anObj ); - + if ( aCurrentType == "ACIS" ) { if ( acisAnswer == SUIT_MessageBox::Yes || acisAnswer == SUIT_MessageBox::YesToAll ) GeometryGUI::GetGeomGen()->PublishNamedShapesInStudy( aDSStudy, anObj ); @@ -701,6 +775,9 @@ bool GEOMToolsGUI::Import() // update object browser getGeometryGUI()->updateObjBrowser( true ); + // browse published objects + app->browseObjects( anEntryList ); + // display imported model (if only one file is selected) if ( objsForDisplay.count() == 1 ) GEOM_Displayer( stud ).Display( objsForDisplay[0].in() ); @@ -716,7 +793,6 @@ bool GEOMToolsGUI::Import() return objsForDisplay.count() > 0; } - //===================================================================================== // function : Export // purpose : BRep, Iges, Step @@ -765,12 +841,11 @@ bool GEOMToolsGUI::Export() bool appropriateObj = false; SALOME_ListIteratorOfListIO It( selectedObjects ); - for(;It.More();It.Next()) { + for (; It.More(); It.Next()) { Handle(SALOME_InteractiveObject) IObject = It.Value(); - Standard_Boolean found; - GEOM::GEOM_Object_var anObj = GEOMBase::ConvertIOinGEOMObject(IObject, found); + GEOM::GEOM_Object_var anObj = GEOMBase::ConvertIOinGEOMObject( IObject ); - if ( !found || anObj->_is_nil() ) + if ( anObj->_is_nil() ) continue; QString fileType; @@ -789,20 +864,18 @@ bool GEOMToolsGUI::Export() anOp->start(); - aInsOp->Export( anObj, file.toStdString().c_str(), fileType.toLatin1().constData() ); - if ( aInsOp->IsDone() ) + if (aInsOp->IsDone()) anOp->commit(); - else - { - anOp->abort(); - wc.suspend(); - SUIT_MessageBox::critical( app->desktop(), - QObject::tr( "GEOM_ERROR" ), - QObject::tr("GEOM_PRP_ABORT") + "\n" + QString( aInsOp->GetErrorCode() ) ); - return false; - } + else { + anOp->abort(); + wc.suspend(); + SUIT_MessageBox::critical(app->desktop(), + QObject::tr("GEOM_ERROR"), + QObject::tr("GEOM_PRP_ABORT") + "\n" + QObject::tr(aInsOp->GetErrorCode())); + return false; + } } catch (const SALOME::SALOME_Exception& S_ex) { //QtCatchCorbaException(S_ex); @@ -839,6 +912,8 @@ void GEOMToolsGUI::removeObjectWithChildren(_PTR(SObject) obj, if (obj->FindAttribute(anAttr, "AttributeIOR")) { _PTR(AttributeIOR) anIOR (anAttr); + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + // Delete shape in Client const TCollection_AsciiString ASCIor ((char*)anIOR->Value().c_str()); getGeometryGUI()->GetShapeReader().RemoveShapeFromBuffer(ASCIor); @@ -846,12 +921,16 @@ void GEOMToolsGUI::removeObjectWithChildren(_PTR(SObject) obj, CORBA::Object_var corbaObj = GeometryGUI::ClientSObjectToObject(obj); GEOM::GEOM_Object_var geomObj = GEOM::GEOM_Object::_narrow( corbaObj ); if (!CORBA::is_nil(geomObj)) { + + //Remove visual properties of the object + appStudy->removeObjectFromAll(obj->GetID().c_str()); + // Erase graphical object QListIterator it( views ); while ( it.hasNext() ) if ( SALOME_View* view = it.next() ) disp->Erase(geomObj, true, view); - + // Remove object from Engine // We can't directly remove object from engine. All we can do is to unpublish the object // from the study. Another client could be using the object.