#include <Standard_Failure.hxx>
#include <Standard_ErrorHandler.hxx> // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC
-
-//=============================================================================
-/*!
- * GetShape()
- */
-//=============================================================================
-
-static TopoDS_Shape GetShape(const Handle(Standard_Transient) &theEnti,
- const Handle(Transfer_TransientProcess) &theTP)
-{
- TopoDS_Shape aResult;
- Handle(Transfer_Binder) aBinder = theTP->Find(theEnti);
-
- if (aBinder.IsNull()) {
- return aResult;
- }
-
- aResult = TransferBRep::ShapeResult(aBinder);
-
- return aResult;
-}
-
-//=============================================================================
-/*!
- * GetLabel()
- */
-//=============================================================================
-
-static TDF_Label GetLabel(const Handle(Standard_Transient) &theEnti,
- const TDF_Label &theShapeLabel,
- const TopoDS_Shape &aShape)
-{
- TDF_Label aResult;
-
- if (theEnti->IsKind
- (STANDARD_TYPE(StepGeom_GeometricRepresentationItem))) {
- // check all named shapes using iterator
- TDF_ChildIDIterator anIt
- (theShapeLabel, TDataStd_Name::GetID(), Standard_True);
-
- for (; anIt.More(); anIt.Next()) {
- Handle(TDataStd_Name) nameAttr =
- Handle(TDataStd_Name)::DownCast(anIt.Value());
-
- if (nameAttr.IsNull()) {
- continue;
- }
-
- TDF_Label aLab = nameAttr->Label();
- Handle(TNaming_NamedShape) shAttr;
-
- if (aLab.FindAttribute(TNaming_NamedShape::GetID(), shAttr) &&
- shAttr->Get().IsEqual(aShape)) {
- aResult = aLab;
- }
- }
- }
-
- // create label and set shape
- if (aResult.IsNull()) {
- TDF_TagSource aTag;
-
- aResult = aTag.NewChild(theShapeLabel);
-
- TNaming_Builder tnBuild (aResult);
-
- tnBuild.Generated(aShape);
- }
-
- return aResult;
-}
-
-//=============================================================================
-/*!
- * StoreName()
- */
-//=============================================================================
-
-static void StoreName(const Handle(Standard_Transient) &theEnti,
- const TopTools_IndexedMapOfShape &theIndices,
- const Handle(Transfer_TransientProcess) &theTP,
- const TDF_Label &theShapeLabel)
-{
- Handle(TCollection_HAsciiString) aName;
-
- if (theEnti->IsKind(STANDARD_TYPE(StepShape_TopologicalRepresentationItem)) ||
- theEnti->IsKind(STANDARD_TYPE(StepGeom_GeometricRepresentationItem))) {
- aName = Handle(StepRepr_RepresentationItem)::DownCast(theEnti)->Name();
- } else {
- Handle(StepBasic_ProductDefinition) PD =
- Handle(StepBasic_ProductDefinition)::DownCast(theEnti);
-
- if (PD.IsNull() == Standard_False) {
- Handle(StepBasic_Product) Prod = PD->Formation()->OfProduct();
- aName = Prod->Name();
- }
- }
-
- bool isValidName = false;
-
- if (aName.IsNull() == Standard_False) {
- isValidName = true;
-
- if (aName->UsefullLength() < 1) {
- isValidName = false;
- } else if (aName->UsefullLength() == 4 &&
- toupper (aName->Value(1)) == 'N' &&
- toupper (aName->Value(2)) == 'O' &&
- toupper (aName->Value(3)) == 'N' &&
- toupper (aName->Value(4)) == 'E') {
- // skip 'N0NE' name
- isValidName = false;
- } else {
- // special check to pass names like "Open CASCADE STEP translator 6.3 1"
- TCollection_AsciiString aSkipName ("Open CASCADE STEP translator");
-
- if (aName->Length() >= aSkipName.Length()) {
- if (aName->String().SubString
- (1, aSkipName.Length()).IsEqual(aSkipName)) {
- isValidName = false;
- }
- }
- }
- }
-
- if (isValidName) {
- TCollection_ExtendedString aNameExt (aName->ToCString());
-
- // find target shape
- TopoDS_Shape S = GetShape(theEnti, theTP);
-
- if (S.IsNull()) {
- return;
- }
-
- // as PRODUCT can be included in the main shape
- // several times, we look here for all iclusions.
- Standard_Integer isub, nbSubs = theIndices.Extent();
-
- for (isub = 1; isub <= nbSubs; isub++) {
- TopoDS_Shape aSub = theIndices.FindKey(isub);
-
- if (aSub.IsPartner(S)) {
- TDF_Label L = GetLabel(theEnti, theShapeLabel, aSub);
-
- // set a name
- TDataStd_Name::Set(L, aNameExt);
- }
- }
- }
-}
-
-//=============================================================================
-/*!
- * StoreMaterial()
- */
-//=============================================================================
-
-static void StoreMaterial
- (const Handle(Standard_Transient) &theEnti,
- const TopTools_IndexedMapOfShape &theIndices,
- const Handle(Transfer_TransientProcess) &theTP,
- const TDF_Label &theShapeLabel)
-{
- // Treat Product Definition Shape only.
- Handle(StepRepr_ProductDefinitionShape) aPDS =
- Handle(StepRepr_ProductDefinitionShape)::DownCast(theEnti);
- Handle(StepBasic_ProductDefinition) aProdDef;
-
- if(aPDS.IsNull() == Standard_False) {
- // Product Definition Shape ==> Product Definition
- aProdDef = aPDS->Definition().ProductDefinition();
- }
-
- if (aProdDef.IsNull() == Standard_False) {
- // Product Definition ==> Property Definition
- const Interface_Graph &aGraph = theTP->Graph();
- Interface_EntityIterator aSubs = aGraph.Sharings(aProdDef);
- TopoDS_Shape aShape;
-
- for(aSubs.Start(); aSubs.More(); aSubs.Next()) {
- Handle(StepRepr_PropertyDefinition) aPropD =
- Handle(StepRepr_PropertyDefinition)::DownCast(aSubs.Value());
-
- if(aPropD.IsNull() == Standard_False) {
- // Property Definition ==> Representation.
- Interface_EntityIterator aSubs1 = aGraph.Sharings(aPropD);
-
- for(aSubs1.Start(); aSubs1.More(); aSubs1.Next()) {
- Handle(StepRepr_PropertyDefinitionRepresentation) aPDR =
- Handle(StepRepr_PropertyDefinitionRepresentation)::
- DownCast(aSubs1.Value());
-
- if(aPDR.IsNull() == Standard_False) {
- // Property Definition ==> Material Name.
- Handle(StepRepr_Representation) aRepr = aPDR->UsedRepresentation();
-
- if(aRepr.IsNull() == Standard_False) {
- Standard_Integer ir;
-
- for(ir = 1; ir <= aRepr->NbItems(); ir++) {
- Handle(StepRepr_RepresentationItem) aRI = aRepr->ItemsValue(ir);
- Handle(StepRepr_DescriptiveRepresentationItem) aDRI =
- Handle(StepRepr_DescriptiveRepresentationItem)::DownCast(aRI);
-
- if(aDRI.IsNull() == Standard_False) {
- // Get shape from Product Definition
- Handle(TCollection_HAsciiString) aMatName = aDRI->Name();
-
- if(aMatName.IsNull() == Standard_False) {
- TCollection_ExtendedString
- aMatNameExt (aMatName->ToCString());
-
- if (aShape.IsNull()) {
- // Get the shape.
- aShape = GetShape(aProdDef, theTP);
-
- if (aShape.IsNull()) {
- return;
- }
- }
-
- // as PRODUCT can be included in the main shape
- // several times, we look here for all iclusions.
- Standard_Integer isub, nbSubs = theIndices.Extent();
-
- for (isub = 1; isub <= nbSubs; isub++) {
- TopoDS_Shape aSub = theIndices.FindKey(isub);
-
- if (aSub.IsPartner(aShape)) {
- TDF_Label aLabel =
- GetLabel(aProdDef, theShapeLabel, aSub);
-
- // set a name
- TDataStd_Comment::Set(aLabel, aMatNameExt);
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-}
-
-//=============================================================================
-/*!
- * Import()
- */
-//=============================================================================
-
-Handle(TCollection_HAsciiString) GetValue (const TCollection_AsciiString& theFileName,
- const TCollection_AsciiString& theParameterName,
- TCollection_AsciiString& theError)
-{
- Handle(TCollection_HAsciiString) aValue;
-
- if (theParameterName != "LEN_UNITS") {
- theError = theParameterName + " parameter reading is not supported by STEP plugin";
- return aValue;
- }
-
- // Set "C" numeric locale to save numbers correctly
- // Kernel_Utils::Localizer loc;
-
- STEPControl_Reader aReader;
-
- Interface_Static::SetCVal("xstep.cascade.unit","M");
- Interface_Static::SetIVal("read.step.ideas", 1);
- Interface_Static::SetIVal("read.step.nonmanifold", 1);
-
- try {
-#if OCC_VERSION_LARGE > 0x06010000
- OCC_CATCH_SIGNALS;
-#endif
- IFSelect_ReturnStatus status = aReader.ReadFile(theFileName.ToCString());
- if (status == IFSelect_RetDone) {
- TColStd_SequenceOfAsciiString anUnitLengthNames;
- TColStd_SequenceOfAsciiString anUnitAngleNames;
- TColStd_SequenceOfAsciiString anUnitSolidAngleNames;
- aReader.FileUnits(anUnitLengthNames, anUnitAngleNames, anUnitSolidAngleNames);
- if (anUnitLengthNames.Length() > 0) {
- aValue = new TCollection_HAsciiString( anUnitLengthNames.First() );
- /*
- TCollection_AsciiString aLenUnits = anUnitLengthNames.First();
- if (aLenUnits == "millimetre")
- aValue = new TCollection_HAsciiString ("MM");
- else if (aLenUnits == "centimetre")
- aValue = new TCollection_HAsciiString ("CM");
- else if (aLenUnits == "metre")
- aValue = new TCollection_HAsciiString ("M");
- else if (aLenUnits == "INCH")
- aValue = new TCollection_HAsciiString ("INCH");
- // TODO (for other units than mm, cm, m or inch)
- //else if (aLenUnits == "")
- // aValue = new TCollection_HAsciiString ("");
-
- // tmp begin
- //std::cout << "$$$ --- " << anUnitLengthNames.First();
- //for (int ii = 2; ii <= anUnitLengthNames.Length(); ii++)
- // std::cout << ", " << anUnitLengthNames.Value(ii);
- //std::cout << std::endl;
- // tmp end
- */
- }
- }
- else {
- theError = theFileName + " reading failed";
- }
- }
- catch (Standard_Failure) {
- Handle(Standard_Failure) aFail = Standard_Failure::Caught();
- theError = aFail->GetMessageString();
- }
-
- return aValue;
-}
-
std::shared_ptr<GeomAPI_Shape> STEPImport(const std::string& theFileName,
const std::string& theFormatName,
std::string& theError)