1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-14 13:30:48 +03:00

0028564: Support of applications using old persistence (ShapeSchema)

* Added Draw commands to read/write files written using ShapeSchema and standard storage drivers
This commit is contained in:
snn
2017-03-31 14:39:11 +03:00
parent 3b5f0ca372
commit f735ad9bd4
5 changed files with 249 additions and 1 deletions

View File

@@ -37,7 +37,13 @@ uses
Draw,
TDF,
TDocStd,
DDF
DDF,
FSD,
BRep,
MgtBRep,
PCDM,
Storage,
ShapeSchema
is
@@ -97,5 +103,8 @@ is
MTMCommands (theCommands : in out Interpretor from Draw);
---Purpose : Create, Add, Remove, Open, Commit, Undo, Redo, SetNestedMode
ShapeSchemaCommands (theCommands : in out Interpretor from Draw);
---Purpose : ShapeSchema_Write, ShapeSchema_Read
end DDocStd;

View File

@@ -141,4 +141,5 @@ void DDocStd::AllCommands(Draw_Interpretor& theCommands)
DDocStd::DocumentCommands(theCommands);
DDocStd::ToolsCommands(theCommands);
DDocStd::MTMCommands(theCommands);
DDocStd::ShapeSchemaCommands(theCommands);
}

View File

