From 9f11350cbecd5c29c1ab2b890057ae1883545322 Mon Sep 17 00:00:00 2001 From: jfa Date: Wed, 7 Mar 2012 08:05:30 +0000 Subject: [PATCH] Mantis issue 0021350: EDF 1948 GEOM: Export IGES 5.3 impossible. --- src/GEOMGUI/GEOM_msg_en.ts | 7 ++ src/GEOMToolsGUI/GEOMToolsGUI.cxx | 111 ++++++++++++++---------------- src/IGESExport/IGESExport.cxx | 104 +++++++++++++++++++++++----- 3 files changed, 146 insertions(+), 76 deletions(-) diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 48edbe8ac..0854f89bf 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -4423,6 +4423,13 @@ Please, select face, shell or solid and try again GEOM_IMPORT_ERRORS Import operation has finished with errors: + + EXPORT_IGES_HETEROGENEOUS_COMPOUND + This compound cannot be exported in IGES format +without loss, because it contains entities, that must be saved in +different modes. It is vertices, edges and wires on the one hand and +shells and solids on the other hand. + GEOM_PUBLISH_NAMED_SHAPES Create groups for named shapes (if there are any)? diff --git a/src/GEOMToolsGUI/GEOMToolsGUI.cxx b/src/GEOMToolsGUI/GEOMToolsGUI.cxx index 3c5c6f1d1..05259bf29 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI.cxx @@ -18,12 +18,11 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // 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 +77,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 +89,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 +143,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 +207,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 +234,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 +256,6 @@ static bool inUse( _PTR(Study) study, const QString& component, const QMapactiveApplication()->putInfo(tr("GEOM_PRP_COMMAND").arg(theCommandID)); @@ -384,7 +380,6 @@ bool GEOMToolsGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent) return true; } - //=============================================================================== // function : OnEditDelete() // purpose : @@ -408,7 +403,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(), @@ -416,7 +411,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() ) ); @@ -425,7 +420,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() ) @@ -444,9 +439,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 ) ) { @@ -474,7 +469,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 @@ -483,7 +478,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; @@ -495,10 +490,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() ); @@ -529,12 +524,10 @@ void GEOMToolsGUI::OnEditDelete() // remove object from GEOM engine removeObjectWithChildren( obj, aStudy, views, disp ); // remove objects from study - aStudyBuilder->RemoveObjectWithChildren( obj ); + aStudyBuilder->RemoveObjectWithChildren( obj ); } } - - selected.Clear(); aSelMgr->setSelectedObjects( selected ); getGeometryGUI()->updateObjBrowser(); @@ -620,7 +613,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 ) { @@ -696,23 +689,24 @@ bool GEOMToolsGUI::Import() return false; // cancel (break) import operation } // if ( acisAnswer != YesToAll && acisAnswer != NoToAll ) } // else if ( aCurrentType == "ACIS" ) - + 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 ); - SALOMEDS::SObject_var aSO = GeometryGUI::GetGeomGen()->PublishInStudy( aDSStudy, - SALOMEDS::SObject::_nil(), - anObj, - aPublishObjName.toLatin1().constData() ); - if( ( !aSO->_is_nil() ) ) + 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 ); @@ -752,7 +746,6 @@ bool GEOMToolsGUI::Import() return objsForDisplay.count() > 0; } - //===================================================================================== // function : Export // purpose : BRep, Iges, Step @@ -801,7 +794,7 @@ 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(); GEOM::GEOM_Object_var anObj = GEOMBase::ConvertIOinGEOMObject( IObject ); @@ -824,20 +817,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); @@ -873,7 +864,7 @@ void GEOMToolsGUI::removeObjectWithChildren(_PTR(SObject) obj, _PTR(GenericAttribute) anAttr; if (obj->FindAttribute(anAttr, "AttributeIOR")) { _PTR(AttributeIOR) anIOR (anAttr); - + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); // Delete shape in Client @@ -883,16 +874,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. diff --git a/src/IGESExport/IGESExport.cxx b/src/IGESExport/IGESExport.cxx index 12cf1e1a8..3315225ad 100644 --- a/src/IGESExport/IGESExport.cxx +++ b/src/IGESExport/IGESExport.cxx @@ -31,8 +31,12 @@ #include #include -#include #include +#include + +#include + +#include #ifdef WNT #if defined IGESEXPORT_EXPORTS || defined IGESExport_EXPORTS @@ -52,6 +56,63 @@ #define IGESEXPORT_EXPORT #endif +//============================================================================= +/*! + * KindOfBRep + * \return 0 if theShape contains only simple entities (wires, edges and vertices), + * 1 if theShape contains only complex entities (shells, solids and compsolids) + * 2 if theShape contains only indifferent entities (faces) + * -1 if theShape contains both simple and complex entities (and in this case it + * cannot be saved without any loss neither in BRepMode == 0 nor in BRepMode == 1) + */ +//============================================================================= +int KindOfBRep (const TopoDS_Shape& theShape) +{ + int aKind = 2; + + switch (theShape.ShapeType()) + { + case TopAbs_COMPOUND: + { + bool isSimple = false; + bool isComplex = false; + TopoDS_Iterator anIt (theShape, Standard_True, Standard_True); + for (; anIt.More(); anIt.Next()) { + TopoDS_Shape aS = anIt.Value(); + int aKindSub = KindOfBRep(aS); + if (aKindSub == 0) + isSimple = true; + else if (aKindSub == 1) + isComplex = true; + else if (aKindSub == -1) { + return -1; // heterogeneous + } + } + if (isSimple && isComplex) + aKind = -1; // heterogeneous + else if (isSimple) + aKind = 0; + else if (isComplex) + aKind = 1; + } + break; + case TopAbs_COMPSOLID: + case TopAbs_SOLID: + case TopAbs_SHELL: + aKind = 1; + break; + case TopAbs_WIRE: + case TopAbs_EDGE: + case TopAbs_VERTEX: + aKind = 0; + break; + default: + aKind = 2; + } + + return aKind; +} + //============================================================================= /*! * @@ -65,17 +126,32 @@ IGESEXPORT_EXPORT const TCollection_AsciiString& theFileName, const TCollection_AsciiString& theFormatName ) { + bool ok = false; + + // define, whether to write only faces (5.1 IGES format) + // or shells and solids also (5.3 IGES format) + int aBrepMode = 0; + if (theFormatName.IsEqual("IGES_5_3")) + aBrepMode = 1; + MESSAGE("Export IGES into file " << theFileName.ToCString()); + + // Mantis issue 0021350: check being exported shape, as some standalone + // entities (edges, wires and vertices) cannot be saved in BRepMode + if (aBrepMode == 1) { + int aKind = KindOfBRep(theShape); + if (aKind == -1) + Standard_Failure::Raise("EXPORT_IGES_HETEROGENEOUS_COMPOUND"); + else if (aKind == 2) + aBrepMode = 1; + else + aBrepMode = aKind; + } + // commented for 0021350: Please don't catch exceptions silently and send an // inappropriate error message instead, it is disturbing for the user and for us //try { - // define, whether to write only faces (5.1 IGES format) - // or shells and solids also (5.3 IGES format) - int aBrepMode = 0; - if (theFormatName.IsEqual("IGES_5_3")) - aBrepMode = 1; - // Set "C" numeric locale to save numbers correctly Kernel_Utils::Localizer loc; @@ -91,18 +167,14 @@ IGESEXPORT_EXPORT Interface_Static::SetCVal("write.precision.mode","Max"); // perform shape writing - ICW.AddShape( theShape ); - ICW.ComputeModel(); - bool ok = ICW.Write( theFileName.ToCString() ); - - // Return previous locale - if ( ok ) - return 1; + if (ICW.AddShape( theShape )) { + ICW.ComputeModel(); + ok = ICW.Write( theFileName.ToCString() ); + } } //catch(Standard_Failure) //{ - // //THROW_SALOME_CORBA_EXCEPTION("Exception catched in IGESExport", SALOME::BAD_PARAM); //} - return 0; + return ok; } } -- 2.39.2