0025748: Parallel version of progress indicator
[occt.git] / src / STEPCAFControl / STEPCAFControl_Writer.cxx
index 5eae284..1625c4a 100644 (file)
@@ -29,6 +29,7 @@
 #include <Interface_EntityIterator.hxx>
 #include <Interface_Static.hxx>
 #include <Message_Messenger.hxx>
+#include <Message_ProgressScope.hxx>
 #include <MoniTool_DataMapIteratorOfDataMapOfShapeTransient.hxx>
 #include <OSD_Path.hxx>
 #include <Quantity_TypeOfColor.hxx>
@@ -365,16 +366,17 @@ IFSelect_ReturnStatus STEPCAFControl_Writer::Write (const Standard_CString filen
 //purpose  :
 //=======================================================================
 
-Standard_Boolean STEPCAFControl_Writer::Transfer( const Handle(TDocStd_Document) &doc,
-                                                 const STEPControl_StepModelType mode,
-                                                 const Standard_CString multi )
+Standard_Boolean STEPCAFControl_Writer::Transfer(const Handle(TDocStd_Document) &doc,
+                                                 const STEPControl_StepModelType mode,
+                                                 const Standard_CString multi,
+                                                 const Message_ProgressRange& theProgress)
 {
   Handle(XCAFDoc_ShapeTool) STool = XCAFDoc_DocumentTool::ShapeTool( doc->Main() );
   if ( STool.IsNull() ) return Standard_False;
 
   TDF_LabelSequence labels;
   STool->GetFreeShapes ( labels );
-  return Transfer ( myWriter, labels, mode, multi );
+  return Transfer(myWriter, labels, mode, multi, Standard_False, theProgress);
 }
 
 
@@ -383,13 +385,14 @@ Standard_Boolean STEPCAFControl_Writer::Transfer( const Handle(TDocStd_Document)
 //purpose  :
 //=======================================================================
 
-Standard_Boolean STEPCAFControl_Writer::Transfer( const TDF_Label& L,
-                                                 const STEPControl_StepModelType mode,
-                                                 const Standard_CString multi )
+Standard_Boolean STEPCAFControl_Writer::Transfer(const TDF_Label& L,
+                                                 const STEPControl_StepModelType mode,
+                                                 const Standard_CString multi,
+                                                 const Message_ProgressRange& theProgress)
 {
   TDF_LabelSequence labels;
   labels.Append ( L );
-  return Transfer ( myWriter, labels, mode, multi );
+  return Transfer(myWriter, labels, mode, multi, Standard_False, theProgress);
 }
 
 //=======================================================================
@@ -397,11 +400,12 @@ Standard_Boolean STEPCAFControl_Writer::Transfer( const TDF_Label& L,
 //purpose  :
 //=======================================================================
 
-Standard_Boolean STEPCAFControl_Writer::Transfer( const TDF_LabelSequence& labels,
-                                                 const STEPControl_StepModelType mode,
-                                                 const Standard_CString multi )
+Standard_Boolean STEPCAFControl_Writer::Transfer(const TDF_LabelSequence& labels,
+                                                 const STEPControl_StepModelType mode,
+                                                 const Standard_CString multi,
+                                                 const Message_ProgressRange& theProgress)
 {
-  return Transfer( myWriter, labels, mode, multi );
+  return Transfer(myWriter, labels, mode, multi, Standard_False, theProgress);
 }
 
 //=======================================================================
@@ -410,9 +414,10 @@ Standard_Boolean STEPCAFControl_Writer::Transfer( const TDF_LabelSequence& label
 //=======================================================================
 
 Standard_Boolean STEPCAFControl_Writer::Perform (const Handle(TDocStd_Document) &doc,
-                                                const Standard_CString filename)
+                                                 const Standard_CString filename,
+                                                 const Message_ProgressRange& theProgress)
 {
-  if ( ! Transfer ( doc ) ) return Standard_False;
+  if (!Transfer(doc, STEPControl_AsIs, 0L, theProgress)) return Standard_False;
   return Write ( filename ) == IFSelect_RetDone;
 }
 
@@ -423,9 +428,10 @@ Standard_Boolean STEPCAFControl_Writer::Perform (const Handle(TDocStd_Document)
 //=======================================================================
 
 Standard_Boolean STEPCAFControl_Writer::Perform (const Handle(TDocStd_Document) &doc,
-                                                const TCollection_AsciiString &filename)
+                                                 const TCollection_AsciiString &filename,
+                                                 const Message_ProgressRange& theProgress)
 {
-  if ( ! Transfer ( doc ) ) return Standard_False;
+  if ( ! Transfer ( doc, STEPControl_AsIs, 0L, theProgress ) ) return Standard_False;
   return Write ( filename.ToCString() ) == IFSelect_RetDone;
 }
 
@@ -500,10 +506,11 @@ const STEPControl_Writer &STEPCAFControl_Writer::Writer () const
 //=======================================================================
 
 Standard_Boolean STEPCAFControl_Writer::Transfer (STEPControl_Writer &writer,
-                                                 const TDF_LabelSequence &labels,
-                                                 const STEPControl_StepModelType mode,
-                                                 const Standard_CString multi,
-                                                  const Standard_Boolean isExternFile)
+                                                  const TDF_LabelSequence &labels,
+                                                  const STEPControl_StepModelType mode,
+                                                  const Standard_CString multi,
+                                                  const Standard_Boolean isExternFile,
+                                                  const Message_ProgressRange& theProgress)
 {
   if ( labels.Length() <=0 ) return Standard_False;
 
@@ -513,7 +520,10 @@ Standard_Boolean STEPCAFControl_Writer::Transfer (STEPControl_Writer &writer,
   // translate free top-level shapes of the DECAF document
   Standard_Integer ap = Interface_Static::IVal ("write.step.schema");
   TDF_LabelSequence sublabels;
-  for ( Standard_Integer i=1; i <= labels.Length(); i++ ) {
+  Message_ProgressScope aPS(theProgress, "Labels", labels.Length());
+  for ( Standard_Integer i=1; i <= labels.Length() && aPS.More(); i++)
+  {
+    Message_ProgressRange aRange = aPS.Next();
     TDF_Label L = labels.Value(i);
     if ( myLabels.IsBound ( L ) ) continue; // already processed
 
@@ -576,12 +586,15 @@ Standard_Boolean STEPCAFControl_Writer::Transfer (STEPControl_Writer &writer,
       if ( XCAFDoc_ShapeTool::IsAssembly ( L ) || XCAFDoc_ShapeTool::IsReference ( L ) )
         Actor->RegisterAssembly ( shape );
 
-      writer.Transfer(shape,mode,Standard_False);
+      writer.Transfer(shape, mode, Standard_False, aRange);
       Actor->SetStdMode ( Standard_True ); // restore default behaviour
     }
     else {
       // translate final solids
-      TopoDS_Shape Sass = TransferExternFiles ( L, mode, sublabels, multi );
+      Message_ProgressScope aPS1 (aRange, NULL, 2);
+      TopoDS_Shape Sass = TransferExternFiles(L, mode, sublabels, multi, aPS1.Next());
+      if (aPS1.UserBreak())
+        return Standard_False;
 
       // translate main assembly structure
 /*
@@ -603,11 +616,13 @@ Standard_Boolean STEPCAFControl_Writer::Transfer (STEPControl_Writer &writer,
 */      
       Standard_Integer assemblymode = Interface_Static::IVal ("write.step.assembly");
       Interface_Static::SetCVal ("write.step.assembly", "On");
-      writer.Transfer ( Sass, STEPControl_AsIs );
+      writer.Transfer ( Sass, STEPControl_AsIs, Standard_True, aPS1.Next());
       Interface_Static::SetIVal ("write.step.assembly", assemblymode);
       Interface_Static::SetIVal ("write.step.schema", ap);
     }
   }
+  if (aPS.UserBreak())
+    return Standard_False;
 
   writer.WS()->ComputeGraph(Standard_True );// added by skl 03.11.2003 since we use
                                             // writer.Transfer() wihtout compute graph
@@ -716,9 +731,10 @@ Standard_Boolean STEPCAFControl_Writer::Transfer (STEPControl_Writer &writer,
 //=======================================================================
 
 TopoDS_Shape STEPCAFControl_Writer::TransferExternFiles (const TDF_Label &L,
-                                                        const STEPControl_StepModelType mode,
-                                                        TDF_LabelSequence &labels,
-                                                        const Standard_CString prefix)
+                                                         const STEPControl_StepModelType mode,
+                                                         TDF_LabelSequence &labels,
+                                                         const Standard_CString prefix,
+                                                         const Message_ProgressRange& theProgress)
 {
   // if label already translated, just return the shape
   if ( myLabels.IsBound ( L ) ) {
@@ -763,7 +779,7 @@ TopoDS_Shape STEPCAFControl_Writer::TransferExternFiles (const TDF_Label &L,
     Standard_Integer assemblymode = Interface_Static::IVal ("write.step.assembly");
     Interface_Static::SetCVal ("write.step.assembly", "Off");
     const Standard_CString multi = 0;
-    EF->SetTransferStatus ( Transfer ( sw, Lseq, mode, multi, Standard_True ) );
+    EF->SetTransferStatus ( Transfer ( sw, Lseq, mode, multi, Standard_True, theProgress) );
     Interface_Static::SetIVal ("write.step.assembly", assemblymode);
     myLabEF.Bind ( L, EF );
     myFiles.Bind ( name->ToCString(), EF );
@@ -787,11 +803,12 @@ TopoDS_Shape STEPCAFControl_Writer::TransferExternFiles (const TDF_Label &L,
     XCAFDoc_ShapeTool::GetComponents ( L, comp, Standard_False );
 
   labels.Append ( aCurL );
-  for ( Standard_Integer k=1; k <= comp.Length(); k++ ) {
+  Message_ProgressScope aPS(theProgress, NULL, comp.Length());
+  for ( Standard_Integer k=1; k <= comp.Length() && aPS.More(); k++ ) {
     TDF_Label lab = comp(k);
     TDF_Label ref;
     if ( ! XCAFDoc_ShapeTool::GetReferredShape ( lab, ref ) ) continue;
-    TopoDS_Shape Scomp = TransferExternFiles ( ref, mode, labels, prefix );
+    TopoDS_Shape Scomp = TransferExternFiles(ref, mode, labels, prefix, aPS.Next());
     Scomp.Location ( XCAFDoc_ShapeTool::GetLocation ( lab ) );
     B.Add ( C, Scomp );
   }