@@ -0,0 +1,233 @@
#include <DDocStd.ixx>
#include <BRep_Builder.hxx>
#include <DBRep.hxx>
#include <Draw_Interpretor.hxx>
#include <FSD_File.hxx>
#include <FSD_CmpFile.hxx>
#include <FSD_BinaryFile.hxx>
#include <MgtBRep.hxx>
#include <NCollection_Handle.hxx>
#include <NCollection_DataMap.hxx>
#include <PCDM_ReadWriter.hxx>
#include <PTColStd_TransientPersistentMap.hxx>
#include <PTColStd_PersistentTransientMap.hxx>
#include <PTopoDS_HShape.hxx>
#include <ShapeSchema.hxx>
#include <Storage_Data.hxx>
#include <Storage_HSeqOfRoot.hxx>
#include <Storage_Root.hxx>
#include <TCollection_ExtendedString.hxx>
#include <TopTools_SequenceOfShape.hxx>
#include <TopoDS_Shape.hxx>
//=======================================================================
//function : DDocStd_ShapeSchema_Write
//=======================================================================
static Standard_Integer DDocStd_ShapeSchema_Write(Draw_Interpretor& di,
Standard_Integer n,
const char** a)
{
if (n < 3)
{
di << "Usage : ShapeSchema_Write shapes filename [gen | cmp | bin]\n";
di << " Arguments:\n";
di << " shapes : list os shape names\n";
di << " filename : output file name\n";
di << " Storage driver:\n";
di << " gen : FSD_File driver (default)\n";
di << " cmp : FSD_CmpFile driver\n";
di << " bin : FSD_BinaryFile driver\n";
return 1;
}
NCollection_Handle<Storage_BaseDriver> aFileDriver;
Standard_Boolean hasStorageDriver = Standard_False;
Standard_Integer iArgN = n - 1;
if (strncmp(a[iArgN], "gen", 3) == 0)
{
aFileDriver = new FSD_File;
hasStorageDriver = Standard_True;
}
else if (strncmp(a[iArgN], "cmp", 3) == 0)
{
aFileDriver = new FSD_CmpFile;
hasStorageDriver = Standard_True;
}
else if (strncmp(a[iArgN], "bin", 3) == 0)
{
aFileDriver = new FSD_BinaryFile;
hasStorageDriver = Standard_True;
}
if (hasStorageDriver) --iArgN;
Storage_Error aStatus = aFileDriver->Open(a[iArgN], Storage_VSWrite);
if (aStatus != Storage_VSOk) {
di << "Error : couldn't open file '" << "' for writing (" << aStatus << ")\n";
return 1;
}
TopTools_SequenceOfShape aShapes;
NCollection_DataMap<TCollection_AsciiString, Standard_Integer> aShapeNames;
for (Standard_Integer i = 1; i < iArgN; ++i)
{
TopoDS_Shape aShape = DBRep::Get(a[i]);
if (aShape.IsNull())
{
di << "Error : null shape " << a[i] << "\n";
return 1;
}
aShapes.Append(aShape);
if (aShapeNames.IsBound(a[i]))
aShapeNames.ChangeFind(a[i]) += 1;
else
aShapeNames.Bind(a[i], 1);
}
Handle(ShapeSchema) aSchema = new ShapeSchema;
Handle(Storage_Data) aData = new Storage_Data;
aData->SetApplicationName(TCollection_ExtendedString("DDocStd_ShapeSchema_Write"));
PTColStd_TransientPersistentMap aMap;
for (Standard_Integer i = 1; i <= aShapes.Length(); ++i)
{
TopoDS_Shape aShape = aShapes.Value(i);
Handle(PTopoDS_HShape) aPShape =
MgtBRep::Translate(aShape, aMap, MgtBRep_WithTriangle);
if (aPShape.IsNull())
{
di << "Error : couldn't translate shape " << a[i] << "\n";
return 1;
}
TCollection_AsciiString aName = a[i];
if (aShapeNames.IsBound(aName))
{
Standard_Integer n = aShapeNames.Find(a[i]);
if (n > 1)
{
aName += "_";
aName += n;
}
}
aData->AddRoot(aName, aPShape);
}
aSchema->Write(*aFileDriver, aData);
aFileDriver->Close();
return 0;
}
//=======================================================================
//function : DDocStd_ShapeSchema_Read
//=======================================================================
static Standard_Integer DDocStd_ShapeSchema_Read(Draw_Interpretor& di,
Standard_Integer n,
const char** a)
{
if (n < 3)
{
di << "Usage : ShapeSchema_Read filename shape\n";
di << " Arguments:\n";
di << " filename : input file name\n";
di << " shape : name of an output shape,\n";
di << " root shapes will be put into a compound\n";
di << " in case of multiple roots in the file\n";
return 1;
}
// Create a driver appropriate for the given file
NCollection_Handle<Storage_BaseDriver> aFileDriver;
if (FSD_CmpFile::IsGoodFileType(TCollection_AsciiString(a[1])) == Storage_VSOk)
aFileDriver = new FSD_CmpFile;
else if (FSD_File::IsGoodFileType(TCollection_AsciiString(a[1])) == Storage_VSOk)
aFileDriver = new FSD_File;
else if (FSD_BinaryFile::IsGoodFileType(TCollection_AsciiString(a[1])) == Storage_VSOk)
aFileDriver = new FSD_BinaryFile;
else
{
di << "Error : unknown storage driver\n";
return 1;
}
PCDM_ReadWriter::Open(*aFileDriver, a[1], Storage_VSRead);
Handle(ShapeSchema) aSchema = new ShapeSchema;
Handle(Storage_Data) aData = aSchema->Read(*aFileDriver);
Handle(Storage_HSeqOfRoot) aRoots = aData->Roots();
di << "Info : " << aRoots->Length() << " root(s)\n";
TopTools_SequenceOfShape aShapes;
PTColStd_PersistentTransientMap aMap;
for (Standard_Integer i = 1; i <= aRoots->Length(); ++i)
{
Handle(Storage_Root) aRoot = aRoots->Value(i);
Handle(Standard_Persistent) aPObject = aRoot->Object();
Handle(PTopoDS_HShape) aPShape = Handle(PTopoDS_HShape)::DownCast(aPObject);
if (aPShape.IsNull())
{
di << "Warning : not a shape at [" << i << "] root\n";
continue;
}
TopoDS_Shape aShape;
MgtBRep::Translate(aPShape, aMap, aShape, MgtBRep_WithTriangle);
if (aShape.IsNull())
{
di << "Error : persistent shape translation at [" << i << "] root\n";
return 1;
}
aShapes.Append(aShape);
}
di << "Info : " << aShapes.Length() << " shape(s) transleted\n";
if (aShapes.Length() > 1)
{
BRep_Builder aB;
TopoDS_Compound aC;
aB.MakeCompound(aC);
for (Standard_Integer i = 1; i <= aShapes.Length(); ++i)
aB.Add(aC, aShapes.Value(i));
DBRep::Set(a[2], aC);
}
else
DBRep::Set(a[2], aShapes.First());
return 0;
}
//=======================================================================
//function : ShapeSchemaCommands
//purpose : registers shape schema related commands in Draw interpreter
//=======================================================================
void DDocStd::ShapeSchemaCommands(Draw_Interpretor& theCommands)
{
static Standard_Boolean done = Standard_False;
if (done) return;
done = Standard_True;
const char* g = "DDocStd commands";
theCommands.Add("ShapeSchema_Write",
"ShapeSchema_Write shape filename [driver]",
__FILE__, DDocStd_ShapeSchema_Write, g);
theCommands.Add("ShapeSchema_Read",
"ShapeSchema_Read filename shape",
__FILE__, DDocStd_ShapeSchema_Read, g);
}

View File

@@ -3,3 +3,4 @@ DDocStd_ApplicationCommands.cxx
DDocStd_DocumentCommands.cxx
DDocStd_ToolsCommands.cxx
DDocStd_MTMCommands.cxx
DDocStd_ShapeSchemaCommands.cxx

View File

@@ -18,3 +18,7 @@ TKBool
TKBO
TKCAF
TKViewerTest
TKShapeSchema
PTKernel
TKPShape
TKCDF