]> OCCT Git - occt.git/commitdiff
0033301: Data Exchange, DE Wrapper - Replacing own XDEDRAW transfer commands to DE
authordpasukhi <dpasukhi@opencascade.com>
Wed, 4 Jan 2023 14:03:00 +0000 (14:03 +0000)
committerdpasukhi <dpasukhi@opencascade.com>
Mon, 23 Jan 2023 22:56:21 +0000 (22:56 +0000)
Commit only for testing OCCT

24 files changed:
src/DE/DE_Provider.cxx
src/DE/DE_Provider.hxx
src/DE/DE_Wrapper.cxx
src/DE/DE_Wrapper.hxx
src/DEBRepCascade/DEBRepCascade_Provider.cxx
src/DEBRepCascade/DEBRepCascade_Provider.hxx
src/DEXCAFCascade/DEXCAFCascade_Provider.cxx
src/DEXCAFCascade/DEXCAFCascade_Provider.hxx
src/IGESCAFControl/IGESCAFControl_Provider.cxx
src/IGESCAFControl/IGESCAFControl_Provider.hxx
src/RWGltf/RWGltf_Provider.cxx
src/RWGltf/RWGltf_Provider.hxx
src/RWObj/RWObj_Provider.cxx
src/RWObj/RWObj_Provider.hxx
src/RWPly/RWPly_Provider.cxx
src/RWPly/RWPly_Provider.hxx
src/RWStl/RWStl_Provider.cxx
src/RWStl/RWStl_Provider.hxx
src/STEPCAFControl/STEPCAFControl_ConfigurationNode.hxx
src/STEPCAFControl/STEPCAFControl_Provider.cxx
src/STEPCAFControl/STEPCAFControl_Provider.hxx
src/Vrml/Vrml_Provider.cxx
src/Vrml/Vrml_Provider.hxx
src/XDEDRAW/XDEDRAW_Common.cxx

index aee45f7f228b249d0bc83986c64d0a9866946389..606e5af854d08faff574da4213350b5c7e8806eb 100644 (file)
@@ -69,38 +69,6 @@ Standard_Boolean DE_Provider::Write(const TCollection_AsciiString& thePath,
   return Standard_False;
 }
 
-//=======================================================================
-// function : Read
-// purpose  :
-//=======================================================================
-Standard_Boolean DE_Provider::Read(const TCollection_AsciiString& thePath,
-                                   const Handle(TDocStd_Document)& theDocument,
-                                   const Message_ProgressRange& theProgress)
-{
-  (void)thePath;
-  (void)theDocument;
-  (void)theProgress;
-  Message::SendFail() << "Error: provider " << GetFormat() <<
-    " " << GetVendor() << " doesn't support read operation";
-  return Standard_False;
-}
-
-//=======================================================================
-// function : Write
-// purpose  :
-//=======================================================================
-Standard_Boolean DE_Provider::Write(const TCollection_AsciiString& thePath,
-                                    const Handle(TDocStd_Document)& theDocument,
-                                    const Message_ProgressRange& theProgress)
-{
-  (void)thePath;
-  (void)theDocument;
-  (void)theProgress;
-  Message::SendFail() << "Error: provider " << GetFormat() <<
-    " " << GetVendor() << " doesn't support write operation";
-  return Standard_False;
-}
-
 //=======================================================================
 // function : Read
 // purpose  :
@@ -136,35 +104,3 @@ Standard_Boolean DE_Provider::Write(const TCollection_AsciiString& thePath,
     " " << GetVendor() << " doesn't support write operation";
   return Standard_False;
 }
-
-//=======================================================================
-// function : Read
-// purpose  :
-//=======================================================================
-Standard_Boolean DE_Provider::Read(const TCollection_AsciiString& thePath,
-                                   TopoDS_Shape& theShape,
-                                   const Message_ProgressRange& theProgress)
-{
-  (void)thePath;
-  (void)theShape;
-  (void)theProgress;
-  Message::SendFail() << "Error: provider " << GetFormat() <<
-    " " << GetVendor() << " doesn't support read operation";
-  return Standard_False;
-}
-
-//=======================================================================
-// function : Write
-// purpose  :
-//=======================================================================
-Standard_Boolean DE_Provider::Write(const TCollection_AsciiString& thePath,
-                                    const TopoDS_Shape& theShape,
-                                    const Message_ProgressRange& theProgress)
-{
-  (void)thePath;
-  (void)theShape;
-  (void)theProgress;
-  Message::SendFail() << "Error: provider " << GetFormat() <<
-    " " << GetVendor() << " doesn't support write operation";
-  return Standard_False;
-}
index d8cdd74bc63e8fb34972a71db9ea60ed69260daa..c67175c1bb94900ac437647af3ac8411ee8edd5b 100644 (file)
@@ -77,24 +77,6 @@ public:
                                                  Handle(XSControl_WorkSession)& theWS,
                                                  const Message_ProgressRange& theProgress = Message_ProgressRange());
 
-  //! Reads a CAD file, according internal configuration
-  //! @param[in] thePath path to the import CAD file
-  //! @param[out] theDocument document to save result
-  //! @param theProgress[in] progress indicator
-  //! @return True if Read was successful
-  Standard_EXPORT virtual Standard_Boolean Read(const TCollection_AsciiString& thePath,
-                                                const Handle(TDocStd_Document)& theDocument,
-                                                const Message_ProgressRange& theProgress = Message_ProgressRange());
-
-  //! Writes a CAD file, according internal configuration
-  //! @param[in] thePath path to the export CAD file
-  //! @param[out] theDocument document to export
-  //! @param theProgress[in] progress indicator
-  //! @return True if Write was successful
-  Standard_EXPORT virtual Standard_Boolean Write(const TCollection_AsciiString& thePath,
-                                                 const Handle(TDocStd_Document)& theDocument,
-                                                 const Message_ProgressRange& theProgress = Message_ProgressRange());
-
   //! Reads a CAD file, according internal configuration
   //! @param[in] thePath path to the import CAD file
   //! @param[out] theShape shape to save result
@@ -117,24 +99,6 @@ public:
                                                  Handle(XSControl_WorkSession)& theWS,
                                                  const Message_ProgressRange& theProgress = Message_ProgressRange());
 
-  //! Reads a CAD file, according internal configuration
-  //! @param[in] thePath path to the import CAD file
-  //! @param[out] theShape shape to save result
-  //! @param theProgress[in] progress indicator
-  //! @return True if Read was successful
-  Standard_EXPORT virtual Standard_Boolean Read(const TCollection_AsciiString& thePath,
-                                                TopoDS_Shape& theShape,
-                                                const Message_ProgressRange& theProgress = Message_ProgressRange());
-
-  //! Writes a CAD file, according internal configuration
-  //! @param[in] thePath path to the export CAD file
-  //! @param[out] theShape shape to export
-  //! @param theProgress[in] progress indicator
-  //! @return True if Write was successful
-  Standard_EXPORT virtual Standard_Boolean Write(const TCollection_AsciiString& thePath,
-                                                 const TopoDS_Shape& theShape,
-                                                 const Message_ProgressRange& theProgress = Message_ProgressRange());
-
 public:
 
   //! Gets CAD format name of associated provider
