0031570: Samples - add Qt samples similar to standard MFC samples
[occt.git] / samples / OCCTOverview / code / DataExchangeSamples.cxx
diff --git a/samples/OCCTOverview/code/DataExchangeSamples.cxx b/samples/OCCTOverview/code/DataExchangeSamples.cxx
new file mode 100644 (file)
index 0000000..e6bac73
--- /dev/null
@@ -0,0 +1,410 @@
+// Copyright (c) 2020 OPEN CASCADE SAS
+//
+// This file is part of the examples of the Open CASCADE Technology software library.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
+
+#include "DataExchangeSamples.h"
+
+#include "MakeBottle.h"
+
+#include <AIS_ViewCube.hxx>
+#include <AIS_Shape.hxx>
+#include <BRepTools.hxx>
+#include <BRep_Tool.hxx>
+#include <BRep_Builder.hxx>
+#include <Geom_Surface.hxx>
+#include <Geom_Plane.hxx>
+#include <Geom_Line.hxx>
+#include <Graphic3d_TextureEnv.hxx>
+#include <IFSelect_ReturnStatus.hxx>
+#include <IGESControl_Controller.hxx>
+#include <IGESControl_Reader.hxx>
+#include <IGESControl_Writer.hxx>
+#include <Interface_Static.hxx>
+#include <STEPControl_Reader.hxx>
+#include <STEPControl_Writer.hxx>
+#include <StlAPI_Writer.hxx>
+#include <TopExp_Explorer.hxx>
+#include <TopoDS.hxx>
+#include <TopoDS_Shape.hxx>
+#include <TopoDS_Compound.hxx>
+#include <TopTools_HSequenceOfShape.hxx>
+#include <VrmlAPI_Writer.hxx>
+
+void DataExchangeSamples::Process (const TCollection_AsciiString& theSampleName)
+{
+  if (IsImportSample(theSampleName))
+  {
+    myObject3d.Clear();
+  }
+  myObject2d.Clear();
+  myCode.Clear();
+  myIsProcessed = Standard_False;
+  try
+  {
+    ExecuteSample(theSampleName);
+  }
+  catch (...)
+  {
+    TraceError(TCollection_AsciiString("Error in sample: ") + theSampleName);
+  }
+}
+
+void DataExchangeSamples::AppendBottle()
+{
+  TopoDS_Shape aBottle = MakeBottle(50, 70, 30);
+  Handle(AIS_InteractiveObject) aShape = new AIS_Shape(aBottle);
+  myObject3d.Append(aShape);
+  Handle(AIS_ViewCube) aViewCube = new AIS_ViewCube();
+  myObject3d.Append(aViewCube);
+  myResult << "A bottle shape was created." << std::endl;
+}
+
+void DataExchangeSamples::ExecuteSample (const TCollection_AsciiString& theSampleName)
+{
+  Standard_Boolean anIsSamplePresent = Standard_True;
+  FindSourceCode(theSampleName);
+  if (theSampleName == "BrepExportSample")
+  {
+    BrepExportSample();
+  }
+  else if (theSampleName == "StepExportSample")
+  {
+    StepExportSample();
+  }
+  else if (theSampleName == "IgesExportSample")
+  {
+    IgesExportSample();
+  }
+  else if (theSampleName == "StlExportSample")
+  {
+    StlExportSample();
+  }
+  else if (theSampleName == "VrmlExportSample")
+  {
+    VrmlExportSample();
+  }
+  else if (theSampleName == "ImageExportSample")
+  {
+    ImageExportSample();
+  }
+  else if (theSampleName == "BrepImportSample")
+  {
+    BrepImportSample();
+  }
+  else if (theSampleName == "StepImportSample")
+  {
+    StepImportSample();
+  }
+  else if (theSampleName == "IgesImportSample")
+  {
+    IgesImportSample();
+  }
+  else
+  {
+    myResult << "No function found: " << theSampleName;
+    myCode += TCollection_AsciiString("No function found: ") + theSampleName;
+    anIsSamplePresent = Standard_False;
+  }
+  myIsProcessed = anIsSamplePresent;
+}
+
+void DataExchangeSamples::BrepExportSample()
+{
+  Standard_Boolean anIsShapeExist = Standard_False;
+  for (Handle(AIS_InteractiveObject) anObject : myObject3d)
+  {
+    if (Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(anObject))
+    {
+      anIsShapeExist = Standard_True;
+      if (BRepTools::Write(aShape->Shape(), myFileName.ToCString()))
+      {
+        myResult << "A shape was successfully written" << std::endl;
+      }
+      else
+      {
+        myResult << "A shape was not written" << std::endl;
+      }
+      break; // write only one shape
+    }
+  }
+  if (!anIsShapeExist)
+  {
+    myResult << "A shape does not exist" << std::endl;
+  }
+}
+
+void DataExchangeSamples::StepExportSample()
+{
+  if (myStepType < 0)
+  {
+    myResult << "Unknown step type" << std::endl;
+    return;
+  }
+
+  IFSelect_ReturnStatus aStatus;
+
+  if (myStepType == STEPControl_FacetedBrep && !CheckFacetedBrep())
+  {
+    myResult << "At least one shape doesn't contain facets" << std::endl;
+    return;
+  }
+
+  STEPControl_Writer aStepWriter;
+  for (Handle(AIS_InteractiveObject) anObject : myObject3d)
+  {
+    if (Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(anObject))
+    {
+      aStatus = aStepWriter.Transfer(aShape->Shape(), myStepType);
+      if (aStatus != IFSelect_RetDone)
+      {
+        myResult << "A shape was not transferred successfully" << std::endl;
+        return;
+      }
+    }
+  }
+  aStatus = aStepWriter.Write(myFileName.ToCString());
+
+  switch (aStatus)
+  {
+    case IFSelect_RetError:
+      myResult << "Incorrect Data." << std::endl;
+      break;
+    case IFSelect_RetFail:
+      myResult << "Writing error" << std::endl;
+      break;
+    case IFSelect_RetVoid:
+      myResult << "Nothing to transfer." << std::endl;
+      break;
+    case IFSelect_RetStop:
+    case IFSelect_RetDone:
+      myResult << "A STEP file was successfully written" << std::endl;
+      break;
+  }
+
+}
+
+void DataExchangeSamples::IgesExportSample()
+{
+  IGESControl_Controller::Init();
+  IGESControl_Writer anIgesWriter(Interface_Static::CVal("XSTEP.iges.unit"),
+                                  Interface_Static::IVal("XSTEP.iges.writebrep.mode"));
+
+  Standard_Boolean anIsShapeExist = Standard_False;
+  for (Handle(AIS_InteractiveObject) anObject : myObject3d)
+  {
+    if (Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(anObject))
+    {
+      anIsShapeExist = Standard_True;
+      anIgesWriter.AddShape(aShape->Shape());
+    }
+  }
+  if (anIsShapeExist)
+  {
+    anIgesWriter.ComputeModel();
+    if (anIgesWriter.Write(myFileName.ToCString()))
+    {
+      myResult << "A STEP file was successfully written" << std::endl;
+    }
+    else
+    {
+      myResult << "A STEP file was not written" << std::endl;
+    }
+  }
+  else
+  {
+    myResult << "Shapes do not exist" << std::endl;
+  }
+}
+
+void DataExchangeSamples::StlExportSample()
+{
+  TopoDS_Compound aTopoCompound;
+  BRep_Builder aBuilder;
+  aBuilder.MakeCompound(aTopoCompound);
+
+  Standard_Boolean anIsShapeExist = Standard_False;
+  for (Handle(AIS_InteractiveObject) anObject : myObject3d)
+  {
+    if (Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(anObject))
+    {
+      anIsShapeExist = Standard_True;
+      aBuilder.Add(aTopoCompound, aShape->Shape());
+    }
+  }
+  if (anIsShapeExist)
+  {
+    StlAPI_Writer aStlWriter;
+    if (aStlWriter.Write(aTopoCompound, myFileName.ToCString()))
+    {
+      myResult << "A STL file was successfully written" << std::endl;
+    }
+    else
+    {
+      myResult << "A STL file was not written" << std::endl;
+    }
+  }
+  else
+  {
+    myResult << "Shapes do not exist" << std::endl;
+  }
+}
+
+void DataExchangeSamples::VrmlExportSample()
+{
+  TopoDS_Compound aTopoCompound;
+  BRep_Builder aBrepBuilder;
+  aBrepBuilder.MakeCompound(aTopoCompound);
+
+  Standard_Boolean anIsShapeExist = Standard_False;
+  for (Handle(AIS_InteractiveObject) anObject : myObject3d)
+  {
+    if (Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(anObject))
+    {
+      anIsShapeExist = Standard_True;
+      aBrepBuilder.Add(aTopoCompound, aShape->Shape());
+    }
+  }
+  if (anIsShapeExist)
+  {
+    VrmlAPI_Writer aVrmlWriter;
+    if (aVrmlWriter.Write(aTopoCompound, myFileName.ToCString()))
+    {
+      myResult << "A VRML file was successfully written" << std::endl;
+    }
+    else
+    {
+      myResult << "A VRML file was not written" << std::endl;
+    }
+  }
+  else
+  {
+    myResult << "Shapes do not exist" << std::endl;
+  }
+}
+
+void DataExchangeSamples::ImageExportSample()
+{
+  if (myView)
+  {
+    Standard_Boolean aResult = myView->Dump(myFileName.ToCString());
+    if (aResult)
+    {
+      myResult << "An image file was successfully written" << std::endl;
+    }
+    else
+    {
+      myResult << "An image file was not written" << std::endl;
+    }
+  }
+}
+
+void DataExchangeSamples::BrepImportSample()
+{
+  TopoDS_Shape aTopoShape;
+  BRep_Builder aBuilder;
+  Standard_Boolean aResult = BRepTools::Read(aTopoShape, myFileName.ToCString(), aBuilder);
+  if (aResult)
+  {
+    Handle(AIS_Shape) anAisShape = new AIS_Shape(aTopoShape);
+    myObject3d.Append(anAisShape);
+    myResult << "A BREP file was read successfully" << std::endl;
+  }
+  else
+  {
+    myResult << "A BREP file was not read successfully" << std::endl;
+  }
+}
+
+void DataExchangeSamples::StepImportSample()
+{
+  Handle(TopTools_HSequenceOfShape) aSequence = new TopTools_HSequenceOfShape();
+  STEPControl_Reader aReader;
+  const IFSelect_ReturnStatus aStatus = aReader.ReadFile(myFileName.ToCString());
+  if (aStatus != IFSelect_RetDone)
+  {
+    myResult << "A BREP file was not read successfully" << std::endl;
+    return;
+  }
+
+  bool anIsFailsOnly = false;
+  aReader.PrintCheckLoad(anIsFailsOnly, IFSelect_ItemsByEntity);
+
+  int aRootsNumber = aReader.NbRootsForTransfer();
+  aReader.PrintCheckTransfer(anIsFailsOnly, IFSelect_ItemsByEntity);
+  for (Standard_Integer i = 1; i <= aRootsNumber; i++)
+  {
+    aReader.TransferRoot(i);
+  }
+
+  int aShapesNumber = aReader.NbShapes();
+  for (int i = 1; i <= aShapesNumber; i++)
+  {
+    TopoDS_Shape aTopoShape = aReader.Shape(i);
+    Handle(AIS_Shape) anAisShape = new AIS_Shape(aTopoShape);
+    myObject3d.Append(anAisShape);
+  }
+  myResult << "A STEP file was read successfully" << std::endl;
+}
+
+void DataExchangeSamples::IgesImportSample()
+{
+  IGESControl_Reader aReader;
+  int status = aReader.ReadFile (myFileName.ToCString());
+  if (status != IFSelect_RetDone)
+  {
+    myResult << "A IGES file was not read successfully" << std::endl;
+    return;
+  }
+  aReader.TransferRoots();
+  TopoDS_Shape aTopoShape = aReader.OneShape();
+  Handle(AIS_Shape) anAisShape = new AIS_Shape (aTopoShape);
+  myObject3d.Append(anAisShape);
+  myResult << "A IGES file was read successfully" << std::endl;
+}
+
+Standard_Boolean DataExchangeSamples::CheckFacetedBrep()
+{
+  Standard_Boolean anError = Standard_False;
+  for (Handle(AIS_InteractiveObject) anObject : myObject3d)
+  {
+    if (Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(anObject))
+    {
+      const TopoDS_Shape aTopoShape = aShape->Shape();
+      for (TopExp_Explorer aFaceExplorer(aTopoShape, TopAbs_FACE); aFaceExplorer.More() && !anError; aFaceExplorer.Next())
+      {
+        Handle(Geom_Surface) aSurface = BRep_Tool::Surface(TopoDS::Face(aFaceExplorer.Current()));
+        if (!aSurface->IsKind(STANDARD_TYPE(Geom_Plane)))
+        {
+          anError = Standard_True;
+        }
+      }
+      for (TopExp_Explorer anEdgeExplorer(aTopoShape, TopAbs_EDGE); anEdgeExplorer.More() && !anError; anEdgeExplorer.Next())
+      {
+        Standard_Real fd, ld;
+        Handle(Geom_Curve) curve = BRep_Tool::Curve(TopoDS::Edge(anEdgeExplorer.Current()), fd, ld);
+        if (!curve->IsKind(STANDARD_TYPE(Geom_Line)))
+        {
+          anError = Standard_True;
+        }
+      }
+    }
+  }
+  return !anError;
+}