Mantis issue 0020750: IMP: Naming during STEP import.

This commit is contained in:
jfa 2010-08-27 11:48:04 +00:00
parent 3a293c4748
commit 343553810e
8 changed files with 184 additions and 55 deletions

View File

@ -65,6 +65,7 @@
#define DESCRIPTION_LABEL 3 #define DESCRIPTION_LABEL 3
#define HISTORY_LABEL 4 #define HISTORY_LABEL 4
#define SUBSHAPES_LABEL 5 // 0020756: GetGroups #define SUBSHAPES_LABEL 5 // 0020756: GetGroups
#define NAMING_LABEL 6 // 002020750: Naming during STEP import
#define ARGUMENTS _label.FindChild((ARGUMENT_LABEL)) #define ARGUMENTS _label.FindChild((ARGUMENT_LABEL))
#define ARGUMENT(thePosition) _label.FindChild((ARGUMENT_LABEL)).FindChild((thePosition)) #define ARGUMENT(thePosition) _label.FindChild((ARGUMENT_LABEL)).FindChild((thePosition))
@ -793,6 +794,16 @@ TDF_Label GEOM_Function::GetArgumentHistoryEntry (const TDF_Label& theArgu
return aHistoryCurLabel; return aHistoryCurLabel;
} }
//=============================================================================
/*!
* GetNamingEntry
*/
//=============================================================================
TDF_Label GEOM_Function::GetNamingEntry (const Standard_Boolean create)
{
return _label.FindChild(NAMING_LABEL, create);
}
//======================================================================= //=======================================================================
//function : GEOM_Function_Type_ //function : GEOM_Function_Type_
//purpose : //purpose :

View File

@ -269,10 +269,13 @@ public:
Standard_EXPORT TDF_Label GetArgumentHistoryEntry (const TDF_Label& theArgumentRefEntry, Standard_EXPORT TDF_Label GetArgumentHistoryEntry (const TDF_Label& theArgumentRefEntry,
const Standard_Boolean create = Standard_True); const Standard_Boolean create = Standard_True);
//Returns top label of this function's naming tree
Standard_EXPORT TDF_Label GetNamingEntry (const Standard_Boolean create = Standard_True);
private: private:
TDF_Label _label; TDF_Label _label;
bool _isDone; bool _isDone;
}; };
#endif #endif

View File

@ -18,7 +18,6 @@
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // 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
//
#include <Standard_Stream.hxx> #include <Standard_Stream.hxx>
@ -109,7 +108,7 @@ Standard_Integer GEOMImpl_ImportDriver::Execute(TFunction_Logbook& log) const
// perform the import // perform the import
TCollection_AsciiString anError; TCollection_AsciiString anError;
TopoDS_Shape aShape = fp( aFileName, aFormatName, anError, aFunction->GetEntry() ); TopoDS_Shape aShape = fp(aFileName, aFormatName, anError, aFunction->GetNamingEntry());
// unload plugin library // unload plugin library
// commented by enk: // commented by enk:
@ -159,7 +158,8 @@ Standard_EXPORT Handle_Standard_Type& GEOMImpl_ImportDriver_Type_()
//function : DownCast //function : DownCast
//purpose : //purpose :
//======================================================================= //=======================================================================
const Handle(GEOMImpl_ImportDriver) Handle(GEOMImpl_ImportDriver)::DownCast(const Handle(Standard_Transient)& AnObject) const Handle(GEOMImpl_ImportDriver) Handle(GEOMImpl_ImportDriver)::DownCast
(const Handle(Standard_Transient)& AnObject)
{ {
Handle(GEOMImpl_ImportDriver) _anOtherObject; Handle(GEOMImpl_ImportDriver) _anOtherObject;
@ -169,5 +169,5 @@ const Handle(GEOMImpl_ImportDriver) Handle(GEOMImpl_ImportDriver)::DownCast(cons
} }
} }
return _anOtherObject ; return _anOtherObject;
} }

View File