index 091fde72d653665f987c32c0ff45aed884494ee6..f1ceefffc3ced193a7565ebdd0c2f611f9ec98eb 100644 (file)
@@ -31,7 +31,7 @@ namespace
 {
   static const TCollection_AsciiString& THE_CONFIGURATION_SCOPE()
   {
-    static const TCollection_AsciiString aScope ("global");
+    static const TCollection_AsciiString aScope("global");
     return aScope;
   }
 
@@ -109,10 +109,6 @@ Standard_Boolean DE_Wrapper::Read(const TCollection_AsciiString& thePath,
   {
     return Standard_False;
   }
-  if (theWS.IsNull())
-  {
-    return Read(thePath, theDocument, theProgress);
-  }
   Handle(DE_Provider) aProvider;
   if (!FindProvider(thePath, Standard_True, aProvider))
   {
@@ -134,10 +130,6 @@ Standard_Boolean DE_Wrapper::Write(const TCollection_AsciiString& thePath,
   {
     return Standard_False;
   }
-  if (theWS.IsNull())
-  {
-    return Write(thePath, theDocument, theProgress);
-  }
   Handle(DE_Provider) aProvider;
   if (!FindProvider(thePath, Standard_False, aProvider))
   {
@@ -146,46 +138,6 @@ Standard_Boolean DE_Wrapper::Write(const TCollection_AsciiString& thePath,
   return aProvider->Write(thePath, theDocument, theWS, theProgress);
 }
 
-//=======================================================================
-// function : Read
-// purpose  :
-//=======================================================================
-Standard_Boolean DE_Wrapper::Read(const TCollection_AsciiString& thePath,
-                                  const Handle(TDocStd_Document)& theDocument,
-                                  const Message_ProgressRange& theProgress)
-{
-  if (theDocument.IsNull())
-  {
-    return Standard_False;
-  }
-  Handle(DE_Provider) aProvider;
-  if (!FindProvider(thePath, Standard_True, aProvider))
-  {
-    return Standard_False;
-  }
-  return aProvider->Read(thePath, theDocument, theProgress);
-}
-
-//=======================================================================
-// function : Write
-// purpose  :
-//=======================================================================
-Standard_Boolean DE_Wrapper::Write(const TCollection_AsciiString& thePath,
-                                   const Handle(TDocStd_Document)& theDocument,
-                                   const Message_ProgressRange& theProgress)
-{
-  if (theDocument.IsNull())
-  {
-    return Standard_False;
-  }
-  Handle(DE_Provider) aProvider;
-  if (!FindProvider(thePath, Standard_False, aProvider))
-  {
-    return Standard_False;
-  }
-  return aProvider->Write(thePath, theDocument, theProgress);
-}
-
 //=======================================================================
 // function : Read
 // purpose  :
@@ -195,10 +147,6 @@ Standard_Boolean DE_Wrapper::Read(const TCollection_AsciiString& thePath,
                                   Handle(XSControl_WorkSession)& theWS,
                                   const Message_ProgressRange& theProgress)
 {
-  if (theWS.IsNull())
-  {
-    return Read(thePath, theShape, theProgress);
-  }
   Handle(DE_Provider) aProvider;
   if (!FindProvider(thePath, Standard_True, aProvider))
   {
@@ -216,10 +164,6 @@ Standard_Boolean DE_Wrapper::Write(const TCollection_AsciiString& thePath,
                                    Handle(XSControl_WorkSession)& theWS,
                                    const Message_ProgressRange& theProgress)
 {
-  if (theWS.IsNull())
-  {
-    return Write(thePath, theShape, theProgress);
-  }
   Handle(DE_Provider) aProvider;
   if (!FindProvider(thePath, Standard_False, aProvider))
   {
@@ -228,39 +172,6 @@ Standard_Boolean DE_Wrapper::Write(const TCollection_AsciiString& thePath,
   return aProvider->Write(thePath, theShape, theWS, theProgress);
 }
 
-//=======================================================================
-// function : Read
-// purpose  :
-//=======================================================================
-Standard_Boolean DE_Wrapper::Read(const TCollection_AsciiString& thePath,
-                                  TopoDS_Shape& theShape,
-                                  const Message_ProgressRange& theProgress)
-{
-
-  Handle(DE_Provider) aProvider;
-  if (!FindProvider(thePath, Standard_True, aProvider))
-  {
-    return Standard_False;
-  }
-  return aProvider->Read(thePath, theShape, theProgress);
-}
-
-//=======================================================================
-// function : Write
-// purpose  :
-//=======================================================================
-Standard_Boolean DE_Wrapper::Write(const TCollection_AsciiString& thePath,
-                                   const TopoDS_Shape& theShape,
-                                   const Message_ProgressRange& theProgress)
-{
-  Handle(DE_Provider) aProvider;
-  if (!FindProvider(thePath, Standard_False, aProvider))
-  {
-    return Standard_False;
-  }
-  return aProvider->Write(thePath, theShape, theProgress);
-}
-
 //=======================================================================
 // function : Load
 // purpose  :
index eb5fedb91e9e2256737c9b680656fae0e7f05d96..f6281d28a903f4d9100b5498bf09e84c9d3dd858 100644 (file)
@@ -94,24 +94,6 @@ public:
                                          Handle(XSControl_WorkSession)& theWS,
                                          const Message_ProgressRange& theProgress = Message_ProgressRange());
 
-  //! Reads a CAD file, according internal configuration
-  //! @param[in] thePath path to the import CAD file
-  //! @param[out] theDocument document to save result
-  //! @param theProgress[in] progress indicator
-  //! @return true if Read operation has ended correctly
-  Standard_EXPORT Standard_Boolean Read(const TCollection_AsciiString& thePath,
-                                        const Handle(TDocStd_Document)& theDocument,
-                                        const Message_ProgressRange& theProgress = Message_ProgressRange());
-
-  //! Writes a CAD file, according internal configuration
-  //! @param[in] thePath path to the export CAD file
-  //! @param[out] theDocument document to export
-  //! @param theProgress[in] progress indicator
-  //! @return true if Write operation has ended correctly
-  Standard_EXPORT Standard_Boolean Write(const TCollection_AsciiString& thePath,
-                                         const Handle(TDocStd_Document)& theDocument,
-                                         const Message_ProgressRange& theProgress = Message_ProgressRange());
-
   //! Reads a CAD file, according internal configuration
   //! @param[in] thePath path to the import CAD file
   //! @param[out] theShape shape to save result
@@ -134,24 +116,6 @@ public:
                                          Handle(XSControl_WorkSession)& theWS,
                                          const Message_ProgressRange& theProgress = Message_ProgressRange());
 
-  //! Reads a CAD file, according internal configuration
-  //! @param[in] thePath path to the import CAD file
-  //! @param[out] theShape shape to save result
-  //! @param theProgress[in] progress indicator
-  //! @return true if Read operation has ended correctly
-  Standard_EXPORT Standard_Boolean Read(const TCollection_AsciiString& thePath,
-                                        TopoDS_Shape& theShape,
-                                        const Message_ProgressRange& theProgress = Message_ProgressRange());
-
-  //! Writes a CAD file, according internal configuration
-  //! @param[in] thePath path to the export CAD file
-  //! @param[out] theShape shape to export
-  //! @param theProgress[in] progress indicator
-  //! @return true if Write operation has ended correctly
-  Standard_EXPORT Standard_Boolean Write(const TCollection_AsciiString& thePath,
-                                         const TopoDS_Shape& theShape,
-                                         const Message_ProgressRange& theProgress = Message_ProgressRange());
-
 public:
 
   //! Updates values according the resource file
index 200540e35ed2d4dc4ce148b28e57343ee6444acb..8cfb238b99f802b12b22e36c0885bb5b7c94ee3f 100644 (file)
@@ -51,38 +51,14 @@ bool DEBRepCascade_Provider::Read(const TCollection_AsciiString& thePath,
                                   const Message_ProgressRange& theProgress)
 {
   (void)theWS;
-  return Read(thePath, theDocument, theProgress);
-}
-
-//=======================================================================
-// function : Write
-// purpose  :
-//=======================================================================
-bool DEBRepCascade_Provider::Write(const TCollection_AsciiString& thePath,
-                                   const Handle(TDocStd_Document)& theDocument,
-                                   Handle(XSControl_WorkSession)& theWS,
-                                   const Message_ProgressRange& theProgress)
-{
-  (void)theWS;
-  return Write(thePath, theDocument, theProgress);
-}
-
-//=======================================================================
-// function : Read
-// purpose  :
-//=======================================================================
-bool DEBRepCascade_Provider::Read(const TCollection_AsciiString& thePath,
-                                  const Handle(TDocStd_Document)& theDocument,
-                                  const Message_ProgressRange& theProgress)
-{
-  if(theDocument.IsNull())
+  if (theDocument.IsNull())
   {
     Message::SendFail() << "Error in the DEBRepCascade_Provider during reading the file " <<
       thePath << "\t: theDocument shouldn't be null";
     return false;
   }
   TopoDS_Shape aShape;
-  if (!Read(thePath, aShape, theProgress))
+  if (!Read(thePath, aShape, theWS, theProgress))
   {
     return false;
   }
@@ -97,8 +73,10 @@ bool DEBRepCascade_Provider::Read(const TCollection_AsciiString& thePath,
 //=======================================================================
 bool DEBRepCascade_Provider::Write(const TCollection_AsciiString& thePath,
                                    const Handle(TDocStd_Document)& theDocument,
+                                   Handle(XSControl_WorkSession)& theWS,
                                    const Message_ProgressRange& theProgress)
 {
+  (void)theWS;
   TopoDS_Shape aShape;
   TDF_LabelSequence aLabels;
   Handle(XCAFDoc_ShapeTool) aSTool = XCAFDoc_DocumentTool::ShapeTool(theDocument->Main());
@@ -126,7 +104,7 @@ bool DEBRepCascade_Provider::Write(const TCollection_AsciiString& thePath,
     }
     aShape = aComp;
   }
-  return Write(thePath, aShape, theProgress);
+  return Write(thePath, aShape, theWS, theProgress);
 }
 
 //=======================================================================
@@ -139,30 +117,6 @@ bool DEBRepCascade_Provider::Read(const TCollection_AsciiString& thePath,
                                   const Message_ProgressRange& theProgress)
 {
   (void)theWS;
-  return Read(thePath, theShape, theProgress);
-}
-
-//=======================================================================
-// function : Write
-// purpose  :
-//=======================================================================
-bool DEBRepCascade_Provider::Write(const TCollection_AsciiString& thePath,
-                                   const TopoDS_Shape& theShape,
-                                   Handle(XSControl_WorkSession)& theWS,
-                                   const Message_ProgressRange& theProgress)
-{
-  (void)theWS;
-  return Write(thePath, theShape, theProgress);
-}
-
-//=======================================================================
-// function : Read
-// purpose  :
-//=======================================================================
-bool DEBRepCascade_Provider::Read(const TCollection_AsciiString& thePath,
-                                  TopoDS_Shape& theShape,
-                                  const Message_ProgressRange& theProgress)
-{
   bool isBinaryFormat = true;
   {
     // probe file header to recognize format
@@ -214,8 +168,10 @@ bool DEBRepCascade_Provider::Read(const TCollection_AsciiString& thePath,
 //=======================================================================
 bool DEBRepCascade_Provider::Write(const TCollection_AsciiString& thePath,
                                    const TopoDS_Shape& theShape,
+                                   Handle(XSControl_WorkSession)& theWS,
                                    const Message_ProgressRange& theProgress)
 {
+  (void)theWS;
   if (GetNode().IsNull() || !GetNode()->IsKind(STANDARD_TYPE(DEBRepCascade_ConfigurationNode)))
   {
     Message::SendFail() << "Error in the DEBRepCascade_Provider during writing the file " <<
@@ -232,7 +188,7 @@ bool DEBRepCascade_Provider::Write(const TCollection_AsciiString& thePath,
         thePath << "\t: Unknown format version";
       return false;
     }
-    if (aNode->InternalParameters.WriteNormals && 
+    if (aNode->InternalParameters.WriteNormals &&
         aNode->InternalParameters.WriteVersionBin < BinTools_FormatVersion_VERSION_4)
     {
       Message::SendFail() << "Error in the DEBRepCascade_Provider during writing the file " <<
@@ -272,7 +228,6 @@ bool DEBRepCascade_Provider::Write(const TCollection_AsciiString& thePath,
       return false;
     }
   }
-
   return true;
 }
 
index 606e086222b3d022d85c1b1a5c97c0b38315169a..4398a9d63cbdb7cc3c43890213bc9aae98814372 100644 (file)
@@ -64,24 +64,6 @@ public:
                                      Handle(XSControl_WorkSession)& theWS,
                                      const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
 
-  //! Reads a CAD file, according internal configuration
-  //! @param[in] thePath path to the import CAD file
-  //! @param[out] theDocument document to save result
-  //! @param theProgress[in] progress indicator
-  //! @return true if Read operation has ended correctly
-  Standard_EXPORT virtual bool Read(const TCollection_AsciiString& thePath,
-                                    const Handle(TDocStd_Document)& theDocument,
-                                    const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
-  //! Writes a CAD file, according internal configuration
-  //! @param[in] thePath path to the export CAD file
-  //! @param[out] theDocument document to export
-  //! @param theProgress[in] progress indicator
-  //! @return true if Write operation has ended correctly
-  Standard_EXPORT virtual bool Write(const TCollection_AsciiString& thePath,
-                                     const Handle(TDocStd_Document)& theDocument,
-                                     const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
   //! Reads a CAD file, according internal configuration
   //! @param[in] thePath path to the import CAD file
   //! @param[out] theShape shape to save result
@@ -104,24 +86,6 @@ public:
                                      Handle(XSControl_WorkSession)& theWS,
                                      const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
 
-  //! Reads a CAD file, according internal configuration
-  //! @param[in] thePath path to the import CAD file
-  //! @param[out] theShape shape to save result
-  //! @param theProgress[in] progress indicator
-  //! @return true if Read operation has ended correctly
-  Standard_EXPORT virtual bool Read(const TCollection_AsciiString& thePath,
-                                    TopoDS_Shape& theShape,
-                                    const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
-  //! Writes a CAD file, according internal configuration
-  //! @param[in] thePath path to the export CAD file
-  //! @param[out] theShape shape to export
-  //! @param theProgress[in] progress indicator
-  //! @return true if Write operation has ended correctly
-  Standard_EXPORT virtual bool Write(const TCollection_AsciiString& thePath,
-                                     const TopoDS_Shape& theShape,
-                                     const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
 public:
 
   //! Gets CAD format name of associated provider
index cef6ceb014f02ecfd669a96313436c24e4916247..eca9bba75610d98a89050e2567489947f3906615 100644 (file)
@@ -59,30 +59,6 @@ bool DEXCAFCascade_Provider::Read(const TCollection_AsciiString& thePath,
                                   const Message_ProgressRange& theProgress)
 {
   (void)theWS;
-  return Read(thePath, theDocument, theProgress);
-}
-
-//=======================================================================
-// function : Write
-// purpose  :
-//=======================================================================
-bool DEXCAFCascade_Provider::Write(const TCollection_AsciiString& thePath,
-                                   const Handle(TDocStd_Document)& theDocument,
-                                   Handle(XSControl_WorkSession)& theWS,
-                                   const Message_ProgressRange& theProgress)
-{
-  (void)theWS;
-  return Write(thePath, theDocument, theProgress);
-}
-
-//=======================================================================
-// function : Read
-// purpose  :
-//=======================================================================
-bool DEXCAFCascade_Provider::Read(const TCollection_AsciiString& thePath,
-                                  const Handle(TDocStd_Document)& theDocument,
-                                  const Message_ProgressRange& theProgress)
-{
   if (theDocument.IsNull())
   {
     Message::SendFail() << "Error in the DEXCAFCascade_Provider during reading the file " <<
@@ -141,8 +117,10 @@ bool DEXCAFCascade_Provider::Read(const TCollection_AsciiString& thePath,
 //=======================================================================
 bool DEXCAFCascade_Provider::Write(const TCollection_AsciiString& thePath,
                                    const Handle(TDocStd_Document)& theDocument,
+                                   Handle(XSControl_WorkSession)& theWS,
                                    const Message_ProgressRange& theProgress)
 {
+  (void)theWS;
   Handle(TDocStd_Application) anApp = new TDocStd_Application();
   BinXCAFDrivers::DefineFormat(anApp);
   PCDM_StoreStatus aStatus = PCDM_SS_Doc_IsNull;
@@ -211,30 +189,6 @@ bool DEXCAFCascade_Provider::Read(const TCollection_AsciiString& thePath,
                                   const Message_ProgressRange& theProgress)
 {
   (void)theWS;
-  return Read(thePath, theShape, theProgress);
-}
-
-//=======================================================================
-// function : Write
-// purpose  :
-//=======================================================================
-bool DEXCAFCascade_Provider::Write(const TCollection_AsciiString& thePath,
-                                   const TopoDS_Shape& theShape,
-                                   Handle(XSControl_WorkSession)& theWS,
-                                   const Message_ProgressRange& theProgress)
-{
-  (void)theWS;
-  return Write(thePath, theShape, theProgress);
-}
-
-//=======================================================================
-// function : Read
-// purpose  :
-//=======================================================================
-bool DEXCAFCascade_Provider::Read(const TCollection_AsciiString& thePath,
-                                  TopoDS_Shape& theShape,
-                                  const Message_ProgressRange& theProgress)
-{
   if (GetNode().IsNull() || !GetNode()->IsKind(STANDARD_TYPE(DEXCAFCascade_ConfigurationNode)))
   {
     Message::SendFail() << "Error in the DEXCAFCascade_Provider during reading the file " << thePath
@@ -245,7 +199,7 @@ bool DEXCAFCascade_Provider::Read(const TCollection_AsciiString& thePath,
   Handle(TDocStd_Application) anApp = new TDocStd_Application();
   BinXCAFDrivers::DefineFormat(anApp);
   anApp->NewDocument("BinXCAF", aDocument);
-  Read(thePath, aDocument, theProgress);
+  Read(thePath, aDocument, theWS, theProgress);
   TDF_LabelSequence aLabels;
   Handle(XCAFDoc_ShapeTool) aSTool = XCAFDoc_DocumentTool::ShapeTool(aDocument->Main());
   aSTool->GetFreeShapes(aLabels);
@@ -281,12 +235,14 @@ bool DEXCAFCascade_Provider::Read(const TCollection_AsciiString& thePath,
 //=======================================================================
 bool DEXCAFCascade_Provider::Write(const TCollection_AsciiString& thePath,
                                    const TopoDS_Shape& theShape,
+                                   Handle(XSControl_WorkSession)& theWS,
                                    const Message_ProgressRange& theProgress)
 {
+  (void)theWS;
   Handle(TDocStd_Document) aDoc = new TDocStd_Document("BinXCAF");
   Handle(XCAFDoc_ShapeTool) aShTool = XCAFDoc_DocumentTool::ShapeTool(aDoc->Main());
   aShTool->AddShape(theShape);
-  return Write(thePath, aDoc, theProgress);
+  return Write(thePath, aDoc, theWS, theProgress);
 }
 
 //=======================================================================
index c252c9c1069c5c0eb9e630b7d99765b25a791a46..4ea144bea76b14ea4f74d840421f52bb6eda4839 100644 (file)
@@ -64,24 +64,6 @@ public:
                                      Handle(XSControl_WorkSession)& theWS,
                                      const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
 
-  //! Reads a CAD file, according internal configuration
-  //! @param[in] thePath path to the import CAD file
-  //! @param[out] theDocument document to save result
-  //! @param theProgress[in] progress indicator
-  //! @return true if Read operation has ended correctly
-  Standard_EXPORT virtual bool Read(const TCollection_AsciiString& thePath,
-                                    const Handle(TDocStd_Document)& theDocument,
-                                    const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
-  //! Writes a CAD file, according internal configuration
-  //! @param[in] thePath path to the export CAD file
-  //! @param[out] theDocument document to export
-  //! @param theProgress[in] progress indicator
-  //! @return true if Write operation has ended correctly
-  Standard_EXPORT virtual bool Write(const TCollection_AsciiString& thePath,
-                                     const Handle(TDocStd_Document)& theDocument,
-                                     const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
   //! Reads a CAD file, according internal configuration
   //! @param[in] thePath path to the import CAD file
   //! @param[out] theShape shape to save result
@@ -104,24 +86,6 @@ public:
                                      Handle(XSControl_WorkSession)& theWS,
                                      const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
 
-  //! Reads a CAD file, according internal configuration
-  //! @param[in] thePath path to the import CAD file
-  //! @param[out] theShape shape to save result
-  //! @param theProgress[in] progress indicator
-  //! @return true if Read operation has ended correctly
-  Standard_EXPORT virtual bool Read(const TCollection_AsciiString& thePath,
-                                    TopoDS_Shape& theShape,
-                                    const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
-  //! Writes a CAD file, according internal configuration
-  //! @param[in] thePath path to the export CAD file
-  //! @param[out] theShape shape to export
-  //! @param theProgress[in] progress indicator
-  //! @return true if Write operation has ended correctly
-  Standard_EXPORT virtual bool Write(const TCollection_AsciiString& thePath,
-                                     const TopoDS_Shape& theShape,
-                                     const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
 public:
 
   //! Gets CAD format name of associated provider
index 403c9ec7558fc3c6ff97c01f848ed7f8678eb637..256c61d86b3137e4f5cd42d4928fdf61cb0e30ec 100644 (file)
@@ -55,7 +55,8 @@ void IGESCAFControl_Provider::personizeWS(Handle(XSControl_WorkSession)& theWS)
       << " Null work session, use internal temporary session";
     theWS = new XSControl_WorkSession();
   }
-  Handle(IGESControl_Controller) aCntrl = Handle(IGESControl_Controller)::DownCast(theWS->NormAdaptor());
+  Handle(IGESControl_Controller) aCntrl =
+    Handle(IGESControl_Controller)::DownCast(theWS->NormAdaptor());
   if (aCntrl.IsNull())
   {
     theWS->SelectNorm("IGES");
@@ -68,44 +69,85 @@ void IGESCAFControl_Provider::personizeWS(Handle(XSControl_WorkSession)& theWS)
 //=======================================================================
 void IGESCAFControl_Provider::initStatic(const Handle(DE_ConfigurationNode)& theNode)
 {
-  Handle(IGESCAFControl_ConfigurationNode) aNode = Handle(IGESCAFControl_ConfigurationNode)::DownCast(theNode);
+  Handle(IGESCAFControl_ConfigurationNode) aNode =
+    Handle(IGESCAFControl_ConfigurationNode)::DownCast(theNode);
   IGESData::Init();
-
+  if (!myToUpdateStaticParameters)
+  {
+    return;
+  }
   // Get previous values
-  myOldValues.ReadBSplineContinuity = (IGESCAFControl_ConfigurationNode::ReadMode_BSplineContinuity)Interface_Static::IVal("read.iges.bspline.continuity");
-  myOldValues.ReadPrecisionMode = (IGESCAFControl_ConfigurationNode::ReadMode_Precision)Interface_Static::IVal("read.precision.mode");
-  myOldValues.ReadPrecisionVal = Interface_Static::RVal("read.precision.val");
-  myOldValues.ReadMaxPrecisionMode = (IGESCAFControl_ConfigurationNode::ReadMode_MaxPrecision)Interface_Static::IVal("read.maxprecision.mode");
-  myOldValues.ReadMaxPrecisionVal = Interface_Static::RVal("read.maxprecision.val");
-  myOldValues.ReadSameParamMode = Interface_Static::IVal("read.stdsameparameter.mode") == 1;
-  myOldValues.ReadSurfaceCurveMode = (IGESCAFControl_ConfigurationNode::ReadMode_SurfaceCurve)Interface_Static::IVal("read.surfacecurve.mode");
-  myOldValues.EncodeRegAngle = Interface_Static::RVal("read.encoderegularity.angle") * 180.0 / M_PI;
-
-  myOldValues.ReadApproxd1 = Interface_Static::IVal("read.iges.bspline.approxd1.mode") == 1;
-  myOldValues.ReadResourceName = Interface_Static::CVal("read.iges.resource.name");
-  myOldValues.ReadSequence = Interface_Static::CVal("read.iges.sequence");
-  myOldValues.ReadFaultyEntities = Interface_Static::IVal("read.iges.faulty.entities") == 1;
-  myOldValues.ReadOnlyVisible = Interface_Static::IVal("read.iges.onlyvisible") == 1;
-
-  myOldValues.WriteBRepMode = (IGESCAFControl_ConfigurationNode::WriteMode_BRep)Interface_Static::IVal("write.iges.brep.mode");
-  myOldValues.WriteConvertSurfaceMode = (IGESCAFControl_ConfigurationNode::WriteMode_ConvertSurface)Interface_Static::IVal("write.convertsurface.mode");
-  myOldValues.WriteUnit = (UnitsMethods_LengthUnit)Interface_Static::IVal("write.iges.unit");
-  myOldValues.WriteHeaderAuthor = Interface_Static::CVal("write.iges.header.author");
-  myOldValues.WriteHeaderCompany = Interface_Static::CVal("write.iges.header.company");
-  myOldValues.WriteHeaderProduct = Interface_Static::CVal("write.iges.header.product");
-  myOldValues.WriteHeaderReciever = Interface_Static::CVal("write.iges.header.receiver");
-  myOldValues.WriteResourceName = Interface_Static::CVal("write.iges.resource.name");
-  myOldValues.WriteSequence = Interface_Static::CVal("write.iges.sequence");
-  myOldValues.WritePrecisionMode = (IGESCAFControl_ConfigurationNode::WriteMode_PrecisionMode)Interface_Static::IVal("write.precision.mode");
-  myOldValues.WritePrecisionVal = Interface_Static::RVal("write.precision.val");
-  myOldValues.WritePlaneMode = (IGESCAFControl_ConfigurationNode::WriteMode_PlaneMode)Interface_Static::IVal("write.iges.plane.mode");
-  myOldValues.WriteOffsetMode = Interface_Static::IVal("write.iges.offset.mode") == 1;
-
-  myOldLengthUnit = Interface_Static::IVal("xstep.cascade.unit");
+  myOldValues.ReadBSplineContinuity =
+    (IGESCAFControl_ConfigurationNode::ReadMode_BSplineContinuity)
+    Interface_Static::IVal("read.iges.bspline.continuity");
+  myOldValues.ReadPrecisionMode =
+    (IGESCAFControl_ConfigurationNode::ReadMode_Precision)
+    Interface_Static::IVal("read.precision.mode");
+  myOldValues.ReadPrecisionVal =
+    Interface_Static::RVal("read.precision.val");
+  myOldValues.ReadMaxPrecisionMode =
+    (IGESCAFControl_ConfigurationNode::ReadMode_MaxPrecision)
+    Interface_Static::IVal("read.maxprecision.mode");
+  myOldValues.ReadMaxPrecisionVal =
+    Interface_Static::RVal("read.maxprecision.val");
+  myOldValues.ReadSameParamMode =
+    Interface_Static::IVal("read.stdsameparameter.mode") == 1;
+  myOldValues.ReadSurfaceCurveMode =
+    (IGESCAFControl_ConfigurationNode::ReadMode_SurfaceCurve)
+    Interface_Static::IVal("read.surfacecurve.mode");
+  myOldValues.EncodeRegAngle =
+    Interface_Static::RVal("read.encoderegularity.angle") * 180.0 / M_PI;
+
+  myOldValues.ReadApproxd1 =
+    Interface_Static::IVal("read.iges.bspline.approxd1.mode") == 1;
+  myOldValues.ReadResourceName =
+    Interface_Static::CVal("read.iges.resource.name");
+  myOldValues.ReadSequence =
+    Interface_Static::CVal("read.iges.sequence");
+  myOldValues.ReadFaultyEntities =
+    Interface_Static::IVal("read.iges.faulty.entities") == 1;
+  myOldValues.ReadOnlyVisible =
+    Interface_Static::IVal("read.iges.onlyvisible") == 1;
+
+  myOldValues.WriteBRepMode =
+    (IGESCAFControl_ConfigurationNode::WriteMode_BRep)
+    Interface_Static::IVal("write.iges.brep.mode");
+  myOldValues.WriteConvertSurfaceMode =
+    (IGESCAFControl_ConfigurationNode::WriteMode_ConvertSurface)
+    Interface_Static::IVal("write.convertsurface.mode");
+  myOldValues.WriteUnit =
+    (UnitsMethods_LengthUnit)
+    Interface_Static::IVal("write.iges.unit");
+  myOldValues.WriteHeaderAuthor =
+    Interface_Static::CVal("write.iges.header.author");
+  myOldValues.WriteHeaderCompany =
+    Interface_Static::CVal("write.iges.header.company");
+  myOldValues.WriteHeaderProduct =
+    Interface_Static::CVal("write.iges.header.product");
+  myOldValues.WriteHeaderReciever =
+    Interface_Static::CVal("write.iges.header.receiver");
+  myOldValues.WriteResourceName =
+    Interface_Static::CVal("write.iges.resource.name");
+  myOldValues.WriteSequence =
+    Interface_Static::CVal("write.iges.sequence");
+  myOldValues.WritePrecisionMode =
+    (IGESCAFControl_ConfigurationNode::WriteMode_PrecisionMode)
+    Interface_Static::IVal("write.precision.mode");
+  myOldValues.WritePrecisionVal =
+    Interface_Static::RVal("write.precision.val");
+  myOldValues.WritePlaneMode =
+    (IGESCAFControl_ConfigurationNode::WriteMode_PlaneMode)
+    Interface_Static::IVal("write.iges.plane.mode");
+  myOldValues.WriteOffsetMode =
+    Interface_Static::IVal("write.iges.offset.mode") == 1;
+
+  myOldGlobalValues.LengthUnit = Interface_Static::IVal("xstep.cascade.unit");
 
   // Set new values
-  UnitsMethods::SetCasCadeLengthUnit(aNode->GlobalParameters.LengthUnit, UnitsMethods_LengthUnit_Millimeter);
-  TCollection_AsciiString aStrUnit(UnitsMethods::DumpLengthUnit(aNode->GlobalParameters.LengthUnit));
+  UnitsMethods::SetCasCadeLengthUnit(aNode->GlobalParameters.LengthUnit,
+                                     UnitsMethods_LengthUnit_Millimeter);
+  TCollection_AsciiString aStrUnit(
+    UnitsMethods::DumpLengthUnit(aNode->GlobalParameters.LengthUnit));
   aStrUnit.UpperCase();
   Interface_Static::SetCVal("xstep.cascade.unit", aStrUnit.ToCString());
   setStatic(aNode->InternalParameters);
@@ -117,34 +159,60 @@ void IGESCAFControl_Provider::initStatic(const Handle(DE_ConfigurationNode)& the
 //=======================================================================
 void IGESCAFControl_Provider::setStatic(const IGESCAFControl_ConfigurationNode::IGESCAFControl_InternalSection theParameter)
 {
-  Interface_Static::SetIVal("read.iges.bspline.continuity", theParameter.ReadBSplineContinuity);
-  Interface_Static::SetIVal("read.precision.mode", theParameter.ReadPrecisionMode);
-  Interface_Static::SetRVal("read.precision.val", theParameter.ReadPrecisionVal);
-  Interface_Static::SetIVal("read.maxprecision.mode", theParameter.ReadMaxPrecisionMode);
-  Interface_Static::SetRVal("read.maxprecision.val", theParameter.ReadMaxPrecisionVal);
-  Interface_Static::SetIVal("read.stdsameparameter.mode", theParameter.ReadSameParamMode);
-  Interface_Static::SetIVal("read.surfacecurve.mode", theParameter.ReadSurfaceCurveMode);
-  Interface_Static::SetRVal("read.encoderegularity.angle", theParameter.EncodeRegAngle * M_PI / 180.0);
-
-  Interface_Static::SetIVal("read.iges.bspline.approxd1.mode", theParameter.ReadApproxd1);
-  Interface_Static::SetCVal("read.iges.resource.name", theParameter.ReadResourceName.ToCString());
-  Interface_Static::SetCVal("read.iges.sequence", theParameter.ReadSequence.ToCString());
-  Interface_Static::SetIVal("read.iges.faulty.entities", theParameter.ReadFaultyEntities);
-  Interface_Static::SetIVal("read.iges.onlyvisible", theParameter.ReadOnlyVisible);
-
-  Interface_Static::SetIVal("write.iges.brep.mode", theParameter.WriteBRepMode);
-  Interface_Static::SetIVal("write.convertsurface.mode", theParameter.WriteConvertSurfaceMode);
-  Interface_Static::SetIVal("write.iges.unit", theParameter.WriteUnit);
-  Interface_Static::SetCVal("write.iges.header.author", theParameter.WriteHeaderAuthor.ToCString());
-  Interface_Static::SetCVal("write.iges.header.company", theParameter.WriteHeaderCompany.ToCString());
-  Interface_Static::SetCVal("write.iges.header.product", theParameter.WriteHeaderProduct.ToCString());
-  Interface_Static::SetCVal("write.iges.header.receiver", theParameter.WriteHeaderReciever.ToCString());
-  Interface_Static::SetCVal("write.iges.resource.name", theParameter.WriteResourceName.ToCString());
-  Interface_Static::SetCVal("write.iges.sequence", theParameter.WriteSequence.ToCString());
-  Interface_Static::SetIVal("write.precision.mode", theParameter.WritePrecisionMode);
-  Interface_Static::SetRVal("write.precision.val", theParameter.WritePrecisionVal);
-  Interface_Static::SetIVal("write.iges.plane.mode", theParameter.WritePlaneMode);
-  Interface_Static::SetIVal("write.iges.offset.mode", theParameter.WriteOffsetMode);
+  Interface_Static::SetIVal("read.iges.bspline.continuity",
+                            theParameter.ReadBSplineContinuity);
+  Interface_Static::SetIVal("read.precision.mode",
+                            theParameter.ReadPrecisionMode);
+  Interface_Static::SetRVal("read.precision.val",
+                            theParameter.ReadPrecisionVal);
+  Interface_Static::SetIVal("read.maxprecision.mode",
+                            theParameter.ReadMaxPrecisionMode);
+  Interface_Static::SetRVal("read.maxprecision.val",
+                            theParameter.ReadMaxPrecisionVal);
+  Interface_Static::SetIVal("read.stdsameparameter.mode",
+                            theParameter.ReadSameParamMode);
+  Interface_Static::SetIVal("read.surfacecurve.mode",
+                            theParameter.ReadSurfaceCurveMode);
+  Interface_Static::SetRVal("read.encoderegularity.angle",
+                            theParameter.EncodeRegAngle * M_PI / 180.0);
+
+  Interface_Static::SetIVal("read.iges.bspline.approxd1.mode",
+                            theParameter.ReadApproxd1);
+  Interface_Static::SetCVal("read.iges.resource.name",
+                            theParameter.ReadResourceName.ToCString());
+  Interface_Static::SetCVal("read.iges.sequence",
+                            theParameter.ReadSequence.ToCString());
+  Interface_Static::SetIVal("read.iges.faulty.entities",
+                            theParameter.ReadFaultyEntities);
+  Interface_Static::SetIVal("read.iges.onlyvisible",
+                            theParameter.ReadOnlyVisible);
+
+  Interface_Static::SetIVal("write.iges.brep.mode",
+                            theParameter.WriteBRepMode);
+  Interface_Static::SetIVal("write.convertsurface.mode",
+                            theParameter.WriteConvertSurfaceMode);
+  Interface_Static::SetIVal("write.iges.unit",
+                            theParameter.WriteUnit);
+  Interface_Static::SetCVal("write.iges.header.author",
+                            theParameter.WriteHeaderAuthor.ToCString());
+  Interface_Static::SetCVal("write.iges.header.company",
+                            theParameter.WriteHeaderCompany.ToCString());
+  Interface_Static::SetCVal("write.iges.header.product",
+                            theParameter.WriteHeaderProduct.ToCString());
+  Interface_Static::SetCVal("write.iges.header.receiver",
+                            theParameter.WriteHeaderReciever.ToCString());
+  Interface_Static::SetCVal("write.iges.resource.name",
+                            theParameter.WriteResourceName.ToCString());
+  Interface_Static::SetCVal("write.iges.sequence",
+                            theParameter.WriteSequence.ToCString());
+  Interface_Static::SetIVal("write.precision.mode",
+                            theParameter.WritePrecisionMode);
+  Interface_Static::SetRVal("write.precision.val",
+                            theParameter.WritePrecisionVal);
+  Interface_Static::SetIVal("write.iges.plane.mode",
+                            theParameter.WritePlaneMode);
+  Interface_Static::SetIVal("write.iges.offset.mode",
+                            theParameter.WriteOffsetMode);
 }
 
 //=======================================================================
@@ -153,8 +221,12 @@ void IGESCAFControl_Provider::setStatic(const IGESCAFControl_ConfigurationNode::
 //=======================================================================
 void IGESCAFControl_Provider::resetStatic()
 {
-  Interface_Static::SetIVal("xstep.cascade.unit", myOldLengthUnit);
-  UnitsMethods::SetCasCadeLengthUnit(myOldLengthUnit);
+  if (!myToUpdateStaticParameters)
+  {
+    return;
+  }
+  Interface_Static::SetIVal("xstep.cascade.unit", myOldGlobalValues.LengthUnit);
+  UnitsMethods::SetCasCadeLengthUnit(myOldGlobalValues.LengthUnit);
   setStatic(myOldValues);
 }
 
@@ -169,44 +241,64 @@ bool IGESCAFControl_Provider::Read(const TCollection_AsciiString& thePath,
 {
   if (theDocument.IsNull())
   {
-    Message::SendFail() << "Error in the IGESCAFControl_Provider during reading the file " <<
-      thePath << "\t: theDocument shouldn't be null";
+    Message::SendFail() << "Error: IGESCAFControl_Provider : "
+      << "Null document";
     return false;
   }
   if (!GetNode()->IsKind(STANDARD_TYPE(IGESCAFControl_ConfigurationNode)))
   {
-    Message::SendFail() << "Error in the IGESCAFControl_Provider during reading the file " <<
-      thePath << "\t: Incorrect or empty Configuration Node";
+    Message::SendFail() << "Error: IGESCAFControl_Provider : "
+      << "Incorrect or empty Configuration Node";
     return false;
   }
-  Handle(IGESCAFControl_ConfigurationNode) aNode = Handle(IGESCAFControl_ConfigurationNode)::DownCast(GetNode());
+  Handle(IGESCAFControl_ConfigurationNode) aNode =
+    Handle(IGESCAFControl_ConfigurationNode)::DownCast(GetNode());
   initStatic(aNode);
 
   personizeWS(theWS);
-  XCAFDoc_DocumentTool::SetLengthUnit(theDocument, aNode->GlobalParameters.LengthUnit, UnitsMethods_LengthUnit_Millimeter);
-  IGESCAFControl_Reader aReader;
-  aReader.SetWS(theWS);
-
+  XCAFDoc_DocumentTool::SetLengthUnit(theDocument,
+                                      aNode->GlobalParameters.LengthUnit,
+                                      UnitsMethods_LengthUnit_Millimeter);
+  const Standard_Boolean toUseLoaded = thePath == ".";
+  TCollection_AsciiString aFile;
+  if (toUseLoaded)
+  {
+    aFile = theWS->LoadedFile();
+    Message::SendInfo() << "Model taken from the IGES session : "
+      << aFile;
+  }
+  else
+  {
+    aFile = thePath;
+    Message::SendInfo() << "File IGES to read : "
+      << aFile;
+  }
+  IGESCAFControl_Reader aReader(theWS, !toUseLoaded);
   aReader.SetReadVisible(aNode->InternalParameters.ReadOnlyVisible);
-
   aReader.SetColorMode(aNode->InternalParameters.ReadColor);
   aReader.SetNameMode(aNode->InternalParameters.ReadName);
   aReader.SetLayerMode(aNode->InternalParameters.ReadLayer);
 
   IFSelect_ReturnStatus aReadStat = IFSelect_RetVoid;
-  aReadStat = aReader.ReadFile(thePath.ToCString());
+  if (!toUseLoaded)
+  {
+    aReadStat = aReader.ReadFile(thePath.ToCString());
+  }
+  else if (theWS->NbStartingEntities() > 0)
+  {
+    aReadStat = IFSelect_RetDone;
+  }
   if (aReadStat != IFSelect_RetDone)
   {
-    Message::SendFail() << "Error in the IGESCAFControl_Provider during reading the file " <<
-      thePath << "\t: abandon, no model loaded";
+    Message::SendFail() << "Error: IGESCAFControl_Provider : ["
+      << aFile << "] : abandon, no model loaded";
     resetStatic();
     return false;
   }
-
   if (!aReader.Transfer(theDocument, theProgress))
   {
-    Message::SendFail() << "Error in the IGESCAFControl_Provider during reading the file " <<
-      thePath << "\t: Cannot read any relevant data from the IGES file";
+    Message::SendFail() << "Error: IGESCAFControl_Provider : [" <<
+      aFile << "] : Cannot read any relevant data from the IGES file";
     resetStatic();
     return false;
   }
@@ -225,62 +317,48 @@ bool IGESCAFControl_Provider::Write(const TCollection_AsciiString& thePath,
 {
   if (!GetNode()->IsKind(STANDARD_TYPE(IGESCAFControl_ConfigurationNode)))
   {
-    Message::SendFail() << "Error in the IGESCAFControl_Provider during reading the file " <<
-      thePath << "\t: Incorrect or empty Configuration Node";
+    Message::SendFail() << "Error: IGESCAFControl_Provider : "
+      << "Incorrect or empty Configuration Node";
     return false;
   }
-  Handle(IGESCAFControl_ConfigurationNode) aNode = Handle(IGESCAFControl_ConfigurationNode)::DownCast(GetNode());
+  Handle(IGESCAFControl_ConfigurationNode) aNode =
+    Handle(IGESCAFControl_ConfigurationNode)::DownCast(GetNode());
   initStatic(aNode);
 
   personizeWS(theWS);
-  XCAFDoc_DocumentTool::SetLengthUnit(theDocument, aNode->InternalParameters.WriteUnit, UnitsMethods_LengthUnit_Millimeter);
-  IGESCAFControl_Writer aWriter(theWS);
+  XCAFDoc_DocumentTool::SetLengthUnit(theDocument,
+                                      aNode->InternalParameters.WriteUnit,
+                                      UnitsMethods_LengthUnit_Millimeter);
+  IGESCAFControl_Writer aWriter(theWS, Standard_True);
   aWriter.SetColorMode(aNode->InternalParameters.WriteColor);
   aWriter.SetNameMode(aNode->InternalParameters.WriteName);
   aWriter.SetLayerMode(aNode->InternalParameters.WriteLayer);
 
   if (!aWriter.Transfer(theDocument, theProgress))
   {
-    Message::SendFail() << "Error in the IGESCAFControl_Provider during reading the file " <<
-      thePath << "\t: The document cannot be translated or gives no result";
+    Message::SendFail() << "Error: IGESCAFControl_Provider : "
+      << "The document cannot be translated or gives no result";
     resetStatic();
     return false;
   }
+  if (thePath == ".")
+  {
+    resetStatic();
+    Message::SendInfo() << "Document has been translated into the session";
+    return true;
+  }
   if (!aWriter.Write(thePath.ToCString()))
   {
-    Message::SendFail() << "Error in the IGESCAFControl_Provider during reading the file " <<
-      thePath << "\t: Write failed";
+    Message::SendFail() << "Error: IGESCAFControl_Provider : [" <<
+      thePath << ": Write failed";
     resetStatic();
     return false;
   }
+  Message::SendInfo() << "IGES file [" << thePath << "] Successfully written";
   resetStatic();
   return true;
 }
 
-//=======================================================================
-// function : Read
-// purpose  :
-//=======================================================================
-bool IGESCAFControl_Provider::Read(const TCollection_AsciiString& thePath,
-                                   const Handle(TDocStd_Document)& theDocument,
-                                   const Message_ProgressRange& theProgress)
-{
-  Handle(XSControl_WorkSession) aWS = new XSControl_WorkSession();
-  return Read(thePath, theDocument, aWS, theProgress);
-}
-
-//=======================================================================
-// function : Write
-// purpose  :
-//=======================================================================
-bool IGESCAFControl_Provider::Write(const TCollection_AsciiString& thePath,
-                                    const Handle(TDocStd_Document)& theDocument,
-                                    const Message_ProgressRange& theProgress)
-{
-  Handle(XSControl_WorkSession) aWS = new XSControl_WorkSession();
-  return Write(thePath, theDocument, aWS, theProgress);
-}
-
 //=======================================================================
 // function : Read
 // purpose  :
@@ -293,11 +371,12 @@ bool IGESCAFControl_Provider::Read(const TCollection_AsciiString& thePath,
   (void)theProgress;
   if (!GetNode()->IsKind(STANDARD_TYPE(IGESCAFControl_ConfigurationNode)))
   {
-    Message::SendFail() << "Error in the IGESCAFControl_Provider during reading the file " <<
-      thePath << "\t: Incorrect or empty Configuration Node";
+    Message::SendFail() << "Error: IGESCAFControl_Provider : "
+      << "Incorrect or empty Configuration Node";
     return false;
   }
-  Handle(IGESCAFControl_ConfigurationNode) aNode = Handle(IGESCAFControl_ConfigurationNode)::DownCast(GetNode());
+  Handle(IGESCAFControl_ConfigurationNode) aNode =
+    Handle(IGESCAFControl_ConfigurationNode)::DownCast(GetNode());
   initStatic(aNode);
   personizeWS(theWS);
   IGESControl_Reader aReader;
@@ -307,15 +386,15 @@ bool IGESCAFControl_Provider::Read(const TCollection_AsciiString& thePath,
   aReadStat = aReader.ReadFile(thePath.ToCString());
   if (aReadStat != IFSelect_RetDone)
   {
-    Message::SendFail() << "Error in the IGESCAFControl_Provider during reading the file " <<
-      thePath << "\t: Could not read file, no model loaded";
+    Message::SendFail() << "Error: IGESCAFControl_Provider : [" <<
+      thePath << ": Could not read file, no model loaded";
     resetStatic();
     return false;
   }
   if (aReader.TransferRoots() <= 0)
   {
-    Message::SendFail() << "Error in the IGESCAFControl_Provider during reading the file " <<
-      thePath << "\t: Cannot read any relevant data from the IGES file";
+    Message::SendFail() << "Error: IGESCAFControl_Provider : [" <<
+      thePath << ": Cannot read any relevant data from the IGES file";
     resetStatic();
     return false;
   }
@@ -337,27 +416,31 @@ bool IGESCAFControl_Provider::Write(const TCollection_AsciiString& thePath,
   (void)theProgress;
   if (!GetNode()->IsKind(STANDARD_TYPE(IGESCAFControl_ConfigurationNode)))
   {
-    Message::SendFail() << "Error in the IGESCAFControl_Provider during reading the file " <<
-      thePath << "\t: Incorrect or empty Configuration Node";
+    Message::SendFail() << "Error: IGESCAFControl_Provider : "
+      << "Incorrect or empty Configuration Node";
     return false;
   }
-  Handle(IGESCAFControl_ConfigurationNode) aNode = Handle(IGESCAFControl_ConfigurationNode)::DownCast(GetNode());
+  Handle(IGESCAFControl_ConfigurationNode) aNode =
+    Handle(IGESCAFControl_ConfigurationNode)::DownCast(GetNode());
   initStatic(aNode);
-  TCollection_AsciiString aUnit(UnitsMethods::DumpLengthUnit(aNode->InternalParameters.WriteUnit));
+  TCollection_AsciiString aUnit(
+    UnitsMethods::DumpLengthUnit(aNode->InternalParameters.WriteUnit));
   aUnit.UpperCase();
   IGESControl_Writer aWriter(aUnit.ToCString(),
                              aNode->InternalParameters.WriteBRepMode);
   Standard_Boolean aIsOk = aWriter.AddShape(theShape);
   if (!aIsOk)
   {
-    Message::SendFail() << "IGESCAFControl_Provider: Shape not written";
+    Message::SendFail() << "Error: IGESCAFControl_Provider : "
+      << "Can't translate shape to IGES model";
     resetStatic();
     return false;
   }
 
   if (!(aWriter.Write(thePath.ToCString())))
   {
-    Message::SendFail() << "IGESCAFControl_Provider: Error on writing file " << thePath;
+    Message::SendFail() << "Error: IGESCAFControl_Provider : "
+      << "Can't write IGES file" << thePath;
     resetStatic();
     return false;
   }
@@ -365,30 +448,6 @@ bool IGESCAFControl_Provider::Write(const TCollection_AsciiString& thePath,
   return true;
 }
 
-//=======================================================================
-// function : Read
-// purpose  :
-//=======================================================================
-bool IGESCAFControl_Provider::Read(const TCollection_AsciiString& thePath,
-                                   TopoDS_Shape& theShape,
-                                   const Message_ProgressRange& theProgress)
-{
-  Handle(XSControl_WorkSession) aWS = new XSControl_WorkSession();
-  return Read(thePath, theShape, aWS, theProgress);
-}
-
-//=======================================================================
-// function : Write
-// purpose  :
-//=======================================================================
-bool IGESCAFControl_Provider::Write(const TCollection_AsciiString& thePath,
-                                    const TopoDS_Shape& theShape,
-                                    const Message_ProgressRange& theProgress)
-{
-  Handle(XSControl_WorkSession) aWS = new XSControl_WorkSession();
-  return Write(thePath, theShape, aWS, theProgress);
-}
-
 //=======================================================================
 // function : GetFormat
 // purpose  :
index a3b778f601ad8a10e26d7d11b6daf5e0c1df360a..2c102a007e82dd362e7c21c14c3fbf9660962d19 100644 (file)
@@ -15,6 +15,7 @@
 #define _IGESCAFControl_Provider_HeaderFile
 
 #include <DE_Provider.hxx>
+#include <DE_ConfigurationNode.hxx>
 #include <IGESCAFControl_ConfigurationNode.hxx>
 
 //! The class to transfer IGES files.
@@ -65,23 +66,6 @@ public:
                                      Handle(XSControl_WorkSession)& theWS,
                                      const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
 
-  //! Reads a CAD file, according internal configuration
-  //! @param[in] thePath path to the import CAD file
-  //! @param[out] theDocument document to save result
-  //! @param theProgress[in] progress indicator
-  //! @return true if Read operation has ended correctly
-  Standard_EXPORT virtual bool Read(const TCollection_AsciiString& thePath,
-                                    const Handle(TDocStd_Document)& theDocument,
-                                    const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
-  //! Writes a CAD file, according internal configuration
-  //! @param[in] thePath path to the export CAD file
-  //! @param[out] theDocument document to export
-  //! @param theProgress[in] progress indicator
-  //! @return true if Write operation has ended correctly
-  Standard_EXPORT virtual bool Write(const TCollection_AsciiString& thePath,
-                                     const Handle(TDocStd_Document)& theDocument,
-                                     const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
 
   //! Reads a CAD file, according internal configuration
   //! @param[in] thePath path to the import CAD file
@@ -105,24 +89,6 @@ public:
                                      Handle(XSControl_WorkSession)& theWS,
                                      const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
 
-  //! Reads a CAD file, according internal configuration
-  //! @param[in] thePath path to the import CAD file
-  //! @param[out] theShape shape to save result
-  //! @param theProgress[in] progress indicator
-  //! @return true if Read operation has ended correctly
-  Standard_EXPORT virtual bool Read(const TCollection_AsciiString& thePath,
-                                    TopoDS_Shape& theShape,
-                                    const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
-  //! Writes a CAD file, according internal configuration
-  //! @param[in] thePath path to the export CAD file
-  //! @param[out] theShape shape to export
-  //! @param theProgress[in] progress indicator
-  //! @return true if Write operation has ended correctly
-  Standard_EXPORT virtual bool Write(const TCollection_AsciiString& thePath,
-                                     const TopoDS_Shape& theShape,
-                                     const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
 public:
 
   //! Gets CAD format name of associated provider
@@ -133,6 +99,14 @@ public:
   //! @return provider's vendor name
   Standard_EXPORT virtual TCollection_AsciiString GetVendor() const Standard_OVERRIDE;
 
+public:
+
+  //! Sets parameter to update static parameter, that true by default
+  void SetToUpdateStaticParameters(const bool theToUpdate) { myToUpdateStaticParameters = theToUpdate; }
+
+  //! Gets parameter to update static parameter, that true by default
+  bool ToUpdateStaticParameters() const  { return myToUpdateStaticParameters; }
+
 private:
 
   //! Personizes work session with current format.
@@ -149,8 +123,11 @@ private:
   //! Reset used interface static variables
   void resetStatic();
 
-  IGESCAFControl_ConfigurationNode::IGESCAFControl_InternalSection myOldValues;
-  int myOldLengthUnit = 1;
+private:
+
+  bool myToUpdateStaticParameters = true; //!< Flag to updating static parameters
+  IGESCAFControl_ConfigurationNode::IGESCAFControl_InternalSection myOldValues; //!< Container to save previous static parameters
+  IGESCAFControl_ConfigurationNode::DE_SectionGlobal myOldGlobalValues; //!< Container to save previous static parameters
 
 };
 
index f8a9436c7edacd4192859242534e23e68f1631ed..f8988dae283a713e0fa5072c7dd7f387ba769c03 100644 (file)
@@ -20,7 +20,7 @@
 #include <XCAFDoc_ShapeTool.hxx>
 #include <XCAFDoc_DocumentTool.hxx>
 
-namespace 
+namespace
 {
   //=======================================================================
   // function : SetReaderParameters
@@ -73,30 +73,6 @@ bool RWGltf_Provider::Read(const TCollection_AsciiString& thePath,
                            const Message_ProgressRange& theProgress)
 {
   (void)theWS;
-  return Read(thePath, theDocument, theProgress);
-}
-
-//=======================================================================
-// function : Write
-// purpose  :
-//=======================================================================
-bool RWGltf_Provider::Write(const TCollection_AsciiString& thePath,
-                            const Handle(TDocStd_Document)& theDocument,
-                            Handle(XSControl_WorkSession)& theWS,
-                            const Message_ProgressRange& theProgress)
-{
-  (void)theWS;
-  return Write(thePath, theDocument, theProgress);
-}
-
-//=======================================================================
-// function : Read
-// purpose  :
-//=======================================================================
-bool RWGltf_Provider::Read(const TCollection_AsciiString& thePath,
-                           const Handle(TDocStd_Document)& theDocument,
-                           const Message_ProgressRange& theProgress)
-{
   if (theDocument.IsNull())
   {
     Message::SendFail() << "Error in the RWGltf_Provider during reading the file " <<
@@ -119,7 +95,7 @@ bool RWGltf_Provider::Read(const TCollection_AsciiString& thePath,
     Message::SendFail() << "Error in the RWGltf_Provider during reading the file " << thePath;
     return false;
   }
-  
+
   return true;
 }
 
@@ -129,8 +105,10 @@ bool RWGltf_Provider::Read(const TCollection_AsciiString& thePath,
 //=======================================================================
 bool RWGltf_Provider::Write(const TCollection_AsciiString& thePath,
                             const Handle(TDocStd_Document)& theDocument,
+                            Handle(XSControl_WorkSession)& theWS,
                             const Message_ProgressRange& theProgress)
 {
+  (void)theWS;
   if (GetNode().IsNull() || !GetNode()->IsKind(STANDARD_TYPE(RWGltf_ConfigurationNode)))
   {
     Message::SendFail() << "Error in the RWGltf_Provider during writing the file " <<
@@ -184,30 +162,6 @@ bool RWGltf_Provider::Read(const TCollection_AsciiString& thePath,
                            const Message_ProgressRange& theProgress)
 {
   (void)theWS;
-  return Read(thePath, theShape, theProgress);
-}
-
-//=======================================================================
-// function : Write
-// purpose  :
-//=======================================================================
-bool RWGltf_Provider::Write(const TCollection_AsciiString& thePath,
-                            const TopoDS_Shape& theShape,
-                            Handle(XSControl_WorkSession)& theWS,
-                            const Message_ProgressRange& theProgress)
-{
-  (void)theWS;
-  return Write(thePath, theShape, theProgress);
-}
-
-//=======================================================================
-// function : Read
-// purpose  :
-//=======================================================================
-bool RWGltf_Provider::Read(const TCollection_AsciiString& thePath,
-                           TopoDS_Shape& theShape,
-                           const Message_ProgressRange& theProgress)
-{
   if (GetNode().IsNull() || !GetNode()->IsKind(STANDARD_TYPE(RWGltf_ConfigurationNode)))
   {
     Message::SendFail() << "Error in the RWGltf_Provider during reading the file " <<
@@ -232,12 +186,14 @@ bool RWGltf_Provider::Read(const TCollection_AsciiString& thePath,
 //=======================================================================
 bool RWGltf_Provider::Write(const TCollection_AsciiString& thePath,
                             const TopoDS_Shape& theShape,
+                            Handle(XSControl_WorkSession)& theWS,
                             const Message_ProgressRange& theProgress)
 {
+  (void)theWS;
   Handle(TDocStd_Document) aDoc = new TDocStd_Document("BinXCAF");
   Handle(XCAFDoc_ShapeTool) aShTool = XCAFDoc_DocumentTool::ShapeTool(aDoc->Main());
   aShTool->AddShape(theShape);
-  return Write(thePath, aDoc, theProgress);
+  return Write(thePath, aDoc, theWS, theProgress);
 }
 
 //=======================================================================
index 09f2036bb6634c26e4bc9cb82d16fbb3ba41318f..0db8e4824629c4bd66e8eda97bbe5edcd7e2bdbd 100644 (file)
@@ -66,24 +66,6 @@ public:
                                      Handle(XSControl_WorkSession)& theWS,
                                      const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
 
-  //! Reads a CAD file, according internal configuration
-  //! @param[in] thePath path to the import CAD file
-  //! @param[out] theDocument document to save result
-  //! @param theProgress[in] progress indicator
-  //! @return true if Read operation has ended correctly
-  Standard_EXPORT virtual bool Read(const TCollection_AsciiString& thePath,
-                                    const Handle(TDocStd_Document)& theDocument,
-                                    const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
-  //! Writes a CAD file, according internal configuration
-  //! @param[in] thePath path to the export CAD file
-  //! @param[out] theDocument document to export
-  //! @param theProgress[in] progress indicator
-  //! @return true if Write operation has ended correctly
-  Standard_EXPORT virtual bool Write(const TCollection_AsciiString& thePath,
-                                     const Handle(TDocStd_Document)& theDocument,
-                                     const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
   //! Reads a CAD file, according internal configuration
   //! @param[in] thePath path to the import CAD file
   //! @param[out] theShape shape to save result
@@ -106,24 +88,6 @@ public:
                                      Handle(XSControl_WorkSession)& theWS,
                                      const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
 
-  //! Reads a CAD file, according internal configuration
-  //! @param[in] thePath path to the import CAD file
-  //! @param[out] theShape shape to save result
-  //! @param theProgress[in] progress indicator
-  //! @return true if Read operation has ended correctly
-  Standard_EXPORT virtual bool Read(const TCollection_AsciiString& thePath,
-                                    TopoDS_Shape& theShape,
-                                    const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
-  //! Writes a CAD file, according internal configuration
-  //! @param[in] thePath path to the export CAD file
-  //! @param[out] theShape shape to export
-  //! @param theProgress[in] progress indicator
-  //! @return true if Write operation has ended correctly
-  Standard_EXPORT virtual bool Write(const TCollection_AsciiString& thePath,
-                                     const TopoDS_Shape& theShape,
-                                     const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
 public:
 
   //! Gets CAD format name of associated provider
index 90435cbd2179b8d51605e879775e9d61805e9a10..1947dc642a6c9a7eb8918a1f6bfb6d910345969f 100644 (file)
@@ -49,30 +49,6 @@ bool RWObj_Provider::Read(const TCollection_AsciiString& thePath,
                           const Message_ProgressRange& theProgress)
 {
   (void)theWS;
-  return Read(thePath, theDocument, theProgress);
-}
-
-//=======================================================================
-// function : Write
-// purpose  :
-//=======================================================================
-bool RWObj_Provider::Write(const TCollection_AsciiString& thePath,
-                           const Handle(TDocStd_Document)& theDocument,
-                           Handle(XSControl_WorkSession)& theWS,
-                           const Message_ProgressRange& theProgress)
-{
-  (void)theWS;
-  return Write(thePath, theDocument, theProgress);
-}
-
-//=======================================================================
-// function : Read
-// purpose  :
-//=======================================================================
-bool RWObj_Provider::Read(const TCollection_AsciiString& thePath,
-                          const Handle(TDocStd_Document)& theDocument,
-                          const Message_ProgressRange& theProgress)
-{
   if (theDocument.IsNull())
   {
     Message::SendFail() << "Error in the RWObj_Provider during reading the file " <<
@@ -110,8 +86,10 @@ bool RWObj_Provider::Read(const TCollection_AsciiString& thePath,
 //=======================================================================
 bool RWObj_Provider::Write(const TCollection_AsciiString& thePath,
                            const Handle(TDocStd_Document)& theDocument,
+                           Handle(XSControl_WorkSession)& theWS,
                            const Message_ProgressRange& theProgress)
 {
+  (void)theWS;
   if (GetNode().IsNull() || !GetNode()->IsKind(STANDARD_TYPE(RWObj_ConfigurationNode)))
   {
     Message::SendFail() << "Error in the RWObj_ConfigurationNode during writing the file " <<
@@ -156,30 +134,6 @@ bool RWObj_Provider::Read(const TCollection_AsciiString& thePath,
                           const Message_ProgressRange& theProgress)
 {
   (void)theWS;
-  return Read(thePath, theShape, theProgress);
-}
-
-//=======================================================================
-// function : Write
-// purpose  :
-//=======================================================================
-bool RWObj_Provider::Write(const TCollection_AsciiString& thePath,
-                           const TopoDS_Shape& theShape,
-                           Handle(XSControl_WorkSession)& theWS,
-                           const Message_ProgressRange& theProgress)
-{
-  (void)theWS;
-  return Write(thePath, theShape, theProgress);
-}
-
-//=======================================================================
-// function : Read
-// purpose  :
-//=======================================================================
-bool RWObj_Provider::Read(const TCollection_AsciiString& thePath,
-                          TopoDS_Shape& theShape,
-                          const Message_ProgressRange& theProgress)
-{
   if (GetNode().IsNull() || !GetNode()->IsKind(STANDARD_TYPE(RWObj_ConfigurationNode)))
   {
     Message::SendFail() << "Error in the RWObj_ConfigurationNode during writing the file " <<
@@ -219,12 +173,14 @@ bool RWObj_Provider::Read(const TCollection_AsciiString& thePath,
 //=======================================================================
 bool RWObj_Provider::Write(const TCollection_AsciiString& thePath,
                            const TopoDS_Shape& theShape,
+                           Handle(XSControl_WorkSession)& theWS,
                            const Message_ProgressRange& theProgress)
 {
+  (void)theWS;
   Handle(TDocStd_Document) aDoc = new TDocStd_Document("BinXCAF");
   Handle(XCAFDoc_ShapeTool) aShTool = XCAFDoc_DocumentTool::ShapeTool(aDoc->Main());
   aShTool->AddShape(theShape);
-  return Write(thePath, aDoc, theProgress);
+  return Write(thePath, aDoc, theWS, theProgress);
 }
 
 //=======================================================================
index 38ab12aa877506f87ba2f6d49eaaa4b709d079ba..0e1f754a6e858acaffd5c98351d2f92eac3ea24f 100644 (file)
@@ -64,24 +64,6 @@ public:
                                      Handle(XSControl_WorkSession)& theWS,
                                      const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
 
-  //! Reads a CAD file, according internal configuration
-  //! @param[in] thePath path to the import CAD file
-  //! @param[out] theDocument document to save result
-  //! @param theProgress[in] progress indicator
-  //! @return true if Read operation has ended correctly
-  Standard_EXPORT virtual bool Read(const TCollection_AsciiString& thePath,
-                                    const Handle(TDocStd_Document)& theDocument,
-                                    const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
-  //! Writes a CAD file, according internal configuration
-  //! @param[in] thePath path to the export CAD file
-  //! @param[out] theDocument document to export
-  //! @param theProgress[in] progress indicator
-  //! @return true if Write operation has ended correctly
-  Standard_EXPORT virtual bool Write(const TCollection_AsciiString& thePath,
-                                     const Handle(TDocStd_Document)& theDocument,
-                                     const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
   //! Reads a CAD file, according internal configuration
   //! @param[in] thePath path to the import CAD file
   //! @param[out] theShape shape to save result
@@ -104,24 +86,6 @@ public:
                                      Handle(XSControl_WorkSession)& theWS,
                                      const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
 
-  //! Reads a CAD file, according internal configuration
-  //! @param[in] thePath path to the import CAD file
-  //! @param[out] theShape shape to save result
-  //! @param theProgress[in] progress indicator
-  //! @return true if Read operation has ended correctly
-  Standard_EXPORT virtual bool Read(const TCollection_AsciiString& thePath,
-                                    TopoDS_Shape& theShape,
-                                    const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
-  //! Writes a CAD file, according internal configuration
-  //! @param[in] thePath path to the export CAD file
-  //! @param[out] theShape shape to export
-  //! @param theProgress[in] progress indicator
-  //! @return true if Write operation has ended correctly
-  Standard_EXPORT virtual bool Write(const TCollection_AsciiString& thePath,
-                                     const TopoDS_Shape& theShape,
-                                     const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
 public:
 
   //! Gets CAD format name of associated provider
index 1f81de5bbc3f25604bb80f89f0fc9d81e747074f..ea0fdb3c3232457f635cb060a40bfd6aac943621 100644 (file)
@@ -52,17 +52,6 @@ bool RWPly_Provider::Write(const TCollection_AsciiString& thePath,
                            const Message_ProgressRange& theProgress)
 {
   (void)theWS;
-  return Write(thePath, theDocument, theProgress);
-}
-
-//=======================================================================
-// function : Write
-// purpose  :
-//=======================================================================
-bool RWPly_Provider::Write(const TCollection_AsciiString& thePath,
-                           const Handle(TDocStd_Document)& theDocument,
-                           const Message_ProgressRange& theProgress)
-{
   if (GetNode().IsNull() || !GetNode()->IsKind(STANDARD_TYPE(RWPly_ConfigurationNode)))
   {
     Message::SendFail() << "Error in the RWPly_Provider during writing the file " <<
@@ -102,7 +91,7 @@ bool RWPly_Provider::Write(const TCollection_AsciiString& thePath,
   aPlyCtx.SetFaceId(aNode->InternalParameters.WriteFaceId);
   if (!aPlyCtx.Perform(theDocument, aFileInfo, theProgress))
   {
-    Message::SendFail() << "Error in the RWPly_Provider during writing the file " 
+    Message::SendFail() << "Error in the RWPly_Provider during writing the file "
       << thePath << "\t: Cannot perform the document";
     return false;
   }
@@ -120,21 +109,10 @@ bool RWPly_Provider::Write(const TCollection_AsciiString& thePath,
                            const Message_ProgressRange& theProgress)
 {
   (void)theWS;
-  return Write(thePath, theShape, theProgress);
-}
-
-//=======================================================================
-// function : Write
-// purpose  :
-//=======================================================================
-bool RWPly_Provider::Write(const TCollection_AsciiString& thePath,
-                           const TopoDS_Shape& theShape,
-                           const Message_ProgressRange& theProgress)
-{
   Handle(TDocStd_Document) aDoc = new TDocStd_Document("BinXCAF");
   Handle(XCAFDoc_ShapeTool) aShTool = XCAFDoc_DocumentTool::ShapeTool(aDoc->Main());
   aShTool->AddShape(theShape);
-  return Write(thePath, aDoc, theProgress);
+  return Write(thePath, aDoc, theWS, theProgress);
 }
 
 //=======================================================================
index 30d686b91f7925776a2f5701759f7d7f7fc53dfa..2f130e67d2286e9fa5d8bdce9658ef82cccee792 100644 (file)
@@ -53,15 +53,6 @@ public:
                                      Handle(XSControl_WorkSession)& theWS,
                                      const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
 
-  //! Writes a CAD file, according internal configuration
-  //! @param[in] thePath path to the export CAD file
-  //! @param[out] theDocument document to export
-  //! @param theProgress[in] progress indicator
-  //! @return true if Write operation has ended correctly
-  Standard_EXPORT virtual bool Write(const TCollection_AsciiString& thePath,
-                                     const Handle(TDocStd_Document)& theDocument,
-                                     const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
   //! Writes a CAD file, according internal configuration
   //! @param[in] thePath path to the export CAD file
   //! @param[out] theShape shape to export
@@ -73,15 +64,6 @@ public:
                                      Handle(XSControl_WorkSession)& theWS,
                                      const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
 
-  //! Writes a CAD file, according internal configuration
-  //! @param[in] thePath path to the export CAD file
-  //! @param[out] theShape shape to export
-  //! @param theProgress[in] progress indicator
-  //! @return true if Write operation has ended correctly
-  Standard_EXPORT virtual bool Write(const TCollection_AsciiString& thePath,
-                                     const TopoDS_Shape& theShape,
-                                     const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
 public:
 
   //! Gets CAD format name of associated provider
index 8f862530b45877ed4a20464e2e0401f5163e8783..00a50d8891e614520053142ccda7cdd96fa33ced 100644 (file)
@@ -51,30 +51,6 @@ bool RWStl_Provider::Read(const TCollection_AsciiString& thePath,
                           const Message_ProgressRange& theProgress)
 {
   (void)theWS;
-  return Read(thePath, theDocument, theProgress);
-}
-
-//=======================================================================
-// function : Write
-// purpose  :
-//=======================================================================
-bool RWStl_Provider::Write(const TCollection_AsciiString& thePath,
-                           const Handle(TDocStd_Document)& theDocument,
-                           Handle(XSControl_WorkSession)& theWS,
-                           const Message_ProgressRange& theProgress)
-{
-  (void)theWS;
-  return Write(thePath, theDocument, theProgress);
-}
-
-//=======================================================================
-// function : Read
-// purpose  :
-//=======================================================================
-bool RWStl_Provider::Read(const TCollection_AsciiString& thePath,
-                          const Handle(TDocStd_Document)& theDocument,
-                          const Message_ProgressRange& theProgress)
-{
   if (theDocument.IsNull())
   {
     Message::SendFail() << "Error in the RWStl_Provider during reading the file " <<
@@ -82,7 +58,7 @@ bool RWStl_Provider::Read(const TCollection_AsciiString& thePath,
     return false;
   }
   TopoDS_Shape aShape;
-  if (!Read(thePath, aShape, theProgress))
+  if (!Read(thePath, aShape, theWS, theProgress))
   {
     return false;
   }
@@ -97,8 +73,10 @@ bool RWStl_Provider::Read(const TCollection_AsciiString& thePath,
 //=======================================================================
 bool RWStl_Provider::Write(const TCollection_AsciiString& thePath,
                            const Handle(TDocStd_Document)& theDocument,
+                           Handle(XSControl_WorkSession)& theWS,
                            const Message_ProgressRange& theProgress)
 {
+  (void)theWS;
   TopoDS_Shape aShape;
   TDF_LabelSequence aLabels;
   Handle(XCAFDoc_ShapeTool) aSTool = XCAFDoc_DocumentTool::ShapeTool(theDocument->Main());
@@ -126,7 +104,7 @@ bool RWStl_Provider::Write(const TCollection_AsciiString& thePath,
     }
     aShape = aComp;
   }
-  return Write(thePath, aShape, theProgress);
+  return Write(thePath, aShape, theWS, theProgress);
 }
 
 //=======================================================================
@@ -139,30 +117,6 @@ bool RWStl_Provider::Read(const TCollection_AsciiString& thePath,
                           const Message_ProgressRange& theProgress)
 {
   (void)theWS;
-  return Read(thePath, theShape, theProgress);
-}
-
-//=======================================================================
-// function : Write
-// purpose  :
-//=======================================================================
-bool RWStl_Provider::Write(const TCollection_AsciiString& thePath,
-                           const TopoDS_Shape& theShape,
-                           Handle(XSControl_WorkSession)& theWS,
-                           const Message_ProgressRange& theProgress)
-{
-  (void)theWS;
-  return Write(thePath, theShape, theProgress);
-}
-
-//=======================================================================
-// function : Read
-// purpose  :
-//=======================================================================
-bool RWStl_Provider::Read(const TCollection_AsciiString& thePath,
-                          TopoDS_Shape& theShape,
-                          const Message_ProgressRange& theProgress)
-{
   Message::SendWarning() << "OCCT Stl reader does not support model scaling according to custom length unit";
   if (!GetNode()->IsKind(STANDARD_TYPE(RWStl_ConfigurationNode)))
   {
@@ -172,7 +126,7 @@ bool RWStl_Provider::Read(const TCollection_AsciiString& thePath,
   }
   Handle(RWStl_ConfigurationNode) aNode = Handle(RWStl_ConfigurationNode)::DownCast(GetNode());
   double aMergeAngle = aNode->InternalParameters.ReadMergeAngle * M_PI / 180.0;
-  if(aMergeAngle != M_PI_2)
+  if (aMergeAngle != M_PI_2)
   {
     if (aMergeAngle < 0.0 || aMergeAngle > M_PI_2)
     {
@@ -210,8 +164,10 @@ bool RWStl_Provider::Read(const TCollection_AsciiString& thePath,
 //=======================================================================
 bool RWStl_Provider::Write(const TCollection_AsciiString& thePath,
                            const TopoDS_Shape& theShape,
+                           Handle(XSControl_WorkSession)& theWS,
                            const Message_ProgressRange& theProgress)
 {
+  (void)theWS;
   Message::SendWarning() << "OCCT Stl writer does not support model scaling according to custom length unit";
   if (GetNode().IsNull() || !GetNode()->IsKind(STANDARD_TYPE(RWStl_ConfigurationNode)))
   {
index 1c6793e2dad84f647d4bc7cbf0968bd2ae257f50..0c1c54044c954686af4812149b786369a8cf0556 100644 (file)
@@ -64,24 +64,6 @@ public:
                                                  Handle(XSControl_WorkSession)& theWS,
                                                  const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
 
-  //! Reads a CAD file, according internal configuration
-  //! @param[in] thePath path to the import CAD file
-  //! @param[out] theDocument document to save result
-  //! @param theProgress[in] progress indicator
-  //! @return true if Read operation has ended correctly
-  Standard_EXPORT virtual Standard_Boolean Read(const TCollection_AsciiString& thePath,
-                                                const Handle(TDocStd_Document)& theDocument,
-                                                const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
-  //! Writes a CAD file, according internal configuration
-  //! @param[in] thePath path to the export CAD file
-  //! @param[out] theDocument document to export
-  //! @param theProgress[in] progress indicator
-  //! @return true if Write operation has ended correctly
-  Standard_EXPORT virtual Standard_Boolean Write(const TCollection_AsciiString& thePath,
-                                                 const Handle(TDocStd_Document)& theDocument,
-                                                 const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
   //! Reads a CAD file, according internal configuration
   //! @param[in] thePath path to the import CAD file
   //! @param[out] theShape shape to save result
@@ -104,24 +86,6 @@ public:
                                                  Handle(XSControl_WorkSession)& theWS,
                                                  const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
 
-  //! Reads a CAD file, according internal configuration
-  //! @param[in] thePath path to the import CAD file
-  //! @param[out] theShape shape to save result
-  //! @param theProgress[in] progress indicator
-  //! @return true if Read operation has ended correctly
-  Standard_EXPORT virtual Standard_Boolean Read(const TCollection_AsciiString& thePath,
-                                                TopoDS_Shape& theShape,
-                                                const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
-  //! Writes a CAD file, according internal configuration
-  //! @param[in] thePath path to the export CAD file
-  //! @param[out] theShape shape to export
-  //! @param theProgress[in] progress indicator
-  //! @return true if Write operation has ended correctly
-  Standard_EXPORT virtual Standard_Boolean Write(const TCollection_AsciiString& thePath,
-                                                 const TopoDS_Shape& theShape,
-                                                 const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
 public:
 
   //! Gets CAD format name of associated provider
index afd83def43cf20f6ee98d3448292ae19ddcc346d..9b60a22c6877ccd883beca124065d3617a8baf1c 100644 (file)
@@ -17,6 +17,7 @@
 #include <DE_ConfigurationNode.hxx>
 #include <STEPControl_StepModelType.hxx>
 #include <Resource_FormatType.hxx>
+#include <TColStd_SequenceOfAsciiString.hxx>
 #include <UnitsMethods_LengthUnit.hxx>
 
 //! The purpose of this class is to configure the transfer process for STEP format
@@ -218,7 +219,9 @@ public:
     bool WriteSurfaceCurMode = true; //<! Indicates whether parametric curves (curves in parametric space of surface) should be written into the STEP file
     UnitsMethods_LengthUnit WriteUnit = UnitsMethods_LengthUnit_Millimeter; //<! Defines a unit in which the STEP file should be written
     TCollection_AsciiString WriteResourceName = "STEP"; //<! Defines the name of the resource file to write
+    TCollection_AsciiString WriteMultiPrefix; //<! Defines prefix for names of external files, if empty do not make multifile
     TCollection_AsciiString WriteSequence = "ToSTEP"; //<! Defines the name of the sequence of operators to write
+    TColStd_SequenceOfAsciiString WriteLabels; //<! Defines list of shape labels to export, if empty import full document
     WriteMode_VertexMode WriteVertexMode = WriteMode_VertexMode_OneCompound; //<! Indicates which of free vertices writing mode is switch on
     bool WriteSubshapeNames = false; //<! Indicates whether to write sub-shape names to 'Name' attributes of STEP Representation Items
     bool WriteColor = true; //<! ColorMode is used to indicate write Colors or not
index 20e835c854b955fa0671085b26dadc5a7d4f013b..66a1976afcab266ed7dc26e077d648372128910d 100644 (file)
@@ -22,6 +22,9 @@
 #include <STEPCAFControl_Controller.hxx>
 #include <STEPCAFControl_Reader.hxx>
 #include <STEPCAFControl_Writer.hxx>
+#include <TDocStd_Document.hxx>
+#include <TDataStd_Name.hxx>
+#include <TDF_Tool.hxx>
 #include <XCAFDoc_DocumentTool.hxx>
 #include <XSControl_WorkSession.hxx>
 #include <UnitsMethods.hxx>
@@ -55,7 +58,8 @@ void STEPCAFControl_Provider::personizeWS(Handle(XSControl_WorkSession)& theWS)
       << " Null work session, use internal temporary session";
     theWS = new XSControl_WorkSession();
   }
-  Handle(STEPControl_Controller) aCntrl = Handle(STEPControl_Controller)::DownCast(theWS->NormAdaptor());
+  Handle(STEPControl_Controller) aCntrl =
+    Handle(STEPControl_Controller)::DownCast(theWS->NormAdaptor());
   if (aCntrl.IsNull())
   {
     theWS->SelectNorm("STEP");
@@ -68,49 +72,104 @@ void STEPCAFControl_Provider::personizeWS(Handle(XSControl_WorkSession)& theWS)
 //=======================================================================
 void STEPCAFControl_Provider::initStatic(const Handle(DE_ConfigurationNode)& theNode)
 {
-  Handle(STEPCAFControl_ConfigurationNode) aNode = Handle(STEPCAFControl_ConfigurationNode)::DownCast(theNode);
+  Handle(STEPCAFControl_ConfigurationNode) aNode =
+    Handle(STEPCAFControl_ConfigurationNode)::DownCast(theNode);
   STEPCAFControl_Controller::Init();
-
+  if (!myToUpdateStaticParameters)
+  {
+    return;
+  }
   // Get previous values
-  myOldValues.ReadBSplineContinuity = (STEPCAFControl_ConfigurationNode::ReadMode_BSplineContinuity)Interface_Static::IVal("read.iges.bspline.continuity");
-  myOldValues.ReadPrecisionMode = (STEPCAFControl_ConfigurationNode::ReadMode_Precision)Interface_Static::IVal("read.precision.mode");
-  myOldValues.ReadPrecisionVal = Interface_Static::RVal("read.precision.val");
-  myOldValues.ReadMaxPrecisionMode = (STEPCAFControl_ConfigurationNode::ReadMode_MaxPrecision)Interface_Static::IVal("read.maxprecision.mode");
-  myOldValues.ReadMaxPrecisionVal = Interface_Static::RVal("read.maxprecision.val");
-  myOldValues.ReadSameParamMode = Interface_Static::IVal("read.stdsameparameter.mode") == 1;
-  myOldValues.ReadSurfaceCurveMode = (STEPCAFControl_ConfigurationNode::ReadMode_SurfaceCurve)Interface_Static::IVal("read.surfacecurve.mode");
-  myOldValues.EncodeRegAngle = Interface_Static::RVal("read.encoderegularity.angle") * 180.0 / M_PI;
-  myOldValues.AngleUnit = (STEPCAFControl_ConfigurationNode::AngleUnitMode)Interface_Static::IVal("step.angleunit.mode");
-
-  myOldValues.ReadResourceName = Interface_Static::CVal("read.step.resource.name");
-  myOldValues.ReadSequence = Interface_Static::CVal("read.step.sequence");
-  myOldValues.ReadProductMode = Interface_Static::IVal("read.step.product.mode") == 1;
-  myOldValues.ReadProductContext = (STEPCAFControl_ConfigurationNode::ReadMode_ProductContext)Interface_Static::IVal("read.step.product.context");
-  myOldValues.ReadShapeRepr = (STEPCAFControl_ConfigurationNode::ReadMode_ShapeRepr)Interface_Static::IVal("read.step.shape.repr");
-  myOldValues.ReadTessellated = (STEPCAFControl_ConfigurationNode::RWMode_Tessellated)Interface_Static::IVal("read.step.tessellated");
-  myOldValues.ReadAssemblyLevel = (STEPCAFControl_ConfigurationNode::ReadMode_AssemblyLevel)Interface_Static::IVal("read.step.assembly.level");
-  myOldValues.ReadRelationship = Interface_Static::IVal("read.step.shape.relationship") == 1;
-  myOldValues.ReadShapeAspect = Interface_Static::IVal("read.step.shape.aspect") == 1;
-  myOldValues.ReadConstrRelation = Interface_Static::IVal("read.step.constructivegeom.relationship") == 1;
-  myOldValues.ReadSubshapeNames = Interface_Static::IVal("read.stepcaf.subshapes.name") == 1;
-  myOldValues.ReadCodePage = (Resource_FormatType)Interface_Static::IVal("read.step.codepage");
-  myOldValues.ReadNonmanifold = Interface_Static::IVal("read.step.nonmanifold") == 1;
-  myOldValues.ReadIdeas = Interface_Static::IVal("read.step.ideas") == 1;
-  myOldValues.ReadAllShapes = Interface_Static::IVal("read.step.all.shapes") == 1;
-  myOldValues.ReadRootTransformation = Interface_Static::IVal("read.step.root.transformation") == 1;
-
-  myOldValues.WritePrecisionMode = (STEPCAFControl_ConfigurationNode::WriteMode_PrecisionMode)Interface_Static::IVal("write.precision.mode");
-  myOldValues.WritePrecisionVal = Interface_Static::RVal("write.precision.val");
-  myOldValues.WriteAssembly = (STEPCAFControl_ConfigurationNode::WriteMode_Assembly)Interface_Static::IVal("write.step.assembly");
-  myOldValues.WriteSchema = (STEPCAFControl_ConfigurationNode::WriteMode_StepSchema)Interface_Static::IVal("write.step.schema");
-  myOldValues.WriteTessellated = (STEPCAFControl_ConfigurationNode::RWMode_Tessellated)Interface_Static::IVal("write.step.tessellated");
-  myOldValues.WriteProductName = Interface_Static::CVal("write.step.product.name");
-  myOldValues.WriteSurfaceCurMode = Interface_Static::IVal("write.surfacecurve.mode") == 1;
-  myOldValues.WriteUnit = (UnitsMethods_LengthUnit)Interface_Static::IVal("write.step.unit");
-  myOldValues.WriteResourceName = Interface_Static::CVal("write.resource.name");
-  myOldValues.WriteSequence = Interface_Static::CVal("write.step.sequence");
-  myOldValues.WriteVertexMode = (STEPCAFControl_ConfigurationNode::WriteMode_VertexMode)Interface_Static::IVal("write.step.vertex.mode");
-  myOldValues.WriteSubshapeNames = Interface_Static::IVal("write.stepcaf.subshapes.name") == 1;
+  myOldValues.ReadBSplineContinuity =
+    (STEPCAFControl_ConfigurationNode::ReadMode_BSplineContinuity)
+    Interface_Static::IVal("read.iges.bspline.continuity");
+  myOldValues.ReadPrecisionMode =
+    (STEPCAFControl_ConfigurationNode::ReadMode_Precision)
+    Interface_Static::IVal("read.precision.mode");
+  myOldValues.ReadPrecisionVal =
+    Interface_Static::RVal("read.precision.val");
+  myOldValues.ReadMaxPrecisionMode =
+    (STEPCAFControl_ConfigurationNode::ReadMode_MaxPrecision)
+    Interface_Static::IVal("read.maxprecision.mode");
+  myOldValues.ReadMaxPrecisionVal =
+    Interface_Static::RVal("read.maxprecision.val");
+  myOldValues.ReadSameParamMode =
+    Interface_Static::IVal("read.stdsameparameter.mode") == 1;
+  myOldValues.ReadSurfaceCurveMode =
+    (STEPCAFControl_ConfigurationNode::ReadMode_SurfaceCurve)
+    Interface_Static::IVal("read.surfacecurve.mode");
+  myOldValues.EncodeRegAngle =
+    Interface_Static::RVal("read.encoderegularity.angle") * 180.0 / M_PI;
+  myOldValues.AngleUnit =
+    (STEPCAFControl_ConfigurationNode::AngleUnitMode)
+    Interface_Static::IVal("step.angleunit.mode");
+
+  myOldValues.ReadResourceName =
+    Interface_Static::CVal("read.step.resource.name");
+  myOldValues.ReadSequence =
+    Interface_Static::CVal("read.step.sequence");
+  myOldValues.ReadProductMode =
+    Interface_Static::IVal("read.step.product.mode") == 1;
+  myOldValues.ReadProductContext =
+    (STEPCAFControl_ConfigurationNode::ReadMode_ProductContext)
+    Interface_Static::IVal("read.step.product.context");
+  myOldValues.ReadShapeRepr =
+    (STEPCAFControl_ConfigurationNode::ReadMode_ShapeRepr)
+    Interface_Static::IVal("read.step.shape.repr");
+  myOldValues.ReadTessellated =
+    (STEPCAFControl_ConfigurationNode::RWMode_Tessellated)
+    Interface_Static::IVal("read.step.tessellated");
+  myOldValues.ReadAssemblyLevel =
+    (STEPCAFControl_ConfigurationNode::ReadMode_AssemblyLevel)
+    Interface_Static::IVal("read.step.assembly.level");
+  myOldValues.ReadRelationship =
+    Interface_Static::IVal("read.step.shape.relationship") == 1;
+  myOldValues.ReadShapeAspect =
+    Interface_Static::IVal("read.step.shape.aspect") == 1;
+  myOldValues.ReadConstrRelation =
+    Interface_Static::IVal("read.step.constructivegeom.relationship") == 1;
+  myOldValues.ReadSubshapeNames =
+    Interface_Static::IVal("read.stepcaf.subshapes.name") == 1;
+  myOldValues.ReadCodePage =
+    (Resource_FormatType)Interface_Static::IVal("read.step.codepage");
+  myOldValues.ReadNonmanifold =
+    Interface_Static::IVal("read.step.nonmanifold") == 1;
+  myOldValues.ReadIdeas =
+    Interface_Static::IVal("read.step.ideas") == 1;
+  myOldValues.ReadAllShapes =
+    Interface_Static::IVal("read.step.all.shapes") == 1;
+  myOldValues.ReadRootTransformation =
+    Interface_Static::IVal("read.step.root.transformation") == 1;
+
+  myOldValues.WritePrecisionMode =
+    (STEPCAFControl_ConfigurationNode::WriteMode_PrecisionMode)
+    Interface_Static::IVal("write.precision.mode");
+  myOldValues.WritePrecisionVal =
+    Interface_Static::RVal("write.precision.val");
+  myOldValues.WriteAssembly =
+    (STEPCAFControl_ConfigurationNode::WriteMode_Assembly)
+    Interface_Static::IVal("write.step.assembly");
+  myOldValues.WriteSchema =
+    (STEPCAFControl_ConfigurationNode::WriteMode_StepSchema)
+    Interface_Static::IVal("write.step.schema");
+  myOldValues.WriteTessellated =
+    (STEPCAFControl_ConfigurationNode::RWMode_Tessellated)
+    Interface_Static::IVal("write.step.tessellated");
+  myOldValues.WriteProductName =
+    Interface_Static::CVal("write.step.product.name");
+  myOldValues.WriteSurfaceCurMode =
+    Interface_Static::IVal("write.surfacecurve.mode") == 1;
+  myOldValues.WriteUnit =
+    (UnitsMethods_LengthUnit)Interface_Static::IVal("write.step.unit");
+  myOldValues.WriteResourceName =
+    Interface_Static::CVal("write.resource.name");
+  myOldValues.WriteSequence =
+    Interface_Static::CVal("write.step.sequence");
+  myOldValues.WriteVertexMode =
+    (STEPCAFControl_ConfigurationNode::WriteMode_VertexMode)
+    Interface_Static::IVal("write.step.vertex.mode");
+  myOldValues.WriteSubshapeNames =
+    Interface_Static::IVal("write.stepcaf.subshapes.name") == 1;
 
   // Set new values
   setStatic(aNode->InternalParameters);
@@ -122,45 +181,82 @@ void STEPCAFControl_Provider::initStatic(const Handle(DE_ConfigurationNode)& the
 //=======================================================================
 void STEPCAFControl_Provider::setStatic(const STEPCAFControl_ConfigurationNode::STEPCAFControl_InternalSection theParameter)
 {
-  Interface_Static::SetIVal("read.iges.bspline.continuity", theParameter.ReadBSplineContinuity);
-  Interface_Static::SetIVal("read.precision.mode", theParameter.ReadPrecisionMode);
-  Interface_Static::SetRVal("read.precision.val", theParameter.ReadPrecisionVal);
-  Interface_Static::SetIVal("read.maxprecision.mode", theParameter.ReadMaxPrecisionMode);
-  Interface_Static::SetRVal("read.maxprecision.val", theParameter.ReadMaxPrecisionVal);
-  Interface_Static::SetIVal("read.stdsameparameter.mode", theParameter.ReadSameParamMode);
-  Interface_Static::SetIVal("read.surfacecurve.mode", theParameter.ReadSurfaceCurveMode);
-  Interface_Static::SetRVal("read.encoderegularity.angle", theParameter.EncodeRegAngle * M_PI / 180.0);
-  Interface_Static::SetIVal("step.angleunit.mode", theParameter.AngleUnit);
-
-  Interface_Static::SetCVal("read.step.resource.name", theParameter.ReadResourceName.ToCString());
-  Interface_Static::SetCVal("read.step.sequence", theParameter.ReadSequence.ToCString());
-  Interface_Static::SetIVal("read.step.product.mode", theParameter.ReadProductMode);
-  Interface_Static::SetIVal("read.step.product.context", theParameter.ReadProductContext);
-  Interface_Static::SetIVal("read.step.shape.repr", theParameter.ReadShapeRepr);
-  Interface_Static::SetIVal("read.step.tessellated", theParameter.ReadTessellated);
-  Interface_Static::SetIVal("read.step.assembly.level", theParameter.ReadAssemblyLevel);
-  Interface_Static::SetIVal("read.step.shape.relationship", theParameter.ReadRelationship);
-  Interface_Static::SetIVal("read.step.shape.aspect", theParameter.ReadShapeAspect);
-  Interface_Static::SetIVal("read.step.constructivegeom.relationship", theParameter.ReadConstrRelation);
-  Interface_Static::SetIVal("read.stepcaf.subshapes.name", theParameter.ReadSubshapeNames);
-  Interface_Static::SetIVal("read.step.codepage", theParameter.ReadCodePage);
-  Interface_Static::SetIVal("read.step.nonmanifold", theParameter.ReadNonmanifold);
-  Interface_Static::SetIVal("read.step.ideas", theParameter.ReadIdeas);
-  Interface_Static::SetIVal("read.step.all.shapes", theParameter.ReadAllShapes);
-  Interface_Static::SetIVal("read.step.root.transformation", theParameter.ReadRootTransformation);
-
-  Interface_Static::SetIVal("write.precision.mode", theParameter.WritePrecisionMode);
-  Interface_Static::SetRVal("write.precision.val", theParameter.WritePrecisionVal);
-  Interface_Static::SetIVal("write.step.assembly", theParameter.WriteAssembly);
-  Interface_Static::SetIVal("write.step.schema", theParameter.WriteSchema);
-  Interface_Static::SetIVal("write.step.tessellated", theParameter.WriteTessellated);
-  Interface_Static::SetCVal("write.step.product.name", theParameter.WriteProductName.ToCString());
-  Interface_Static::SetIVal("write.surfacecurve.mode", theParameter.WriteSurfaceCurMode);
-  Interface_Static::SetIVal("write.step.unit", theParameter.WriteUnit);
-  Interface_Static::SetCVal("write.resource.name", theParameter.WriteResourceName.ToCString());
-  Interface_Static::SetCVal("write.step.sequence", theParameter.WriteSequence.ToCString());
-  Interface_Static::SetIVal("write.step.vertex.mode", theParameter.WriteVertexMode);
-  Interface_Static::SetIVal("write.stepcaf.subshapes.name", theParameter.WriteSubshapeNames);
+  Interface_Static::SetIVal("read.iges.bspline.continuity",
+                            theParameter.ReadBSplineContinuity);
+  Interface_Static::SetIVal("read.precision.mode",
+                            theParameter.ReadPrecisionMode);
+  Interface_Static::SetRVal("read.precision.val",
+                            theParameter.ReadPrecisionVal);
+  Interface_Static::SetIVal("read.maxprecision.mode",
+                            theParameter.ReadMaxPrecisionMode);
+  Interface_Static::SetRVal("read.maxprecision.val",
+                            theParameter.ReadMaxPrecisionVal);
+  Interface_Static::SetIVal("read.stdsameparameter.mode",
+                            theParameter.ReadSameParamMode);
+  Interface_Static::SetIVal("read.surfacecurve.mode",
+                            theParameter.ReadSurfaceCurveMode);
+  Interface_Static::SetRVal("read.encoderegularity.angle",
+                            theParameter.EncodeRegAngle * M_PI / 180.0);
+  Interface_Static::SetIVal("step.angleunit.mode",
+                            theParameter.AngleUnit);
+
+  Interface_Static::SetCVal("read.step.resource.name",
+                            theParameter.ReadResourceName.ToCString());
+  Interface_Static::SetCVal("read.step.sequence",
+                            theParameter.ReadSequence.ToCString());
+  Interface_Static::SetIVal("read.step.product.mode",
+                            theParameter.ReadProductMode);
+  Interface_Static::SetIVal("read.step.product.context",
+                            theParameter.ReadProductContext);
+  Interface_Static::SetIVal("read.step.shape.repr",
+                            theParameter.ReadShapeRepr);
+  Interface_Static::SetIVal("read.step.tessellated",
+                            theParameter.ReadTessellated);
+  Interface_Static::SetIVal("read.step.assembly.level",
+                            theParameter.ReadAssemblyLevel);
+  Interface_Static::SetIVal("read.step.shape.relationship",
+                            theParameter.ReadRelationship);
+  Interface_Static::SetIVal("read.step.shape.aspect",
+                            theParameter.ReadShapeAspect);
+  Interface_Static::SetIVal("read.step.constructivegeom.relationship",
+                            theParameter.ReadConstrRelation);
+  Interface_Static::SetIVal("read.stepcaf.subshapes.name",
+                            theParameter.ReadSubshapeNames);
+  Interface_Static::SetIVal("read.step.codepage",
+                            theParameter.ReadCodePage);
+  Interface_Static::SetIVal("read.step.nonmanifold",
+                            theParameter.ReadNonmanifold);
+  Interface_Static::SetIVal("read.step.ideas",
+                            theParameter.ReadIdeas);
+  Interface_Static::SetIVal("read.step.all.shapes",
+                            theParameter.ReadAllShapes);
+  Interface_Static::SetIVal("read.step.root.transformation",
+                            theParameter.ReadRootTransformation);
+
+  Interface_Static::SetIVal("write.precision.mode",
+                            theParameter.WritePrecisionMode);
+  Interface_Static::SetRVal("write.precision.val",
+                            theParameter.WritePrecisionVal);
+  Interface_Static::SetIVal("write.step.assembly",
+                            theParameter.WriteAssembly);
+  Interface_Static::SetIVal("write.step.schema",
+                            theParameter.WriteSchema);
+  Interface_Static::SetIVal("write.step.tessellated",
+                            theParameter.WriteTessellated);
+  Interface_Static::SetCVal("write.step.product.name",
+                            theParameter.WriteProductName.ToCString());
+  Interface_Static::SetIVal("write.surfacecurve.mode",
+                            theParameter.WriteSurfaceCurMode);
+  Interface_Static::SetIVal("write.step.unit",
+                            theParameter.WriteUnit);
+  Interface_Static::SetCVal("write.resource.name",
+                            theParameter.WriteResourceName.ToCString());
+  Interface_Static::SetCVal("write.step.sequence",
+                            theParameter.WriteSequence.ToCString());
+  Interface_Static::SetIVal("write.step.vertex.mode",
+                            theParameter.WriteVertexMode);
+  Interface_Static::SetIVal("write.stepcaf.subshapes.name",
+                            theParameter.WriteSubshapeNames);
 }
 
 //=======================================================================
@@ -169,6 +265,10 @@ void STEPCAFControl_Provider::setStatic(const STEPCAFControl_ConfigurationNode::
 //=======================================================================
 void STEPCAFControl_Provider::resetStatic()
 {
+  if (!myToUpdateStaticParameters)
+  {
+    return;
+  }
   setStatic(myOldValues);
 }
 
@@ -183,42 +283,122 @@ bool STEPCAFControl_Provider::Read(const TCollection_AsciiString& thePath,
 {
   if (theDocument.IsNull())
   {
-    Message::SendFail() << "Error in the STEPCAFControl_Provider during reading the file " <<
-      thePath << "\t: theDocument shouldn't be null";
+    Message::SendFail() << "Error: STEPCAFControl_Provider : "
+      << "Null document";
     return false;
   }
-  if (GetNode().IsNull() || !GetNode()->IsKind(STANDARD_TYPE(STEPCAFControl_ConfigurationNode)))
+  if (GetNode().IsNull() ||
+      !GetNode()->IsKind(STANDARD_TYPE(STEPCAFControl_ConfigurationNode)))
   {
-    Message::SendFail() << "Error in the STEPCAFControl_Provider during reading the file " <<
-      thePath << "\t: Incorrect or empty Configuration Node";
+    Message::SendFail() << "Error: STEPCAFControl_Provider : "
+      << "Incorrect or empty Configuration Node";
     return false;
   }
-  Handle(STEPCAFControl_ConfigurationNode) aNode = Handle(STEPCAFControl_ConfigurationNode)::DownCast(GetNode());
+  Handle(STEPCAFControl_ConfigurationNode) aNode =
+    Handle(STEPCAFControl_ConfigurationNode)::DownCast(GetNode());
   initStatic(aNode);
 
   personizeWS(theWS);
-  XCAFDoc_DocumentTool::SetLengthUnit(theDocument, aNode->GlobalParameters.LengthUnit, UnitsMethods_LengthUnit_Millimeter);
-  STEPCAFControl_Reader aReader;
-  aReader.Init(theWS);
+  XCAFDoc_DocumentTool::SetLengthUnit(theDocument,
+                                      aNode->GlobalParameters.LengthUnit,
+                                      UnitsMethods_LengthUnit_Millimeter);
+  const Standard_Boolean toUseLoaded = thePath == ".";
+  TCollection_AsciiString aFile;
+  if (toUseLoaded)
+  {
+    aFile = theWS->LoadedFile();
+    Message::SendInfo() << "Model taken from the STEP session : "
+      << aFile;
+  }
+  else
+  {
+    aFile = thePath;
+    Message::SendInfo() << "File STEP to read : "
+      << aFile;
+  }
+  STEPCAFControl_Reader aReader(theWS, !toUseLoaded);
   aReader.SetColorMode(aNode->InternalParameters.ReadColor);
   aReader.SetNameMode(aNode->InternalParameters.ReadName);
   aReader.SetLayerMode(aNode->InternalParameters.ReadLayer);
   aReader.SetPropsMode(aNode->InternalParameters.ReadProps);
-
   IFSelect_ReturnStatus aReadStat = IFSelect_RetVoid;
-  aReadStat = aReader.ReadFile(thePath.ToCString());
+  if (!toUseLoaded)
+  {
+    aReadStat = aReader.ReadFile(thePath.ToCString());
+  }
+  else if (theWS->NbStartingEntities() > 0)
+  {
+    aReadStat = IFSelect_RetDone;
+  }
   if (aReadStat != IFSelect_RetDone)
   {
-    Message::SendFail() << "Error in the STEPCAFControl_Provider during reading the file " <<
-      thePath << "\t: abandon";
+    Message::SendFail() << "Error: STEPCAFControl_Provider : ["
+      << aFile << "] : abandon, no model loaded";
+    resetStatic();
+    return false;
+  }
+  if (!aReader.Transfer(theDocument, theProgress))
+  {
+    Message::SendFail() << "Error: STEPCAFControl_Provider : [" <<
+      aFile << "] : Cannot read any relevant data from the IGES file";
     resetStatic();
     return false;
   }
+  resetStatic();
+  return true;
+}
 
+
+//=======================================================================
+// function : Read
+// purpose  :
+//=======================================================================
+bool STEPCAFControl_Provider::Read(std::istream& theIStream,
+                                   const Handle(TDocStd_Document)& theDocument,
+                                   const TCollection_AsciiString theName,
+                                   Handle(XSControl_WorkSession)& theWS,
+                                   const Message_ProgressRange& theProgress)
+{
+  if (theDocument.IsNull())
+  {
+    Message::SendFail() << "Error: STEPCAFControl_Provider : "
+      << "Null document";
+    return false;
+  }
+  if (GetNode().IsNull() ||
+      !GetNode()->IsKind(STANDARD_TYPE(STEPCAFControl_ConfigurationNode)))
+  {
+    Message::SendFail() << "Error: STEPCAFControl_Provider : "
+      << "Incorrect or empty Configuration Node";
+    return false;
+  }
+  Handle(STEPCAFControl_ConfigurationNode) aNode =
+    Handle(STEPCAFControl_ConfigurationNode)::DownCast(GetNode());
+  initStatic(aNode);
+
+  personizeWS(theWS);
+  XCAFDoc_DocumentTool::SetLengthUnit(theDocument,
+                                      aNode->GlobalParameters.LengthUnit,
+                                      UnitsMethods_LengthUnit_Millimeter);
+  Message::SendInfo() << "Model taken from the STEP stream";
+  STEPCAFControl_Reader aReader(theWS);
+  aReader.SetColorMode(aNode->InternalParameters.ReadColor);
+  aReader.SetNameMode(aNode->InternalParameters.ReadName);
+  aReader.SetLayerMode(aNode->InternalParameters.ReadLayer);
+  aReader.SetPropsMode(aNode->InternalParameters.ReadProps);
+  IFSelect_ReturnStatus aReadStat = IFSelect_RetVoid;
+  aReadStat = aReader.ReadStream(theName.ToCString(), theIStream);
+  if (aReadStat != IFSelect_RetDone)
+  {
+    Message::SendFail() << "Error: STEPCAFControl_Provider : "
+      << "Abandon, no model loaded via stream";
+    resetStatic();
+    return false;
+  }
   if (!aReader.Transfer(theDocument, theProgress))
   {
-    Message::SendFail() << "Error in the STEPCAFControl_Provider during reading the file " <<
-      thePath << "\t: Cannot read any relevant data from the STEP file";
+    Message::SendFail() << "Error: STEPCAFControl_Provider : "
+      << "Cannot read any relevant data from the IGES file";
     resetStatic();
     return false;
   }
@@ -235,58 +415,186 @@ bool STEPCAFControl_Provider::Write(const TCollection_AsciiString& thePath,
                                     Handle(XSControl_WorkSession)& theWS,
                                     const Message_ProgressRange& theProgress)
 {
-  if (GetNode().IsNull() || !GetNode()->IsKind(STANDARD_TYPE(STEPCAFControl_ConfigurationNode)))
+  if (GetNode().IsNull() ||
+      !GetNode()->IsKind(STANDARD_TYPE(STEPCAFControl_ConfigurationNode)))
   {
-    Message::SendFail() << "Error in the STEPCAFControl_Provider during writing the file " <<
-      thePath << "\t: Incorrect or empty Configuration Node";
+    Message::SendFail() << "Error: STEPCAFControl_Provider : "
+      << "Incorrect or empty Configuration Node";
     return false;
   }
-  Handle(STEPCAFControl_ConfigurationNode) aNode = Handle(STEPCAFControl_ConfigurationNode)::DownCast(GetNode());
+  Handle(STEPCAFControl_ConfigurationNode) aNode =
+    Handle(STEPCAFControl_ConfigurationNode)::DownCast(GetNode());
   initStatic(aNode);
-
-  XCAFDoc_DocumentTool::SetLengthUnit(theDocument, 
-                                      UnitsMethods::GetLengthUnitScale(aNode->InternalParameters.WriteUnit, UnitsMethods_LengthUnit_Millimeter),
+  XCAFDoc_DocumentTool::SetLengthUnit(theDocument,
+                                      UnitsMethods::GetLengthUnitScale(
+                                      aNode->InternalParameters.WriteUnit,
+                                      UnitsMethods_LengthUnit_Millimeter),
                                       UnitsMethods_LengthUnit_Millimeter);
   personizeWS(theWS);
-  STEPCAFControl_Writer aWriter;
-  aWriter.Init(theWS);
-  STEPControl_StepModelType aMode = static_cast<STEPControl_StepModelType>(aNode->InternalParameters.WriteModelType);
+  STEPCAFControl_Writer aWriter(theWS, Standard_True);
+  STEPControl_StepModelType aMode =
+    static_cast<STEPControl_StepModelType>(aNode->InternalParameters.WriteModelType);
   aWriter.SetColorMode(aNode->InternalParameters.WriteColor);
   aWriter.SetNameMode(aNode->InternalParameters.WriteName);
   aWriter.SetLayerMode(aNode->InternalParameters.WriteLayer);
   aWriter.SetPropsMode(aNode->InternalParameters.WriteProps);
 
-  TDF_Label aLabel;
-
-  if (!aWriter.Transfer(theDocument, aMode, 0, theProgress))
+  TDF_LabelSequence aLabels;
+  TCollection_AsciiString aLabelsString;
+  for (TColStd_SequenceOfAsciiString::Iterator anIter(aNode->InternalParameters.WriteLabels);
+       anIter.More(); anIter.Next())
+  {
+    const TCollection_AsciiString& aValue = anIter.Value();
+    TDF_Label aLabel;
+    TDF_Tool::Label(theDocument->Main().Data(), aValue, aLabel, Standard_False);
+    if (aLabel.IsNull())
+    {
+      Message::SendFail() << "Error: No label for entry '" << aValue << "'";
+      return false;
+    }
+    if (!aLabelsString.IsEmpty())
+    {
+      aLabelsString += " ";
+    }
+    aLabelsString += aValue;
+    aLabels.Append(aLabel);
+  }
+  TCollection_ExtendedString aDocName;
+  Handle(TDataStd_Name) aNameAttr;
+  if (theDocument->GetData()->Root().FindAttribute(TDataStd_Name::GetID(), aNameAttr))
+  {
+    aDocName = aNameAttr->Get();
+  }
+  Standard_Boolean aTransferStatus = Standard_True;
+  Standard_CString aMultiFilePrefix = !aNode->InternalParameters.WriteMultiPrefix.IsEmpty() ?
+    aNode->InternalParameters.WriteMultiPrefix.ToCString() : nullptr;
+  Message::SendInfo() << "Writing STEP file "
+    << thePath;
+  if (aLabels.IsEmpty())
+  {
+    Message::SendInfo() << "Translating labels "
+      << aLabelsString << " of document " << aDocName << " to STEP";
+    aTransferStatus = aWriter.Transfer(theDocument, aMode, aMultiFilePrefix, theProgress);
+  }
+  else
   {
-    Message::SendFail() << "Error in the STEPCAFControl_Provider during writing the file " <<
-      thePath << "\t: The document cannot be translated or gives no result";
+    Message::SendInfo() << "Translating document "
+      << aDocName << " to STEP";
+    aTransferStatus = aWriter.Transfer(aLabels, aMode, aMultiFilePrefix, theProgress);
+  }
+  if (!aTransferStatus)
+  {
+    Message::SendFail() << "Error: STEPCAFControl_Provider : "
+      << "The document cannot be translated or gives no result";
     resetStatic();
     return false;
   }
-  IFSelect_ReturnStatus aStatus = aWriter.Write(thePath.ToCString());
-  switch (aStatus)
+  if (thePath == ".")
   {
-    case IFSelect_RetVoid:
-    {
-      Message::SendFail() << "Error in the STEPCAFControl_Provider during writing the file " <<
-        thePath << "\t: No file written";
-      resetStatic();
-      return false;;
-    }
-    case IFSelect_RetDone:
+    resetStatic();
+    Message::SendInfo() << "Document has been translated into the session";
+    return true;
+  }
+  if (aWriter.Write(thePath.ToCString()) != IFSelect_RetDone)
+  {
+    Message::SendFail() << "Error: STEPCAFControl_Provider : [" <<
+      thePath << "] : Write failed";
+    resetStatic();
+    return false;
+  }
+  Message::SendInfo() << "STEP file [" << thePath << "] Successfully written";
+  resetStatic();
+  return true;
+}
+
+//=======================================================================
+// function : Write
+// purpose  :
+//=======================================================================
+bool STEPCAFControl_Provider::Write(std::ostream& theOStream,
+                                    const Handle(TDocStd_Document)& theDocument,
+                                    Handle(XSControl_WorkSession)& theWS,
+                                    const Message_ProgressRange& theProgress)
+{
+  if (GetNode().IsNull() ||
+      !GetNode()->IsKind(STANDARD_TYPE(STEPCAFControl_ConfigurationNode)))
+  {
+    Message::SendFail() << "Error: STEPCAFControl_Provider : "
+      << "Incorrect or empty Configuration Node";
+    return false;
+  }
+  Handle(STEPCAFControl_ConfigurationNode) aNode =
+    Handle(STEPCAFControl_ConfigurationNode)::DownCast(GetNode());
+  initStatic(aNode);
+  XCAFDoc_DocumentTool::SetLengthUnit(theDocument,
+                                      UnitsMethods::GetLengthUnitScale(
+                                      aNode->InternalParameters.WriteUnit,
+                                      UnitsMethods_LengthUnit_Millimeter),
+                                      UnitsMethods_LengthUnit_Millimeter);
+  personizeWS(theWS);
+  STEPCAFControl_Writer aWriter(theWS, Standard_True);
+  STEPControl_StepModelType aMode =
+    static_cast<STEPControl_StepModelType>(aNode->InternalParameters.WriteModelType);
+  aWriter.SetColorMode(aNode->InternalParameters.WriteColor);
+  aWriter.SetNameMode(aNode->InternalParameters.WriteName);
+  aWriter.SetLayerMode(aNode->InternalParameters.WriteLayer);
+  aWriter.SetPropsMode(aNode->InternalParameters.WriteProps);
+  TDF_LabelSequence aLabels;
+  TCollection_AsciiString aLabelsString;
+  for (TColStd_SequenceOfAsciiString::Iterator anIter(aNode->InternalParameters.WriteLabels);
+       anIter.More(); anIter.Next())
+  {
+    const TCollection_AsciiString& aValue = anIter.Value();
+    TDF_Label aLabel;
+    TDF_Tool::Label(theDocument->Main().Data(), aValue, aLabel, Standard_False);
+    if (aLabel.IsNull())
     {
-      break;
+      Message::SendFail() << "Error: No label for entry '" << aValue << "'";
+      return false;
     }
-    default:
+    if (!aLabelsString.IsEmpty())
     {
-      Message::SendFail() << "Error in the STEPCAFControl_Provider during writing the file " <<
-        thePath << "\t: Error on writing file";
-      resetStatic();
-      return false;
+      aLabelsString += " ";
     }
+    aLabelsString += aValue;
+    aLabels.Append(aLabel);
+  }
+  TCollection_ExtendedString aDocName;
+  Handle(TDataStd_Name) aNameAttr;
+  if (theDocument->GetData()->Root().FindAttribute(TDataStd_Name::GetID(), aNameAttr))
+  {
+    aDocName = aNameAttr->Get();
+  }
+  Standard_Boolean aTransferStatus = Standard_True;
+  Standard_CString aMultiFilePrefix = !aNode->InternalParameters.WriteMultiPrefix.IsEmpty() ?
+    aNode->InternalParameters.WriteMultiPrefix.ToCString() : nullptr;
+  Message::SendInfo() << "Writing STEP file to stream";
+  if (aLabels.IsEmpty())
+  {
+    Message::SendInfo() << "Translating labels "
+      << aLabelsString << " of document " << aDocName << " to STEP";
+    aTransferStatus = aWriter.Transfer(theDocument, aMode, aMultiFilePrefix, theProgress);
+  }
+  else
+  {
+    Message::SendInfo() << "Translating document "
+      << aDocName << " to STEP";
+    aTransferStatus = aWriter.Transfer(aLabels, aMode, aMultiFilePrefix, theProgress);
+  }
+  if (!aTransferStatus)
+  {
+    Message::SendFail() << "Error: STEPCAFControl_Provider : "
+      << "The document cannot be translated or gives no result";
+    resetStatic();
+    return false;
   }
+  if (aWriter.WriteStream(theOStream) != IFSelect_RetDone)
+  {
+    Message::SendFail() << "Error: STEPCAFControl_Provider : Write to stream failed";
+    resetStatic();
+    return false;
+  }
+  Message::SendInfo() << "STEP file to stream successfully written";
   resetStatic();
   return true;
 }
@@ -296,52 +604,71 @@ bool STEPCAFControl_Provider::Write(const TCollection_AsciiString& thePath,
 // purpose  :
 //=======================================================================
 bool STEPCAFControl_Provider::Read(const TCollection_AsciiString& thePath,
-                                   const Handle(TDocStd_Document)& theDocument,
+                                   TopoDS_Shape& theShape,
+                                   Handle(XSControl_WorkSession)& theWS,
                                    const Message_ProgressRange& theProgress)
 {
-  Handle(XSControl_WorkSession) aWS = new XSControl_WorkSession();
-  return Read(thePath, theDocument, aWS, theProgress);
-}
-
-//=======================================================================
-// function : Write
-// purpose  :
-//=======================================================================
-bool STEPCAFControl_Provider::Write(const TCollection_AsciiString& thePath,
-                                    const Handle(TDocStd_Document)& theDocument,
-                                    const Message_ProgressRange& theProgress)
-{
-  Handle(XSControl_WorkSession) aWS = new XSControl_WorkSession();
-  return Write(thePath, theDocument, aWS, theProgress);
+  (void)theProgress;
+  if (GetNode().IsNull() ||
+      !GetNode()->IsKind(STANDARD_TYPE(STEPCAFControl_ConfigurationNode)))
+  {
+    Message::SendFail() << "Error: STEPCAFControl_Provider : "
+      << "Incorrect or empty Configuration Node";
+    return false;
+  }
+  Handle(STEPCAFControl_ConfigurationNode) aNode =
+    Handle(STEPCAFControl_ConfigurationNode)::DownCast(GetNode());
+  initStatic(aNode);
+  personizeWS(theWS);
+  STEPControl_Reader aReader(theWS);
+  if (aReader.ReadFile(thePath.ToCString()) != IFSelect_RetDone)
+  {
+    Message::SendFail() << "Error: STEPCAFControl_Provider : ["
+      << thePath << "] : abandon, no model loaded";
+    resetStatic();
+    return false;
+  }
+  Handle(StepData_StepModel) aModel = Handle(StepData_StepModel)::DownCast(aReader.Model());
+  aModel->SetLocalLengthUnit(aNode->GlobalParameters.LengthUnit);
+  if (aReader.TransferRoots() <= 0)
+  {
+    Message::SendFail() << "Error: STEPCAFControl_Provider : [" <<
+      thePath << "] : Cannot read any relevant data from the STEP file";
+    resetStatic();
+    return false;
+  }
+  theShape = aReader.OneShape();
+  resetStatic();
+  return true;
 }
 
 //=======================================================================
 // function : Read
 // purpose  :
 //=======================================================================
-bool STEPCAFControl_Provider::Read(const TCollection_AsciiString& thePath,
+bool STEPCAFControl_Provider::Read(std::istream& theIStream,
                                    TopoDS_Shape& theShape,
+                                   const TCollection_AsciiString theName,
                                    Handle(XSControl_WorkSession)& theWS,
                                    const Message_ProgressRange& theProgress)
 {
   (void)theProgress;
-  if (GetNode().IsNull() || !GetNode()->IsKind(STANDARD_TYPE(STEPCAFControl_ConfigurationNode)))
+  if (GetNode().IsNull() ||
+      !GetNode()->IsKind(STANDARD_TYPE(STEPCAFControl_ConfigurationNode)))
   {
-    Message::SendFail() << "Error in the STEPCAFControl_Provider during reading the file " <<
-      thePath << "\t: Incorrect or empty Configuration Node";
+    Message::SendFail() << "Error: STEPCAFControl_Provider : "
+      << "Incorrect or empty Configuration Node";
     return false;
   }
-  Handle(STEPCAFControl_ConfigurationNode) aNode = Handle(STEPCAFControl_ConfigurationNode)::DownCast(GetNode());
+  Handle(STEPCAFControl_ConfigurationNode) aNode =
+    Handle(STEPCAFControl_ConfigurationNode)::DownCast(GetNode());
   initStatic(aNode);
   personizeWS(theWS);
-  STEPControl_Reader aReader;
-  aReader.SetWS(theWS);
-  IFSelect_ReturnStatus aReadstat = IFSelect_RetVoid;
-  aReadstat = aReader.ReadFile(thePath.ToCString());
-  if (aReadstat != IFSelect_RetDone)
-  {
-    Message::SendFail() << "Error in the STEPCAFControl_Provider during reading the file " <<
-      thePath << "\t: abandon, no model loaded";
+  STEPControl_Reader aReader(theWS);
+  if (aReader.ReadStream(theName.ToCString(), theIStream) != IFSelect_RetDone)
+  {
+    Message::SendFail() << "Error: STEPCAFControl_Provider : "
+      << "Abandon, no model loaded from STEP stream";
     resetStatic();
     return false;
   }
@@ -349,8 +676,8 @@ bool STEPCAFControl_Provider::Read(const TCollection_AsciiString& thePath,
   aModel->SetLocalLengthUnit(aNode->GlobalParameters.LengthUnit);
   if (aReader.TransferRoots() <= 0)
   {
-    Message::SendFail() << "Error in the STEPCAFControl_Provider during reading the file " <<
-      thePath << "\t:Cannot read any relevant data from the STEP file";
+    Message::SendFail() << "Error: STEPCAFControl_Provider : "
+      << "Cannot read any relevant data from the STEP stream";
     resetStatic();
     return false;
   }
@@ -368,32 +695,36 @@ bool STEPCAFControl_Provider::Write(const TCollection_AsciiString& thePath,
                                     Handle(XSControl_WorkSession)& theWS,
                                     const Message_ProgressRange& theProgress)
 {
-  if (GetNode().IsNull() || !GetNode()->IsKind(STANDARD_TYPE(STEPCAFControl_ConfigurationNode)))
+  if (GetNode().IsNull() ||
+      !GetNode()->IsKind(STANDARD_TYPE(STEPCAFControl_ConfigurationNode)))
   {
-    Message::SendFail() << "Error in the STEPCAFControl_Provider during reading the file " <<
-      thePath << "\t: Incorrect or empty Configuration Node";
+    Message::SendFail() << "Error: STEPCAFControl_Provider : "
+      << "Incorrect or empty Configuration Node";
     return false;
   }
-  Handle(STEPCAFControl_ConfigurationNode) aNode = Handle(STEPCAFControl_ConfigurationNode)::DownCast(GetNode());
+  Handle(STEPCAFControl_ConfigurationNode) aNode =
+    Handle(STEPCAFControl_ConfigurationNode)::DownCast(GetNode());
   initStatic(aNode);
 
   personizeWS(theWS);
-  STEPControl_Writer aWriter;
-  aWriter.SetWS(theWS);
-  IFSelect_ReturnStatus aWritestat = IFSelect_RetVoid;
+  STEPControl_Writer aWriter(theWS, Standard_True);
   Handle(StepData_StepModel) aModel = aWriter.Model();
-  aModel->SetWriteLengthUnit(UnitsMethods::GetLengthUnitScale(aNode->InternalParameters.WriteUnit, UnitsMethods_LengthUnit_Millimeter));
-  aWritestat = aWriter.Transfer(theShape, aNode->InternalParameters.WriteModelType, true, theProgress);
+  aModel->SetWriteLengthUnit(UnitsMethods::GetLengthUnitScale(
+    aNode->InternalParameters.WriteUnit,
+    UnitsMethods_LengthUnit_Millimeter));
+  IFSelect_ReturnStatus aWritestat =
+    aWriter.Transfer(theShape, aNode->InternalParameters.WriteModelType, true, theProgress);
   if (aWritestat != IFSelect_RetDone)
   {
-    Message::SendFail() << "Error in the STEPCAFControl_Provider during reading the file " <<
-      thePath << "\t: abandon, no model loaded";
+    Message::SendFail() << "Error: STEPCAFControl_Provider : "
+      << "Can't translate shape to STEP model";
     resetStatic();
     return false;
   }
   if (aWriter.Write(thePath.ToCString()) != IFSelect_RetDone)
   {
-    Message::SendFail() << "STEPCAFControl_Provider: Error on writing file";
+    Message::SendFail() << "Error: STEPCAFControl_Provider : "
+      << "Can't write STEP file " << thePath;
     resetStatic();
     return false;
   }
@@ -401,28 +732,50 @@ bool STEPCAFControl_Provider::Write(const TCollection_AsciiString& thePath,
   return true;
 }
 
-//=======================================================================
-// function : Read
-// purpose  :
-//=======================================================================
-bool STEPCAFControl_Provider::Read(const TCollection_AsciiString& thePath,
-                                   TopoDS_Shape& theShape,
-                                   const Message_ProgressRange& theProgress)
-{
-  Handle(XSControl_WorkSession) aWS = new XSControl_WorkSession();
-  return Read(thePath, theShape, aWS, theProgress);
-}
-
 //=======================================================================
 // function : Write
 // purpose  :
 //=======================================================================
-bool STEPCAFControl_Provider::Write(const TCollection_AsciiString& thePath,
+bool STEPCAFControl_Provider::Write(std::ostream& theOStream,
                                     const TopoDS_Shape& theShape,
+                                    Handle(XSControl_WorkSession)& theWS,
                                     const Message_ProgressRange& theProgress)
 {
-  Handle(XSControl_WorkSession) aWS = new XSControl_WorkSession();
-  return Write(thePath, theShape, aWS, theProgress);
+  if (GetNode().IsNull() ||
+      !GetNode()->IsKind(STANDARD_TYPE(STEPCAFControl_ConfigurationNode)))
+  {
+    Message::SendFail() << "Error: STEPCAFControl_Provider : "
+      << "Incorrect or empty Configuration Node";
+    return false;
+  }
+  Handle(STEPCAFControl_ConfigurationNode) aNode =
+    Handle(STEPCAFControl_ConfigurationNode)::DownCast(GetNode());
+  initStatic(aNode);
+
+  personizeWS(theWS);
+  STEPControl_Writer aWriter(theWS, Standard_True);
+  Handle(StepData_StepModel) aModel = aWriter.Model();
+  aModel->SetWriteLengthUnit(UnitsMethods::GetLengthUnitScale(
+    aNode->InternalParameters.WriteUnit,
+    UnitsMethods_LengthUnit_Millimeter));
+  IFSelect_ReturnStatus aWritestat =
+    aWriter.Transfer(theShape, aNode->InternalParameters.WriteModelType, true, theProgress);
+  if (aWritestat != IFSelect_RetDone)
+  {
+    Message::SendFail() << "Error: STEPCAFControl_Provider : "
+      << "Can't translate shape to STEP model";
+    resetStatic();
+    return false;
+  }
+  if (aWriter.WriteStream(theOStream) != IFSelect_RetDone)
+  {
+    Message::SendFail() << "Error: STEPCAFControl_Provider : "
+      << "Can't write STEP to stream";
+    resetStatic();
+    return false;
+  }
+  resetStatic();
+  return true;
 }
 
 //=======================================================================
index c80e9e7153f44a6fe45c575258dcb4898394d41f..55b7d6381824ac0fb3148e14e0dc9a08cb8efc8a 100644 (file)
@@ -54,6 +54,19 @@ public:
                                     Handle(XSControl_WorkSession)& theWS,
                                     const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
 
+  //! Reads a CAD file, according internal configuration
+  //! @param[in] theIStream stream to import STEP data
+  //! @param[out] theDocument document to save result
+  //! @paramp[in] theName name of step file, can be empty
+  //! @param[in] theWS current work session
+  //! @param theProgress[in] progress indicator
+  //! @return true if Read operation has ended correctly
+  Standard_EXPORT virtual bool Read(std::istream& theIStream,
+                                    const Handle(TDocStd_Document)& theDocument,
+                                    const TCollection_AsciiString theName,
+                                    Handle(XSControl_WorkSession)& theWS,
+                                    const Message_ProgressRange& theProgress = Message_ProgressRange());
+
   //! Writes a CAD file, according internal configuration
   //! @param[in] thePath path to the export CAD file
   //! @param[out] theDocument document to export
@@ -65,23 +78,16 @@ public:
                                      Handle(XSControl_WorkSession)& theWS,
                                      const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
 
-  //! Reads a CAD file, according internal configuration
-  //! @param[in] thePath path to the import CAD file
-  //! @param[out] theDocument document to save result
-  //! @param theProgress[in] progress indicator
-  //! @return true if Read operation has ended correctly
-  Standard_EXPORT virtual bool Read(const TCollection_AsciiString& thePath,
-                                    const Handle(TDocStd_Document)& theDocument,
-                                    const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
   //! Writes a CAD file, according internal configuration
-  //! @param[in] thePath path to the export CAD file
+  //! @param[in] theOStream stream to export STEP data
   //! @param[out] theDocument document to export
+  //! @param[in] theWS current work session
   //! @param theProgress[in] progress indicator
   //! @return true if Write operation has ended correctly
-  Standard_EXPORT virtual bool Write(const TCollection_AsciiString& thePath,
+  Standard_EXPORT virtual bool Write(std::ostream& theOStream,
                                      const Handle(TDocStd_Document)& theDocument,
-                                     const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
+                                     Handle(XSControl_WorkSession)& theWS,
+                                     const Message_ProgressRange& theProgress = Message_ProgressRange());
 
   //! Reads a CAD file, according internal configuration
   //! @param[in] thePath path to the import CAD file
@@ -94,6 +100,19 @@ public:
                                     Handle(XSControl_WorkSession)& theWS,
                                     const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
 
+  //! Reads a CAD file, according internal configuration
+  //! @param[in] theIStream stream to the step file
+  //! @param[out] theShape shape to save result
+  //! @paramp[in] theName name of step file, can be empty
+  //! @param[in] theWS current work session
+  //! @param theProgress[in] progress indicator
+  //! @return true if Read operation has ended correctly
+  Standard_EXPORT virtual bool Read(std::istream& theIStream,
+                                    TopoDS_Shape& theShape,
+                                    const TCollection_AsciiString theName,
+                                    Handle(XSControl_WorkSession)& theWS,
+                                    const Message_ProgressRange& theProgress = Message_ProgressRange());
+
   //! Writes a CAD file, according internal configuration
   //! @param[in] thePath path to the export CAD file
   //! @param[out] theShape shape to export
@@ -105,23 +124,16 @@ public:
                                      Handle(XSControl_WorkSession)& theWS,
                                      const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
 
-  //! Reads a CAD file, according internal configuration
-  //! @param[in] thePath path to the import CAD file
-  //! @param[out] theShape shape to save result
-  //! @param theProgress[in] progress indicator
-  //! @return true if Read operation has ended correctly
-  Standard_EXPORT virtual bool Read(const TCollection_AsciiString& thePath,
-                                    TopoDS_Shape& theShape,
-                                    const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
   //! Writes a CAD file, according internal configuration
-  //! @param[in] thePath path to the export CAD file
+  //! @param[in] theOStream stream to export STEP data
   //! @param[out] theShape shape to export
+  //! @param[in] theWS current work session
   //! @param theProgress[in] progress indicator
   //! @return true if Write operation has ended correctly
-  Standard_EXPORT virtual bool Write(const TCollection_AsciiString& thePath,
+  Standard_EXPORT virtual bool Write(std::ostream& theOStream,
                                      const TopoDS_Shape& theShape,
-                                     const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
+                                     Handle(XSControl_WorkSession)& theWS,
+                                     const Message_ProgressRange& theProgress = Message_ProgressRange());
 
 public:
 
@@ -133,6 +145,14 @@ public:
   //! @return provider's vendor name
   Standard_EXPORT virtual TCollection_AsciiString GetVendor() const Standard_OVERRIDE;
 
+public:
+
+  //! Sets parameter to update static parameter, that true by default
+  void SetToUpdateStaticParameters(const bool theToUpdate) { myToUpdateStaticParameters = theToUpdate; }
+
+  //! Gets parameter to update static parameter, that true by default
+  bool ToUpdateStaticParameters() const { return myToUpdateStaticParameters; }
+
 private:
 
   //! Personizes work session with current format.
@@ -149,7 +169,10 @@ private:
   //! Reset used interface static variables
   void resetStatic();
 
-  STEPCAFControl_ConfigurationNode::STEPCAFControl_InternalSection myOldValues;
+private:
+
+  bool myToUpdateStaticParameters = true; //!< Flag to updating static parameters
+  STEPCAFControl_ConfigurationNode::STEPCAFControl_InternalSection myOldValues; //!< Container to save previous static parameters
 
 };
 
index 005af99a69310d026753651b4d95a753c4c50dfa..5ca61c92f4c226916a6e4adc7f122baafbb21075 100644 (file)
@@ -51,30 +51,6 @@ bool Vrml_Provider::Read(const TCollection_AsciiString& thePath,
                          const Message_ProgressRange& theProgress)
 {
   (void)theWS;
-  return Read(thePath, theDocument, theProgress);
-}
-
-//=======================================================================
-// function : Write
-// purpose  :
-//=======================================================================
-bool Vrml_Provider::Write(const TCollection_AsciiString& thePath,
-                          const Handle(TDocStd_Document)& theDocument,
-                          Handle(XSControl_WorkSession)& theWS,
-                          const Message_ProgressRange& theProgress)
-{
-  (void)theWS;
-  return Write(thePath, theDocument, theProgress);
-}
-
-//=======================================================================
-// function : Read
-// purpose  :
-//=======================================================================
-bool Vrml_Provider::Read(const TCollection_AsciiString& thePath,
-                         const Handle(TDocStd_Document)& theDocument,
-                         const Message_ProgressRange& theProgress)
-{
   if (theDocument.IsNull())
   {
     Message::SendFail() << "Error in the Vrml_Provider during reading the file " <<
@@ -118,8 +94,10 @@ bool Vrml_Provider::Read(const TCollection_AsciiString& thePath,
 //=======================================================================
 bool Vrml_Provider::Write(const TCollection_AsciiString& thePath,
                           const Handle(TDocStd_Document)& theDocument,
+                          Handle(XSControl_WorkSession)& theWS,
                           const Message_ProgressRange& theProgress)
 {
+  (void)theWS;
   (void)theProgress;
   if (GetNode().IsNull() || !GetNode()->IsKind(STANDARD_TYPE(Vrml_ConfigurationNode)))
   {
@@ -152,30 +130,6 @@ bool Vrml_Provider::Read(const TCollection_AsciiString& thePath,
                          const Message_ProgressRange& theProgress)
 {
   (void)theWS;
-  return Read(thePath, theShape, theProgress);
-}
-
-//=======================================================================
-// function : Write
-// purpose  :
-//=======================================================================
-bool Vrml_Provider::Write(const TCollection_AsciiString& thePath,
-                          const TopoDS_Shape& theShape,
-                          Handle(XSControl_WorkSession)& theWS,
-                          const Message_ProgressRange& theProgress)
-{
-  (void)theWS;
-  return Write(thePath, theShape, theProgress);
-}
-
-//=======================================================================
-// function : Read
-// purpose  :
-//=======================================================================
-bool Vrml_Provider::Read(const TCollection_AsciiString& thePath,
-                         TopoDS_Shape& theShape,
-                         const Message_ProgressRange& theProgress)
-{
   (void)theProgress;
   if (GetNode().IsNull() || !GetNode()->IsKind(STANDARD_TYPE(Vrml_ConfigurationNode)))
   {
@@ -271,12 +225,14 @@ bool Vrml_Provider::Read(const TCollection_AsciiString& thePath,
 //=======================================================================
 bool Vrml_Provider::Write(const TCollection_AsciiString& thePath,
                           const TopoDS_Shape& theShape,
+                          Handle(XSControl_WorkSession)& theWS,
                           const Message_ProgressRange& theProgress)
 {
+  (void)theWS;
   Handle(TDocStd_Document) aDoc = new TDocStd_Document("BinXCAF");
   Handle(XCAFDoc_ShapeTool) aShTool = XCAFDoc_DocumentTool::ShapeTool(aDoc->Main());
   aShTool->AddShape(theShape);
-  return Write(thePath, aDoc, theProgress);
+  return Write(thePath, aDoc, theWS, theProgress);
 }
 
 //=======================================================================
index a4f9b6df9202076b580d03ad02acad3b21276035..e5950dfbf3bfd590942e433c305e3ed470c501f1 100644 (file)
@@ -64,24 +64,6 @@ public:
                                      Handle(XSControl_WorkSession)& theWS,
                                      const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
 
-  //! Reads a CAD file, according internal configuration
-  //! @param[in] thePath path to the import CAD file
-  //! @param[out] theDocument document to save result
-  //! @param theProgress[in] progress indicator
-  //! @return true if Read operation has ended correctly
-  Standard_EXPORT virtual bool Read(const TCollection_AsciiString& thePath,
-                                    const Handle(TDocStd_Document)& theDocument,
-                                    const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
-  //! Writes a CAD file, according internal configuration
-  //! @param[in] thePath path to the export CAD file
-  //! @param[out] theDocument document to export
-  //! @param theProgress[in] progress indicator
-  //! @return true if Write operation has ended correctly
-  Standard_EXPORT virtual bool Write(const TCollection_AsciiString& thePath,
-                                     const Handle(TDocStd_Document)& theDocument,
-                                     const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
   //! Reads a CAD file, according internal configuration
   //! @param[in] thePath path to the import CAD file
   //! @param[out] theShape shape to save result
@@ -104,24 +86,6 @@ public:
                                      Handle(XSControl_WorkSession)& theWS,
                                      const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
 
-  //! Reads a CAD file, according internal configuration
-  //! @param[in] thePath path to the import CAD file
-  //! @param[out] theShape shape to save result
-  //! @param theProgress[in] progress indicator
-  //! @return true if Read operation has ended correctly
-  Standard_EXPORT virtual bool Read(const TCollection_AsciiString& thePath,
-                                    TopoDS_Shape& theShape,
-                                    const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
-  //! Writes a CAD file, according internal configuration
-  //! @param[in] thePath path to the export CAD file
-  //! @param[out] theShape shape to export
-  //! @param theProgress[in] progress indicator
-  //! @return true if Write operation has ended correctly
-  Standard_EXPORT virtual bool Write(const TCollection_AsciiString& thePath,
-                                     const TopoDS_Shape& theShape,
-                                     const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
-
 public:
 
   //! Gets CAD format name of associated provider
index 509e2b7793bddfbd2bda4c6e8b5adec12ef89b7a..cf223d5cfba2eb67d3a35580c25e1d7ef04b3216 100644 (file)
 #include <Draw_ProgressIndicator.hxx>
 #include <Message.hxx>
 #include <IFSelect_SessionPilot.hxx>
-#include <IGESCAFControl_Reader.hxx>
-#include <IGESCAFControl_Writer.hxx>
-#include <IGESControl_Controller.hxx>
+#include <IGESCAFControl_ConfigurationNode.hxx>
+#include <IGESCAFControl_Provider.hxx>
+//#include <IGESCAFControl_Reader.hxx>
+//#include <IGESCAFControl_Writer.hxx>
+//#include <IGESControl_Controller.hxx>
 #include <Interface_Macros.hxx>
 #include <OSD_OpenFile.hxx>
 #include <OSD_Path.hxx>
-#include <STEPCAFControl_ExternFile.hxx>
-#include <STEPCAFControl_Reader.hxx>
-#include <STEPCAFControl_Writer.hxx>
-#include <STEPControl_Controller.hxx>
+#include <STEPCAFControl_ConfigurationNode.hxx>
+#include <STEPCAFControl_Provider.hxx>
+//#include <STEPCAFControl_ExternFile.hxx>
+//#include <STEPCAFControl_Reader.hxx>
+//#include <STEPCAFControl_Writer.hxx>
+//#include <STEPControl_Controller.hxx>
 #include <TDF_Data.hxx>
 #include <TDocStd_Application.hxx>
 #include <TDocStd_Document.hxx>
@@ -86,44 +90,44 @@ static bool parseCoordinateSystem(const char* theArg,
   return Standard_True;
 }
 
-static Standard_Boolean ClearDicWS()
-{
-  thedictws.Clear();
-  return Standard_True;
-}
-
-static void AddWS(TCollection_AsciiString filename,
-                  const Handle(XSControl_WorkSession)& WS)
-{
-  WS->SetVars(new XSDRAW_Vars); // support of DRAW variables
-  thedictws.Bind(filename, WS);
-}
-
-
-static Standard_Boolean FillDicWS(NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)>& dicFile)
-{
-  ClearDicWS();
-  if (dicFile.IsEmpty())
-  {
-    return Standard_False;
-  }
-  Handle(STEPCAFControl_ExternFile) EF;
-  NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)>::Iterator DicEFIt(dicFile);
-  for (; DicEFIt.More(); DicEFIt.Next())
-  {
-    TCollection_AsciiString filename = DicEFIt.Key();
-    EF = DicEFIt.Value();
-    AddWS(filename, EF->GetWS());
-  }
-  return Standard_True;
-}
+//static Standard_Boolean ClearDicWS()
+//{
+//  thedictws.Clear();
+//  return Standard_True;
+//}
+//
+//static void AddWS(TCollection_AsciiString filename,
+//                  const Handle(XSControl_WorkSession)& WS)
+//{
+//  WS->SetVars(new XSDRAW_Vars); // support of DRAW variables
+//  thedictws.Bind(filename, WS);
+//}
+
+
+//static Standard_Boolean FillDicWS(NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)>& dicFile)
+//{
+  //ClearDicWS();
+  //if (dicFile.IsEmpty())
+  //{
+  //  return Standard_False;
+  //}
+  //Handle(STEPCAFControl_ExternFile) EF;
+  //NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)>::Iterator DicEFIt(dicFile);
+  //for (; DicEFIt.More(); DicEFIt.Next())
+  //{
+  //  TCollection_AsciiString filename = DicEFIt.Key();
+  //  EF = DicEFIt.Value();
+  //  AddWS(filename, EF->GetWS());
+  //}
+//  return Standard_True;
+//}
 
 static Standard_Boolean SetCurrentWS(TCollection_AsciiString filename)
 {
-  if (!thedictws.IsBound(filename)) return Standard_False;
-  Handle(XSControl_WorkSession) CurrentWS =
-    Handle(XSControl_WorkSession)::DownCast(thedictws.ChangeFind(filename));
-  XSDRAW::Pilot()->SetSession(CurrentWS);
+  //if (!thedictws.IsBound(filename)) return Standard_False;
+  //Handle(XSControl_WorkSession) CurrentWS =
+  //  Handle(XSControl_WorkSession)::DownCast(thedictws.ChangeFind(filename));
+  //XSDRAW::Pilot()->SetSession(CurrentWS);
 
   return Standard_True;
 }
@@ -227,20 +231,10 @@ static Standard_Integer ReadIges(Draw_Interpretor& di, Standard_Integer argc, co
     di << "Use: " << argv[0] << " Doc filename [mode]: read IGES file to a document\n";
     return 0;
   }
-
-  DeclareAndCast(IGESControl_Controller, ctl, XSDRAW::Controller());
-  if (ctl.IsNull()) XSDRAW::SetNorm("IGES");
-
-  TCollection_AsciiString fnom, rnom;
-  Standard_Boolean modfic = XSDRAW::FileAndVar(argv[2], argv[1], "IGES", fnom, rnom);
-  if (modfic) di << " File IGES to read : " << fnom.ToCString() << "\n";
-  else        di << " Model taken from the session : " << fnom.ToCString() << "\n";
-  //  di<<" -- Names of variables BREP-DRAW prefixed by : "<<rnom<<"\n";
-
-  IGESCAFControl_Reader reader(XSDRAW::Session(), modfic);
+  Handle(IGESCAFControl_ConfigurationNode) aNode =
+    new IGESCAFControl_ConfigurationNode();
   Standard_Integer onlyvisible = Interface_Static::IVal("read.iges.onlyvisible");
-  reader.SetReadVisible(onlyvisible == 1);
-
+  aNode->InternalParameters.ReadOnlyVisible = onlyvisible == 1;
   if (argc == 4)
   {
     Standard_Boolean mode = Standard_True;
@@ -249,39 +243,11 @@ static Standard_Integer ReadIges(Draw_Interpretor& di, Standard_Integer argc, co
       {
         case '-': mode = Standard_False; break;
         case '+': mode = Standard_True; break;
-        case 'c': reader.SetColorMode(mode); break;
-        case 'n': reader.SetNameMode(mode); break;
-        case 'l': reader.SetLayerMode(mode); break;
+        case 'c': aNode->InternalParameters.ReadColor = mode; break;
+        case 'n': aNode->InternalParameters.ReadName = mode; break;
+        case 'l': aNode->InternalParameters.ReadLayer = mode; break;
       }
   }
-
-  Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator(di);
-  Message_ProgressScope aRootScope(aProgress->Start(), "IGES import", modfic ? 2 : 1);
-
-  IFSelect_ReturnStatus readstat = IFSelect_RetVoid;
-  if (modfic)
-  {
-    Message_ProgressScope aReadScope(aRootScope.Next(), "File reading", 1);
-    aReadScope.Show();
-    readstat = reader.ReadFile(fnom.ToCString());
-  }
-  else if (XSDRAW::Session()->NbStartingEntities() > 0)
-  {
-    readstat = IFSelect_RetDone;
-  }
-  if (readstat != IFSelect_RetDone)
-  {
-    if (modfic)
-    {
-      di << "Could not read file " << fnom.ToCString() << " , abandon\n";
-    }
-    else
-    {
-      di << "No model loaded\n";
-    }
-    return 1;
-  }
-
   Handle(TDocStd_Document) doc;
   if (!DDocStd::GetDocument(argv[1], doc, Standard_False))
   {
@@ -290,18 +256,18 @@ static Standard_Integer ReadIges(Draw_Interpretor& di, Standard_Integer argc, co
     TDataStd_Name::Set(doc->GetData()->Root(), argv[1]);
     Handle(DDocStd_DrawDocument) DD = new DDocStd_DrawDocument(doc);
     Draw::Set(argv[1], DD);
-    //     di << "Document saved with name " << argv[1];
   }
-  if (!reader.Transfer(doc, aRootScope.Next()))
+  Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator(di);
+  Handle(IGESCAFControl_Provider) aProvider =
+    new IGESCAFControl_Provider(aNode);
+  aProvider->SetToUpdateStaticParameters(false);
+  Handle(XSControl_WorkSession) aWS = XSDRAW::Session();
+  if (!aProvider->Read(argv[2], doc, aWS, aProgress->Start()))
   {
-    di << "Cannot read any relevant data from the IGES file\n";
+    di << "Error: Can't read IGES file\n";
     return 1;
   }
-
-  //  Handle(DDocStd_DrawDocument) DD = new DDocStd_DrawDocument(doc);  
-  //  Draw::Set(argv[1],DD);       
-  di << "Document saved with name " << argv[1];
-
+  Message::SendInfo() << "Document saved with name " << argv[1];
   return 0;
 }
 
@@ -317,7 +283,8 @@ static Standard_Integer WriteIges(Draw_Interpretor& di, Standard_Integer argc, c
     di << "Use: " << argv[0] << " Doc filename [mode]: write document to IGES file\n";
     return 0;
   }
-
+  Handle(IGESCAFControl_ConfigurationNode) aNode =
+    new IGESCAFControl_ConfigurationNode();
   Handle(TDocStd_Document) Doc;
   DDocStd::GetDocument(argv[1], Doc);
   if (Doc.IsNull())
@@ -325,19 +292,6 @@ static Standard_Integer WriteIges(Draw_Interpretor& di, Standard_Integer argc, c
     di << argv[1] << " is not a document\n";
     return 1;
   }
-
-  XSDRAW::SetNorm("IGES");
-
-  TCollection_AsciiString fnom, rnom;
-  const Standard_Boolean modfic = XSDRAW::FileAndVar(argv[2], argv[1], "IGES", fnom, rnom);
-
-  //  IGESControl_Writer ICW (Interface_Static::CVal("write.iges.unit"),
-  //                     Interface_Static::IVal("write.iges.brep.mode"));
-
-  Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator(di);
-  Message_ProgressScope aRootScope(aProgress->Start(), "IGES export", modfic ? 2 : 1);
-
-  IGESCAFControl_Writer writer(XSDRAW::Session(), Standard_True);
   if (argc == 4)
   {
     Standard_Boolean mode = Standard_True;
@@ -346,30 +300,21 @@ static Standard_Integer WriteIges(Draw_Interpretor& di, Standard_Integer argc, c
       {
         case '-': mode = Standard_False; break;
         case '+': mode = Standard_True; break;
-        case 'c': writer.SetColorMode(mode); break;
-        case 'n': writer.SetNameMode(mode); break;
-        case 'l': writer.SetLayerMode(mode); break;
+        case 'c': aNode->InternalParameters.WriteColor = mode; break;
+        case 'n': aNode->InternalParameters.WriteName = mode; break;
+        case 'l': aNode->InternalParameters.WriteLayer = mode; break;
       }
   }
-  writer.Transfer(Doc, aRootScope.Next());
-
-  if (modfic)
-  {
-    Message_ProgressScope aWriteScope(aRootScope.Next(), "File writing", 1);
-    aWriteScope.Show();
-    di << "Writing IGES model to file " << argv[2] << "\n";
-    if (writer.Write(argv[2]))
-    {
-      di << " Write OK\n";
-    }
-    else
-    {
-      di << " Write failed\n";
-    }
-  }
-  else
-  {
-    di << "Document has been translated into the session";
+  Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator(di);
+  Handle(IGESCAFControl_Provider) aProvider =
+    new IGESCAFControl_Provider(aNode);
+  aProvider->SetToUpdateStaticParameters(false);
+  Handle(XSControl_WorkSession) aWS = XSDRAW::Session();
+  const TCollection_AsciiString aPath = argv[2];
+  if (!aProvider->Write(aPath, Doc, aWS, aProgress->Start()))
+  {
+    di << "Error: Can't write IGES file\n";
+    return 1;
   }
   return 0;
 }
@@ -380,11 +325,6 @@ static Standard_Integer WriteIges(Draw_Interpretor& di, Standard_Integer argc, c
 //=======================================================================
 static Standard_Integer ReadStep(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
 {
-  DeclareAndCast(STEPControl_Controller, ctl, XSDRAW::Controller());
-  if (ctl.IsNull())
-  {
-    XSDRAW::SetNorm ("STEP");
-  }
 
   Standard_CString aDocName = NULL;
   TCollection_AsciiString aFilePath, aModeStr;
@@ -411,101 +351,73 @@ static Standard_Integer ReadStep(Draw_Interpretor& di, Standard_Integer argc, co
     }
     else
     {
-      Message::SendFail() << "Syntax error at '" << argv[anArgIter] << "'";
+      di << "Syntax error at '" << argv[anArgIter] << "'";
       return 1;
     }
   }
-
-  TCollection_AsciiString aFileName, anOldVarName;
-  Standard_Boolean isFileMode = XSDRAW::FileAndVar (aFilePath.ToCString(), aDocName, "STEP", aFileName, anOldVarName);
-  if (isFileMode) di << " File STEP to read : " << aFileName << "\n";
-  else            di << " Model taken from the session : " << aFileName << "\n";
-  //  di<<" -- Names of variables BREP-DRAW prefixed by : "<<rnom<<"\n";
-
-  STEPCAFControl_Reader aReader (XSDRAW::Session(), isFileMode);
+  Handle(STEPCAFControl_ConfigurationNode) aNode =
+    new STEPCAFControl_ConfigurationNode();
   if (!aModeStr.IsEmpty())
   {
     Standard_Boolean aMode = Standard_True;
     for (Standard_Integer i = 1; aModeStr.Value (i); ++i)
     {
-      switch (aModeStr.Value (i))
+      switch (aModeStr.Value(i))
       {
-        case '-' : aMode = Standard_False; break;
-        case '+' : aMode = Standard_True;  break;
-        case 'c' : aReader.SetColorMode (aMode); break;
-        case 'n' : aReader.SetNameMode  (aMode); break;
-        case 'l' : aReader.SetLayerMode (aMode); break;
-        case 'v' : aReader.SetPropsMode (aMode); break;
+        case '-': aMode = Standard_False; break;
+        case '+': aMode = Standard_True; break;
+        case 'c': aNode->InternalParameters.WriteColor = aMode; break;
+        case 'n': aNode->InternalParameters.WriteName = aMode; break;
+        case 'l': aNode->InternalParameters.WriteLayer = aMode; break;
+        case 'v': aNode->InternalParameters.WriteProps = aMode; break;
         default:
         {
-          Message::SendFail() << "Syntax error at '" << aModeStr << "'\n";
+          di << "Syntax error at '" << aModeStr << "'\n";
           return 1;
         }
       }
     }
   }
-  
-  Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator (di);
-  Message_ProgressScope aRootScope (aProgress->Start(), "STEP import", isFileMode ? 2 : 1);
-
-  IFSelect_ReturnStatus aReadStat = IFSelect_RetVoid;
-  if (isFileMode)
-  {
-    Message_ProgressScope aReadScope (aRootScope.Next(), "File reading", 1);
-    aReadScope.Show();
-    if (toTestStream)
-    {
-      std::ifstream aStream;
-      OSD_OpenStream (aStream, aFileName.ToCString(), std::ios::in | std::ios::binary);
-      TCollection_AsciiString aFolder, aFileNameShort;
-      OSD_Path::FolderAndFileFromPath (aFileName, aFolder, aFileNameShort);
-      aReadStat = aReader.ReadStream (aFileNameShort.ToCString(), aStream);
-    }
-    else
-    {
-      aReadStat = aReader.ReadFile (aFileName.ToCString());
-    }
-  }
-  else if (XSDRAW::Session()->NbStartingEntities() > 0)
+  Handle(TDocStd_Document) aDoc;
+  if (!DDocStd::GetDocument(aDocName, aDoc, Standard_False))
   {
-    aReadStat = IFSelect_RetDone;
+    Handle(TDocStd_Application) anApp = DDocStd::GetApplication();
+    anApp->NewDocument("BinXCAF", aDoc);
+    TDataStd_Name::Set(aDoc->GetData()->Root(), aDocName);
+    Handle(DDocStd_DrawDocument) aDrawDoc = new DDocStd_DrawDocument(aDoc);
+    Draw::Set(aDocName, aDrawDoc);
   }
-  if (aReadStat != IFSelect_RetDone)
+  Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator (di);
+  Handle(STEPCAFControl_Provider) aProvider =
+    new STEPCAFControl_Provider(aNode);
+  aProvider->SetToUpdateStaticParameters(false);
+  Standard_Boolean aReadStat = Standard_False;
+  Handle(XSControl_WorkSession) aWS = XSDRAW::Session();
+  if (toTestStream)
   {
-    if (isFileMode)
-    {
-      di << "Could not read file " << aFileName << " , abandon\n";
-    }
-    else
-    {
-      di << "No model loaded\n";
-    }
-    return 1;
+    std::ifstream aStream;
+    OSD_OpenStream (aStream, aFilePath.ToCString(), std::ios::in | std::ios::binary);
+    TCollection_AsciiString aFolder, aFileNameShort;
+    OSD_Path::FolderAndFileFromPath (aFilePath, aFolder, aFileNameShort);
+    aReadStat =
+      aProvider->Read(aStream, aDoc, aFilePath, aWS, aProgress->Start());
   }
-
-  Handle(TDocStd_Document) aDoc;
-  if (!DDocStd::GetDocument (aDocName, aDoc, Standard_False))
+  else
   {
-    Handle(TDocStd_Application) anApp = DDocStd::GetApplication();
-    anApp->NewDocument("BinXCAF", aDoc);
-    TDataStd_Name::Set (aDoc->GetData()->Root(), aDocName);
-    Handle(DDocStd_DrawDocument) aDrawDoc = new DDocStd_DrawDocument (aDoc);
-    Draw::Set (aDocName, aDrawDoc);
-    //     di << "Document saved with name " << aDocName;
+    aReadStat =
+      aProvider->Read(aFilePath, aDoc, aWS, aProgress->Start());
   }
-  if (!aReader.Transfer (aDoc, aRootScope.Next()))
+  if (!aReadStat)
   {
     di << "Cannot read any relevant data from the STEP file\n";
     return 1;
   }
-
   Handle(DDocStd_DrawDocument) aDrawDoc = new DDocStd_DrawDocument (aDoc);
   Draw::Set (aDocName, aDrawDoc);
-  di << "Document saved with name " << aDocName;
-
-  NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)> aDicFile = aReader.ExternFiles();
-  FillDicWS (aDicFile);
-  AddWS (aFileName, XSDRAW::Session());
+  Message::SendInfo() << "Document saved with name " << aDocName;
+  //NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)> aDicFile = aReader.ExternFiles();
+  //FillDicWS (aDicFile);
+  //AddWS (aFileName, XSDRAW::Session());
   return 0;
 }
 
@@ -515,22 +427,15 @@ static Standard_Integer ReadStep(Draw_Interpretor& di, Standard_Integer argc, co
 //=======================================================================
 static Standard_Integer WriteStep(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
 {
-  DeclareAndCast(STEPControl_Controller,ctl,XSDRAW::Controller());
-  if (ctl.IsNull())
-  {
-    XSDRAW::SetNorm ("STEP");
-  }
-  STEPCAFControl_Writer aWriter (XSDRAW::Session(), Standard_True);
-
   Handle(TDocStd_Document) aDoc;
   TCollection_AsciiString aDocName, aFilePath;
-  STEPControl_StepModelType aMode = STEPControl_AsIs;
+  Handle(STEPCAFControl_ConfigurationNode) aNode =
+    new STEPCAFControl_ConfigurationNode();
   bool hasModeArg = false, toTestStream = false;
-  TCollection_AsciiString aMultiFilePrefix, aLabelName;
   TDF_Label aLabel;
   for (Standard_Integer anArgIter = 1; anArgIter < argc; ++anArgIter)
   {
-    TCollection_AsciiString anArgCase (argv[anArgIter]);
+    TCollection_AsciiString anArgCase(argv[anArgIter]);
     anArgCase.LowerCase();
     if (anArgCase == "-stream")
     {
@@ -539,7 +444,7 @@ static Standard_Integer WriteStep(Draw_Interpretor& di, Standard_Integer argc, c
     else if (aDocName.IsEmpty())
     {
       Standard_CString aDocNameStr = argv[anArgIter];
-      DDocStd::GetDocument (aDocNameStr, aDoc);
+      DDocStd::GetDocument(aDocNameStr, aDoc);
       if (aDoc.IsNull())
       {
         di << "Syntax error: '" << argv[anArgIter] << "' is not a document";
@@ -554,52 +459,57 @@ static Standard_Integer WriteStep(Draw_Interpretor& di, Standard_Integer argc, c
     else if (!hasModeArg)
     {
       hasModeArg = true;
-      switch (anArgCase.Value (1))
+      switch (anArgCase.Value(1))
       {
         case 'a':
-        case '0': aMode = STEPControl_AsIs;                    break;
+        case '0': aNode->InternalParameters.WriteModelType = STEPControl_AsIs; break;
         case 'f':
-        case '1': aMode = STEPControl_FacetedBrep;             break;
+        case '1': aNode->InternalParameters.WriteModelType = STEPControl_FacetedBrep; break;
         case 's':
-        case '2': aMode = STEPControl_ShellBasedSurfaceModel;  break;
+        case '2': aNode->InternalParameters.WriteModelType = STEPControl_ShellBasedSurfaceModel; break;
         case 'm':
-        case '3': aMode = STEPControl_ManifoldSolidBrep;       break;
+        case '3': aNode->InternalParameters.WriteModelType = STEPControl_ManifoldSolidBrep; break;
         case 'w':
-        case '4': aMode = STEPControl_GeometricCurveSet;       break;
+        case '4': aNode->InternalParameters.WriteModelType = STEPControl_GeometricCurveSet; break;
         default:
         {
-          di << "Syntax error: mode '" << argv[anArgIter] << "' is incorrect [give fsmw]";
+          di << "Syntax error: mode '" << anArgCase.Value(1) << "' is incorrect [give fsmw]";
           return 1;
         }
       }
       Standard_Boolean wrmode = Standard_True;
       for (Standard_Integer i = 1; i <= anArgCase.Length(); ++i)
       {
-        switch (anArgCase.Value (i))
+        switch (anArgCase.Value(i))
         {
-          case '-' : wrmode = Standard_False; break;
-          case '+' : wrmode = Standard_True;  break;
-          case 'c' : aWriter.SetColorMode (wrmode); break;
-          case 'n' : aWriter.SetNameMode  (wrmode); break;
-          case 'l' : aWriter.SetLayerMode (wrmode); break;
-          case 'v' : aWriter.SetPropsMode (wrmode); break;
+          case '-': wrmode = Standard_False; break;
+          case '+': wrmode = Standard_True; break;
+          case 'c': aNode->InternalParameters.WriteColor = wrmode; break;
+          case 'n': aNode->InternalParameters.WriteName = wrmode; break;
+          case 'l': aNode->InternalParameters.WriteLayer = wrmode; break;
+          case 'v': aNode->InternalParameters.WriteProps = wrmode; break;
+          default:
+          {
+            di << "Syntax error at '" << anArgCase.Value(i) << "'\n";
+            return 1;
+          }
         }
       }
     }
-    else if (aMultiFilePrefix.IsEmpty()
-          && anArgCase.Search (":") == -1)
+    else if (aNode->InternalParameters.WriteMultiPrefix.IsEmpty()
+             && anArgCase.Search(":") == -1)
     {
-      aMultiFilePrefix = argv[anArgIter];
+      aNode->InternalParameters.WriteMultiPrefix = argv[anArgIter];
     }
     else if (aLabel.IsNull())
     {
-      if (!DDF::FindLabel (aDoc->Main().Data(), argv[anArgIter], aLabel)
-       || aLabel.IsNull())
+      if (!DDF::FindLabel(aDoc->Main().Data(), argv[anArgIter], aLabel)
+          || aLabel.IsNull())
       {
         di << "Syntax error: No label for entry '" << argv[anArgIter] << "'";
         return 1;
       }
-      aLabelName = argv[anArgIter];
+      aNode->InternalParameters.WriteLabels.Append(argv[anArgIter]);
     }
     else
     {
@@ -612,84 +522,34 @@ static Standard_Integer WriteStep(Draw_Interpretor& di, Standard_Integer argc, c
     di << "Syntax error: wrong number of arguments";
     return 1;
   }
-
-  TCollection_AsciiString aFileName, anOldVarName;
-  const Standard_Boolean isFileMode = XSDRAW::FileAndVar (aFilePath.ToCString(), aDocName.ToCString(), "STEP", aFileName, anOldVarName);
-
-  Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator (di);
-  Message_ProgressScope aRootScope (aProgress->Start(), "STEP export", isFileMode ? 2 : 1);
-  if (!aLabel.IsNull())
-  {  
-    di << "Translating label " << aLabelName << " of document " << aDocName << " to STEP\n";
-    if (!aWriter.Transfer (aLabel, aMode,
-                           !aMultiFilePrefix.IsEmpty() ? aMultiFilePrefix.ToCString() : NULL,
-                           aRootScope.Next()))
-    {
-      di << "Error: the label of document cannot be translated or gives no result";
-      return 1;
-    }
-  }
-  else
-  {
-    di << "Translating document " << aDocName << " to STEP\n";
-    if (!aWriter.Transfer (aDoc, aMode,
-                           !aMultiFilePrefix.IsEmpty() ? aMultiFilePrefix.ToCString() : NULL,
-                           aRootScope.Next()))
-    {
-      di << "Error: The document cannot be translated or gives no result\n";
-    }
-  }
-
-  if (!isFileMode)
-  {
-    di << "Document has been translated into the session";
-    return 0;
-  }
-
-  Message_ProgressScope aWriteScope (aRootScope.Next(), "File writing", 1);
-  aWriteScope.Show();
-  di << "Writing STEP file " << aFilePath << "\n";
-
-  IFSelect_ReturnStatus aStat = IFSelect_RetVoid;
+  Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator(di);
+  Handle(STEPCAFControl_Provider) aProvider =
+    new STEPCAFControl_Provider(aNode);
+  aProvider->SetToUpdateStaticParameters(false);
+  Standard_Boolean aReadStat = Standard_False;
+  Handle(XSControl_WorkSession) aWS = XSDRAW::Session();
   if (toTestStream)
   {
     std::ofstream aStream;
-    OSD_OpenStream (aStream, aFilePath, std::ios::out | std::ios::binary);
-    aStat = aWriter.WriteStream (aStream);
-    aStream.close();
-    if (!aStream.good()
-      && aStat == IFSelect_RetDone)
-    {
-      aStat = IFSelect_RetFail;
-    }
+    OSD_OpenStream(aStream, aFilePath, std::ios::out | std::ios::binary);
+    TCollection_AsciiString aFolder, aFileNameShort;
+    OSD_Path::FolderAndFileFromPath(aFilePath, aFolder, aFileNameShort);
+    aReadStat =
+      aProvider->Write(aStream, aDoc, aWS, aProgress->Start());
   }
   else
   {
-    aStat = aWriter.Write (aFilePath.ToCString());
+    aReadStat =
+      aProvider->Write(aFilePath, aDoc, aWS, aProgress->Start());
   }
-
-  switch (aStat)
+  if (!aReadStat)
   {
-    case IFSelect_RetVoid:
-    {
-      di << "Error: no file written";
-      break;
-    }
-    case IFSelect_RetDone:
-    {
-      di << "File " << aFilePath << " written\n";
-
-      NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)> aDicFile = aWriter.ExternFiles();
-      FillDicWS (aDicFile);
-      AddWS (aFilePath, XSDRAW::Session());
-      break;
-    }
-    default:
-    {
-      di << "Error on writing file";
-      break;
-    }
+    di << "Cannot write any relevant data to the STEP file\n";
+    return 1;
   }
+  //NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)> aDicFile = aWriter.ExternFiles();
+  //FillDicWS(aDicFile);
+  //AddWS(aFilePath, XSDRAW::Session());
   return 0;
 }
 
@@ -1228,7 +1088,8 @@ static Standard_Integer ReadFile(Draw_Interpretor& theDI,
   if (aStat)
   {
     TopoDS_Shape aShape;
-    aStat = isNoDoc ? aConf->Read(aFilePath, aShape) : aConf->Read(aFilePath, aDoc);
+    Handle(XSControl_WorkSession) aWS = XSDRAW::Session();
+    aStat = isNoDoc ? aConf->Read(aFilePath, aShape, aWS) : aConf->Read(aFilePath, aDoc, aWS);
     if(isNoDoc && aStat)
     {
       DBRep::Set(aDocShapeName.ToCString(), aShape);
@@ -1304,6 +1165,7 @@ static Standard_Integer WriteFile(Draw_Interpretor& theDI,
   {
     aStat = aConf->Load(aConfString);
   }
+  Handle(XSControl_WorkSession) aWS = XSDRAW::Session();
   if (aStat)
   {
     if(isNoDoc)
@@ -1314,11 +1176,11 @@ static Standard_Integer WriteFile(Draw_Interpretor& theDI,
         Message::SendFail() << "Error: incorrect shape";
         return 1;
       }
-      aStat = aConf->Write(aFilePath, aShape);
+      aStat = aConf->Write(aFilePath, aShape, aWS);
     }
     else
     {
-      aStat = aConf->Write(aFilePath, aDoc);
+      aStat = aConf->Write(aFilePath, aDoc, aWS);
     }
   }
   if (!aStat)