X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_Obstacle.cxx;h=b83e7cb8af3c9ed39658e0462e520e10b30c4e2f;hb=deed826b2d6c39ba2ed410108cdf54d64cded321;hp=957bb7c0cd5d1cefb3c62d5431b8956b9b5eec8e;hpb=7b9454f8053b968f127bf7981eb05b6749e261f4;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_Obstacle.cxx b/src/HYDROData/HYDROData_Obstacle.cxx index 957bb7c0..b83e7cb8 100644 --- a/src/HYDROData/HYDROData_Obstacle.cxx +++ b/src/HYDROData/HYDROData_Obstacle.cxx @@ -3,10 +3,26 @@ #include "HYDROData_Document.h" +#include + +#include +#include +#include +#include +#include +#include +#include #include +#include +#include +#include +#include +#include #include +#include // CAREFUL ! position of this file is critic + #define PYTHON_OBSTACLE_ID "KIND_OBSTACLE" IMPLEMENT_STANDARD_HANDLE(HYDROData_Obstacle,HYDROData_ArtificialObject) @@ -26,7 +42,7 @@ QStringList HYDROData_Obstacle::DumpToPython( MapOfTreatedObjects& theTreatedObj { QStringList aResList; - Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( this ); + Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab ); if ( aDocument.IsNull() ) return aResList; @@ -56,5 +72,232 @@ TopoDS_Shape HYDROData_Obstacle::GetShape3D() const return getShape3D(); } +bool HYDROData_Obstacle::ImportFromFile( const QString& theFilePath ) +{ + // Check the file existence + QFileInfo aFileInfo( theFilePath ); + if ( !aFileInfo.exists() ) { + return false; + } + + bool aRes = false; + TopoDS_Shape aShape; + + // Import file + QString aFileSuf = aFileInfo.suffix().toLower(); + if ( aFileSuf == "brep" ) { + aShape = ImportBREP( theFilePath ); + } else if ( aFileSuf == "iges" || aFileSuf == "igs" ) { + aShape = ImportIGES( theFilePath ); + } else if ( aFileSuf == "step" ) { + aShape = ImportSTEP( theFilePath ); + } + + // Check the result shape + aRes = !aShape.IsNull(); + + // Set shape to the obstacle in case of success + if ( aRes ) { + SetShape3D( aShape ); + SetFilePath( theFilePath ); + } + + return aRes; +} + +void HYDROData_Obstacle::SetFilePath( const QString& theFilePath ) +{ + TCollection_AsciiString anAsciiStr( theFilePath.toStdString().c_str() ); + TDataStd_AsciiString::Set( myLab.FindChild( DataTag_FilePath ), anAsciiStr ); +} +QString HYDROData_Obstacle::GetFilePath() const +{ + QString aRes; + + Handle(TDataStd_AsciiString) anAsciiStr; + if ( myLab.FindChild( DataTag_FilePath ).FindAttribute( TDataStd_AsciiString::GetID(), anAsciiStr ) ) + aRes = QString( anAsciiStr->Get().ToCString() ); + return aRes; +} + +void HYDROData_Obstacle::SetGeomObjectEntry( const QString& theEntry ) +{ + TCollection_AsciiString anAsciiStr( theEntry.toStdString().c_str() ); + TDataStd_AsciiString::Set( myLab.FindChild( DataTag_GeomObjectEntry ), anAsciiStr ); +} + +QString HYDROData_Obstacle::GetGeomObjectEntry() const +{ + QString aRes; + + Handle(TDataStd_AsciiString) anAsciiStr; + if ( myLab.FindChild( DataTag_GeomObjectEntry ).FindAttribute( TDataStd_AsciiString::GetID(), anAsciiStr ) ) + aRes = QString( anAsciiStr->Get().ToCString() ); + + return aRes; +} + +TopoDS_Shape HYDROData_Obstacle::ImportBREP( const QString& theFilePath ) const +{ + TopoDS_Shape aResShape; + + BRep_Builder aBrepBuilder; + BRepTools::Read( aResShape, qPrintable(theFilePath), aBrepBuilder ); + + return aResShape; +} + +TopoDS_Shape HYDROData_Obstacle::ImportIGES( const QString& theFilePath ) const +{ + TopoDS_Shape aResShape; + + // Set "C" numeric locale to save numbers correctly + Kernel_Utils::Localizer loc; + + IGESControl_Reader aReader; + + Interface_Static::SetCVal("xstep.cascade.unit","M"); + + try { + OCC_CATCH_SIGNALS; + + IFSelect_ReturnStatus status = aReader.ReadFile(qPrintable(theFilePath)); + + if (status == IFSelect_RetDone) { + // Rescale units + Handle(IGESData_IGESModel) aModel = + Handle(IGESData_IGESModel)::DownCast(aReader.Model()); + if (!aModel.IsNull()) { + IGESData_GlobalSection aGS = aModel->GlobalSection(); + aGS.SetUnitFlag(6); + aModel->SetGlobalSection(aGS); + } + + aReader.ClearShapes(); + aReader.TransferRoots(); + + aResShape = aReader.OneShape(); + } + else { + aResShape.Nullify(); + } + } + catch(Standard_Failure) { + aResShape.Nullify(); + } + + return aResShape; +} + +TopoDS_Shape HYDROData_Obstacle::ImportSTEP( const QString& theFilePath ) const +{ + TopoDS_Shape aResShape; + + // Set "C" numeric locale to save numbers correctly + Kernel_Utils::Localizer loc; + + STEPControl_Reader aReader; + + // Convert to METERS + Interface_Static::SetCVal("xstep.cascade.unit","M"); + Interface_Static::SetIVal("read.step.ideas", 1); + Interface_Static::SetIVal("read.step.nonmanifold", 1); + + BRep_Builder B; + TopoDS_Compound compound; + B.MakeCompound(compound); + + try { + OCC_CATCH_SIGNALS; + + IFSelect_ReturnStatus status = aReader.ReadFile( qPrintable(theFilePath) ); + + if (status == IFSelect_RetDone) { + // Rescale units + // set UnitFlag to units from file + TColStd_SequenceOfAsciiString anUnitLengthNames; + TColStd_SequenceOfAsciiString anUnitAngleNames; + TColStd_SequenceOfAsciiString anUnitSolidAngleNames; + aReader.FileUnits(anUnitLengthNames, anUnitAngleNames, anUnitSolidAngleNames); + if (anUnitLengthNames.Length() > 0) { + TCollection_AsciiString aLenUnits = anUnitLengthNames.First(); + if (aLenUnits == "millimetre") + Interface_Static::SetCVal("xstep.cascade.unit", "MM"); + else if (aLenUnits == "centimetre") + Interface_Static::SetCVal("xstep.cascade.unit", "CM"); + else if (aLenUnits == "metre" || aLenUnits.IsEmpty()) + Interface_Static::SetCVal("xstep.cascade.unit", "M"); + else if (aLenUnits == "INCH") + Interface_Static::SetCVal("xstep.cascade.unit", "INCH"); + else { + // The file contains not supported units + return aResShape; + } + } + + Standard_Boolean failsonly = Standard_False; + aReader.PrintCheckLoad(failsonly, IFSelect_ItemsByEntity); + + // Root transfers + Standard_Integer nbr = aReader.NbRootsForTransfer(); + aReader.PrintCheckTransfer(failsonly, IFSelect_ItemsByEntity); + + for (Standard_Integer n = 1; n <= nbr; n++) { + Standard_Boolean ok = aReader.TransferRoot(n); + // Collecting resulting entities + Standard_Integer nbs = aReader.NbShapes(); + if (!ok || nbs == 0) { + continue; // skip empty root + } + else if (nbr == 1 && nbs == 1) { // For a single entity + aResShape = aReader.Shape(1); + // ATTENTION: this is a workaround for mantis issue 0020442 remark 0010776 + // It should be removed after patching OCCT for bug OCC22436 + // (fix for OCCT is expected in service pack next to OCCT6.3sp12) + if (aResShape.ShapeType() == TopAbs_COMPOUND) { + int nbSub1 = 0; + TopoDS_Shape currShape; + TopoDS_Iterator It (aResShape, Standard_True, Standard_True); + for (; It.More(); It.Next()) { + nbSub1++; + currShape = It.Value(); + } + if (nbSub1 == 1) + aResShape = currShape; + } + // END workaround + break; + } + + for (Standard_Integer i = 1; i <= nbs; i++) { + TopoDS_Shape aShape = aReader.Shape(i); + if (aShape.IsNull()) { + continue; + } + else { + B.Add(compound, aShape); + } + } + } + + if (aResShape.IsNull()) + aResShape = compound; + + // Check if any BRep entity has been read, there must be at least a vertex + if ( !TopExp_Explorer( aResShape, TopAbs_VERTEX ).More() ) { + // No geometrical data in the imported file + return TopoDS_Shape(); + } + } + else { + aResShape.Nullify(); + } + } + catch (Standard_Failure) { + aResShape.Nullify(); + } + + return aResShape; +}