@ -265,7 +265,7 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy,
//if (strlen(theName) == 0) aShapeName += TCollection_AsciiString(aResultSO->Tag()); //if (strlen(theName) == 0) aShapeName += TCollection_AsciiString(aResultSO->Tag());
//else aShapeName = TCollection_AsciiString(CORBA::string_dup(theName)); //else aShapeName = TCollection_AsciiString(CORBA::string_dup(theName));
// try to find existed name for current shape // BEGIN: try to find existed name for current shape
bool HasName = false; bool HasName = false;
// recieve current TopoDS shape // recieve current TopoDS shape
CORBA::String_var entry = aShape->GetEntry(); CORBA::String_var entry = aShape->GetEntry();
@ -278,24 +278,28 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy,
} }
entry = aMainSh->GetEntry(); entry = aMainSh->GetEntry();
Handle(GEOM_Object) anObj = _impl->GetObject(aMainSh->GetStudyID(), entry); Handle(GEOM_Object) anObj = _impl->GetObject(aMainSh->GetStudyID(), entry);
TDF_Label aMainLbl = anObj->GetEntry(); TDF_Label aMainLbl = anObj->GetFunction(1)->GetNamingEntry();
// check all named shapes using iterator // check all named shapes using iterator
TDF_ChildIDIterator anIt(aMainLbl, TNaming_NamedShape::GetID(), Standard_True); TDF_ChildIDIterator anIt (aMainLbl, TNaming_NamedShape::GetID(), Standard_True);
for(; anIt.More(); anIt.Next()) {
for (; anIt.More() && !HasName; anIt.Next()) {
Handle(TNaming_NamedShape) anAttr = Handle(TNaming_NamedShape) anAttr =
Handle(TNaming_NamedShape)::DownCast(anIt.Value()); Handle(TNaming_NamedShape)::DownCast(anIt.Value());
if(anAttr.IsNull()) continue; if (anAttr.IsNull()) continue;
TopoDS_Shape S = anAttr->Get(); TopoDS_Shape S = anAttr->Get();
if( !S.IsEqual(TopoSh) ) continue; if (S.IsEqual(TopoSh)) {
TDF_Label L = anAttr->Label(); TDF_Label L = anAttr->Label();
Handle(TDataStd_Name) aName; Handle(TDataStd_Name) aName;
if(L.FindAttribute(TDataStd_Name::GetID(),aName)) { if (L.FindAttribute(TDataStd_Name::GetID(), aName)) {
aShapeName = aName->Get(); aShapeName = aName->Get();
HasName = true; HasName = true;
}
} }
} }
// END: try to find existed name for current shape
if(!HasName) { if (!HasName) {
// asv : 11.11.04 Introducing a more sofisticated method of name creation, just as // asv : 11.11.04 Introducing a more sofisticated method of name creation, just as
// it is done in GUI in GEOMBase::GetDefaultName() - not just add a Tag() == number // it is done in GUI in GEOMBase::GetDefaultName() - not just add a Tag() == number
// of objects in the study, but compute a number of objects with the same prefix // of objects in the study, but compute a number of objects with the same prefix

View File

@ -22,7 +22,6 @@
// File: IGESImport.cxx // File: IGESImport.cxx
// Created: Wed May 19 14:36:35 2004 // Created: Wed May 19 14:36:35 2004
// Author: Pavel TELKOV // Author: Pavel TELKOV
// <ptv@mutex.nnov.opencascade.com>
#include "utilities.h" #include "utilities.h"
@ -31,15 +30,26 @@
#include <IFSelect_ReturnStatus.hxx> #include <IFSelect_ReturnStatus.hxx>
#include <IGESControl_Reader.hxx> #include <IGESControl_Reader.hxx>
#include <IGESData_IGESModel.hxx> #include <IGESData_IGESModel.hxx>
#include <IGESData_IGESEntity.hxx>
#include <Interface_Static.hxx>
#include <Interface_InterfaceModel.hxx>
#include <XSControl_TransferReader.hxx>
#include <XSControl_WorkSession.hxx>
#include <Transfer_TransientProcess.hxx>
#include <Transfer_Binder.hxx>
#include <TransferBRep.hxx>
#include <TNaming_Builder.hxx>
#include <TDF_TagSource.hxx>
#include <TDataStd_Name.hxx>
#include <TDF_Label.hxx>
#include <TCollection_HAsciiString.hxx> #include <TCollection_HAsciiString.hxx>
#include <TopoDS_Shape.hxx> #include <TopoDS_Shape.hxx>
#include <TDF_Label.hxx>
#include <TopoDS_Vertex.hxx> #include <TopoDS_Vertex.hxx>
#include <BRep_Builder.hxx> #include <BRep_Builder.hxx>
#include <gp_Pnt.hxx> #include <gp_Pnt.hxx>
#include <Interface_Static.hxx>
#ifdef WNT #ifdef WNT
#if defined IGESIMPORT_EXPORTS || defined IGESImport_EXPORTS #if defined IGESIMPORT_EXPORTS || defined IGESImport_EXPORTS
@ -71,7 +81,7 @@ IGESIMPORT_EXPORT
TopoDS_Shape Import (const TCollection_AsciiString& theFileName, TopoDS_Shape Import (const TCollection_AsciiString& theFileName,
const TCollection_AsciiString& theFormatName, const TCollection_AsciiString& theFormatName,
TCollection_AsciiString& theError, TCollection_AsciiString& theError,
const TDF_Label&) const TDF_Label& theShapeLabel)
{ {
// Set "C" numeric locale to save numbers correctly // Set "C" numeric locale to save numbers correctly
Kernel_Utils::Localizer loc; Kernel_Utils::Localizer loc;
@ -84,19 +94,19 @@ IGESIMPORT_EXPORT
if (status == IFSelect_RetDone) { if (status == IFSelect_RetDone) {
if( theFormatName == "IGES_UNIT" ) { if (theFormatName == "IGES_UNIT") {
Handle(IGESData_IGESModel) aModel = Handle(IGESData_IGESModel) aModel =
Handle(IGESData_IGESModel)::DownCast(aReader.Model()); Handle(IGESData_IGESModel)::DownCast(aReader.Model());
gp_Pnt P(1.0,0.0,0.0); gp_Pnt P(1.0,0.0,0.0);
if(!aModel.IsNull()) { if (!aModel.IsNull()) {
Handle(TCollection_HAsciiString) aUnitName = Handle(TCollection_HAsciiString) aUnitName =
aModel->GlobalSection().UnitName(); aModel->GlobalSection().UnitName();
//cout<<"aUnitName = "<<aUnitName->ToCString()<<endl; //cout<<"aUnitName = "<<aUnitName->ToCString()<<endl;
//cout<<"aUnitFlag = "<<aModel->GlobalSection().UnitFlag()<<endl; //cout<<"aUnitFlag = "<<aModel->GlobalSection().UnitFlag()<<endl;
if( aUnitName->String()=="MM" ) { if (aUnitName->String()=="MM") {
P = gp_Pnt(0.001,0.0,0.0); P = gp_Pnt(0.001,0.0,0.0);
} }
else if( aUnitName->String()=="CM" ) { else if (aUnitName->String()=="CM") {
P = gp_Pnt(0.01,0.0,0.0); P = gp_Pnt(0.01,0.0,0.0);
} }
} }
@ -106,12 +116,12 @@ IGESIMPORT_EXPORT
aResShape = V; aResShape = V;
return aResShape; return aResShape;
} }
if( theFormatName == "IGES_SCALE" ) { if (theFormatName == "IGES_SCALE") {
//cout<<"need re-scale a model"<<endl; //cout<<"need re-scale a model"<<endl;
// set UnitFlag to 'meter' // set UnitFlag to 'meter'
Handle(IGESData_IGESModel) aModel = Handle(IGESData_IGESModel) aModel =
Handle(IGESData_IGESModel)::DownCast(aReader.Model()); Handle(IGESData_IGESModel)::DownCast(aReader.Model());
if(!aModel.IsNull()) { if (!aModel.IsNull()) {
IGESData_GlobalSection aGS = aModel->GlobalSection(); IGESData_GlobalSection aGS = aModel->GlobalSection();
aGS.SetUnitFlag(6); aGS.SetUnitFlag(6);
aModel->SetGlobalSection(aGS); aModel->SetGlobalSection(aGS);
@ -128,6 +138,38 @@ IGESIMPORT_EXPORT
MESSAGE("ImportIGES : count of shapes produced = " << aReader.NbShapes()); MESSAGE("ImportIGES : count of shapes produced = " << aReader.NbShapes());
aResShape = aReader.OneShape(); aResShape = aReader.OneShape();
// BEGIN: Store names of sub-shapes from file
Handle(Interface_InterfaceModel) Model = aReader.WS()->Model();
Handle(XSControl_TransferReader) TR = aReader.WS()->TransferReader();
if (!TR.IsNull()) {
Handle(Transfer_TransientProcess) TP = /*TransientProcess();*/TR->TransientProcess();
Standard_Integer nb = Model->NbEntities();
for (Standard_Integer i = 1; i <= nb; i++) {
Handle(IGESData_IGESEntity) ent = Handle(IGESData_IGESEntity)::DownCast(Model->Value(i));
if (ent.IsNull() || ! ent->HasName()) continue;
// find target shape
Handle(Transfer_Binder) binder = TP->Find(ent);
if (binder.IsNull()) continue;
TopoDS_Shape S = TransferBRep::ShapeResult(binder);
if (S.IsNull()) continue;
// create label and set shape
TDF_Label L;
TDF_TagSource aTag;
L = aTag.NewChild(theShapeLabel);
TNaming_Builder tnBuild (L);
tnBuild.Generated(S);
// set a name
TCollection_AsciiString string = ent->NameValue()->String();
string.LeftAdjust();
string.RightAdjust();
TCollection_ExtendedString str (string);
TDataStd_Name::Set(L, str);
}
}
// END: Store names
} else { } else {
// switch (status) { // switch (status) {
// case IFSelect_RetVoid: // case IFSelect_RetVoid:

View File

@ -16,13 +16,12 @@
# #
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
# #
# File : Makefile.in # File : Makefile.in
# Author : Pavel TELKOV # Author : Pavel TELKOV
# Modified by : Alexander BORODIN (OCN) - autotools usage # Modified by : Alexander BORODIN (OCN) - autotools usage
# Module : GEOM # Module : GEOM
# $Header$ # $Header$
#
include $(top_srcdir)/adm_local/unix/make_common_starter.am include $(top_srcdir)/adm_local/unix/make_common_starter.am
# Libraries targets # Libraries targets
@ -37,7 +36,7 @@ libIGESImport_la_CPPFLAGS = \
$(CAS_CPPFLAGS) \ $(CAS_CPPFLAGS) \
$(KERNEL_CXXFLAGS) $(KERNEL_CXXFLAGS)
libIGESImport_la_LDFLAGS = \ libIGESImport_la_LDFLAGS = \
$(STDLIB) \ $(STDLIB) \
$(CAS_LDPATH) -lTKIGES \ $(CAS_LDPATH) -lTKIGES -lTKCAF \
$(KERNEL_LDFLAGS) -lSALOMELocalTrace -lSALOMEBasics $(KERNEL_LDFLAGS) -lSALOMELocalTrace -lSALOMEBasics

View File

@ -43,4 +43,4 @@ libSTEPImport_la_CPPFLAGS = \
libSTEPImport_la_LDFLAGS = \ libSTEPImport_la_LDFLAGS = \
$(KERNEL_LDFLAGS) -lSALOMELocalTrace -lSALOMEBasics \ $(KERNEL_LDFLAGS) -lSALOMELocalTrace -lSALOMEBasics \
$(STDLIB) \ $(STDLIB) \
$(CAS_LDPATH) -lTKSTEP $(CAS_LDPATH) -lTKSTEP -lTKCAF

View File

@ -19,12 +19,10 @@
// //
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
// //
// File: STEPImport.cxx
// Created: Wed May 19 14:41:10 2004
// Author: Pavel TELKOV
// File: STEPImport.cxx
// Created: Wed May 19 14:41:10 2004
// Author: Pavel TELKOV
// <ptv@mutex.nnov.opencascade.com>
//
#include "utilities.h" #include "utilities.h"
#include <Basics_Utils.hxx> #include <Basics_Utils.hxx>
@ -34,13 +32,31 @@
#include <IFSelect_ReturnStatus.hxx> #include <IFSelect_ReturnStatus.hxx>
#include <STEPControl_Reader.hxx> #include <STEPControl_Reader.hxx>
#include <StepBasic_ProductDefinition.hxx>
#include <StepBasic_ProductDefinitionFormation.hxx>
#include <StepBasic_Product.hxx>
#include <Interface_InterfaceModel.hxx>
#include <XSControl_TransferReader.hxx>
#include <XSControl_WorkSession.hxx>
#include <Transfer_Binder.hxx>
#include <TNaming_Builder.hxx>
#include <TDataStd_Name.hxx>
#include <Transfer_TransientProcess.hxx>
#include <TransferBRep.hxx>
#include <TCollection_AsciiString.hxx> #include <TCollection_AsciiString.hxx>
#include <TopoDS_Compound.hxx> #include <TopoDS_Compound.hxx>
#include <TopoDS_Shape.hxx> #include <TopoDS_Shape.hxx>
#include <TDF_Label.hxx> #include <TDF_Label.hxx>
#include <TDF_Tool.hxx>
#include <Interface_Static.hxx> #include <Interface_Static.hxx>
#include <TopTools_IndexedMapOfShape.hxx>
#include <TopExp.hxx>
#include <TopoDS_Iterator.hxx>
#include <BRepTools.hxx>
#include <Standard_Failure.hxx> #include <Standard_Failure.hxx>
#include <Standard_ErrorHandler.hxx> // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC #include <Standard_ErrorHandler.hxx> // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC
@ -70,11 +86,11 @@
extern "C" extern "C"
{ {
STEPIMPORT_EXPORT STEPIMPORT_EXPORT
TopoDS_Shape Import (const TCollection_AsciiString& theFileName, TopoDS_Shape Import (const TCollection_AsciiString& theFileName,
const TCollection_AsciiString& /*theFormatName*/, const TCollection_AsciiString& /*theFormatName*/,
TCollection_AsciiString& theError, TCollection_AsciiString& theError,
const TDF_Label&) const TDF_Label& theShapeLabel)
{ {
MESSAGE("Import STEP model from file " << theFileName.ToCString()); MESSAGE("Import STEP model from file " << theFileName.ToCString());
// Set "C" numeric locale to save numbers correctly // Set "C" numeric locale to save numbers correctly
@ -87,7 +103,7 @@ STEPIMPORT_EXPORT
//VRV: OCC 4.0 migration //VRV: OCC 4.0 migration
TopoDS_Compound compound; TopoDS_Compound compound;
BRep_Builder B; BRep_Builder B;
B.MakeCompound( compound ); B.MakeCompound(compound);
try { try {
#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
OCC_CATCH_SIGNALS; OCC_CATCH_SIGNALS;
@ -95,13 +111,13 @@ STEPIMPORT_EXPORT
IFSelect_ReturnStatus status = aReader.ReadFile(theFileName.ToCString()); IFSelect_ReturnStatus status = aReader.ReadFile(theFileName.ToCString());
if (status == IFSelect_RetDone) { if (status == IFSelect_RetDone) {
Standard_Boolean failsonly = Standard_False ; Standard_Boolean failsonly = Standard_False;
aReader.PrintCheckLoad (failsonly, IFSelect_ItemsByEntity); aReader.PrintCheckLoad(failsonly, IFSelect_ItemsByEntity);
/* Root transfers */ /* Root transfers */
Standard_Integer nbr = aReader.NbRootsForTransfer(); Standard_Integer nbr = aReader.NbRootsForTransfer();
aReader.PrintCheckTransfer (failsonly, IFSelect_ItemsByEntity); aReader.PrintCheckTransfer(failsonly, IFSelect_ItemsByEntity);
for ( Standard_Integer n=1; n <= nbr; n++) { for (Standard_Integer n = 1; n <= nbr; n++) {
Standard_Boolean ok = aReader.TransferRoot(n); Standard_Boolean ok = aReader.TransferRoot(n);
/* Collecting resulting entities */ /* Collecting resulting entities */
Standard_Integer nbs = aReader.NbShapes(); Standard_Integer nbs = aReader.NbShapes();
@ -116,22 +132,76 @@ STEPIMPORT_EXPORT
break; break;
} }
for ( Standard_Integer i=1; i<=nbs; i++ ) { for (Standard_Integer i = 1; i <= nbs; i++) {
TopoDS_Shape aShape = aReader.Shape(i); TopoDS_Shape aShape = aReader.Shape(i);
if ( aShape.IsNull() ) { if (aShape.IsNull()) {
// THROW_SALOME_CORBA_EXCEPTION("Null shape in GEOM_Gen_i::ImportStep", SALOME::BAD_PARAM) ; // THROW_SALOME_CORBA_EXCEPTION("Null shape in GEOM_Gen_i::ImportStep", SALOME::BAD_PARAM) ;
//return aResShape; //return aResShape;
continue; continue;
} }
else { else {
B.Add( compound, aShape ) ; B.Add(compound, aShape);
} }
} }
} }
if ( aResShape.IsNull() ) if (aResShape.IsNull())
aResShape = compound; aResShape = compound;
} else { // BEGIN: Store names of sub-shapes from file
TopTools_IndexedMapOfShape anIndices;
TopExp::MapShapes(aResShape, anIndices);
Handle(Interface_InterfaceModel) Model = aReader.WS()->Model();
Handle(XSControl_TransferReader) TR = aReader.WS()->TransferReader();
if (!TR.IsNull()) {
Handle(Transfer_TransientProcess) TP = TR->TransientProcess();
Handle(Standard_Type) tPD = STANDARD_TYPE(StepBasic_ProductDefinition);
Standard_Integer nb = Model->NbEntities();
for (Standard_Integer ie = 1; ie <= nb; ie++) {
Handle(Standard_Transient) enti = Model->Value(ie);
if (enti->DynamicType() != tPD) continue;
Handle(StepBasic_ProductDefinition) PD =
Handle(StepBasic_ProductDefinition)::DownCast(enti);
if (PD.IsNull()) continue;
Handle(StepBasic_Product) Prod = PD->Formation()->OfProduct();
if (Prod->Name()->UsefullLength() <= 0) continue;
Handle(TCollection_HAsciiString) aName = Prod->Name();
TCollection_ExtendedString aNameExt (aName->ToCString());
// find target shape
Handle(Transfer_Binder) binder = TP->Find(enti);
if (binder.IsNull()) continue;
TopoDS_Shape S = TransferBRep::ShapeResult(binder);
if (S.IsNull()) continue;
// as PRODUCT can be included in the main shape
// several times, we look here for all iclusions.
Standard_Integer isub, nbSubs = anIndices.Extent();
for (isub = 1; isub <= nbSubs; isub++)
{
TopoDS_Shape aSub = anIndices.FindKey(isub);
if (aSub.IsPartner(S)) {
// create label and set shape
TDF_Label L;
TDF_TagSource aTag;
L = aTag.NewChild(theShapeLabel);
TNaming_Builder tnBuild (L);
//tnBuild.Generated(S);
tnBuild.Generated(aSub);
// set a name
TDataStd_Name::Set(L, aNameExt);
}
}
}
}
// END: Store names
}
else {
// switch (status) { // switch (status) {
// case IFSelect_RetVoid: // case IFSelect_RetVoid:
// theError = "Nothing created or No data to process"; // theError = "Nothing created or No data to process";