1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-02 17:46:22 +03:00
occt/samples/OCCTOverview/code/DataExchangeSamples.cxx
asuraven a2176e6524 0031570: Samples - add Qt samples similar to standard MFC samples
Added Qt sample OCCTOverview providing examples of use of OCCT API with relevant code and demonstration of results in the viewer.

Off-topic: some unused images are removed from dox/introduction/images/
2020-10-06 20:40:23 +03:00

411 lines
11 KiB
C++

// 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;
}