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

Compare commits

..

11 Commits

Author SHA1 Message Date
ika
6231958ddc 0033356: Data Exchange - Wrong half of sphere is imported 2023-05-15 13:06:20 +01:00
msmediasofts
359edc7d8a 0033366: Documentation - Add description of BRepAlgoAPI_Algo::Shape()
Added description of BRepAlgoAPI_Algo::Shape()
2023-04-19 18:04:52 +01:00
mzernova
f9998f03ad 0031777: Visualization - improve SelectMgr_EntityOwner to process selection scheme
The selection scheme has been propagated to Owner object interface, and the
AIS_Selection::Select() method has been replaced to unify the logic.
2023-04-05 17:20:33 +01:00
dorlov
c479c4f6d8 0023638: Data Exchange - Reading IGES file produced invalid shape
Removed double healing of Iges group entities
Added ShapeBuild_ReShape member to the IGESData_IGESModel class, shapes which are registered in ShapeBuild_ReShape class does not process to healing
2023-03-28 01:00:42 +01:00
dpasukhi
c51df6bfd2 0033327: Data Exchange, IGES Import - SubfigureDef can't read string
Fixed problem with texted types
Added checking for null string for subfigure via XCAF transferring
2023-03-20 23:11:36 +00:00
dpasukhi
5e43274280 0033337: DRAW - Can't load plugins on Linux OS
WSL 2 have windows FileSystem and as a result we have \r symbols before \n
For this cases we can just remove \r\n (\n is a last symbol) for the node value.
2023-03-20 23:11:35 +00:00
dpasukhi
efe960751c 0033331: Data Exchange, Step Import - Unsupported Representation Items
Fixed problem with iteration on Null RI
2023-03-20 23:11:27 +00:00
anv
6b9e0dc3f8 0033345: Coding - Memory allocation operators got inaccessible
Macros was moved back to public.
2023-03-19 20:53:54 +00:00
akaftasev
2ef94c994e 0033340: Modeling Algorithm - Improve memory management performance in the PaveFiller
Changed NCollection_BaseAllocator to NCollection_IncAllocator in BOPAlgo_PaveFiller::MakeBlocks()
2023-03-19 20:53:53 +00:00
dpasukhi
1dd4b902c0 0033092: Data Exchange, Documentation - Implementation of DE_Wrapper documentation
Implement new user-guide documentation for DE Wrapper
2023-03-19 20:53:53 +00:00
akaftasev
a846d36326 0033264: Modeling Algorithms - Result of section operation is incomplete
Test case added.
2023-03-19 20:53:53 +00:00
76 changed files with 3596 additions and 3031 deletions

View File

@@ -45,6 +45,7 @@ user_guides/visualization/visualization.md
user_guides/iges/iges.md
user_guides/step/step.md
user_guides/xde/xde.md
user_guides/de_wrapper/de_wrapper.md
user_guides/ocaf/ocaf.md
user_guides/draw_test_harness/draw_test_harness.md
user_guides/inspector/inspector.md

View File

@@ -20,6 +20,7 @@ user_guides/vis/vis.md
user_guides/iges/iges.md
user_guides/step/step.md
user_guides/xde/xde.md
user_guides/de_wrapper/de_wrapper.md
user_guides/inspector/inspector.md
user_guides/draw_test_harness/draw_test_harness.md

View File

@@ -0,0 +1,413 @@
Data Exchange Wrapper (DE_Wrapper) {#occt_user_guides__de_wrapper}
============================
@tableofcontents
@section occt_de_wrapper_1 Introduction
This guide explains how to use the **Data Exchange Wrapper** (DE Wrapper).
It provides basic directions on setup, usage and file creation via DE_Wrapper.
The Data Exchange Wrapper (DE Wrapper) module allows reading and writing supported CAD formats to shape objects or special XDE documents, setting up the transfer process for all CAD files.
It is also possible to add support for new CAD formats by prototyping existing tools.
The DE Wrapper component requires @ref occt_user_guides__xde "XDE" toolkit for operation.
This guide mainly explains how to convert CAD files to Open CASCADE Technology (OCCT) shapes and vice versa.
This guide principally deals with the following OCCT classes:
* The Provider class, which loads CAD files and translates their contents to OCCT shapes or XDE documents, or translates OCCT shapes or XDE documents to CAD entities and then writes those entities to a CAD file.
* The Configuration class, which contains all information for the transfer process, such as the units, tolerance, and all internal information for the OCC readers or writers.
* The wrapper class, which contains all loaded configuration objects with own CAD format, reads or writes CAD files in the format derived from file extension or contents and saves or loads configuration settings for loaded configuration objects.
@section occt_de_wrapper_2 Supported CAD formats
| CAD format | Extensions | RW support | Thread Safety | Presentation | Package |
| :--------- | :--------- | :--------- | :----------- | :----------- | :------ |
| STEP | .stp, .step .stepz | RW | No | BRep, Mesh | STEPCAFControl |
| XCAF | .xbf | RW | Yes | BRep, Mesh | DEXCAFCascade |
| BREP | .brep | RW | Yes | BRep, Mesh | DEBRepCascade |
| IGES | .igs, .iges | RW | No | BRep | IGESCAFControl |
| OBJ | .obj | RW | Yes | Mesh | RWObj |
| STL | .stl | RW | Yes | Mesh | RWStl |
| PLY | .ply | W | Yes | Mesh | RWPly |
| GLTF | .glTF .glb | RW | Yes | Mesh | RWGltf |
| VRML | .wrl .vrml | RW | Yes | Mesh | Vrml |
**Note** :
* The format names in the first column match the FormatName values used for configuration nodes.
* The VendorName for all listed CAD formats is "OCC".
@section occt_de_wrapper_3 DE Session Configuration
Any providers can have their own read/write parameters. The transfer process is set up using DE configuration nodes, which hold all relevant parameters. There are two ways to change the parameter values: directly from code or by an external resource file/string.
The session is a global or static DE_Wrapper object that stores registered DE configuration nodes and wraps DE commands to work with them. It has some configuration parameters of its own and also keeps track of loaded nodes and specilal global parameters.
@subsection occt_de_wrapper_3_1 Getting a DE session. Code sample
Working with a DE session requires a DE_Wrapper object to be loaded or created first.
Getting the global DE_Wrapping object:
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
~~~~
Creating a local DE_Wrapper:
~~~~{.cpp}
Handle(DE_Wrapper) aSession = new DE_Wrapper();
~~~~
It is recommended to create a local one-time copy to work with the session, if no global changes are intended.
~~~~{.cpp}
Handle(DE_Wrapper) aOneTimeSession = aSession->Copy();
~~~~
@subsection occt_de_wrapper_3_2 Configuration resource
Configuration resource is an external file or string of the following format:
~~~~{.cpp}
global.priority.STEP : OCC DTK
global.general.length.unit : 1
provider.STEP.OCC.read.precision.val : 0.0001
~~~~
@subsubsection occt_de_wrapper_3_2_1 Configuration resource: graph of scopes
* **global.** is a scope of global parameters
* **priority.** is a scope of priority to use vendors with their providers.
* **general.** is a scope of global configuration parameter values
* <strong>"..."</strong> is an internal configuration with any internal scopes
* <strong>". : "</strong> is a separator of key-value
* __...__ parameter value, can't contain new line symbols.
* **provider.** is a scope of configuration providers
* **STEP.** is a scope of CAD format to configure
* **OCC.** is a scope of a vendor or provider
* <strong>"..."</strong> is an internal configuration with any internal scopes
* <strong>". : "</strong> is a separator of key-value
* <strong>"..."</strong> parameter value, can't contain new line symbols.
@subsubsection occt_de_wrapper_3_2_2 Loading configuration resources. Configuring DE Session
The resource should be loaded after the registration of all providers that should be configured. The resource only impacts registered parameters. To configure a new registered provider it is necessary to load the resource again. Parameters not present in the resource will remain unchanged.
There are two ways to check what parameters are available:
* C++: Open ConfigureNode file and check the InternalParameter field. Each parameter will be described with a comment. To check the global parameters, use the DE_Wrapper class public methods.
* Resource: Register all available Nodes to the session, then save the configuration and view all existing parameters.
There are two options for loading a resource: recursive and global parameters only. Recursive is the default option to configure all global parameters (units, priority, enable status) and all registered providers. Non-recursive configures only global parameters and ignores all provider settings. This option is the best for updating provider priority.
@subsubsection occt_de_wrapper_3_2_3 Loading configuration resources. Code sample
Configuring using a resource string:
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
TCollection_AsciiString aString =
"global.priority.STEP : OCC DTK\n"
"global.general.length.unit : 1\n"
"provider.STEP.OCC.read.precision.val : 0.\n";
Standard_Boolean aIsRecursive = Standard_True;
if (!aSession->Load(aString, aIsRecursive))
{
Message::SendFail() << "Error: configuration is incorrect";
}
~~~~
Configuring using a resource file:
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
TCollection_AsciiString aPathToFile = "";
Standard_Boolean aIsRecursive = Standard_True;
if (!aSession->Load(aPathToFile, aIsRecursive))
{
Message::SendFail() << "Error: configuration is incorrect";
}
~~~~
@subsubsection occt_de_wrapper_3_2_4 Loading configuration resources. DRAW sample
Configuring using a resource string:
~~~~{.cpp}
set conf "
global.priority.STEP : OCC
global.general.length.unit : 1
provider.STEP.OCC.read.iges.bspline.continuity : 1
provider.STEP.OCC.read.precision.mode : 0
provider.STEP.OCC.read.precision.val : 0.0001
"
LoadConfiguration ${conf} -recursive on
~~~~
Configuring using a resource file:
~~~~{.cpp}
set pathToFile ""
LoadConfiguration ${pathToFile} -recursive on
~~~~
@subsubsection occt_de_wrapper_3_2_5 Saving configuration resources. Dump of configuration DE Session
Saving the configuration of a DE Session involves dumping all parameters of registered providers.
If a parameter did not change during the session, its value remains as default.
There are two ways to save a resource: recursive and global parameters only. Recursive is the way to dump all registered provider information. Non-recursive dumps only global parameters, for example, save priority of vendors or the length unit.
It is possible to filter what vendors or providers to save by providing the correct name of the vendor or provider.
@subsubsection occt_de_wrapper_3_2_6 Saving configuration resources. Code sample
Dump to resource string. If the vendors list is empty, saves all vendors. If the providers list is empty, saves all providers of valid vendors.
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
TColStd_ListOfAsciiString aFormats;
TColStd_ListOfAsciiString aVendors;
aFormats.Appends("STEP");
aVendors.Appends("OCC");
Standard_Boolean aIsRecursive = Standard_True;
TCollection_AsciiString aConf = aSession->aConf->Save(aIsRecursive, aFormats, aVendors);
~~~~
Configure using a resource file. If the vendors list is empty, saves all vendors. If the providers list is empty, saves all providers of valid vendors.
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
TCollection_AsciiString aPathToFile = "";
TColStd_ListOfAsciiString aFormats;
TColStd_ListOfAsciiString aVendors;
aFormats.Appends("STEP");
aVendors.Appends("OCC");
Standard_Boolean aIsRecursive = Standard_True;
if (!aSession->Save(aPathToFile, aIsRecursive, aFormats,aVendors))
{
Message::SendFail() << "Error: configuration is not saved";
}
~~~~
@subsubsection occt_de_wrapper_3_2_7 Saving configuration resources. DRAW sample
Dump configuration to string. If no list of vendors is passed or it is empty, all vendors are saved. If no providers list is passed or it is empty, all providers of valid vendors are saved.
~~~~{.cpp}
set vendors "OCC"
set format "STEP"
set dump_conf [DumpConfiguration -recursive on -format ${format} -vendor ${vendors}]
~~~~
Dump configuration to file. If no vendors list are set as an argument or it is empty, saves all vendors. If no providers list as argument or it is empty, saves all providers of valid vendors:
~~~~{.cpp}
set vendors "OCC"
set format "STEP"
set pathToFile ""
DumpConfiguration -path ${pathToFile} -recursive on -format ${format} -vendor ${vendors}
~~~~
@subsection occt_de_wrapper_3_3 Registering providers
To transfer a CAD file using DE Wrapper, it is necessary to register a CAD provider.
The provider contains internal and global parameters that have default values in the creation stage.
All registered providers are set to the map with information about its vendor and kept as smart handles. Therefore, it is possible to change the values via handle from external code.
@subsubsection occt_de_wrapper_3_3_1 Registering providers. Code sample
It is nesessary to register only one ConfigurationNode for all needed formats.
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
Handle(DE_ConfigurationNode) aNode = new STEPCAFControl_ConfigurationNode();
aSession->Bind(aNode);
~~~~
@subsubsection occt_de_wrapper_3_3_2 Registering providers. DRAW Sample
Use DRAW with all providers registered by the following command:
~~~~{.cpp}
pload XDE
~~~~
@subsubsection occt_de_wrapper_3_3_3 Realtime initialization. Code sample
It is possible to change a paramater from code using a smart pointer.
~~~~{.cpp}
// global variable
static Handle(STEPCAFControl_ConfigurationNode) THE_STEP_NODE;
static Handle(DE_ConfigurationNode) RegisterStepNode()
{
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
if (!THE_STEP_NODE.IsNull())
{
return THE_STEP_NODE;
}
THE_STEP_NODE = new STEPCAFControl_ConfigurationNode();
aSession->Bind(THE_STEP_NODE);
return THE_STEP_NODE;
}
// Change parameter value
THE_STEP_NODE->InternalParameters.ReadRelationship = false;
THE_STEP_NODE->InternalParameters.ReadName = false;
THE_STEP_NODE->InternalParameters.ReadProps = false;
~~~~
@subsection occt_de_wrapper_3_4 Priority of Vendors
DE session is able to work with several vendors with the same supported CAD format. To choose the preffered vendor for each format, use a special priority list.
If the high priority vendor's provider is not supported, a transfer operation is needed (write/read), then the next vendor will be chosen.
@subsubsection occt_de_wrapper_3_4_1 Priority of Vendors. Code sample
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
TCollection_AsciiString aFormat = "STEP";
TColStd_ListOfAsciiString aVendors;
aVendors.Appends("OCC"); // high priority
aVendors.Appends("DTK");
// Flag to disable not choosen vendors, in this case configuration is possible
// otherwise, lower their priority and continue to check ability to transfer
Standard_Boolean aToDisable = Standard_True;
aSession->ChangePriority(aFormat, aVendors, aToDisable);
~~~~
@subsubsection occt_de_wrapper_3_4_2 Priority of Vendors. DRAW Sample
It is recommended to disable recursion and update only global parameters.
~~~~{.cpp}
set conf "
global.priority.STEP : OCC DTK
"
LoadConfiguration ${conf} -recursive off
~~~~
@section occt_de_wrapper_4 Transfer of CAD files
To transfer from a CAD file to OCC or from OCC to a CAD file, it is necessary to use a configured DE_Wrapper object. It can be local, one-time or global. Global configuration of DE_Wrapper propagates to all nodes via transfer. There are two options for transferring: using OCC shape or XCAF document. It is possible to work only with real path to/from the file. Streaming is not supported (yet).
The format of input/output file is automatically determined by its extension or contents.
@subsection occt_de_wrapper_4_1 Transfer of CAD files. Code samples
Reading STEP file to Shape.
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
TCollection_AsciiString aPathToFile = "example.stp";
TopoDS_Shape aShRes;
if (!aSession->Read(aPathToFile, aShRes))
{
Message::SendFail() << "Error: Can't read file";
}
~~~~
Writing Shape to STEP file.
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
TCollection_AsciiString aPathToFile = "example.stp";
TopoDS_Shape aShFrom = ...;
if (!aSession->Write(aPathToFile, aShRes))
{
Message::SendFail() << "Error: Can't write file";
}
~~~~
Reading STEP file into XCAF document.
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
TCollection_AsciiString aPathToFile = "example.stp";
Handle(TDocStd_Document) aDoc = ...;
if (!aSession->Read(aPathToFile, aDoc))
{
Message::SendFail() << "Error: Can't read file";
}
~~~~
Writing XCAF document into STEP.
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
TCollection_AsciiString aPathToFile = "example.stp";
Handle(TDocStd_Document) aDoc = ...;
if (!aSession->Write(aPathToFile, aDoc))
{
Message::SendFail() << "Error: Can't write file";
}
~~~~
@subsection occt_de_wrapper_4_2 Transfer of CAD files. DRAW samples
Reading a STEP file into a Shape.
~~~~{.cpp}
set fileName "sample.stp"
readfile shape ${fileName}
~~~~
Writing a Shape into STEP.
~~~~{.cpp}
set fileName "sample.stp"
writefile shape ${fileName}
~~~~
Reading STEP into XCAF document.
~~~~{.cpp}
set fileName "sample.stp"
ReadFile D ${fileName}
~~~~
Writing XCAF document into STEP.
~~~~{.cpp}
set fileName "sample.stp"
WriteFile D ${fileName}
~~~~
@subsection occt_de_wrapper_4_3 Transfer using DE Provider. Code sample
It is possible to read and write CAD files directly from a special provider.
~~~~{.cpp}
// Creating or getting node
Handle(STEPCAFControl_ConfigurationNode) aNode = new STEPCAFControl_ConfigurationNode();
// Creationg an one-time provider
Handle(DE_Provider) aProvider = aNode->BuildProvider();
// Setting configuration with all parameters
aProvider->SetNode(aNode);
if (!aProvider->Read(...))
{
Message::SendFail() << "Error: Can't read STEP file";
}
if (!aProvider->Write(...))
{
Message::SendFail() << "Error: Can't write STEP file";
}
~~~~
@subsection occt_de_wrapper_4_4 Temporary configuration via transfer
It is possible to change the configuration of only one transfer operation. To avoid changing parameters in a session, one-time clone of the session can be created and used for transfer. This way is recommended for use in multithreaded mode.
@subsubsection occt_de_wrapper_4_4_1 Temporary configuration via transfer. Code sample
Code sample to configure via transfer.
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper()->Copy();
TCollection_AsciiString aString =
"global.priority.STEP : OCC DTK\n"
"global.general.length.unit : 1\n"
"provider.STEP.OCC.read.precision.val : 0.\n";
if (!aSession->Load(aString, aIsRecursive))
{
Message::SendFail() << "Error: configuration is incorrect";
}
TCollection_AsciiString aPathToFile = "example.stp";
TopoDS_Shape aShRes;
if (!aSession->Read(aPathToFile, aShRes))
{
Message::SendFail() << "Error: Can't read file";
}
~~~~
@subsubsection occt_de_wrapper_4_4_2 Temporary configuration via transfer. DRAW sample
Code sample to configure via transfer within DRAW command.
~~~~{.cpp}
set fileName "sample.stp"
readfile S5 $filename -conf "global.general.length.unit : 1000 "
~~~~
Code sample to configure via transfer as variable.
~~~~{.cpp}
set fileName "sample.stp"
set conf "
global.priority.STEP : OCC
global.general.length.unit : 1
provider.STEP.OCC.read.iges.bspline.continuity : 1
provider.STEP.OCC.read.precision.mode : 0
provider.STEP.OCC.read.precision.val : 0.0001
"
readfile S5 $filename -conf ${conf}
~~~~

View File

@@ -13,6 +13,7 @@ OCCT User Guides are organized by OCCT modules:
* @subpage occt_user_guides__iges "IGES Translator"
* @subpage occt_user_guides__step "STEP Translator"
* @subpage occt_user_guides__xde "Extended Data Exchange (XDE)"
* @subpage occt_user_guides__de_wrapper "Data Exchange Wrapper (DE Wrapper)"
* @subpage occt_user_guides__ocaf "Open CASCADE Application Framework (OCAF)"
* @subpage occt_user_guides__test_harness "DRAW Test Harness"
* @subpage occt_user_guides__inspector "Inspector"

View File

@@ -3228,6 +3228,30 @@ void AIS_InteractiveContext::ClearSelected (const Standard_Boolean theToUpdateVi
}
}
//=======================================================================
//function : isDetected
//purpose :
//=======================================================================
Standard_Boolean AIS_InteractiveContext::isDetected (const Handle(AIS_InteractiveObject)& theObject)
{
for (Standard_Integer aDetIter = myDetectedSeq.Lower(); aDetIter <= myDetectedSeq.Upper(); aDetIter++)
{
Handle(SelectMgr_EntityOwner) aPicked = MainSelector()->Picked(myDetectedSeq(aDetIter));
Handle(AIS_InteractiveObject) anObj;
if (!aPicked.IsNull())
{
anObj = Handle(AIS_InteractiveObject)::DownCast(aPicked->Selectable());
}
if (!anObj.IsNull()
&& anObj == theObject)
{
return Standard_True;
}
}
return Standard_False;
}
//=======================================================================
//function : SetSelected
//purpose : Sets the whole object as selected and highlights it with selection color
@@ -3288,7 +3312,8 @@ void AIS_InteractiveContext::SetSelected (const Handle(AIS_InteractiveObject)& t
}
// added to avoid untimely viewer update...
mySelection->ClearAndSelect (anOwner);
const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
mySelection->ClearAndSelect (anOwner, myFilters, isDetected (anObj));
if (myAutoHilight)
{
@@ -3350,7 +3375,7 @@ void AIS_InteractiveContext::SetSelected (const Handle(SelectMgr_EntityOwner)& t
unhighlightSelected();
}
mySelection->ClearAndSelect (theOwner);
mySelection->ClearAndSelect (theOwner, myFilters, isDetected (anObject));
if (myAutoHilight)
{
Handle(Prs3d_Drawer) aCustomStyle;
@@ -3401,16 +3426,17 @@ void AIS_InteractiveContext::AddOrRemoveSelected (const Handle(SelectMgr_EntityO
return;
}
if (!myFilters->IsOk(theOwner) && !theOwner->IsSelected())
if (!myFilters->IsOk (theOwner) && !theOwner->IsSelected())
{
return;
}
mySelection->Select (theOwner);
AIS_SelectionScheme aSelScheme = theOwner->IsSelected() ? AIS_SelectionScheme_Remove : AIS_SelectionScheme_Add;
const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
mySelection->Select (theOwner, myFilters, aSelScheme, isDetected (anObj));
if (myAutoHilight)
{
const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
Handle(AIS_GlobalStatus)* aStatusPtr = myObjects.ChangeSeek (anObj);
if (!aStatusPtr)
{
@@ -3469,7 +3495,8 @@ Standard_Boolean AIS_InteractiveContext::SetSelectedState (const Handle(SelectMg
}
else
{
const AIS_SelectStatus aSelStatus = mySelection->Select (theEntity);
const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast(theEntity->Selectable());
const AIS_SelectStatus aSelStatus = mySelection->Select (theEntity, myFilters, AIS_SelectionScheme_Remove, isDetected (anObj));
theEntity->SetSelected (false);
return aSelStatus == AIS_SS_Removed;
}

View File

@@ -1302,6 +1302,9 @@ protected: //! @name internal methods
Standard_EXPORT AIS_StatusOfDetection moveTo (const Handle(V3d_View)& theView,
const Standard_Boolean theToRedrawOnUpdate);
//! Returns True if the object is detected.
Standard_EXPORT Standard_Boolean isDetected (const Handle(AIS_InteractiveObject)& theObject);
//! Helper function to unhighlight all entity owners currently highlighted with seleciton color.
Standard_EXPORT void unselectOwners (const Handle(AIS_InteractiveObject)& theObject);

View File

@@ -55,24 +55,38 @@ void AIS_Selection::Clear()
//function : Select
//purpose :
//=======================================================================
AIS_SelectStatus AIS_Selection::Select (const Handle(SelectMgr_EntityOwner)& theObject)
AIS_SelectStatus AIS_Selection::Select (const Handle(SelectMgr_EntityOwner)& theOwner,
const Handle(SelectMgr_Filter)& theFilter,
const AIS_SelectionScheme theSelScheme,
const Standard_Boolean theIsDetected)
{
if (theObject.IsNull()
|| !theObject->HasSelectable())
if (theOwner.IsNull()
|| !theOwner->HasSelectable())
{
return AIS_SS_NotDone;
}
if (!myResultMap.IsBound (theObject))
const Standard_Boolean isDetected = theIsDetected
&& (theFilter.IsNull() || theFilter->IsOk (theOwner));
const Standard_Boolean wasSelected = theOwner->IsSelected();
const Standard_Boolean toSelect = theOwner->Select (theSelScheme, isDetected);
if (toSelect && !wasSelected)
{
AIS_NListOfEntityOwner::Iterator aListIter;
myresult.Append (theObject, aListIter);
myResultMap.Bind (theObject, aListIter);
theObject->SetSelected (Standard_True);
myresult.Append (theOwner, aListIter);
myResultMap.Bind (theOwner, aListIter);
theOwner->SetSelected (Standard_True);
return AIS_SS_Added;
}
AIS_NListOfEntityOwner::Iterator aListIter = myResultMap.Find (theObject);
if (!toSelect && !wasSelected)
{
return AIS_SS_NotDone;
}
AIS_NListOfEntityOwner::Iterator aListIter = myResultMap.Find (theOwner);
if (myIterator == aListIter)
{
if (myIterator.More())
@@ -88,14 +102,14 @@ AIS_SelectStatus AIS_Selection::Select (const Handle(SelectMgr_EntityOwner)& the
// In the mode of advanced mesh selection only one owner is created for all selection modes.
// It is necessary to check the current detected entity
// and remove the owner from map only if the detected entity is the same as previous selected (IsForcedHilight call)
if (theObject->IsForcedHilight())
if (theOwner->IsForcedHilight())
{
return AIS_SS_Added;
}
myresult.Remove (aListIter);
myResultMap.UnBind (theObject);
theObject->SetSelected (Standard_False);
myResultMap.UnBind (theOwner);
theOwner->SetSelected (Standard_False);
// update list iterator for next object in <myresult> list if any
if (aListIter.More())
@@ -142,86 +156,39 @@ void AIS_Selection::SelectOwners (const AIS_NArray1OfEntityOwner& thePickedOwner
const Standard_Boolean theToAllowSelOverlap,
const Handle(SelectMgr_Filter)& theFilter)
{
(void )theToAllowSelOverlap;
switch (theSelScheme)
(void)theToAllowSelOverlap;
if (theSelScheme == AIS_SelectionScheme_ReplaceExtra
&& thePickedOwners.Size() == myresult.Size())
{
case AIS_SelectionScheme_UNKNOWN:
// If picked owners is equivalent to the selected then just clear selected.
Standard_Boolean isTheSame = Standard_True;
for (AIS_NArray1OfEntityOwner::Iterator aPickedIter (thePickedOwners); aPickedIter.More(); aPickedIter.Next())
{
return;
}
case AIS_SelectionScheme_ReplaceExtra:
{
// If picked owners is equivalent to the selected then just clear selected
// Else go to AIS_SelectionScheme_Replace
if (thePickedOwners.Size() == myresult.Size())
if (!myResultMap.IsBound (aPickedIter.Value()))
{
Standard_Boolean isTheSame = Standard_True;
for (AIS_NArray1OfEntityOwner::Iterator aSelIter (thePickedOwners); aSelIter.More(); aSelIter.Next())
{
if (!myResultMap.IsBound (aSelIter.Value()))
{
isTheSame = Standard_False;
break;
}
}
if (isTheSame)
{
Clear();
return;
}
isTheSame = Standard_False;
break;
}
}
Standard_FALLTHROUGH
case AIS_SelectionScheme_Replace:
if (isTheSame)
{
Clear();
for (AIS_NArray1OfEntityOwner::Iterator aSelIter (thePickedOwners); aSelIter.More(); aSelIter.Next())
{
appendOwner (aSelIter.Value(), theFilter);
}
Clear();
return;
}
}
return;
}
case AIS_SelectionScheme_Add:
{
for (AIS_NArray1OfEntityOwner::Iterator aSelIter (thePickedOwners); aSelIter.More(); aSelIter.Next())
{
appendOwner (aSelIter.Value(), theFilter);
}
return;
}
case AIS_SelectionScheme_Remove:
{
for (AIS_NArray1OfEntityOwner::Iterator aSelIter (thePickedOwners); aSelIter.More(); aSelIter.Next())
{
if (myResultMap.IsBound (aSelIter.Value()))
{
Select (aSelIter.Value());
}
}
return;
}
case AIS_SelectionScheme_XOR:
{
for (AIS_NArray1OfEntityOwner::Iterator aSelIter (thePickedOwners); aSelIter.More(); aSelIter.Next())
{
const Handle(SelectMgr_EntityOwner)& anOwner = aSelIter.Value();
if (anOwner.IsNull()
|| !anOwner->HasSelectable()
|| !theFilter->IsOk (anOwner))
{
continue;
}
if (theSelScheme == AIS_SelectionScheme_Replace
|| theSelScheme == AIS_SelectionScheme_ReplaceExtra
|| theSelScheme == AIS_SelectionScheme_Clear)
{
Clear();
}
Select (anOwner);
}
return;
}
case AIS_SelectionScheme_Clear:
{
Clear();
return;
}
for (AIS_NArray1OfEntityOwner::Iterator aPickedIter (thePickedOwners); aPickedIter.More(); aPickedIter.Next())
{
const Handle(SelectMgr_EntityOwner)& anOwner = aPickedIter.Value();
Select (anOwner, theFilter, theSelScheme, true);
}
}

View File

@@ -34,23 +34,36 @@ public:
//! creates a new selection.
Standard_EXPORT AIS_Selection();
//! removes all the object of the selection.
Standard_EXPORT virtual void Clear();
//! if the object is not yet in the selection, it will be added.
//! if the object is already in the selection, it will be removed.
Standard_EXPORT virtual AIS_SelectStatus Select (const Handle(SelectMgr_EntityOwner)& theObject);
//! @param[in] theOwner element to change selection state
//! @param[in] theFilter context filter
//! @param[in] theSelScheme selection scheme
//! @param[in] theIsDetected flag of object detection
//! @return result of selection
Standard_EXPORT virtual AIS_SelectStatus Select (const Handle(SelectMgr_EntityOwner)& theOwner,
const Handle(SelectMgr_Filter)& theFilter,
const AIS_SelectionScheme theSelScheme,
const Standard_Boolean theIsDetected);
//! the object is always add int the selection.
//! faster when the number of objects selected is great.
Standard_EXPORT virtual AIS_SelectStatus AddSelect (const Handle(SelectMgr_EntityOwner)& theObject);
//! clears the selection and adds the object in the selection.
virtual void ClearAndSelect (const Handle(SelectMgr_EntityOwner)& theObject)
//! @param[in] theObject element to change selection state
//! @param[in] theFilter context filter
//! @param[in] theIsDetected flag of object detection
virtual void ClearAndSelect (const Handle(SelectMgr_EntityOwner)& theObject,
const Handle(SelectMgr_Filter)& theFilter,
const Standard_Boolean theIsDetected)
{
Clear();
Select (theObject);
Select (theObject, theFilter, AIS_SelectionScheme_Add, theIsDetected);
}
//! checks if the object is in the selection.

View File

@@ -62,6 +62,7 @@
#include <IntTools_SequenceOfCurves.hxx>
#include <IntTools_SequenceOfPntOn2Faces.hxx>
#include <IntTools_Tools.hxx>
#include <NCollection_IncAllocator.hxx>
#include <NCollection_Vector.hxx>
#include <Precision.hxx>
#include <TColStd_ListOfInteger.hxx>
@@ -578,14 +579,12 @@ void BOPAlgo_PaveFiller::MakeBlocks(const Message_ProgressRange& theRange)
Standard_Integer i, nF1, nF2, aNbC, aNbP, j;
Standard_Integer nV1, nV2;
Standard_Real aT1, aT2;
Handle(NCollection_BaseAllocator) aAllocator;
Handle(NCollection_BaseAllocator) aAllocator = new NCollection_IncAllocator;
BOPDS_ListIteratorOfListOfPaveBlock aItLPB;
TopoDS_Edge aES;
Handle(BOPDS_PaveBlock) aPBOut;
//
//-----------------------------------------------------scope f
aAllocator=
NCollection_BaseAllocator::CommonBaseAllocator();
//
TColStd_ListOfInteger aLSE(aAllocator), aLBV(aAllocator);
TColStd_MapOfInteger aMVOnIn(100, aAllocator), aMVCommon(100, aAllocator),

View File

@@ -34,6 +34,8 @@ public:
DEFINE_STANDARD_ALLOC
//! Returns a shape built by the shape construction algorithm.
//! Does not check if the shape is built.
Standard_EXPORT virtual const TopoDS_Shape& Shape() Standard_OVERRIDE;
// Provide access to methods of protected base class BOPAlgo_Options

View File

@@ -295,18 +295,6 @@ TCollection_AsciiString DE_ConfigurationContext::StringVal(const TCollection_Asc
return GetString(theParam, aVal, theScope) ? aVal : theDefValue;
}
//=======================================================================
//function : StringSeqVal
//purpose :
//=======================================================================
TColStd_ListOfAsciiString DE_ConfigurationContext::StringSeqVal(const TCollection_AsciiString& theParam,
const TColStd_ListOfAsciiString& theDefValue,
const TCollection_AsciiString& theScope) const
{
TColStd_ListOfAsciiString aVal;
return GetStringSeq(theParam, aVal, theScope) ? aVal : theDefValue;
}
//=======================================================================
//function : GetReal
//purpose :

View File

@@ -139,15 +139,6 @@ public:
const TCollection_AsciiString& theDefValue,
const TCollection_AsciiString& theScope = "") const;
//! Gets value of parameter as being of specific type
//! @param[in] theParam complex parameter name
//! @param[in] theDefValue value by default if param is not found or has wrong type
//! @param[in] theScope base parameter name
//! @return specific type value
Standard_EXPORT TColStd_ListOfAsciiString StringSeqVal(const TCollection_AsciiString& theParam,
const TColStd_ListOfAsciiString& theDefValue,
const TCollection_AsciiString& theScope = "") const;
//! Gets internal resource map
//! @return map with resource value
Standard_EXPORT const DE_ResourceMap& GetInternalMap() const { return myResource; }

View File

@@ -114,15 +114,6 @@ bool DE_ConfigurationNode::IsExportSupported() const
return false;
}
//=======================================================================
// function : IsExportSupported
// purpose :
//=======================================================================
bool DE_ConfigurationNode::IsStreamSupported() const
{
return false;
}
//=======================================================================
// function : CheckForSupport
// purpose :

View File

@@ -102,10 +102,6 @@ public:
//! @return Standard_True if export is support
Standard_EXPORT virtual bool IsExportSupported() const;
//! Checks the stream for import/export supporting
//! @return Standard_True if stream is support
Standard_EXPORT virtual bool IsStreamSupported() const;
//! Gets CAD format name of associated provider
//! @return provider CAD format
Standard_EXPORT virtual TCollection_AsciiString GetFormat() const = 0;
@@ -132,11 +128,17 @@ public:
//! Gets the provider loading status
//! @return Standard_True if the load is correct
Standard_Boolean IsEnabled() const { return myIsEnabled; }
Standard_Boolean IsEnabled() const
{
return myIsEnabled;
}
//! Sets the provider loading status
//! @param[in] theIsLoaded input load status
void SetEnabled(const Standard_Boolean theIsLoaded) { myIsEnabled = theIsLoaded; }
void SetEnabled(const Standard_Boolean theIsLoaded)
{
myIsEnabled = theIsLoaded;
}
public:

View File

@@ -47,27 +47,7 @@ Standard_Boolean DE_Provider::Read(const TCollection_AsciiString& thePath,
(void)theWS;
(void)theProgress;
Message::SendFail() << "Error: provider " << GetFormat() <<
" " << GetVendor() << " doesn't support read operation";
return Standard_False;
}
//=======================================================================
// function : Read
// purpose :
//=======================================================================
bool DE_Provider::Read(std::istream& theIStream,
const Handle(TDocStd_Document)& theDocument,
const TCollection_AsciiString theName,
Handle(XSControl_WorkSession)& theWS,
const Message_ProgressRange& theProgress)
{
(void)theIStream;
(void)theDocument;
(void)theName;
(void)theWS;
(void)theProgress;
Message::SendFail() << "Error: provider " << GetFormat() <<
" " << GetVendor() << " doesn't support stream read operation";
" " << GetVendor() <<" doesn't support read operation";
return Standard_False;
}
@@ -89,21 +69,35 @@ 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 :
//=======================================================================
bool DE_Provider::Write(std::ostream& theOStream,
const Handle(TDocStd_Document)& theDocument,
Handle(XSControl_WorkSession)& theWS,
const Message_ProgressRange& theProgress)
Standard_Boolean DE_Provider::Write(const TCollection_AsciiString& thePath,
const Handle(TDocStd_Document)& theDocument,
const Message_ProgressRange& theProgress)
{
(void)theOStream;
(void)thePath;
(void)theDocument;
(void)theWS;
(void)theProgress;
Message::SendFail() << "Error: provider " << GetFormat() <<
" " << GetVendor() << " doesn't support stream write operation";
" " << GetVendor() << " doesn't support write operation";
return Standard_False;
}
@@ -125,26 +119,6 @@ Standard_Boolean DE_Provider::Read(const TCollection_AsciiString& thePath,
return Standard_False;
}
//=======================================================================
// function : Read
// purpose :
//=======================================================================
bool DE_Provider::Read(std::istream& theIStream,
TopoDS_Shape& theShape,
const TCollection_AsciiString theName,
Handle(XSControl_WorkSession)& theWS,
const Message_ProgressRange& theProgress)
{
(void)theIStream;
(void)theShape;
(void)theName;
(void)theWS;
(void)theProgress;
Message::SendFail() << "Error: provider " << GetFormat() <<
" " << GetVendor() << " doesn't support stream read operation";
return Standard_False;
}
//=======================================================================
// function : Write
// purpose :
@@ -163,20 +137,34 @@ Standard_Boolean DE_Provider::Write(const TCollection_AsciiString& thePath,
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 :
//=======================================================================
bool DE_Provider::Write(std::ostream& theOStream,
const TopoDS_Shape& theShape,
Handle(XSControl_WorkSession)& theWS,
const Message_ProgressRange& theProgress)
Standard_Boolean DE_Provider::Write(const TCollection_AsciiString& thePath,
const TopoDS_Shape& theShape,
const Message_ProgressRange& theProgress)
{
(void)theOStream;
(void)thePath;
(void)theShape;
(void)theWS;
(void)theProgress;
Message::SendFail() << "Error: provider " << GetFormat() <<
" " << GetVendor() << " doesn't support stream write operation";
" " << GetVendor() << " doesn't support write operation";
return Standard_False;
}

View File

@@ -61,23 +61,10 @@ public:
//! @param[in] theWS current work session
//! @param theProgress[in] progress indicator
//! @return True if Read was successful
Standard_EXPORT virtual bool Read(const TCollection_AsciiString& thePath,
const Handle(TDocStd_Document)& theDocument,
Handle(XSControl_WorkSession)& theWS,
const Message_ProgressRange& theProgress = Message_ProgressRange());
//! Reads a CAD file, according internal configuration
//! @param[in] theIStream stream to import CAD data
//! @param[out] theDocument document to save result
//! @paramp[in] theName name of CAD 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());
Standard_EXPORT virtual Standard_Boolean Read(const TCollection_AsciiString& thePath,
const Handle(TDocStd_Document)& theDocument,
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
@@ -85,21 +72,28 @@ public:
//! @param[in] theWS current work session
//! @param theProgress[in] progress indicator
//! @return True if Write was successful
Standard_EXPORT virtual bool Write(const TCollection_AsciiString& thePath,
const Handle(TDocStd_Document)& theDocument,
Handle(XSControl_WorkSession)& theWS,
const Message_ProgressRange& theProgress = Message_ProgressRange());
Standard_EXPORT virtual Standard_Boolean Write(const TCollection_AsciiString& thePath,
const Handle(TDocStd_Document)& theDocument,
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] theOStream stream to export CAD data
//! @param[in] thePath path to the export CAD file
//! @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(std::ostream& theOStream,
const Handle(TDocStd_Document)& theDocument,
Handle(XSControl_WorkSession)& theWS,
const Message_ProgressRange& theProgress = Message_ProgressRange());
//! @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
@@ -107,23 +101,10 @@ public:
//! @param[in] theWS current work session
//! @param theProgress[in] progress indicator
//! @return True if Read was successful
Standard_EXPORT virtual bool Read(const TCollection_AsciiString& thePath,
TopoDS_Shape& theShape,
Handle(XSControl_WorkSession)& theWS,
const Message_ProgressRange& theProgress = Message_ProgressRange());
//! Reads a CAD file, according internal configuration
//! @param[in] theIStream stream to the CAD file
//! @param[out] theShape shape to save result
//! @paramp[in] theName name of CAD 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());
Standard_EXPORT virtual Standard_Boolean Read(const TCollection_AsciiString& thePath,
TopoDS_Shape& theShape,
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
@@ -131,21 +112,28 @@ public:
//! @param[in] theWS current work session
//! @param theProgress[in] progress indicator
//! @return True if Write was successful
Standard_EXPORT virtual bool Write(const TCollection_AsciiString& thePath,
const TopoDS_Shape& theShape,
Handle(XSControl_WorkSession)& theWS,
const Message_ProgressRange& theProgress = Message_ProgressRange());
Standard_EXPORT virtual Standard_Boolean Write(const TCollection_AsciiString& thePath,
const TopoDS_Shape& theShape,
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] theOStream stream to export CAD data
//! @param[in] thePath path to the export CAD file
//! @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(std::ostream& theOStream,
const TopoDS_Shape& theShape,
Handle(XSControl_WorkSession)& theWS,
const Message_ProgressRange& theProgress = Message_ProgressRange());
//! @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:
@@ -159,11 +147,17 @@ public:
//! Gets internal configuration node
//! @return configuration node object
Handle(DE_ConfigurationNode) GetNode() const { return myNode; }
Handle(DE_ConfigurationNode) GetNode() const
{
return myNode;
}
//! Sets internal configuration node
//! @param[in] theNode configuration node to set
void SetNode(const Handle(DE_ConfigurationNode)& theNode) { myNode = theNode; }
void SetNode(const Handle(DE_ConfigurationNode)& theNode)
{
myNode = theNode;
}
private:

View 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,6 +109,10 @@ 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))
{
@@ -130,6 +134,10 @@ 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))
{
@@ -138,6 +146,46 @@ 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 :
@@ -147,6 +195,10 @@ 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))
{
@@ -164,6 +216,10 @@ 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))
{
@@ -172,6 +228,39 @@ 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 :

View File

@@ -94,6 +94,24 @@ 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
@@ -116,6 +134,24 @@ 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

View File

@@ -51,21 +51,7 @@ bool DEBRepCascade_Provider::Read(const TCollection_AsciiString& thePath,
const Message_ProgressRange& theProgress)
{
(void)theWS;
if (theDocument.IsNull())
{
Message::SendFail() << "Error: DEBRepCascade_Provider : "
<< "Null document";
return false;
}
TopoDS_Shape aShape;
if (!Read(thePath, aShape, theWS, theProgress))
{
return false;
}
Handle(XCAFDoc_ShapeTool) aShTool =
XCAFDoc_DocumentTool::ShapeTool(theDocument->Main());
aShTool->AddShape(aShape);
return true;
return Read(thePath, theDocument, theProgress);
}
//=======================================================================
@@ -78,15 +64,49 @@ bool DEBRepCascade_Provider::Write(const TCollection_AsciiString& thePath,
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())
{
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))
{
return false;
}
Handle(XCAFDoc_ShapeTool) aShTool = XCAFDoc_DocumentTool::ShapeTool(theDocument->Main());
aShTool->AddShape(aShape);
return true;
}
//=======================================================================
// function : Write
// purpose :
//=======================================================================
bool DEBRepCascade_Provider::Write(const TCollection_AsciiString& thePath,
const Handle(TDocStd_Document)& theDocument,
const Message_ProgressRange& theProgress)
{
TopoDS_Shape aShape;
TDF_LabelSequence aLabels;
Handle(XCAFDoc_ShapeTool) aSTool =
XCAFDoc_DocumentTool::ShapeTool(theDocument->Main());
Handle(XCAFDoc_ShapeTool) aSTool = XCAFDoc_DocumentTool::ShapeTool(theDocument->Main());
aSTool->GetFreeShapes(aLabels);
if (aLabels.Length() <= 0)
{
Message::SendFail() << "Error: DEBRepCascade_Provider : "
<< "Incorrect or empty Configuration Node";
Message::SendFail() << "Error in the DEBRepCascade_Provider during writing the file " <<
thePath << "\t: Document contain no shapes";
return false;
}
@@ -106,7 +126,7 @@ bool DEBRepCascade_Provider::Write(const TCollection_AsciiString& thePath,
}
aShape = aComp;
}
return Write(thePath, aShape, theWS, theProgress);
return Write(thePath, aShape, theProgress);
}
//=======================================================================
@@ -119,45 +139,7 @@ bool DEBRepCascade_Provider::Read(const TCollection_AsciiString& thePath,
const Message_ProgressRange& theProgress)
{
(void)theWS;
bool isBinaryFormat = true;
{
// probe file header to recognize format
const Handle(OSD_FileSystem)& aFileSystem =
OSD_FileSystem::DefaultFileSystem();
std::shared_ptr<std::istream> aFile =
aFileSystem->OpenIStream(thePath, std::ios::in | std::ios::binary);
if (aFile.get() == NULL)
{
Message::SendFail() << "Error: DEBRepCascade_Provider : ["
<< thePath << "] : Cannot open the file";
return false;
}
char aStringBuf[255] = {};
aFile->read(aStringBuf, 255);
if (aFile->fail())
{
Message::SendFail() << "Error: DEBRepCascade_Provider : ["
<< thePath << "] : Cannot open the file";
return false;
}
isBinaryFormat = !(::strncmp(aStringBuf, "DBRep_DrawableShape", 19) == 0);
}
Standard_Boolean aReadStatus = Standard_True;
if (isBinaryFormat)
{
aReadStatus = BinTools::Read(theShape, thePath.ToCString(), theProgress);
}
else
{
aReadStatus =
BRepTools::Read(theShape, thePath.ToCString(), BRep_Builder(), theProgress);
}
if (!aReadStatus)
{
Message::SendFail() << "Error: DEBRepCascade_Provider : ["
<< thePath << "] : Cannot read data from the file";
}
return aReadStatus;
return Read(thePath, theShape, theProgress);
}
//=======================================================================
@@ -170,72 +152,127 @@ bool DEBRepCascade_Provider::Write(const TCollection_AsciiString& thePath,
const Message_ProgressRange& theProgress)
{
(void)theWS;
if (GetNode().IsNull() ||
!GetNode()->IsKind(STANDARD_TYPE(DEBRepCascade_ConfigurationNode)))
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;
{
Message::SendFail() << "Error: DEBRepCascade_Provider : "
<< "Incorrect or empty Configuration Node";
return false;
}
Handle(DEBRepCascade_ConfigurationNode) aNode =
Handle(DEBRepCascade_ConfigurationNode)::DownCast(GetNode());
if (aNode->InternalParameters.WriteBinary)
{
if (aNode->InternalParameters.WriteVersionBin >
static_cast<BinTools_FormatVersion>(BinTools_FormatVersion_UPPER) ||
aNode->InternalParameters.WriteVersionBin <
static_cast<BinTools_FormatVersion>(BinTools_FormatVersion_LOWER))
// probe file header to recognize format
const Handle(OSD_FileSystem)& aFileSystem = OSD_FileSystem::DefaultFileSystem();
std::shared_ptr<std::istream> aFile = aFileSystem->OpenIStream(thePath, std::ios::in | std::ios::binary);
if (aFile.get() == NULL)
{
Message::SendFail() << "Error: DEBRepCascade_Provider : ["
<< thePath << "] : Unknown format version";
return false;
}
if (aNode->InternalParameters.WriteNormals &&
aNode->InternalParameters.WriteVersionBin < BinTools_FormatVersion_VERSION_4)
{
Message::SendFail() << "Error: DEBRepCascade_Provider : ["
<< thePath << "] : Vertex normals require binary format version 4 or later";
Message::SendFail() << "Error in the DEBRepCascade_Provider during reading the file " <<
thePath << "\t: Cannot read the file";
return false;
}
if (!BinTools::Write(theShape, thePath.ToCString(),
aNode->InternalParameters.WriteTriangles,
aNode->InternalParameters.WriteNormals,
aNode->InternalParameters.WriteVersionBin, theProgress))
char aStringBuf[255] = {};
aFile->read(aStringBuf, 255);
if (aFile->fail())
{
Message::SendFail() << "Error: DEBRepCascade_Provider : ["
<< thePath << "] : Cannot write the file";
Message::SendFail() << "Error in the DEBRepCascade_Provider during reading the file " <<
thePath << "\t: Cannot read the file";
return false;
}
isBinaryFormat = !(::strncmp(aStringBuf, "DBRep_DrawableShape", 19) == 0);
}
if (isBinaryFormat)
{
if (!BinTools::Read(theShape, thePath.ToCString(), theProgress))
{
Message::SendFail() << "Error in the DEBRepCascade_Provider during reading the file " <<
thePath << "\t: Cannot read from the file";
return false;
}
}
else
{
if (aNode->InternalParameters.WriteVersionAscii >
static_cast<TopTools_FormatVersion>(TopTools_FormatVersion_UPPER) ||
aNode->InternalParameters.WriteVersionAscii <
static_cast<TopTools_FormatVersion>(TopTools_FormatVersion_LOWER))
if (!BRepTools::Read(theShape, thePath.ToCString(), BRep_Builder(), theProgress))
{
Message::SendFail() << "Error: DEBRepCascade_Provider : ["
<< thePath << "] : Unknown format version";
Message::SendFail() << "Error in the DEBRepCascade_Provider during reading the file " <<
thePath << "\t: Cannot read from the file";
return false;
}
}
return true;
}
//=======================================================================
// function : Write
// purpose :
//=======================================================================
bool DEBRepCascade_Provider::Write(const TCollection_AsciiString& thePath,
const TopoDS_Shape& theShape,
const Message_ProgressRange& theProgress)
{
if (GetNode().IsNull() || !GetNode()->IsKind(STANDARD_TYPE(DEBRepCascade_ConfigurationNode)))
{
Message::SendFail() << "Error in the DEBRepCascade_Provider during writing the file " <<
thePath << "\t: Incorrect or empty Configuration Node";
return false;
}
Handle(DEBRepCascade_ConfigurationNode) aNode = Handle(DEBRepCascade_ConfigurationNode)::DownCast(GetNode());
if (aNode->InternalParameters.WriteBinary)
{
if (aNode->InternalParameters.WriteVersionBin > static_cast<BinTools_FormatVersion>(BinTools_FormatVersion_UPPER) ||
aNode->InternalParameters.WriteVersionBin < static_cast<BinTools_FormatVersion>(BinTools_FormatVersion_LOWER))
{
Message::SendFail() << "Error in the DEBRepCascade_Provider during writing the file " <<
thePath << "\t: Unknown format version";
return false;
}
if (aNode->InternalParameters.WriteNormals &&
aNode->InternalParameters.WriteVersionBin < BinTools_FormatVersion_VERSION_4)
{
Message::SendFail() << "Error in the DEBRepCascade_Provider during writing the file " <<
thePath << "\t: Vertex normals require binary format version 4 or later";
return false;
}
if (!BinTools::Write(theShape, thePath.ToCString(), aNode->InternalParameters.WriteTriangles,
aNode->InternalParameters.WriteNormals, aNode->InternalParameters.WriteVersionBin, theProgress))
{
Message::SendFail() << "Error in the DEBRepCascade_Provider during writing the file " <<
thePath << "\t: Cannot write the file";
return false;
}
}
else
{
if (aNode->InternalParameters.WriteVersionAscii > static_cast<TopTools_FormatVersion>(TopTools_FormatVersion_UPPER) ||
aNode->InternalParameters.WriteVersionAscii < static_cast<TopTools_FormatVersion>(TopTools_FormatVersion_LOWER))
{
Message::SendFail() << "Error in the DEBRepCascade_Provider during writing the file " <<
thePath << "\t: Unknown format version";
return false;
}
if (aNode->InternalParameters.WriteNormals &&
aNode->InternalParameters.WriteVersionAscii < TopTools_FormatVersion_VERSION_3)
{
Message::SendFail() << "Error: DEBRepCascade_Provider : ["
<< thePath << "] : Vertex normals require ascii format version 3 or later";
Message::SendFail() << "Error in the DEBRepCascade_Provider during writing the file " <<
thePath << "\t: Error: vertex normals require ascii format version 3 or later";
return false;
}
if (!BRepTools::Write(theShape, thePath.ToCString(),
aNode->InternalParameters.WriteTriangles,
aNode->InternalParameters.WriteNormals,
aNode->InternalParameters.WriteVersionAscii, theProgress))
if (!BRepTools::Write(theShape, thePath.ToCString(), aNode->InternalParameters.WriteTriangles,
aNode->InternalParameters.WriteNormals, aNode->InternalParameters.WriteVersionAscii, theProgress))
{
Message::SendFail() << "Error: DEBRepCascade_Provider : ["
<< thePath << "] : Cannot write the file";
Message::SendFail() << "Error in the DEBRepCascade_Provider during writing the file " <<
thePath << "\t: Cannot write the file";
return false;
}
}
return true;
}

View File

@@ -64,6 +64,24 @@ 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
@@ -86,6 +104,24 @@ 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

View File

@@ -59,21 +59,43 @@ 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: DEXCAFCascade_Provider : "
<< "Null document";
Message::SendFail() << "Error in the DEXCAFCascade_Provider during reading the file " <<
thePath << "\t: theDocument shouldn't be null";
return false;
}
if (GetNode().IsNull() ||
!GetNode()->IsKind(STANDARD_TYPE(DEXCAFCascade_ConfigurationNode)))
if (GetNode().IsNull() || !GetNode()->IsKind(STANDARD_TYPE(DEXCAFCascade_ConfigurationNode)))
{
Message::SendFail() << "Error: DEXCAFCascade_Provider : "
<< "Incorrect or empty Configuration Node";
Message::SendFail() << "Error in the DEXCAFCascade_Provider during reading the file " << thePath
<< "\t: Incorrect or empty Configuration Node";
return false;
}
Handle(DEXCAFCascade_ConfigurationNode) aNode =
Handle(DEXCAFCascade_ConfigurationNode)::DownCast(GetNode());
Handle(DEXCAFCascade_ConfigurationNode) aNode = Handle(DEXCAFCascade_ConfigurationNode)::DownCast(GetNode());
Handle(TDocStd_Document) aDocument;
Handle(TDocStd_Application) anApp = new TDocStd_Application();
BinDrivers::DefineFormat(anApp);
@@ -86,15 +108,12 @@ bool DEXCAFCascade_Provider::Read(const TCollection_AsciiString& thePath,
XmlLDrivers::DefineFormat(anApp);
XmlTObjDrivers::DefineFormat(anApp);
XmlXCAFDrivers::DefineFormat(anApp);
Handle(PCDM_ReaderFilter) aFilter =
new PCDM_ReaderFilter(aNode->InternalParameters.ReadAppendMode);
for (TColStd_ListOfAsciiString::Iterator anIt(aNode->InternalParameters.ReadSkipValues);
anIt.More(); anIt.Next())
Handle(PCDM_ReaderFilter) aFilter = new PCDM_ReaderFilter(aNode->InternalParameters.ReadAppendMode);
for (TColStd_ListOfAsciiString::Iterator anIt(aNode->InternalParameters.ReadSkipValues); anIt.More(); anIt.Next())
{
aFilter->AddSkipped(anIt.Value());
}
for (TColStd_ListOfAsciiString::Iterator anIt(aNode->InternalParameters.ReadValues);
anIt.More(); anIt.Next())
for (TColStd_ListOfAsciiString::Iterator anIt(aNode->InternalParameters.ReadValues); anIt.More(); anIt.Next())
{
if (anIt.Value().StartsWith("0"))
{
@@ -108,8 +127,8 @@ bool DEXCAFCascade_Provider::Read(const TCollection_AsciiString& thePath,
if (anApp->Open(thePath, aDocument, aFilter, theProgress) != PCDM_RS_OK)
{
Message::SendFail() << "Error: DEXCAFCascade_Provider : [" <<
thePath << "] : Cannot open XDE document";
Message::SendFail() << "Error in the DEXCAFCascade_Provider during reading the file : " << thePath
<< "\t: Cannot open XDE document";
return false;
}
theDocument->SetData(aDocument->GetData());
@@ -122,10 +141,8 @@ 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;
@@ -135,50 +152,50 @@ bool DEXCAFCascade_Provider::Write(const TCollection_AsciiString& thePath,
}
else if (!theDocument->IsSaved())
{
Message::SendFail() << "Error: DEXCAFCascade_Provider : [" <<
thePath << "] : Storage error : Document has never been saved";
Message::SendFail() << "Storage error in the DEXCAFCascade_Provider during writing the file " <<
thePath << "\t: Storage error : this document has never been saved";
return false;
}
else
{
aStatus = anApp->Save(theDocument, theProgress);
}
switch (aStatus)
{
case PCDM_SS_OK:
return true;
case PCDM_SS_DriverFailure:
Message::SendFail() << "Error: DEXCAFCascade_Provider : [" <<
thePath << "] : Storage error : driver failure";
Message::SendFail() << "Error in the DEXCAFCascade_Provider during writing the file : " << thePath
<< "\t: Storage error : driver failure";
break;
case PCDM_SS_WriteFailure:
Message::SendFail() << "Error: DEXCAFCascade_Provider : [" <<
thePath << "] : Storage error : write failure";
Message::SendFail() << "Error in the DEXCAFCascade_Provider during the writing the file : " << thePath
<< "\t: Storage error : write failure";
break;
case PCDM_SS_Failure:
Message::SendFail() << "Error: DEXCAFCascade_Provider : [" <<
thePath << "] : Storage error : general failure";
Message::SendFail() << "Error in the DEXCAFCascade_Provider during writing the file : " << thePath
<< "\t: Storage error : general failure";
break;
case PCDM_SS_Doc_IsNull:
Message::SendFail() << "Error: DEXCAFCascade_Provider : [" <<
thePath << "] : Storage error : document is NULL";
Message::SendFail() << "Error in the DEXCAFCascade_Provider during writing the file : " << thePath
<< "\t: Storage error :: document is NULL";
break;
case PCDM_SS_No_Obj:
Message::SendFail() << "Error: DEXCAFCascade_Provider : [" <<
thePath << "] : Storage error : no object";
Message::SendFail() << "Error in the DEXCAFCascade_Provider during writing the file : " << thePath
<< "\t: Storage error : no object";
break;
case PCDM_SS_Info_Section_Error:
Message::SendFail() << "Error: DEXCAFCascade_Provider : [" <<
thePath << "] : Storage error : section error";
Message::SendFail() << "Error in the DEXCAFCascade_Provider during writing the file : " << thePath
<< "\t: Storage error : section error";
break;
case PCDM_SS_UserBreak:
Message::SendFail() << "Error: DEXCAFCascade_Provider : [" <<
thePath << "] : Storage error : user break";
Message::SendFail() << "Error in the DEXCAFCascade_Provider during writing the file : " << thePath
<< "\t: Storage error : user break";
break;
case PCDM_SS_UnrecognizedFormat:
Message::SendFail() << "Error: DEXCAFCascade_Provider : [" <<
thePath << "] : Storage error : unrecognized document storage format : "
<< theDocument->StorageFormat();
Message::SendFail() << "Error in the DEXCAFCascade_Provider during writing the file : " << thePath
<< "\t: Storage error : unrecognized document storage format : " << theDocument->StorageFormat();
break;
}
return false;
@@ -194,25 +211,48 @@ bool DEXCAFCascade_Provider::Read(const TCollection_AsciiString& thePath,
const Message_ProgressRange& theProgress)
{
(void)theWS;
if (GetNode().IsNull() ||
!GetNode()->IsKind(STANDARD_TYPE(DEXCAFCascade_ConfigurationNode)))
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: DEXCAFCascade_Provider : "
<< "Incorrect or empty Configuration Node";
Message::SendFail() << "Error in the DEXCAFCascade_Provider during reading the file " << thePath
<< "\t: Incorrect or empty Configuration Node";
return false;
}
Handle(TDocStd_Document) aDocument;
Handle(TDocStd_Application) anApp = new TDocStd_Application();
BinXCAFDrivers::DefineFormat(anApp);
anApp->NewDocument("BinXCAF", aDocument);
Read(thePath, aDocument, theWS, theProgress);
Read(thePath, aDocument, theProgress);
TDF_LabelSequence aLabels;
Handle(XCAFDoc_ShapeTool) aSTool = XCAFDoc_DocumentTool::ShapeTool(aDocument->Main());
aSTool->GetFreeShapes(aLabels);
if (aLabels.Length() <= 0)
{
Message::SendFail() << "Error: DEXCAFCascade_Provider : [" <<
thePath << "] : Storage error : Document contain no shapes";
Message::SendFail() << "Error in the DEXCAFCascade_Provider during reading the file : " << thePath
<< "\t: Document contain no shapes";
return false;
}
@@ -241,14 +281,12 @@ 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, theWS, theProgress);
return Write(thePath, aDoc, theProgress);
}
//=======================================================================

View File

@@ -64,6 +64,24 @@ 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
@@ -86,6 +104,24 @@ 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

View File

@@ -13,217 +13,19 @@
#include <IGESCAFControl_Provider.hxx>
#include <BinXCAFDrivers.hxx>
#include <IGESCAFControl_ConfigurationNode.hxx>
#include <IGESCAFControl_Reader.hxx>
#include <IGESCAFControl_Writer.hxx>
#include <IGESControl_Controller.hxx>
#include <IGESData.hxx>
#include <IGESData_IGESModel.hxx>
#include <Interface_Static.hxx>
#include <Message.hxx>
#include <UnitsMethods.hxx>
#include <XCAFDoc_DocumentTool.hxx>
#include <XSControl_WorkSession.hxx>
#include <UnitsMethods.hxx>
IMPLEMENT_STANDARD_RTTIEXT(IGESCAFControl_Provider, DE_Provider)
namespace
{
//! Special class to handle static parameters.
//! Initialize all parameters in the begin of life
//! and reset changed parameters in the end of life
class IGESCAFControl_ParameterController
{
public:
IGESCAFControl_ParameterController(const Handle(IGESCAFControl_ConfigurationNode)& theNode,
const Standard_Boolean theUpdateStatic);
~IGESCAFControl_ParameterController();
protected:
void setStatic(const IGESCAFControl_ConfigurationNode::IGESCAFControl_InternalSection theParameter);
private:
bool myToUpdateStaticParameters; //!< 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 global parameters
};
//=======================================================================
// function : IGESCAFControl_ParameterController
// purpose :
//=======================================================================
IGESCAFControl_ParameterController::IGESCAFControl_ParameterController(const Handle(IGESCAFControl_ConfigurationNode)& theNode,
const Standard_Boolean theUpdateStatic)
: myToUpdateStaticParameters(theUpdateStatic)
{
IGESControl_Controller::Init();
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;
myOldGlobalValues.LengthUnit = 0.001 *
UnitsMethods::GetLengthFactorValue(Interface_Static::IVal("xstep.cascade.unit"));
// Set new values
TCollection_AsciiString aStrUnit(
UnitsMethods::DumpLengthUnit(theNode->GlobalParameters.LengthUnit));
aStrUnit.UpperCase();
Interface_Static::SetCVal("xstep.cascade.unit", aStrUnit.ToCString());
UnitsMethods::SetCasCadeLengthUnit(theNode->GlobalParameters.LengthUnit);
setStatic(theNode->InternalParameters);
}
//=======================================================================
// function : ~IGESCAFControl_ParameterController
// purpose :
//=======================================================================
IGESCAFControl_ParameterController::~IGESCAFControl_ParameterController()
{
if (!myToUpdateStaticParameters)
{
return;
}
// Set new values
TCollection_AsciiString aStrUnit(
UnitsMethods::DumpLengthUnit(myOldGlobalValues.LengthUnit,
UnitsMethods_LengthUnit_Meter));
aStrUnit.UpperCase();
Interface_Static::SetCVal("xstep.cascade.unit", aStrUnit.ToCString());
setStatic(myOldValues);
}
//=======================================================================
// function : setStatic
// purpose :
//=======================================================================
void IGESCAFControl_ParameterController::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);
}
}
//=======================================================================
// function : IGESCAFControl_Provider
// purpose :
@@ -240,23 +42,99 @@ IGESCAFControl_Provider::IGESCAFControl_Provider(const Handle(DE_ConfigurationNo
{}
//=======================================================================
// function : STEPCAFControl_Provider
// function : initStatic
// purpose :
//=======================================================================
void IGESCAFControl_Provider::personizeWS(Handle(XSControl_WorkSession)& theWS)
void IGESCAFControl_Provider::initStatic(const Handle(DE_ConfigurationNode)& theNode)
{
if (theWS.IsNull())
{
Message::SendWarning() << "Warning: IGESCAFControl_Provider :"
<< " Null work session, use internal temporary session";
theWS = new XSControl_WorkSession();
}
Handle(IGESControl_Controller) aCntrl =
Handle(IGESControl_Controller)::DownCast(theWS->NormAdaptor());
if (aCntrl.IsNull())
{
theWS->SelectNorm("IGES");
}
Handle(IGESCAFControl_ConfigurationNode) aNode = Handle(IGESCAFControl_ConfigurationNode)::DownCast(theNode);
IGESData::Init();
// 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");
// Set new values
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);
}
//=======================================================================
// function : setStatic
// purpose :
//=======================================================================
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);
}
//=======================================================================
// function : resetStatic
// purpose :
//=======================================================================
void IGESCAFControl_Provider::resetStatic()
{
Interface_Static::SetIVal("xstep.cascade.unit", myOldLengthUnit);
UnitsMethods::SetCasCadeLengthUnit(myOldLengthUnit);
setStatic(myOldValues);
}
//=======================================================================
@@ -270,70 +148,50 @@ bool IGESCAFControl_Provider::Read(const TCollection_AsciiString& thePath,
{
if (theDocument.IsNull())
{
Message::SendFail() << "Error: IGESCAFControl_Provider : "
<< "Null document";
Message::SendFail() << "Error in the IGESCAFControl_Provider during reading the file " <<
thePath << "\t: theDocument shouldn't be null";
return false;
}
if (!GetNode()->IsKind(STANDARD_TYPE(IGESCAFControl_ConfigurationNode)))
{
Message::SendFail() << "Error: IGESCAFControl_Provider : "
<< "Incorrect or empty Configuration Node";
Message::SendFail() << "Error in the IGESCAFControl_Provider during reading the file " <<
thePath << "\t: Incorrect or empty Configuration Node";
return false;
}
Handle(IGESCAFControl_ConfigurationNode) aNode =
Handle(IGESCAFControl_ConfigurationNode)::DownCast(GetNode());
IGESCAFControl_ParameterController aParamController(aNode, myToUpdateStaticParameters);
personizeWS(theWS);
XCAFDoc_DocumentTool::SetLengthUnit(theDocument,
aNode->GlobalParameters.LengthUnit,
UnitsMethods_LengthUnit_Millimeter);
const Standard_Boolean toUseLoaded = thePath == ".";
TCollection_AsciiString aFile;
if (toUseLoaded)
Handle(IGESCAFControl_ConfigurationNode) aNode = Handle(IGESCAFControl_ConfigurationNode)::DownCast(GetNode());
initStatic(aNode);
XCAFDoc_DocumentTool::SetLengthUnit(theDocument, aNode->GlobalParameters.LengthUnit, UnitsMethods_LengthUnit_Millimeter);
IGESCAFControl_Reader aReader;
if (!theWS.IsNull())
{
aFile = theWS->LoadedFile();
Message::SendInfo() << "Model taken from the IGES session : "
<< aFile;
aReader.SetWS(theWS);
}
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);
Handle(IGESData_IGESModel) aModel = aReader.IGESModel();
if (aModel.IsNull())
{
aModel = Handle(IGESData_IGESModel)::DownCast(theWS->NewModel());
}
aModel->ClearHeader();
aModel->ChangeGlobalSection().SetCascadeUnit(aNode->GlobalParameters.LengthUnit);
IFSelect_ReturnStatus aReadStat = IFSelect_RetVoid;
if (!toUseLoaded)
{
aReadStat = aReader.ReadFile(thePath.ToCString());
}
else if (theWS->NbStartingEntities() > 0)
{
aReadStat = IFSelect_RetDone;
}
aReadStat = aReader.ReadFile(thePath.ToCString());
if (aReadStat != IFSelect_RetDone)
{
Message::SendFail() << "Error: IGESCAFControl_Provider : ["
<< aFile << "] : abandon, no model loaded";
Message::SendFail() << "Error in the IGESCAFControl_Provider during reading the file " <<
thePath << "\t: abandon, no model loaded";
resetStatic();
return false;
}
if (!aReader.Transfer(theDocument, theProgress))
{
Message::SendFail() << "Error: IGESCAFControl_Provider : [" <<
aFile << "] : Cannot read any relevant data from the IGES file";
Message::SendFail() << "Error in the IGESCAFControl_Provider during reading the file " <<
thePath << "\t: Cannot read any relevant data from the IGES file";
resetStatic();
return false;
}
resetStatic();
return true;
}
@@ -348,35 +206,18 @@ bool IGESCAFControl_Provider::Write(const TCollection_AsciiString& thePath,
{
if (!GetNode()->IsKind(STANDARD_TYPE(IGESCAFControl_ConfigurationNode)))
{
Message::SendFail() << "Error: IGESCAFControl_Provider : "
<< "Incorrect or empty Configuration Node";
Message::SendFail() << "Error in the IGESCAFControl_Provider during reading the file " <<
thePath << "\t: Incorrect or empty Configuration Node";
return false;
}
Handle(IGESCAFControl_ConfigurationNode) aNode =
Handle(IGESCAFControl_ConfigurationNode)::DownCast(GetNode());
IGESCAFControl_ParameterController aParamController(aNode, myToUpdateStaticParameters);
personizeWS(theWS);
TCollection_AsciiString aUnit(
UnitsMethods::DumpLengthUnit(aNode->InternalParameters.WriteUnit));
aUnit.UpperCase();
Handle(IGESCAFControl_ConfigurationNode) aNode = Handle(IGESCAFControl_ConfigurationNode)::DownCast(GetNode());
initStatic(aNode);
IGESCAFControl_Writer aWriter(theWS, Standard_True);
if (aNode->InternalParameters.WriteUnit > UnitsMethods_LengthUnit_Undefined &&
aNode->InternalParameters.WriteUnit <= UnitsMethods_LengthUnit_Microinch)
XCAFDoc_DocumentTool::SetLengthUnit(theDocument, aNode->InternalParameters.WriteUnit, UnitsMethods_LengthUnit_Millimeter);
IGESCAFControl_Writer aWriter;
if (!theWS.IsNull())
{
Handle(IGESData_IGESModel) aModel = aWriter.Model();
IGESData_GlobalSection aGSesction = aModel->GlobalSection();
Handle(TCollection_HAsciiString) aName = new TCollection_HAsciiString(
IGESData_BasicEditor::UnitFlagName(aNode->InternalParameters.WriteUnit));
if (aGSesction.UnitFlag() == 3)
{
aGSesction.SetUnitName(aName);
}
else if (aGSesction.UnitFlag() > 0)
{
aGSesction.SetUnitFlag(aNode->InternalParameters.WriteUnit);
}
aModel->SetGlobalSection(aGSesction);
aWriter = IGESCAFControl_Writer(theWS);
}
aWriter.SetColorMode(aNode->InternalParameters.WriteColor);
aWriter.SetNameMode(aNode->InternalParameters.WriteName);
@@ -384,25 +225,46 @@ bool IGESCAFControl_Provider::Write(const TCollection_AsciiString& thePath,
if (!aWriter.Transfer(theDocument, theProgress))
{
Message::SendFail() << "Error: IGESCAFControl_Provider : "
<< "The document cannot be translated or gives no result";
Message::SendFail() << "Error in the IGESCAFControl_Provider during reading the file " <<
thePath << "\t: The document cannot be translated or gives no result";
resetStatic();
return false;
}
if (thePath == ".")
{
Message::SendInfo() << "Document has been translated into the session";
return true;
}
if (!aWriter.Write(thePath.ToCString()))
{
Message::SendFail() << "Error: IGESCAFControl_Provider : [" <<
thePath << "] : Write failed";
Message::SendFail() << "Error in the IGESCAFControl_Provider during reading the file " <<
thePath << "\t: 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;
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;
return Write(thePath, theDocument, aWS, theProgress);
}
//=======================================================================
// function : Read
// purpose :
@@ -415,39 +277,36 @@ bool IGESCAFControl_Provider::Read(const TCollection_AsciiString& thePath,
(void)theProgress;
if (!GetNode()->IsKind(STANDARD_TYPE(IGESCAFControl_ConfigurationNode)))
{
Message::SendFail() << "Error: IGESCAFControl_Provider : "
<< "Incorrect or empty Configuration Node";
Message::SendFail() << "Error in the IGESCAFControl_Provider during reading the file " <<
thePath << "\t: Incorrect or empty Configuration Node";
return false;
}
Handle(IGESCAFControl_ConfigurationNode) aNode =
Handle(IGESCAFControl_ConfigurationNode)::DownCast(GetNode());
IGESCAFControl_ParameterController aParamController(aNode, myToUpdateStaticParameters);
personizeWS(theWS);
Handle(IGESCAFControl_ConfigurationNode) aNode = Handle(IGESCAFControl_ConfigurationNode)::DownCast(GetNode());
initStatic(aNode);
IGESControl_Reader aReader;
aReader.SetWS(theWS);
Handle(IGESData_IGESModel) aModel = aReader.IGESModel();
if (aModel.IsNull())
if (!theWS.IsNull())
{
aModel = Handle(IGESData_IGESModel)::DownCast(theWS->NewModel());
aReader.SetWS(theWS);
}
aModel->ClearHeader();
aModel->ChangeGlobalSection().SetCascadeUnit(aNode->GlobalParameters.LengthUnit);
aReader.SetReadVisible(aNode->InternalParameters.ReadOnlyVisible);
IFSelect_ReturnStatus aReadStat = IFSelect_RetVoid;
aReadStat = aReader.ReadFile(thePath.ToCString());
if (aReadStat != IFSelect_RetDone)
{
Message::SendFail() << "Error: IGESCAFControl_Provider : [" <<
thePath << "] : Could not read file, no model loaded";
Message::SendFail() << "Error in the IGESCAFControl_Provider during reading the file " <<
thePath << "\t: Could not read file, no model loaded";
resetStatic();
return false;
}
if (aReader.TransferRoots() <= 0)
{
Message::SendFail() << "Error: IGESCAFControl_Provider : [" <<
thePath << "] : Cannot read any relevant data from the IGES file";
Message::SendFail() << "Error in the IGESCAFControl_Provider during reading the file " <<
thePath << "\t: Cannot read any relevant data from the IGES file";
resetStatic();
return false;
}
theShape = aReader.OneShape();
resetStatic();
return true;
}
@@ -464,36 +323,58 @@ bool IGESCAFControl_Provider::Write(const TCollection_AsciiString& thePath,
(void)theProgress;
if (!GetNode()->IsKind(STANDARD_TYPE(IGESCAFControl_ConfigurationNode)))
{
Message::SendFail() << "Error: IGESCAFControl_Provider : "
<< "Incorrect or empty Configuration Node";
Message::SendFail() << "Error in the IGESCAFControl_Provider during reading the file " <<
thePath << "\t: Incorrect or empty Configuration Node";
return false;
}
Handle(IGESCAFControl_ConfigurationNode) aNode =
Handle(IGESCAFControl_ConfigurationNode)::DownCast(GetNode());
IGESCAFControl_ParameterController aParamController(aNode, myToUpdateStaticParameters);
personizeWS(theWS);
TCollection_AsciiString aUnit(
UnitsMethods::DumpLengthUnit(aNode->InternalParameters.WriteUnit));
Handle(IGESCAFControl_ConfigurationNode) aNode = Handle(IGESCAFControl_ConfigurationNode)::DownCast(GetNode());
initStatic(aNode);
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() << "Error: IGESCAFControl_Provider : "
<< "Can't translate shape to IGES model";
Message::SendFail() << "IGESCAFControl_Provider: Shape not written";
resetStatic();
return false;
}
if (!(aWriter.Write(thePath.ToCString())))
{
Message::SendFail() << "Error: IGESCAFControl_Provider : "
<< "Can't write IGES file" << thePath;
Message::SendFail() << "IGESCAFControl_Provider: Error on writing file " << thePath;
resetStatic();
return false;
}
resetStatic();
return true;
}
//=======================================================================
// function : Read
// purpose :
//=======================================================================
bool IGESCAFControl_Provider::Read(const TCollection_AsciiString& thePath,
TopoDS_Shape& theShape,
const Message_ProgressRange& theProgress)
{
Handle(XSControl_WorkSession) aWS;
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;
return Write(thePath, theShape, aWS, theProgress);
}
//=======================================================================
// function : GetFormat
// purpose :

View File

@@ -15,7 +15,6 @@
#define _IGESCAFControl_Provider_HeaderFile
#include <DE_Provider.hxx>
#include <DE_ConfigurationNode.hxx>
#include <IGESCAFControl_ConfigurationNode.hxx>
//! The class to transfer IGES files.
@@ -66,6 +65,23 @@ 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
@@ -89,6 +105,24 @@ 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
@@ -99,24 +133,19 @@ 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.
//! Creates new temporary session if current session is null
//! @param[in] theWS current work session
void personizeWS(Handle(XSControl_WorkSession)& theWS);
//! Initialize static variables
void initStatic(const Handle(DE_ConfigurationNode)& theNode);
private:
//! Initialize static variables
void setStatic(const IGESCAFControl_ConfigurationNode::IGESCAFControl_InternalSection theParameter);
bool myToUpdateStaticParameters = true; //!< Flag to updating static parameters
//! Reset used interface static variables
void resetStatic();
IGESCAFControl_ConfigurationNode::IGESCAFControl_InternalSection myOldValues;
int myOldLengthUnit = 1;
};

View File

@@ -322,7 +322,8 @@ Standard_Boolean IGESCAFControl_Reader::Transfer (const Handle(TDocStd_Document)
//Checks that current entity is a subfigure
Handle(IGESBasic_SubfigureDef) aSubfigure = Handle(IGESBasic_SubfigureDef)::DownCast (ent);
if (GetNameMode() && !aSubfigure.IsNull() && STool->Search (S, L, Standard_True, Standard_True))
if (GetNameMode() && !aSubfigure.IsNull() && !aSubfigure->Name().IsNull() &&
STool->Search(S, L, Standard_True, Standard_True))
{
//In this case we attach subfigure name to the label, instead of default "COMPOUND"
Handle(TCollection_HAsciiString) aName = aSubfigure->Name();

View File

@@ -23,6 +23,7 @@
#include <Interface_Macros.hxx>
#include <Interface_Static.hxx>
#include <Message_Msg.hxx>
#include <ShapeBuild_ReShape.hxx>
#include <Standard_Transient.hxx>
#include <Standard_Type.hxx>
#include <TCollection_HAsciiString.hxx>
@@ -47,6 +48,7 @@ void IGESData_VerifyDate
IGESData_IGESModel::IGESData_IGESModel ()
{
thestart = new TColStd_HSequenceOfHAsciiString();
myReShape = new ShapeBuild_ReShape();
// thecheckstx = new Interface_Check;
// thechecksem = new Interface_Check;
}
@@ -62,6 +64,7 @@ void IGESData_IGESModel::ClearHeader ()
IGESData_GlobalSection newheader; // Un peu brutal, certes
theheader = newheader;
thestart = new TColStd_HSequenceOfHAsciiString();
myReShape = new ShapeBuild_ReShape();
}

View File

@@ -22,10 +22,10 @@
class IGESData_IGESEntity;
class Interface_Check;
class ShapeBuild_ReShape;
class Standard_Transient;
class TCollection_HAsciiString;
class IGESData_IGESModel;
DEFINE_STANDARD_HANDLE(IGESData_IGESModel, Interface_InterfaceModel)
@@ -151,8 +151,11 @@ public:
//! i.e. a string "Dnn" with nn = directory entry number (2*N-1)
Standard_EXPORT Handle(TCollection_HAsciiString) StringLabel (const Handle(Standard_Transient)& ent) const Standard_OVERRIDE;
//! Gets ReShape used to store a model's shapes changes
const Handle(ShapeBuild_ReShape)& ReShape() const { return myReShape; }
//! Sets ReShape used to store a history of changes of the model's shapes
void SetReShape(const Handle(ShapeBuild_ReShape)& theReShape) { myReShape = theReShape; }
DEFINE_STANDARD_RTTIEXT(IGESData_IGESModel,Interface_InterfaceModel)
@@ -166,7 +169,7 @@ private:
Handle(TColStd_HSequenceOfHAsciiString) thestart;
IGESData_GlobalSection theheader;
Handle(ShapeBuild_ReShape) myReShape;
};

View File

@@ -633,34 +633,55 @@ Standard_Boolean IGESData_ParamReader::ReadXYZ
//=======================================================================
//function : ReadText
//purpose :
//purpose :
//=======================================================================
Standard_Boolean IGESData_ParamReader::ReadText
(const IGESData_ParamCursor& PC, const Message_Msg& amsg,
Handle(TCollection_HAsciiString)& val)
Standard_Boolean IGESData_ParamReader::ReadText(const IGESData_ParamCursor& thePC,
const Message_Msg& theMsg,
Handle(TCollection_HAsciiString)& theVal)
{
if (!PrepareRead(PC,Standard_False)) return Standard_False;
const Interface_FileParameter& FP = theparams->Value(theindex+thebase);
if (FP.ParamType() != Interface_ParamText) {
if (FP.ParamType() == Interface_ParamVoid) {
val = new TCollection_HAsciiString("");
if (!PrepareRead(thePC, Standard_False))
{
return Standard_False;
}
const Interface_FileParameter& aFP = theparams->Value(theindex + thebase);
if (aFP.ParamType() != Interface_ParamText)
{
theVal = new TCollection_HAsciiString("");
if (aFP.ParamType() == Interface_ParamVoid)
{
return Standard_True;
}
SendFail (amsg);
SendFail(theMsg);
return Standard_False;
}
Handle(TCollection_HAsciiString) tval = new TCollection_HAsciiString (FP.CValue());
Standard_Integer lnt = tval->Length();
Standard_Integer lnh = tval->Location(1,'H',1,lnt);
if (lnh <= 1 || lnh >= lnt) {
SendFail (amsg);
const Handle(TCollection_HAsciiString) aBaseValue = new TCollection_HAsciiString(aFP.CValue());
const Standard_Integer aBaseLength = aBaseValue->Length();
const Standard_Integer aSymbolLocation = aBaseValue->Location(1, 'H', 1, aBaseLength);
if (aSymbolLocation <= 1 || aSymbolLocation > aBaseLength)
{
theVal = new TCollection_HAsciiString("");
SendFail(theMsg);
return Standard_False;
} else {
Standard_Integer hol = atoi (tval->SubString(1,lnh-1)->ToCString());
if (hol != (lnt-lnh)) SendWarning (amsg);
}
val = new TCollection_HAsciiString(tval->SubString(lnh+1,lnt)->ToCString());
const TCollection_AsciiString aSpecialSubString = aBaseValue->String().SubString(1, aSymbolLocation - 1);
if (!aSpecialSubString.IsIntegerValue())
{
theVal = new TCollection_HAsciiString("");
SendFail(theMsg);
return Standard_False;
}
Standard_Integer aResLength = aSpecialSubString.IntegerValue();
if (aResLength != (aBaseLength - aSymbolLocation))
{
SendWarning(theMsg);
aResLength = aBaseLength - aSymbolLocation;
}
TCollection_AsciiString aResString;
if (aResLength > 0)
{
aResString = aBaseValue->String().SubString(aSymbolLocation + 1, aBaseLength);
}
theVal = new TCollection_HAsciiString(aResString);
return Standard_True;
}

View File

@@ -200,7 +200,7 @@ public:
//! For Message
Standard_EXPORT Standard_Boolean ReadXYZ (const IGESData_ParamCursor& PC, const Standard_CString mess, gp_XYZ& val);
Standard_EXPORT Standard_Boolean ReadText (const IGESData_ParamCursor& PC, const Message_Msg& amsg, Handle(TCollection_HAsciiString)& val);
Standard_EXPORT Standard_Boolean ReadText (const IGESData_ParamCursor& thePC, const Message_Msg& theMsg, Handle(TCollection_HAsciiString)& theVal);
//! Reads a Text value from parameter "num", as a String from
//! Collection, that is, Hollerith text without leading "nnnH"

View File

@@ -131,8 +131,6 @@ static void TrimTolerances (const TopoDS_Shape& shape,
}
}
//=======================================================================
//function : Transfer
//purpose :
@@ -196,10 +194,11 @@ Handle(Transfer_Binder) IGESToBRep_Actor::Transfer
// fixing shape
Handle(Standard_Transient) info;
shape = XSAlgo::AlgoContainer()->ProcessShape( shape, theeps, CAS.GetMaxTol(),
"read.iges.resource.name",
"read.iges.sequence", info,
aPS.Next());
shape = XSAlgo::AlgoContainer()->ProcessShape(shape, theeps, CAS.GetMaxTol(),
"read.iges.resource.name",
"read.iges.sequence",
info, mymodel->ReShape(),
aPS.Next());
XSAlgo::AlgoContainer()->MergeTransferInfo(TP, info, nbTPitems);
}

View File

@@ -53,43 +53,43 @@ bool RWGltf_ConfigurationNode::Load(const Handle(DE_ConfigurationContext)& theRe
{
TCollection_AsciiString aScope = THE_CONFIGURATION_SCOPE() + "." + GetFormat() + "." + GetVendor();
InternalParameters.FileLengthUnit =
InternalParameters.FileLengthUnit =
theResource->RealVal("file.length.unit", InternalParameters.FileLengthUnit, aScope);
InternalParameters.SystemCS = (RWMesh_CoordinateSystem)
(theResource->IntegerVal("system.cs", (int)InternalParameters.SystemCS, aScope) % 2);
InternalParameters.FileCS = (RWMesh_CoordinateSystem)
(theResource->IntegerVal("file.cs", (int)InternalParameters.SystemCS, aScope) % 2);
InternalParameters.ReadSinglePrecision =
InternalParameters.ReadSinglePrecision =
theResource->BooleanVal("read.single.precision", InternalParameters.ReadSinglePrecision, aScope);
InternalParameters.ReadCreateShapes =
InternalParameters.ReadCreateShapes =
theResource->BooleanVal("read.create.shapes", InternalParameters.ReadCreateShapes, aScope);
InternalParameters.ReadRootPrefix =
InternalParameters.ReadRootPrefix =
theResource->StringVal("read.root.prefix", InternalParameters.ReadRootPrefix, aScope);
InternalParameters.ReadFillDoc =
InternalParameters.ReadFillDoc =
theResource->BooleanVal("read.fill.doc", InternalParameters.ReadFillDoc, aScope);
InternalParameters.ReadFillIncomplete =
InternalParameters.ReadFillIncomplete =
theResource->BooleanVal("read.fill.incomplete", InternalParameters.ReadFillIncomplete, aScope);
InternalParameters.ReadMemoryLimitMiB =
InternalParameters.ReadMemoryLimitMiB =
theResource->IntegerVal("read.memory.limit.mib", InternalParameters.ReadMemoryLimitMiB, aScope);
InternalParameters.ReadParallel =
InternalParameters.ReadParallel =
theResource->BooleanVal("read.parallel", InternalParameters.ReadParallel, aScope);
InternalParameters.ReadSkipEmptyNodes =
InternalParameters.ReadSkipEmptyNodes =
theResource->BooleanVal("read.skip.empty.nodes", InternalParameters.ReadSkipEmptyNodes, aScope);
InternalParameters.ReadLoadAllScenes =
InternalParameters.ReadLoadAllScenes =
theResource->BooleanVal("read.load.all.scenes", InternalParameters.ReadLoadAllScenes, aScope);
InternalParameters.ReadUseMeshNameAsFallback =
InternalParameters.ReadUseMeshNameAsFallback =
theResource->BooleanVal("read.use.mesh.name.as.fallback", InternalParameters.ReadUseMeshNameAsFallback, aScope);
InternalParameters.ReadSkipLateDataLoading =
InternalParameters.ReadSkipLateDataLoading =
theResource->BooleanVal("read.skip.late.data.loading", InternalParameters.ReadSkipLateDataLoading, aScope);
InternalParameters.ReadKeepLateData =
InternalParameters.ReadKeepLateData =
theResource->BooleanVal("read.keep.late.data", InternalParameters.ReadKeepLateData, aScope);
InternalParameters.ReadPrintDebugMessages =
InternalParameters.ReadPrintDebugMessages =
theResource->BooleanVal("read.print.debug.message", InternalParameters.ReadPrintDebugMessages, aScope);
InternalParameters.WriteComment =
InternalParameters.WriteComment =
theResource->StringVal("write.comment", InternalParameters.WriteComment, aScope);
InternalParameters.WriteAuthor =
InternalParameters.WriteAuthor =
theResource->StringVal("write.author", InternalParameters.WriteAuthor, aScope);
InternalParameters.WriteTrsfFormat = (RWGltf_WriterTrsfFormat)
@@ -98,43 +98,14 @@ bool RWGltf_ConfigurationNode::Load(const Handle(DE_ConfigurationContext)& theRe
(theResource->IntegerVal("write.node.name.format", InternalParameters.WriteNodeNameFormat, aScope) % (RWMesh_NameFormat_ProductAndInstanceAndOcaf + 1));
InternalParameters.WriteMeshNameFormat = (RWMesh_NameFormat)
(theResource->IntegerVal("write.mesh.name.format", InternalParameters.WriteMeshNameFormat, aScope) % (RWMesh_NameFormat_ProductAndInstanceAndOcaf + 1));
// Draco parameters
InternalParameters.WriteDracoParameters.DracoCompression =
theResource->BooleanVal("write.draco.compression",
InternalParameters.WriteDracoParameters.DracoCompression, aScope);
InternalParameters.WriteDracoParameters.CompressionLevel =
theResource->IntegerVal("write.draco.level",
InternalParameters.WriteDracoParameters.CompressionLevel, aScope);
InternalParameters.WriteDracoParameters.QuantizePositionBits =
theResource->IntegerVal("write.draco.position.bits",
InternalParameters.WriteDracoParameters.QuantizePositionBits, aScope);
InternalParameters.WriteDracoParameters.QuantizeNormalBits =
theResource->IntegerVal("write.draco.normal.bits",
InternalParameters.WriteDracoParameters.QuantizeNormalBits, aScope);
InternalParameters.WriteDracoParameters.QuantizeTexcoordBits =
theResource->IntegerVal("write.draco.texture.bits",
InternalParameters.WriteDracoParameters.QuantizeTexcoordBits, aScope);
InternalParameters.WriteDracoParameters.QuantizeColorBits =
theResource->IntegerVal("write.draco.color.bits",
InternalParameters.WriteDracoParameters.QuantizeColorBits, aScope);
InternalParameters.WriteDracoParameters.QuantizeGenericBits =
theResource->IntegerVal("write.draco.generic.bits",
InternalParameters.WriteDracoParameters.QuantizeGenericBits, aScope);
InternalParameters.WriteDracoParameters.UnifiedQuantization =
theResource->BooleanVal("write.draco.unified.quantization",
InternalParameters.WriteDracoParameters.UnifiedQuantization, aScope);
InternalParameters.WriteForcedUVExport =
InternalParameters.WriteForcedUVExport =
theResource->BooleanVal("write.forced.uv.export", InternalParameters.WriteForcedUVExport, aScope);
InternalParameters.WriteEmbedTexturesInGlb =
InternalParameters.WriteEmbedTexturesInGlb =
theResource->BooleanVal("write.embed.textures.in.glb", InternalParameters.WriteEmbedTexturesInGlb, aScope);
InternalParameters.WriteMergeFaces =
InternalParameters.WriteMergeFaces =
theResource->BooleanVal("write.merge.faces", InternalParameters.WriteMergeFaces, aScope);
InternalParameters.WriteSplitIndices16 =
InternalParameters.WriteSplitIndices16 =
theResource->BooleanVal("write.split.indices16", InternalParameters.WriteSplitIndices16, aScope);
InternalParameters.WriteParallel =
theResource->BooleanVal("write.parallel", InternalParameters.WriteParallel, aScope);
return true;
}
@@ -287,63 +258,6 @@ TCollection_AsciiString RWGltf_ConfigurationNode::Save() const
aResult += aScope + "write.mesh.name.format :\t " + InternalParameters.WriteMeshNameFormat + "\n";
aResult += "!\n";
// Draco parameters
aResult += "!\n";
aResult += "!Flag to use Draco compression. If it is TRUE, compression is used\n";
aResult += "!Default value: 0(false). Available values: 0(false), 1(true)\n";
aResult += aScope + "write.draco.compression :\t " +
InternalParameters.WriteDracoParameters.DracoCompression + "\n";
aResult += "!\n";
aResult += "!\n";
aResult += "!Draco compression level\n";
aResult += "!Default value: 7. Available values: [0-10]\n";
aResult += aScope + "write.draco.level :\t " +
InternalParameters.WriteDracoParameters.CompressionLevel + "\n";
aResult += "!\n";
aResult += "!\n";
aResult += "!Quantization bits for position attribute\n";
aResult += "!Default value: 14. Available values: any positive value\n";
aResult += aScope + "write.draco.position.bits :\t " +
InternalParameters.WriteDracoParameters.QuantizePositionBits + "\n";
aResult += "!\n";
aResult += "!\n";
aResult += "!Quantization bits for normal attribute\n";
aResult += "!Default value: 10. Available values: any positive value\n";
aResult += aScope + "write.draco.normal.bits :\t " +
InternalParameters.WriteDracoParameters.QuantizeNormalBits + "\n";
aResult += "!\n";
aResult += "!\n";
aResult += "!Quantization bits for texture coordinate attribute\n";
aResult += "!Default value: 12. Available values: any positive value\n";
aResult += aScope + "write.draco.texture.bits :\t " +
InternalParameters.WriteDracoParameters.QuantizeTexcoordBits + "\n";
aResult += "!\n";
aResult += "!\n";
aResult += "!Quantization bits for color attributes\n";
aResult += "!Default value: 8. Available values: any positive value\n";
aResult += aScope + "write.draco.color.bits :\t " +
InternalParameters.WriteDracoParameters.QuantizeColorBits + "\n";
aResult += "!\n";
aResult += "!\n";
aResult += "!Quantization bits for skinning and custom attributes\n";
aResult += "!Default value: 12. Available values: any positive value\n";
aResult += aScope + "write.draco.generic.bits :\t " +
InternalParameters.WriteDracoParameters.QuantizeGenericBits + "\n";
aResult += "!\n";
aResult += "!\n";
aResult += "!Quantize positions of all primitives using the same quantization grid\n";
aResult += "!Default value: 0(false). Available values: 0(false), 1(true)\n";
aResult += aScope + "write.draco.unified.quantization :\t " +
InternalParameters.WriteDracoParameters.UnifiedQuantization + "\n";
aResult += "!\n";
aResult += "!\n";
aResult += "!Export UV coordinates even if there are no mapped texture\n";
aResult += "!Default value: 0(false). Available values: 0(false), 1(true)\n";
@@ -368,12 +282,6 @@ TCollection_AsciiString RWGltf_ConfigurationNode::Save() const
aResult += aScope + "write.split.indices16 :\t " + InternalParameters.WriteSplitIndices16 + "\n";
aResult += "!\n";
aResult += "!\n";
aResult += "!Flag to use multithreading\n";
aResult += "!Default value: 0(false). Available values: 0(false), 1(true)\n";
aResult += aScope + "write.parallel :\t " + InternalParameters.WriteParallel + "\n";
aResult += "!\n";
aResult += "!*****************************************************************************\n";
return aResult;
}

View File

@@ -16,7 +16,6 @@
#include <DE_ConfigurationNode.hxx>
#include <RWMesh_CoordinateSystem.hxx>
#include <RWGltf_DracoParameters.hxx>
#include <RWGltf_WriterTrsfFormat.hxx>
#include <RWMesh_NameFormat.hxx>
@@ -108,12 +107,10 @@ public:
RWGltf_WriterTrsfFormat WriteTrsfFormat = RWGltf_WriterTrsfFormat_Compact; //!< Transformation format to write into glTF file
RWMesh_NameFormat WriteNodeNameFormat = RWMesh_NameFormat_InstanceOrProduct; //!< Name format for exporting Nodes
RWMesh_NameFormat WriteMeshNameFormat = RWMesh_NameFormat_Product; //!< Name format for exporting Meshes
RWGltf_DracoParameters WriteDracoParameters; //!< Defines draco compression parameters
bool WriteForcedUVExport = false; //!< Export UV coordinates even if there are no mapped texture
bool WriteEmbedTexturesInGlb = true; //!< Flag to write image textures into GLB file
bool WriteMergeFaces = false; //!< Flag to merge faces within a single part
bool WriteSplitIndices16 = false; //!< Flag to prefer keeping 16-bit indexes while merging face
bool WriteParallel = false; //!< Flag to use multithreading
} InternalParameters;
};

View File

@@ -20,14 +20,13 @@
#include <XCAFDoc_ShapeTool.hxx>
#include <XCAFDoc_DocumentTool.hxx>
namespace
namespace
{
//=======================================================================
// function : SetReaderParameters
// purpose :
//=======================================================================
static void SetReaderParameters(RWGltf_CafReader& theReader,
const Handle(RWGltf_ConfigurationNode) theNode)
static void SetReaderParameters(RWGltf_CafReader& theReader, const Handle(RWGltf_ConfigurationNode) theNode)
{
theReader.SetDoublePrecision(!theNode->InternalParameters.ReadSinglePrecision);
theReader.SetSystemLengthUnit(theNode->GlobalParameters.LengthUnit / 1000);
@@ -74,36 +73,7 @@ bool RWGltf_Provider::Read(const TCollection_AsciiString& thePath,
const Message_ProgressRange& theProgress)
{
(void)theWS;
if (theDocument.IsNull())
{
Message::SendFail() << "Error: RWGltf_Provider : "
<< "Null document";
return false;
}
if (GetNode().IsNull() ||
!GetNode()->IsKind(STANDARD_TYPE(RWGltf_ConfigurationNode)))
{
Message::SendFail() << "Error: RWGltf_Provider : "
<< "Incorrect or empty Configuration Node";
return false;
}
Handle(RWGltf_ConfigurationNode) aNode =
Handle(RWGltf_ConfigurationNode)::DownCast(GetNode());
RWGltf_CafReader aReader;
aReader.SetDocument(theDocument);
SetReaderParameters(aReader, aNode);
XCAFDoc_DocumentTool::SetLengthUnit(theDocument,
aNode->GlobalParameters.LengthUnit,
UnitsMethods_LengthUnit_Millimeter);
if (!aReader.Perform(thePath, theProgress))
{
Message::SendFail() << "Error: RWGltf_Provider : [" <<
thePath << "] : Cannot read any relevant data from the GLTF file";
return false;
}
myExternalFiles = aReader.ExternalFiles();
myMetadata = aReader.Metadata();
return true;
return Read(thePath, theDocument, theProgress);
}
//=======================================================================
@@ -116,15 +86,58 @@ bool RWGltf_Provider::Write(const TCollection_AsciiString& thePath,
const Message_ProgressRange& theProgress)
{
(void)theWS;
if (GetNode().IsNull() ||
!GetNode()->IsKind(STANDARD_TYPE(RWGltf_ConfigurationNode)))
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: RWGltf_Provider : "
<< "Incorrect or empty Configuration Node";
Message::SendFail() << "Error in the RWGltf_Provider during reading the file " <<
thePath << "\t: theDocument shouldn't be null";
return false;
}
Handle(RWGltf_ConfigurationNode) aNode =
Handle(RWGltf_ConfigurationNode)::DownCast(GetNode());
if (GetNode().IsNull() || (!GetNode().IsNull() && !GetNode()->IsKind(STANDARD_TYPE(RWGltf_ConfigurationNode))))
{
Message::SendFail() << "Error in the RWGltf_Provider during reading the file " <<
thePath << "\t: Incorrect or empty Configuration Node";
return false;
}
Handle(RWGltf_ConfigurationNode) aNode = Handle(RWGltf_ConfigurationNode)::DownCast(GetNode());
RWGltf_CafReader aReader;
aReader.SetDocument(theDocument);
SetReaderParameters(aReader, aNode);
XCAFDoc_DocumentTool::SetLengthUnit(theDocument, aNode->GlobalParameters.LengthUnit, UnitsMethods_LengthUnit_Millimeter);
if (!aReader.Perform(thePath, theProgress))
{
Message::SendFail() << "Error in the RWGltf_Provider during reading the file " << thePath;
return false;
}
return true;
}
//=======================================================================
// function : Write
// purpose :
//=======================================================================
bool RWGltf_Provider::Write(const TCollection_AsciiString& thePath,
const Handle(TDocStd_Document)& theDocument,
const Message_ProgressRange& theProgress)
{
if (GetNode().IsNull() || !GetNode()->IsKind(STANDARD_TYPE(RWGltf_ConfigurationNode)))
{
Message::SendFail() << "Error in the RWGltf_Provider during writing the file " <<
thePath << "\t: Incorrect or empty Configuration Node";
return false;
}
Handle(RWGltf_ConfigurationNode) aNode = Handle(RWGltf_ConfigurationNode)::DownCast(GetNode());
RWMesh_CoordinateSystemConverter aConverter;
aConverter.SetInputLengthUnit(aNode->GlobalParameters.LengthUnit / 1000);
@@ -146,19 +159,16 @@ bool RWGltf_Provider::Write(const TCollection_AsciiString& thePath,
anExt.LowerCase();
RWGltf_CafWriter aWriter(thePath, anExt.EndsWith(".glb"));
aWriter.SetCoordinateSystemConverter(aConverter);
aWriter.SetCompressionParameters(aNode->InternalParameters.WriteDracoParameters);
aWriter.SetTransformationFormat(aNode->InternalParameters.WriteTrsfFormat);
aWriter.SetNodeNameFormat(aNode->InternalParameters.WriteNodeNameFormat);
aWriter.SetMeshNameFormat(aNode->InternalParameters.WriteMeshNameFormat);
aWriter.SetForcedUVExport(aNode->InternalParameters.WriteForcedUVExport);
aWriter.SetToEmbedTexturesInGlb(aNode->InternalParameters.WriteEmbedTexturesInGlb);
aWriter.SetMergeFaces(aNode->InternalParameters.WriteMergeFaces);
aWriter.SetParallel(aNode->InternalParameters.WriteParallel);
aWriter.SetSplitIndices16(aNode->InternalParameters.WriteSplitIndices16);
if (!aWriter.Perform(theDocument, aFileInfo, theProgress))
{
Message::SendFail() << "Error: RWGltf_Provider : [" <<
thePath << "] : Cannot write any relevant data to the GLTF file";
Message::SendFail() << "Error in the RWGltf_Provider during writing the file " << thePath;
return false;
}
return true;
@@ -174,27 +184,7 @@ bool RWGltf_Provider::Read(const TCollection_AsciiString& thePath,
const Message_ProgressRange& theProgress)
{
(void)theWS;
if (GetNode().IsNull() ||
!GetNode()->IsKind(STANDARD_TYPE(RWGltf_ConfigurationNode)))
{
Message::SendFail() << "Error: RWGltf_Provider : "
<< "Incorrect or empty Configuration Node";
return false;
}
Handle(RWGltf_ConfigurationNode) aNode =
Handle(RWGltf_ConfigurationNode)::DownCast(GetNode());
RWGltf_CafReader aReader;
SetReaderParameters(aReader, aNode);
if (!aReader.Perform(thePath, theProgress))
{
Message::SendFail() << "Error: RWGltf_Provider : [" <<
thePath << "] : Cannot read any relevant data from the GLTF file";
return false;
}
theShape = aReader.SingleShape();
myExternalFiles = aReader.ExternalFiles();
myMetadata = aReader.Metadata();
return true;
return Read(thePath, theShape, theProgress);
}
//=======================================================================
@@ -207,10 +197,47 @@ bool RWGltf_Provider::Write(const TCollection_AsciiString& thePath,
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 " <<
thePath << "\t: Incorrect or empty Configuration Node";
return false;
}
Handle(RWGltf_ConfigurationNode) aNode = Handle(RWGltf_ConfigurationNode)::DownCast(GetNode());
RWGltf_CafReader aReader;
SetReaderParameters(aReader, aNode);
if (!aReader.Perform(thePath, theProgress))
{
Message::SendFail() << "Error in the RWGltf_Provider during reading the file " << thePath;
return false;
}
theShape = aReader.SingleShape();
return true;
}
//=======================================================================
// function : Write
// purpose :
//=======================================================================
bool RWGltf_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, theWS, theProgress);
return Write(thePath, aDoc, theProgress);
}
//=======================================================================

View File

@@ -66,6 +66,24 @@ 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
@@ -88,6 +106,24 @@ 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
@@ -98,18 +134,6 @@ public:
//! @return provider's vendor name
Standard_EXPORT virtual TCollection_AsciiString GetVendor() const Standard_OVERRIDE;
public:
//!
const TColStd_IndexedDataMapOfStringString& GetMetadata() const { return myMetadata; }
//!
const NCollection_IndexedMap<TCollection_AsciiString>& GetExternalFiles() const { return myExternalFiles; }
private:
TColStd_IndexedDataMapOfStringString myMetadata; //!<
NCollection_IndexedMap<TCollection_AsciiString> myExternalFiles; //!<
};
#endif // _RWGltf_Provider_HeaderFile

View File

@@ -63,8 +63,6 @@ bool RWObj_ConfigurationNode::Load(const Handle(DE_ConfigurationContext)& theRes
theResource->BooleanVal("read.single.precision", InternalParameters.ReadSinglePrecision, aScope);
InternalParameters.ReadCreateShapes =
theResource->BooleanVal("read.create.shapes", InternalParameters.ReadCreateShapes, aScope);
InternalParameters.ReadCreateSingle =
theResource->BooleanVal("read.create.single", InternalParameters.ReadCreateSingle, aScope);
InternalParameters.ReadRootPrefix =
theResource->StringVal("read.root.prefix", InternalParameters.ReadRootPrefix, aScope);
InternalParameters.ReadFillDoc =
@@ -125,17 +123,11 @@ TCollection_AsciiString RWObj_ConfigurationNode::Save() const
aResult += "!\n";
aResult += "!\n";
aResult += "!Flag for create shapes in shape reading case\n";
aResult += "!Flag for create a single triangulation\n";
aResult += "!Default value: 0(false). Available values: 0(false), 1(true)\n";
aResult += aScope + "read.create.shapes :\t " + InternalParameters.ReadCreateShapes + "\n";
aResult += "!\n";
aResult += "!\n";
aResult += "!Flag for create shapes in shape reading case\n";
aResult += "!Default value: 0(false). Available values: 0(false), 1(true)\n";
aResult += aScope + "read.create.single :\t " + InternalParameters.ReadCreateSingle + "\n";
aResult += "!\n";
aResult += "!\n";
aResult += "!Root folder for generating root labels names\n";
aResult += "!Default value: ""(empty). Available values: <path>\n";

View File

@@ -87,8 +87,7 @@ public:
RWMesh_CoordinateSystem FileCS = RWMesh_CoordinateSystem_Yup; //!< File origin coordinate system to perform conversion during read
// Reading
bool ReadSinglePrecision = false; //!< Flag for reading vertex data with single or double floating point precision
bool ReadCreateShapes = false; //!< Flag for create shapes in shape reading case
bool ReadCreateSingle = false; //!< Flag for create a single triangulation in shape reading case
bool ReadCreateShapes = false; //!< Flag for create a single triangulation
TCollection_AsciiString ReadRootPrefix; //!< Root folder for generating root labels names
bool ReadFillDoc = true; //!< Flag for fill document from shape sequence
bool ReadFillIncomplete = true; //!< Flag for fill the document with partially retrieved data even if reader has failed with error

View File

@@ -49,38 +49,7 @@ bool RWObj_Provider::Read(const TCollection_AsciiString& thePath,
const Message_ProgressRange& theProgress)
{
(void)theWS;
if (theDocument.IsNull())
{
Message::SendFail() << "Error: RWObj_Provider : "
<< "Null document";
return false;
}
if (GetNode().IsNull() ||
!GetNode()->IsKind(STANDARD_TYPE(RWObj_ConfigurationNode)))
{
Message::SendFail() << "Error: RWObj_Provider : "
<< "Incorrect or empty Configuration Node";
return false;
}
Handle(RWObj_ConfigurationNode) aNode =
Handle(RWObj_ConfigurationNode)::DownCast(GetNode());
RWObj_CafReader aReader;
aReader.SetSinglePrecision(aNode->InternalParameters.ReadSinglePrecision);
aReader.SetSystemLengthUnit(aNode->GlobalParameters.LengthUnit / 1000);
aReader.SetSystemCoordinateSystem(aNode->InternalParameters.SystemCS);
aReader.SetFileLengthUnit(aNode->InternalParameters.FileLengthUnit);
aReader.SetFileCoordinateSystem(aNode->InternalParameters.FileCS);
aReader.SetDocument(theDocument);
aReader.SetRootPrefix(aNode->InternalParameters.ReadRootPrefix);
aReader.SetMemoryLimitMiB(aNode->InternalParameters.ReadMemoryLimitMiB);
if (!aReader.Perform(thePath, theProgress))
{
Message::SendFail() << "Error: RWObj_Provider : [" <<
thePath << "] : Cannot read any relevant data from the Obj file";
return false;
}
myExternalFiles = aReader.ExternalFiles();
return true;
return Read(thePath, theDocument, theProgress);
}
//=======================================================================
@@ -93,15 +62,63 @@ bool RWObj_Provider::Write(const TCollection_AsciiString& thePath,
const Message_ProgressRange& theProgress)
{
(void)theWS;
if (GetNode().IsNull() ||
!GetNode()->IsKind(STANDARD_TYPE(RWObj_ConfigurationNode)))
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: RWObj_Provider : "
<< "Incorrect or empty Configuration Node";
Message::SendFail() << "Error in the RWObj_Provider during reading the file " <<
thePath << "\t: theDocument shouldn't be null";
return false;
}
Handle(RWObj_ConfigurationNode) aNode =
Handle(RWObj_ConfigurationNode)::DownCast(GetNode());
if (GetNode().IsNull() || !GetNode()->IsKind(STANDARD_TYPE(RWObj_ConfigurationNode)))
{
Message::SendFail() << "Error in the RWObj_ConfigurationNode during reading the file " <<
thePath << "\t: Incorrect or empty Configuration Node";
return false;
}
Handle(RWObj_ConfigurationNode) aNode = Handle(RWObj_ConfigurationNode)::DownCast(GetNode());
RWObj_CafReader aReader;
aReader.SetSinglePrecision(aNode->InternalParameters.ReadSinglePrecision);
aReader.SetSystemLengthUnit(aNode->GlobalParameters.LengthUnit / 1000);
aReader.SetSystemCoordinateSystem(aNode->InternalParameters.SystemCS);
aReader.SetFileLengthUnit(aNode->InternalParameters.FileLengthUnit);
aReader.SetFileCoordinateSystem(aNode->InternalParameters.FileCS);
aReader.SetDocument(theDocument);
aReader.SetRootPrefix(aNode->InternalParameters.ReadRootPrefix);
aReader.SetMemoryLimitMiB(aNode->InternalParameters.ReadMemoryLimitMiB);
if (!aReader.Perform(thePath, theProgress))
{
Message::SendFail() << "Error in the RWObj_ConfigurationNode during reading the file " << thePath;
return false;
}
XCAFDoc_DocumentTool::SetLengthUnit(theDocument, aNode->GlobalParameters.LengthUnit, UnitsMethods_LengthUnit_Millimeter);
return true;
}
//=======================================================================
// function : Write
// purpose :
//=======================================================================
bool RWObj_Provider::Write(const TCollection_AsciiString& thePath,
const Handle(TDocStd_Document)& theDocument,
const Message_ProgressRange& theProgress)
{
if (GetNode().IsNull() || !GetNode()->IsKind(STANDARD_TYPE(RWObj_ConfigurationNode)))
{
Message::SendFail() << "Error in the RWObj_ConfigurationNode during writing the file " <<
thePath << "\t: Incorrect or empty Configuration Node";
return false;
}
Handle(RWObj_ConfigurationNode) aNode = Handle(RWObj_ConfigurationNode)::DownCast(GetNode());
TColStd_IndexedDataMapOfStringString aFileInfo;
if (!aNode->InternalParameters.WriteAuthor.IsEmpty())
@@ -112,6 +129,7 @@ bool RWObj_Provider::Write(const TCollection_AsciiString& thePath,
{
aFileInfo.Add("Comments", aNode->InternalParameters.WriteComment);
}
RWMesh_CoordinateSystemConverter aConverter;
aConverter.SetInputLengthUnit(aNode->GlobalParameters.LengthUnit / 1000);
aConverter.SetInputCoordinateSystem(aNode->InternalParameters.SystemCS);
@@ -122,8 +140,7 @@ bool RWObj_Provider::Write(const TCollection_AsciiString& thePath,
aWriter.SetCoordinateSystemConverter(aConverter);
if (!aWriter.Perform(theDocument, aFileInfo, theProgress))
{
Message::SendFail() << "Error: RWObj_Provider : [" <<
thePath << "] : Cannot write any relevant data to the Obj file";
Message::SendFail() << "Error in the RWObj_ConfigurationNode during writing the file " << thePath;
return false;
}
return true;
@@ -139,61 +156,7 @@ bool RWObj_Provider::Read(const TCollection_AsciiString& thePath,
const Message_ProgressRange& theProgress)
{
(void)theWS;
if (GetNode().IsNull() ||
!GetNode()->IsKind(STANDARD_TYPE(RWObj_ConfigurationNode)))
{
Message::SendFail() << "Error: RWObj_Provider : "
<< "Incorrect or empty Configuration Node";
return false;
}
Handle(RWObj_ConfigurationNode) aNode =
Handle(RWObj_ConfigurationNode)::DownCast(GetNode());
if (aNode->InternalParameters.ReadCreateSingle)
{
RWMesh_CoordinateSystemConverter aConverter;
aConverter.SetOutputLengthUnit(aNode->GlobalParameters.LengthUnit / 1000);
aConverter.SetOutputCoordinateSystem(aNode->InternalParameters.SystemCS);
aConverter.SetInputLengthUnit(aNode->InternalParameters.FileLengthUnit);
aConverter.SetInputCoordinateSystem(aNode->InternalParameters.FileCS);
RWObj_TriangulationReader aSimpleReader;
aSimpleReader.SetTransformation(aConverter);
aSimpleReader.SetSinglePrecision(aNode->InternalParameters.ReadSinglePrecision);
aSimpleReader.SetCreateShapes(aNode->InternalParameters.ReadCreateShapes);
aSimpleReader.SetSinglePrecision(aNode->InternalParameters.ReadSinglePrecision);
aSimpleReader.SetMemoryLimit(aNode->InternalParameters.ReadMemoryLimitMiB);
if (!aSimpleReader.Read(thePath, theProgress))
{
Message::SendFail() << "Error: RWObj_Provider : [" <<
thePath << "] : Cannot read any relevant data from the Obj file";
return false;
}
Handle(Poly_Triangulation) aTriangulation = aSimpleReader.GetTriangulation();
TopoDS_Face aFace;
BRep_Builder aBuiler;
aBuiler.MakeFace(aFace);
aBuiler.UpdateFace(aFace, aTriangulation);
theShape = aFace;
myExternalFiles = aSimpleReader.ExternalFiles();
return true;
}
RWObj_CafReader aReader;
aReader.SetSinglePrecision(aNode->InternalParameters.ReadSinglePrecision);
aReader.SetSystemLengthUnit(aNode->GlobalParameters.LengthUnit / 1000);
aReader.SetSystemCoordinateSystem(aNode->InternalParameters.SystemCS);
aReader.SetFileLengthUnit(aNode->InternalParameters.FileLengthUnit);
aReader.SetFileCoordinateSystem(aNode->InternalParameters.FileCS);
aReader.SetRootPrefix(aNode->InternalParameters.ReadRootPrefix);
aReader.SetMemoryLimitMiB(aNode->InternalParameters.ReadMemoryLimitMiB);
if (!aReader.Perform(thePath, theProgress))
{
Message::SendFail() << "Error: RWObj_Provider : [" <<
thePath << "] : Cannot read any relevant data from the Obj file";
return false;
}
theShape = aReader.SingleShape();
myExternalFiles = aReader.ExternalFiles();
return true;
return Read(thePath, theShape, theProgress);
}
//=======================================================================
@@ -206,11 +169,62 @@ bool RWObj_Provider::Write(const TCollection_AsciiString& thePath,
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 " <<
thePath << "\t: Incorrect or empty Configuration Node";
return false;
}
Handle(RWObj_ConfigurationNode) aNode = Handle(RWObj_ConfigurationNode)::DownCast(GetNode());
RWMesh_CoordinateSystemConverter aConverter;
aConverter.SetOutputLengthUnit(aNode->GlobalParameters.LengthUnit / 1000);
aConverter.SetOutputCoordinateSystem(aNode->InternalParameters.SystemCS);
aConverter.SetInputLengthUnit(aNode->InternalParameters.FileLengthUnit);
aConverter.SetInputCoordinateSystem(aNode->InternalParameters.FileCS);
RWObj_TriangulationReader aSimpleReader;
aSimpleReader.SetTransformation(aConverter);
aSimpleReader.SetSinglePrecision(aNode->InternalParameters.ReadSinglePrecision);
aSimpleReader.SetCreateShapes(aNode->InternalParameters.ReadCreateShapes);
aSimpleReader.SetSinglePrecision(aNode->InternalParameters.ReadSinglePrecision);
aSimpleReader.SetMemoryLimit(aNode->InternalParameters.ReadMemoryLimitMiB);
if (!aSimpleReader.Read(thePath, theProgress))
{
Message::SendFail() << "Error in the RWObj_ConfigurationNode during reading the file " << thePath;
return false;
}
Handle(Poly_Triangulation) aTriangulation = aSimpleReader.GetTriangulation();
TopoDS_Face aFace;
BRep_Builder aBuiler;
aBuiler.MakeFace(aFace);
aBuiler.UpdateFace(aFace, aTriangulation);
theShape = aFace;
return true;
}
//=======================================================================
// function : Write
// purpose :
//=======================================================================
bool RWObj_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());
Handle(XCAFDoc_ShapeTool) aShTool = XCAFDoc_DocumentTool::ShapeTool(aDoc->Main());
aShTool->AddShape(theShape);
return Write(thePath, aDoc, theWS, theProgress);
return Write(thePath, aDoc, theProgress);
}
//=======================================================================

View File

@@ -16,8 +16,6 @@
#include <DE_Provider.hxx>
#include <NCollection_IndexedMap.hxx>
//! The class to transfer OBJ files.
//! Reads and Writes any OBJ files into/from OCCT.
//! Each operation needs configuration node.
@@ -66,6 +64,24 @@ 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
@@ -88,6 +104,24 @@ 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
@@ -97,15 +131,6 @@ public:
//! Gets provider's vendor name of associated provider
//! @return provider's vendor name
Standard_EXPORT virtual TCollection_AsciiString GetVendor() const Standard_OVERRIDE;
public:
//!
const NCollection_IndexedMap<TCollection_AsciiString>& GetExternalFiles() const { return myExternalFiles; }
private:
NCollection_IndexedMap<TCollection_AsciiString> myExternalFiles; //!<
};
#endif // _RWObj_Provider_HeaderFile

View File

@@ -52,24 +52,33 @@ bool RWPly_Provider::Write(const TCollection_AsciiString& thePath,
const Message_ProgressRange& theProgress)
{
(void)theWS;
if (GetNode().IsNull() ||
!GetNode()->IsKind(STANDARD_TYPE(RWPly_ConfigurationNode)))
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: RWPly_Provider : "
<< "Incorrect or empty Configuration Node";
Message::SendFail() << "Error in the RWPly_Provider during writing the file " <<
thePath << "\t: Incorrect or empty Configuration Node";
return false;
}
Handle(RWPly_ConfigurationNode) aNode =
Handle(RWPly_ConfigurationNode)::DownCast(GetNode());
Handle(RWPly_ConfigurationNode) aNode = Handle(RWPly_ConfigurationNode)::DownCast(GetNode());
TDF_LabelSequence aRootLabels;
Handle(XCAFDoc_ShapeTool) aShapeTool =
XCAFDoc_DocumentTool::ShapeTool(theDocument->Main());
Handle(XCAFDoc_ShapeTool) aShapeTool = XCAFDoc_DocumentTool::ShapeTool(theDocument->Main());
aShapeTool->GetFreeShapes(aRootLabels);
if (aRootLabels.IsEmpty())
{
return Standard_True;
}
TColStd_IndexedDataMapOfStringString aFileInfo;
if (!aNode->InternalParameters.WriteAuthor.IsEmpty())
{
@@ -93,8 +102,8 @@ bool RWPly_Provider::Write(const TCollection_AsciiString& thePath,
aPlyCtx.SetFaceId(aNode->InternalParameters.WriteFaceId);
if (!aPlyCtx.Perform(theDocument, aFileInfo, theProgress))
{
Message::SendFail() << "Error: RWObj_Provider : [" <<
thePath << "] : Cannot write any relevant data to the Ply file";
Message::SendFail() << "Error in the RWPly_Provider during writing the file "
<< thePath << "\t: Cannot perform the document";
return false;
}
@@ -111,10 +120,21 @@ 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, theWS, theProgress);
return Write(thePath, aDoc, theProgress);
}
//=======================================================================

View File

@@ -53,6 +53,15 @@ 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
@@ -64,6 +73,15 @@ 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

View File

@@ -56,8 +56,8 @@ bool RWStl_ConfigurationNode::Load(const Handle(DE_ConfigurationContext)& theRes
InternalParameters.ReadMergeAngle =
theResource->RealVal("read.merge.angle", InternalParameters.ReadMergeAngle, aScope);
InternalParameters.ReadShapeType = (ReadMode_ShapeType)
theResource->IntegerVal("read.brep", InternalParameters.ReadShapeType, aScope);
InternalParameters.ReadBRep =
theResource->BooleanVal("read.brep", InternalParameters.ReadBRep, aScope);
InternalParameters.WriteAscii =
theResource->BooleanVal("write.ascii", InternalParameters.WriteAscii, aScope);
return true;
@@ -85,9 +85,9 @@ TCollection_AsciiString RWStl_ConfigurationNode::Save() const
aResult += "!\n";
aResult += "!\n";
aResult += "!Defines result type of transferred shape\n";
aResult += "!Default value: 1(SingleMesh). Available values: 0(MultiMesh), 1(SingleMesh), 2(CompShape)\n";
aResult += aScope + "read.brep :\t " + InternalParameters.ReadShapeType + "\n";
aResult += "!Setting up Boundary Representation flag\n";
aResult += "!Default value: false. Available values: \"on\", \"off\"\n";
aResult += aScope + "read.brep :\t " + InternalParameters.ReadBRep + "\n";
aResult += "!\n";
aResult += "!\n";

View File

@@ -84,17 +84,11 @@ public:
Standard_EXPORT virtual bool CheckContent(const Handle(NCollection_Buffer)& theBuffer) const Standard_OVERRIDE;
public:
enum ReadMode_ShapeType
{
ReadMode_ShapeType_MultiMesh = 0,
ReadMode_ShapeType_SingleMesh,
ReadMode_ShapeType_CompShape,
};
struct RWStl_InternalSection
{
// Read
double ReadMergeAngle = 90.; //!< Input merge angle value
ReadMode_ShapeType ReadShapeType = ReadMode_ShapeType_SingleMesh; //!< Defines result type of transferred shape
bool ReadBRep = false; //!< Setting up Boundary Representation flag
// Write
bool WriteAscii = true; //!< Setting up writing mode (Ascii or Binary)

View File

@@ -51,21 +51,7 @@ bool RWStl_Provider::Read(const TCollection_AsciiString& thePath,
const Message_ProgressRange& theProgress)
{
(void)theWS;
if (theDocument.IsNull())
{
Message::SendFail() << "Error: RWStl_Provider : "
<< "Null document";
return false;
}
TopoDS_Shape aShape;
if (!Read(thePath, aShape, theWS, theProgress))
{
return false;
}
Handle(XCAFDoc_ShapeTool) aShapeTool =
XCAFDoc_DocumentTool::ShapeTool(theDocument->Main());
aShapeTool->AddShape(aShape);
return true;
return Read(thePath, theDocument, theProgress);
}
//=======================================================================
@@ -78,15 +64,49 @@ bool RWStl_Provider::Write(const TCollection_AsciiString& thePath,
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 " <<
thePath << "\t: theDocument shouldn't be null";
return false;
}
TopoDS_Shape aShape;
if (!Read(thePath, aShape, theProgress))
{
return false;
}
Handle(XCAFDoc_ShapeTool) aShapeTool = XCAFDoc_DocumentTool::ShapeTool(theDocument->Main());
aShapeTool->AddShape(aShape);
return true;
}
//=======================================================================
// function : Write
// purpose :
//=======================================================================
bool RWStl_Provider::Write(const TCollection_AsciiString& thePath,
const Handle(TDocStd_Document)& theDocument,
const Message_ProgressRange& theProgress)
{
TopoDS_Shape aShape;
TDF_LabelSequence aLabels;
Handle(XCAFDoc_ShapeTool) aSTool =
XCAFDoc_DocumentTool::ShapeTool(theDocument->Main());
Handle(XCAFDoc_ShapeTool) aSTool = XCAFDoc_DocumentTool::ShapeTool(theDocument->Main());
aSTool->GetFreeShapes(aLabels);
if (aLabels.Length() <= 0)
{
Message::SendFail() << "Error: RWStl_Provider : "
<< "Incorrect or empty Configuration Node";
Message::SendFail() << "Error in the RWStl_Provider during writing the file " <<
thePath << "\t: Document contain no shapes";
return false;
}
@@ -106,7 +126,7 @@ bool RWStl_Provider::Write(const TCollection_AsciiString& thePath,
}
aShape = aComp;
}
return Write(thePath, aShape, theWS, theProgress);
return Write(thePath, aShape, theProgress);
}
//=======================================================================
@@ -119,87 +139,7 @@ bool RWStl_Provider::Read(const TCollection_AsciiString& thePath,
const Message_ProgressRange& theProgress)
{
(void)theWS;
Message::SendWarning()
<< "OCCT Stl reader does not support model scaling according to custom length unit";
if (!GetNode()->IsKind(STANDARD_TYPE(RWStl_ConfigurationNode)))
{
Message::SendFail() << "Error: RWStl_Provider : "
<< "Incorrect or empty Configuration Node";
return false;
}
Handle(RWStl_ConfigurationNode) aNode =
Handle(RWStl_ConfigurationNode)::DownCast(GetNode());
double aMergeAngle = aNode->InternalParameters.ReadMergeAngle * M_PI / 180.0;
if (aMergeAngle < 0.0 || aMergeAngle > M_PI_2)
{
Message::SendFail() << "Error: RWStl_Provider : ["
<< aMergeAngle << "] The merge angle is out of the valid range";
return false;
}
switch (aNode->InternalParameters.ReadShapeType)
{
case(RWStl_ConfigurationNode::ReadMode_ShapeType_MultiMesh):
{
NCollection_Sequence<Handle(Poly_Triangulation)> aTriangList;
// Read STL file to the triangulation list.
RWStl::ReadFile(thePath.ToCString(), aMergeAngle, aTriangList, theProgress);
BRep_Builder aB;
if (aTriangList.Size() == 1)
{
TopoDS_Face aFace;
aB.MakeFace(aFace);
aB.UpdateFace(aFace, aTriangList.First());
theShape = aFace;
}
else
{
TopoDS_Compound aCmp;
for (NCollection_Sequence<Handle(Poly_Triangulation)>::Iterator anIt(aTriangList);
anIt.More(); anIt.Next())
{
if (aCmp.IsNull())
{
aB.MakeCompound(aCmp);
}
TopoDS_Face aFace;
aB.MakeFace(aFace, anIt.Value());
aB.Add(aCmp, aFace);
}
theShape = aCmp;
}
break;
}
case(RWStl_ConfigurationNode::ReadMode_ShapeType_SingleMesh):
{
// Read STL file to the triangulation.
Handle(Poly_Triangulation) aTriangulation =
RWStl::ReadFile(thePath.ToCString(), aMergeAngle, theProgress);
if (!aTriangulation.IsNull())
{
TopoDS_Face aFace;
BRep_Builder aB;
aB.MakeFace(aFace);
aB.UpdateFace(aFace, aTriangulation);
theShape = aFace;
}
break;
}
case(RWStl_ConfigurationNode::ReadMode_ShapeType_CompShape):
{
Standard_DISABLE_DEPRECATION_WARNINGS
StlAPI::Read(theShape, thePath.ToCString());
Standard_ENABLE_DEPRECATION_WARNINGS
break;
}
}
if (theShape.IsNull())
{
Message::SendFail() << "Error: RWStl_Provider : [" <<
thePath << "] : Cannot read any relevant data from the STL file";
return false;
}
return true;
return Read(thePath, theShape, theProgress);
}
//=======================================================================
@@ -212,24 +152,81 @@ bool RWStl_Provider::Write(const TCollection_AsciiString& thePath,
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)))
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)))
{
Message::SendFail() << "Error: RWStl_Provider : "
<< "Incorrect or empty Configuration Node";
Message::SendFail() << "Error in the RWStl_Provider during reading the file " <<
thePath << "\t: Incorrect or empty Configuration Node";
return true;
}
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 < 0.0 || aMergeAngle > M_PI_2)
{
Message::SendFail() << "Error in the RWStl_Provider during reading the file " <<
thePath << "\t: The merge angle is out of the valid range";
return false;
}
}
if (!aNode->InternalParameters.ReadBRep)
{
Handle(Poly_Triangulation) aTriangulation = RWStl::ReadFile(thePath.ToCString(), aMergeAngle, theProgress);
TopoDS_Face aFace;
BRep_Builder aB;
aB.MakeFace(aFace);
aB.UpdateFace(aFace, aTriangulation);
theShape = aFace;
}
else
{
Standard_DISABLE_DEPRECATION_WARNINGS
if (!StlAPI::Read(theShape, thePath.ToCString()))
{
Message::SendFail() << "Error in the RWStl_Provider during reading the file " << thePath;
return false;
}
Standard_ENABLE_DEPRECATION_WARNINGS
}
return true;
}
//=======================================================================
// function : Write
// purpose :
//=======================================================================
bool RWStl_Provider::Write(const TCollection_AsciiString& thePath,
const TopoDS_Shape& theShape,
const Message_ProgressRange& theProgress)
{
Message::SendWarning() << "OCCT Stl writer does not support model scaling according to custom length unit";
if (GetNode().IsNull() || !GetNode()->IsKind(STANDARD_TYPE(RWStl_ConfigurationNode)))
{
Message::SendFail() << "Error in the RWStl_Provider during reading the file " <<
thePath << "\t: Incorrect or empty Configuration Node";
return false;
}
Handle(RWStl_ConfigurationNode) aNode =
Handle(RWStl_ConfigurationNode)::DownCast(GetNode());
Handle(RWStl_ConfigurationNode) aNode = Handle(RWStl_ConfigurationNode)::DownCast(GetNode());
StlAPI_Writer aWriter;
aWriter.ASCIIMode() = aNode->InternalParameters.WriteAscii;
if (!aWriter.Write(theShape, thePath.ToCString(), theProgress))
{
Message::SendFail() << "Error: RWStl_Provider : [" <<
thePath << "] : Mesh writing has been failed";
Message::SendFail() << "Error in the RWStl_Provider during reading the file " <<
thePath << "\t: Mesh writing has been failed";
return false;
}
return true;

View File

@@ -64,6 +64,24 @@ 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
@@ -86,6 +104,24 @@ 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

View File

@@ -225,6 +225,14 @@ static Resource_KindOfLine WhatKindOfLine(OSD_File& aFile,
aToken2.Clear();
else {
Line.Remove(1,Pos-1);
const Standard_Integer aLineLength = Line.Length();
if (aLineLength >= 2)
{
if (Line.Value(aLineLength - 1) == '\r')
{
Line.Remove(aLineLength - 1);
}
}
Line.Remove(Line.Length());
aToken2 = Line;
}

View File

@@ -131,12 +131,8 @@ bool STEPCAFControl_ConfigurationNode::Load(const Handle(DE_ConfigurationContext
theResource->IntegerVal("write.unit", InternalParameters.WriteUnit, aScope);
InternalParameters.WriteResourceName =
theResource->StringVal("write.resource.name", InternalParameters.WriteResourceName, aScope);
InternalParameters.WriteMultiPrefix =
theResource->StringVal("write.multi.prefix", InternalParameters.WriteMultiPrefix, aScope);
InternalParameters.WriteSequence =
theResource->StringVal("write.sequence", InternalParameters.WriteSequence, aScope);
InternalParameters.WriteLabels =
theResource->StringSeqVal("write.labels", InternalParameters.WriteLabels, aScope);
InternalParameters.WriteVertexMode = (WriteMode_VertexMode)
theResource->IntegerVal("write.vertex.mode", InternalParameters.WriteVertexMode, aScope);
InternalParameters.WriteSubshapeNames =
@@ -431,30 +427,12 @@ TCollection_AsciiString STEPCAFControl_ConfigurationNode::Save() const
aResult += aScope + "write.resource.name :\t " + InternalParameters.WriteResourceName + "\n";
aResult += "!\n";
aResult += "!\n";
aResult += "!Defines prefix for names of external files, if empty do not make multifile\n";
aResult += "!Default value: empty. Available values: <string>\n";
aResult += aScope + "write.multi.prefix :\t " + InternalParameters.WriteMultiPrefix + "\n";
aResult += "!\n";
aResult += "!\n";
aResult += "!Defines name of the sequence of operators\n";
aResult += "!Default value: \"ToSTEP\". Available values: <string>\n";
aResult += aScope + "write.sequence :\t " + InternalParameters.WriteSequence + "\n";
aResult += "!\n";
aResult += "!\n";
aResult += "!Defines list of shape labels to export, if empty import full document\n";
aResult += "!Default value: empty. Available values: sequense of label entries\n";
aResult += aScope + "write.labels :\t ";
for (TColStd_ListOfAsciiString::Iterator anIter(InternalParameters.WriteLabels);
anIter.More(); anIter.Next())
{
aResult += anIter.Value();
aResult += " ";
}
aResult += "\n!\n";
aResult += "!\n";
aResult += "!This parameter indicates which of free vertices writing mode is switch on\n";
aResult += "!Default value: 0(\"One Compound\"). Available values: 0(\"One Compound\"), 1(\"Signle Vertex\")\n";
@@ -539,15 +517,6 @@ bool STEPCAFControl_ConfigurationNode::IsExportSupported() const
return true;
}
//=======================================================================
// function : IsExportSupported
// purpose :
//=======================================================================
bool STEPCAFControl_ConfigurationNode::IsStreamSupported() const
{
return true;
}
//=======================================================================
// function : GetFormat
// purpose :

View File

@@ -17,7 +17,6 @@
#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
@@ -70,10 +69,6 @@ public:
//! @return true if export is supported
Standard_EXPORT virtual bool IsExportSupported() const Standard_OVERRIDE;
//! Checks the stream for import/export supporting
//! @return Standard_True if stream is support
Standard_EXPORT virtual bool IsStreamSupported() const Standard_OVERRIDE;
//! Gets CAD format name of associated provider
//! @return provider CAD format
Standard_EXPORT virtual TCollection_AsciiString GetFormat() const Standard_OVERRIDE;
@@ -223,9 +218,7 @@ 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_ListOfAsciiString 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

View File

@@ -13,256 +13,19 @@
#include <STEPCAFControl_Provider.hxx>
#include <BinXCAFDrivers.hxx>
#include <Interface_Static.hxx>
#include <Message.hxx>
#include <StepData_StepModel.hxx>
#include <STEPCAFControl_ConfigurationNode.hxx>
#include <STEPCAFControl_Controller.hxx>
#include <STEPCAFControl_Reader.hxx>
#include <STEPCAFControl_Writer.hxx>
#include <STEPControl_ActorWrite.hxx>
#include <STEPControl_Controller.hxx>
#include <StepData_StepModel.hxx>
#include <TDataStd_Name.hxx>
#include <TDF_Tool.hxx>
#include <TDocStd_Document.hxx>
#include <UnitsMethods.hxx>
#include <XCAFDoc_DocumentTool.hxx>
#include <XSControl_WorkSession.hxx>
#include <UnitsMethods.hxx>
IMPLEMENT_STANDARD_RTTIEXT(STEPCAFControl_Provider, DE_Provider)
namespace
{
//! Special class to handle static parameters.
//! Initialize all parameters in the begin of life
//! and reset changed parameters in the end of life
class STEPCAFControl_ParameterController
{
public:
STEPCAFControl_ParameterController(const Handle(STEPCAFControl_ConfigurationNode)& theNode,
const Standard_Boolean theUpdateStatic);
~STEPCAFControl_ParameterController();
protected:
void setStatic(const STEPCAFControl_ConfigurationNode::STEPCAFControl_InternalSection theParameter);
private:
bool myToUpdateStaticParameters; //!< Flag to updating static parameters
STEPCAFControl_ConfigurationNode::STEPCAFControl_InternalSection myOldValues; //!< Container to save previous static parameters
};
//=======================================================================
// function : STEPCAFControl_ParameterController
// purpose :
//=======================================================================
STEPCAFControl_ParameterController::STEPCAFControl_ParameterController(const Handle(STEPCAFControl_ConfigurationNode)& theNode,
const Standard_Boolean theUpdateStatic)
: myToUpdateStaticParameters(theUpdateStatic)
{
STEPCAFControl_Controller::Init();
STEPControl_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;
// Set new values
setStatic(theNode->InternalParameters);
}
//=======================================================================
// function : ~STEPCAFControl_ParameterController
// purpose :
//=======================================================================
STEPCAFControl_ParameterController::~STEPCAFControl_ParameterController()
{
if (!myToUpdateStaticParameters)
{
return;
}
setStatic(myOldValues);
}
//=======================================================================
// function : setStatic
// purpose :
//=======================================================================
void STEPCAFControl_ParameterController::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);
}
}
//=======================================================================
// function : STEPCAFControl_Provider
// purpose :
@@ -279,23 +42,113 @@ STEPCAFControl_Provider::STEPCAFControl_Provider(const Handle(DE_ConfigurationNo
{}
//=======================================================================
// function : personizeWS
// function : initStatic
// purpose :
//=======================================================================
void STEPCAFControl_Provider::personizeWS(Handle(XSControl_WorkSession)& theWS)
void STEPCAFControl_Provider::initStatic(const Handle(DE_ConfigurationNode)& theNode)
{
if (theWS.IsNull())
{
Message::SendWarning() << "Warning: STEPCAFControl_Provider :"
<< " Null work session, use internal temporary session";
theWS = new XSControl_WorkSession();
}
Handle(STEPControl_Controller) aCntrl =
Handle(STEPControl_Controller)::DownCast(theWS->NormAdaptor());
if (aCntrl.IsNull())
{
theWS->SelectNorm("STEP");
}
Handle(STEPCAFControl_ConfigurationNode) aNode = Handle(STEPCAFControl_ConfigurationNode)::DownCast(theNode);
STEPCAFControl_Controller::Init();
// 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;
// Set new values
setStatic(aNode->InternalParameters);
}
//=======================================================================
// function : setStatic
// purpose :
//=======================================================================
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);
}
//=======================================================================
// function : resetStatic
// purpose :
//=======================================================================
void STEPCAFControl_Provider::resetStatic()
{
setStatic(myOldValues);
}
//=======================================================================
@@ -309,120 +162,48 @@ bool STEPCAFControl_Provider::Read(const TCollection_AsciiString& thePath,
{
if (theDocument.IsNull())
{
Message::SendFail() << "Error: STEPCAFControl_Provider : "
<< "Null document";
Message::SendFail() << "Error in the STEPCAFControl_Provider during reading the file " <<
thePath << "\t: theDocument shouldn't be null";
return false;
}
if (GetNode().IsNull() ||
!GetNode()->IsKind(STANDARD_TYPE(STEPCAFControl_ConfigurationNode)))
if (GetNode().IsNull() || !GetNode()->IsKind(STANDARD_TYPE(STEPCAFControl_ConfigurationNode)))
{
Message::SendFail() << "Error: STEPCAFControl_Provider : "
<< "Incorrect or empty Configuration Node";
Message::SendFail() << "Error in the STEPCAFControl_Provider during reading the file " <<
thePath << "\t: Incorrect or empty Configuration Node";
return false;
}
Handle(STEPCAFControl_ConfigurationNode) aNode =
Handle(STEPCAFControl_ConfigurationNode)::DownCast(GetNode());
STEPCAFControl_ParameterController aParamController(aNode, myToUpdateStaticParameters);
personizeWS(theWS);
XCAFDoc_DocumentTool::SetLengthUnit(theDocument,
aNode->GlobalParameters.LengthUnit,
UnitsMethods_LengthUnit_Millimeter);
const Standard_Boolean toUseLoaded = thePath == ".";
TCollection_AsciiString aFile;
if (toUseLoaded)
Handle(STEPCAFControl_ConfigurationNode) aNode = Handle(STEPCAFControl_ConfigurationNode)::DownCast(GetNode());
initStatic(aNode);
XCAFDoc_DocumentTool::SetLengthUnit(theDocument, aNode->GlobalParameters.LengthUnit, UnitsMethods_LengthUnit_Millimeter);
STEPCAFControl_Reader aReader;
if (!theWS.IsNull())
{
aFile = theWS->LoadedFile();
Message::SendInfo() << "Model taken from the STEP session : "
<< aFile;
aReader.Init(theWS);
}
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;
if (!toUseLoaded)
{
aReadStat = aReader.ReadFile(thePath.ToCString());
}
else if (theWS->NbStartingEntities() > 0)
{
aReadStat = IFSelect_RetDone;
}
aReadStat = aReader.ReadFile(thePath.ToCString());
if (aReadStat != IFSelect_RetDone)
{
Message::SendFail() << "Error: STEPCAFControl_Provider : ["
<< aFile << "] : abandon, no model loaded";
Message::SendFail() << "Error in the STEPCAFControl_Provider during reading the file " <<
thePath << "\t: abandon";
resetStatic();
return false;
}
if (!aReader.Transfer(theDocument, theProgress))
{
Message::SendFail() << "Error: STEPCAFControl_Provider : [" <<
aFile << "] : Cannot read any relevant data from the STEP file";
Message::SendFail() << "Error in the STEPCAFControl_Provider during reading the file " <<
thePath << "\t: Cannot read any relevant data from the STEP file";
resetStatic();
return false;
}
myProcessedExtFiles = aReader.ExternFiles();
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());
STEPCAFControl_ParameterController aParamController(aNode, myToUpdateStaticParameters);
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";
return false;
}
if (!aReader.Transfer(theDocument, theProgress))
{
Message::SendFail() << "Error: STEPCAFControl_Provider : "
<< "Cannot read any relevant data from the STEP file";
return false;
}
myProcessedExtFiles = aReader.ExternFiles();
resetStatic();
return true;
}
@@ -435,176 +216,86 @@ 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: STEPCAFControl_Provider : "
<< "Incorrect or empty Configuration Node";
Message::SendFail() << "Error in the STEPCAFControl_Provider during writing the file " <<
thePath << "\t: Incorrect or empty Configuration Node";
return false;
}
Handle(STEPCAFControl_ConfigurationNode) aNode =
Handle(STEPCAFControl_ConfigurationNode)::DownCast(GetNode());
STEPCAFControl_ParameterController aParamController(aNode, myToUpdateStaticParameters);
personizeWS(theWS);
XCAFDoc_DocumentTool::SetLengthUnit(theDocument,
aNode->GlobalParameters.LengthUnit,
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);
STEPCAFControl_Writer aWriter(theWS, Standard_True);
STEPControl_StepModelType aMode =
static_cast<STEPControl_StepModelType>(aNode->InternalParameters.WriteModelType);
STEPCAFControl_Writer aWriter;
if (!theWS.IsNull())
{
aWriter.Init(theWS);
}
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_ListOfAsciiString::Iterator anIter(aNode->InternalParameters.WriteLabels);
anIter.More(); anIter.Next())
TDF_Label aLabel;
if (!aWriter.Transfer(theDocument, aMode, 0, theProgress))
{
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 in the STEPCAFControl_Provider during writing the file " <<
thePath << "\t: The document cannot be translated or gives no result";
resetStatic();
return false;
}
IFSelect_ReturnStatus aStatus = aWriter.Write(thePath.ToCString());
switch (aStatus)
{
case IFSelect_RetVoid:
{
Message::SendFail() << "Error: No label for entry '" << aValue << "'";
Message::SendFail() << "Error in the STEPCAFControl_Provider during writing the file " <<
thePath << "\t: No file written";
resetStatic();
return false;;
}
case IFSelect_RetDone:
{
break;
}
default:
{
Message::SendFail() << "Error in the STEPCAFControl_Provider during writing the file " <<
thePath << "\t: Error on writing file";
resetStatic();
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::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";
return false;
}
if (thePath == ".")
{
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";
return false;
}
Message::SendInfo() << "STEP file [" << thePath << "] Successfully written";
myProcessedExtFiles = aWriter.ExternFiles();
resetStatic();
return true;
}
//=======================================================================
// function : Read
// purpose :
//=======================================================================
bool STEPCAFControl_Provider::Read(const TCollection_AsciiString& thePath,
const Handle(TDocStd_Document)& theDocument,
const Message_ProgressRange& theProgress)
{
Handle(XSControl_WorkSession) aWS;
return Read(thePath, theDocument, aWS, theProgress);
}
//=======================================================================
// function : Write
// purpose :
//=======================================================================
bool STEPCAFControl_Provider::Write(std::ostream& theOStream,
bool STEPCAFControl_Provider::Write(const TCollection_AsciiString& thePath,
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());
STEPCAFControl_ParameterController aParamController(aNode, myToUpdateStaticParameters);
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_ListOfAsciiString::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 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";
return false;
}
if (aWriter.WriteStream(theOStream) != IFSelect_RetDone)
{
Message::SendFail() << "Error: STEPCAFControl_Provider : Write to stream failed";
return false;
}
Message::SendInfo() << "STEP file to stream successfully written";
myProcessedExtFiles = aWriter.ExternFiles();
return true;
Handle(XSControl_WorkSession) aWS;
return Write(thePath, theDocument, aWS, theProgress);
}
//=======================================================================
@@ -617,74 +308,39 @@ bool STEPCAFControl_Provider::Read(const TCollection_AsciiString& thePath,
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: STEPCAFControl_Provider : "
<< "Incorrect or empty Configuration Node";
Message::SendFail() << "Error in the STEPCAFControl_Provider during reading the file " <<
thePath << "\t: Incorrect or empty Configuration Node";
return false;
}
Handle(STEPCAFControl_ConfigurationNode) aNode =
Handle(STEPCAFControl_ConfigurationNode)::DownCast(GetNode());
STEPCAFControl_ParameterController aParamController(aNode, myToUpdateStaticParameters);
personizeWS(theWS);
STEPControl_Reader aReader(theWS);
if (aReader.ReadFile(thePath.ToCString()) != IFSelect_RetDone)
Handle(STEPCAFControl_ConfigurationNode) aNode = Handle(STEPCAFControl_ConfigurationNode)::DownCast(GetNode());
initStatic(aNode);
STEPControl_Reader aReader;
if(!theWS.IsNull())
{
Message::SendFail() << "Error: STEPCAFControl_Provider : ["
<< thePath << "] : abandon, no model loaded";
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";
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";
return false;
}
theShape = aReader.OneShape();
return true;
}
//=======================================================================
// function : Read
// purpose :
//=======================================================================
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)))
{
Message::SendFail() << "Error: STEPCAFControl_Provider : "
<< "Incorrect or empty Configuration Node";
return false;
}
Handle(STEPCAFControl_ConfigurationNode) aNode =
Handle(STEPCAFControl_ConfigurationNode)::DownCast(GetNode());
STEPCAFControl_ParameterController aParamController(aNode, myToUpdateStaticParameters);
personizeWS(theWS);
STEPControl_Reader aReader(theWS);
if (aReader.ReadStream(theName.ToCString(), theIStream) != IFSelect_RetDone)
{
Message::SendFail() << "Error: STEPCAFControl_Provider : "
<< "Abandon, no model loaded from STEP stream";
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 : "
<< "Cannot read any relevant data from the STEP stream";
Message::SendFail() << "Error in the STEPCAFControl_Provider during reading the file " <<
thePath << "\t:Cannot read any relevant data from the STEP file";
resetStatic();
return false;
}
theShape = aReader.OneShape();
resetStatic();
return true;
}
@@ -697,94 +353,63 @@ 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: STEPCAFControl_Provider : "
<< "Incorrect or empty Configuration Node";
Message::SendFail() << "Error in the STEPCAFControl_Provider during reading the file " <<
thePath << "\t: Incorrect or empty Configuration Node";
return false;
}
Handle(STEPCAFControl_ConfigurationNode) aNode =
Handle(STEPCAFControl_ConfigurationNode)::DownCast(GetNode());
STEPCAFControl_ParameterController aParamController(aNode, myToUpdateStaticParameters);
personizeWS(theWS);
STEPControl_Writer aWriter(theWS, Standard_True);
Handle(StepData_StepModel) aModel = aWriter.Model();
Standard_Integer aNbEntities = (aModel.IsNull() ? 0 : aModel->NbEntities());
aModel->SetWriteLengthUnit(UnitsMethods::GetLengthUnitScale(
aNode->InternalParameters.WriteUnit,
UnitsMethods_LengthUnit_Millimeter));
IFSelect_ReturnStatus aWritestat =
aWriter.Transfer(theShape, aNode->InternalParameters.WriteModelType, true, theProgress);
if (aNbEntities > 0)
Handle(STEPCAFControl_ConfigurationNode) aNode = Handle(STEPCAFControl_ConfigurationNode)::DownCast(GetNode());
initStatic(aNode);
STEPControl_Writer aWriter;
if(!theWS.IsNull())
{
Message::SendTrace() << "STEPCAFControl_Provider : Model not empty before transferring";
aWriter.SetWS(theWS);
}
IFSelect_ReturnStatus aWritestat = IFSelect_RetVoid;
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);
if (aWritestat != IFSelect_RetDone)
{
Message::SendFail() << "Error: STEPCAFControl_Provider : "
<< "Can't translate shape to STEP model";
Message::SendFail() << "Error in the STEPCAFControl_Provider during reading the file " <<
thePath << "\t: abandon, no model loaded";
resetStatic();
return false;
}
if (thePath == ".")
{
Message::SendInfo() << "Step model has been translated into the session";
return true;
}
if (aWriter.Write(thePath.ToCString()) != IFSelect_RetDone)
{
Message::SendFail() << "Error: STEPCAFControl_Provider : "
<< "Can't write STEP file " << thePath;
Message::SendFail() << "STEPCAFControl_Provider: Error on writing file";
resetStatic();
return false;
}
resetStatic();
return true;
}
//=======================================================================
// function : Read
// purpose :
//=======================================================================
bool STEPCAFControl_Provider::Read(const TCollection_AsciiString& thePath,
TopoDS_Shape& theShape,
const Message_ProgressRange& theProgress)
{
Handle(XSControl_WorkSession) aWS;
return Read(thePath, theShape, aWS, theProgress);
}
//=======================================================================
// function : Write
// purpose :
//=======================================================================
bool STEPCAFControl_Provider::Write(std::ostream& theOStream,
bool STEPCAFControl_Provider::Write(const TCollection_AsciiString& thePath,
const TopoDS_Shape& theShape,
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());
STEPCAFControl_ParameterController aParamController(aNode, myToUpdateStaticParameters);
personizeWS(theWS);
STEPControl_Writer aWriter(theWS, Standard_True);
Handle(StepData_StepModel) aModel = aWriter.Model();
Standard_Integer aNbEntities = (aModel.IsNull() ? 0 : aModel->NbEntities());
aModel->SetWriteLengthUnit(UnitsMethods::GetLengthUnitScale(
aNode->InternalParameters.WriteUnit,
UnitsMethods_LengthUnit_Millimeter));
IFSelect_ReturnStatus aWritestat =
aWriter.Transfer(theShape, aNode->InternalParameters.WriteModelType, true, theProgress);
if (aNbEntities > 0)
{
Message::SendTrace() << "STEPCAFControl_Provider : Model not empty before transferring";
}
if (aWritestat != IFSelect_RetDone)
{
Message::SendFail() << "Error: STEPCAFControl_Provider : "
<< "Can't translate shape to STEP model";
return false;
}
if (aWriter.WriteStream(theOStream) != IFSelect_RetDone)
{
Message::SendFail() << "Error: STEPCAFControl_Provider : "
<< "Can't write STEP to stream";
return false;
}
return true;
Handle(XSControl_WorkSession) aWS;
return Write(thePath, theShape, aWS, theProgress);
}
//=======================================================================

View File

@@ -16,7 +16,6 @@
#include <DE_Provider.hxx>
#include <STEPCAFControl_ConfigurationNode.hxx>
#include <STEPCAFControl_ExternFile.hxx>
//! The class to transfer STEP files.
//! Reads and Writes any STEP files into/from OCCT.
@@ -55,19 +54,6 @@ 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
@@ -79,16 +65,23 @@ 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] theOStream stream to export STEP data
//! @param[in] thePath path to the export CAD file
//! @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(std::ostream& theOStream,
Standard_EXPORT virtual bool Write(const TCollection_AsciiString& thePath,
const Handle(TDocStd_Document)& theDocument,
Handle(XSControl_WorkSession)& theWS,
const Message_ProgressRange& theProgress = Message_ProgressRange());
const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
//! Reads a CAD file, according internal configuration
//! @param[in] thePath path to the import CAD file
@@ -101,19 +94,6 @@ 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
@@ -125,16 +105,23 @@ 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] theOStream stream to export STEP data
//! @param[in] thePath path to the export CAD file
//! @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(std::ostream& theOStream,
Standard_EXPORT virtual bool Write(const TCollection_AsciiString& thePath,
const TopoDS_Shape& theShape,
Handle(XSControl_WorkSession)& theWS,
const Message_ProgressRange& theProgress = Message_ProgressRange());
const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE;
public:
@@ -146,34 +133,18 @@ public:
//! @return provider's vendor name
Standard_EXPORT virtual TCollection_AsciiString GetVendor() const Standard_OVERRIDE;
public:
private:
//! Sets parameter to update static parameter, that true by default
void SetToUpdateStaticParameters(const bool theToUpdate) { myToUpdateStaticParameters = theToUpdate; }
//! Initialize static variables
void initStatic(const Handle(DE_ConfigurationNode)& theNode);
//! Gets parameter to update static parameter, that true by default
bool ToUpdateStaticParameters() const { return myToUpdateStaticParameters; }
//! Initialize static variables
void setStatic(const STEPCAFControl_ConfigurationNode::STEPCAFControl_InternalSection theParameter);
public:
//! Reset used interface static variables
void resetStatic();
//! Gets external files used in the last read or write process.
//! Processed only on multifile setting up
NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)> GetExternalFiles() const
{
return myProcessedExtFiles;
}
private:
//! Personizes work session with current format.
//! Creates new temporary session if current session is null
//! @param[in] theWS current work session
void personizeWS(Handle(XSControl_WorkSession)& theWS);
private:
bool myToUpdateStaticParameters = true; //!< Flag to updating static parameters
NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)> myProcessedExtFiles; //!< External files from the last operation
STEPCAFControl_ConfigurationNode::STEPCAFControl_InternalSection myOldValues;
};

View File

@@ -4692,9 +4692,16 @@ void collectRepresentationItems(const Interface_Graph& theGraph,
const Handle(StepShape_ShapeRepresentation)& theRepresentation,
NCollection_Sequence<Handle(StepRepr_RepresentationItem)>& theItems)
{
Handle(StepRepr_HArray1OfRepresentationItem) aReprItems = theRepresentation->Items();
for (Standard_Integer itemIt = aReprItems->Lower(); itemIt <= aReprItems->Upper(); itemIt++)
theItems.Append(aReprItems->Value(itemIt));
for (StepRepr_HArray1OfRepresentationItem::Iterator anIter(theRepresentation->Items()->Array1());
anIter.More(); anIter.Next())
{
const Handle(StepRepr_RepresentationItem)& anReprItem = anIter.Value();
if (anReprItem.IsNull())
{
continue;
}
theItems.Append(anReprItem);
}
Interface_EntityIterator entIt = theGraph.TypedSharings(theRepresentation, STANDARD_TYPE(StepRepr_RepresentationRelationship));
for (entIt.Start(); entIt.More(); entIt.Next())

View File

@@ -47,7 +47,9 @@ class TopoDS_Shape;
//! Also supports multifile writing
class STEPCAFControl_Writer
{
public:
DEFINE_STANDARD_ALLOC
public:
//! Creates a writer with an empty

View File

@@ -83,6 +83,51 @@ void SelectMgr_EntityOwner::HilightWithColor (const Handle(PrsMgr_PresentationMa
}
}
// =======================================================================
// function : Select
// purpose :
// =======================================================================
Standard_Boolean SelectMgr_EntityOwner::Select (const AIS_SelectionScheme theSelScheme,
const Standard_Boolean theIsDetected) const
{
switch (theSelScheme)
{
case AIS_SelectionScheme_UNKNOWN:
{
return myIsSelected;
}
case AIS_SelectionScheme_Replace:
{
return theIsDetected;
}
case AIS_SelectionScheme_Add:
{
return !myIsSelected || theIsDetected || IsForcedHilight();
}
case AIS_SelectionScheme_Remove:
{
return myIsSelected && !theIsDetected;
}
case AIS_SelectionScheme_XOR:
{
if (theIsDetected)
{
return !myIsSelected && !IsForcedHilight();
}
return myIsSelected;
}
case AIS_SelectionScheme_Clear:
{
return Standard_False;
}
case AIS_SelectionScheme_ReplaceExtra:
{
return theIsDetected;
}
}
return Standard_False;
}
// =======================================================================
// function : DumpJson
// purpose :

View File

@@ -17,6 +17,7 @@
#ifndef _SelectMgr_EntityOwner_HeaderFile
#define _SelectMgr_EntityOwner_HeaderFile
#include <AIS_SelectionScheme.hxx>
#include <Aspect_VKey.hxx>
#include <PrsMgr_PresentationManager.hxx>
#include <SelectMgr_SelectableObject.hxx>
@@ -139,6 +140,12 @@ public:
//! @param theIsSelected [in] shows if owner is selected.
void SetSelected (const Standard_Boolean theIsSelected) { myIsSelected = theIsSelected; }
//! If the object needs to be selected, it returns true.
//! @param[in] theSelScheme selection scheme
//! @param[in] theIsDetected flag of object detection
Standard_EXPORT Standard_Boolean Select (const AIS_SelectionScheme theSelScheme,
const Standard_Boolean theIsDetected) const;
//! Returns selection state.
Standard_DEPRECATED ("Deprecated method - IsSelected() should be used instead")
Standard_Integer State() const { return myIsSelected ? 1 : 0; }

View File

@@ -112,18 +112,20 @@ Standard_Boolean ShapeFix_Shape::Perform(const Message_ProgressRange& theProgres
TopLoc_Location nullLoc,L;
L = myShape.Location();
TopoDS_Shape aShapeNullLoc = myShape;
const Standard_Boolean aIsRecorded = Context()->IsNewShape(myShape);
aShapeNullLoc.Location(nullLoc);
if(myMapFixingShape.Contains(aShapeNullLoc)) {
if(aIsRecorded || myMapFixingShape.Contains(aShapeNullLoc))
{
myShape.Location(L, Standard_False);
myResult = Context()->Apply(myShape);
status = Standard_True;
return status;
}
else myMapFixingShape.Add(aShapeNullLoc);
myMapFixingShape.Add(aShapeNullLoc);
//---------------------------------------
myShape.Location(L, Standard_False);
TopoDS_Shape S = Context()->Apply(myShape);
if ( NeedFix ( myFixVertexPositionMode ) )
if (NeedFix(myFixVertexPositionMode))
ShapeFix::FixVertexPosition(S,Precision(),Context());
st = S.ShapeType();

View File

@@ -267,7 +267,7 @@ public:
//! Performs an analysis and reorders edges in the wire using class WireOrder.
//! Flag <theModeBoth> determines the use of miscible mode if necessary.
Standard_EXPORT Standard_Boolean FixReorder(Standard_Boolean theModeBoth = Standard_False);
Standard_EXPORT Standard_Boolean FixReorder(Standard_Boolean theModeBoth = Standard_True);
//! Applies FixSmall(num) to all edges in the wire
Standard_EXPORT Standard_Integer FixSmall (const Standard_Boolean lockvtx, const Standard_Real precsmall = 0.0);

View File

@@ -174,7 +174,7 @@ void TopoDSToStep_MakeStepWire::Init (const TopoDS_Wire& aWire,
const TopoDS_Wire ForwardWire = TopoDS::Wire (aWire.Oriented (TopAbs_FORWARD));
Handle(ShapeFix_Wire) STW = new ShapeFix_Wire (ForwardWire, aTool.CurrentFace(), Precision::Confusion());
// for toroidal like surfaces we need to use both (3d and 2d) mode to correctly reorder the edges
STW->FixReorder (Standard_True);
STW->FixReorder ();
Handle(ShapeExtend_WireData) anExtWire = STW->WireData();
//:abv 04.05.00: CAX-IF TRJ4: writing complete sphere with single vertex_loop

View File

@@ -51,6 +51,30 @@ 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 " <<
@@ -94,10 +118,8 @@ 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)))
{
@@ -130,6 +152,30 @@ 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)))
{
@@ -225,13 +271,12 @@ 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)
{
Handle(TDocStd_Document) aDoc = new TDocStd_Document("BinXCAF");
Handle(XCAFDoc_ShapeTool) aShTool = XCAFDoc_DocumentTool::ShapeTool(aDoc->Main());
aShTool->AddShape(theShape);
return Write(thePath, aDoc, theWS, theProgress);
return Write(thePath, aDoc, theProgress);
}
//=======================================================================

View File

@@ -64,6 +64,24 @@ 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
@@ -86,6 +104,24 @@ 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

File diff suppressed because it is too large Load Diff

View File

@@ -82,103 +82,131 @@ void XSAlgo_AlgoContainer::PrepareForTransfer() const
//=======================================================================
//function : ProcessShape
//purpose :
//purpose :
//=======================================================================
TopoDS_Shape XSAlgo_AlgoContainer::ProcessShape (const TopoDS_Shape& shape,
const Standard_Real Prec,
const Standard_Real maxTol,
const Standard_CString prscfile,
const Standard_CString pseq,
Handle(Standard_Transient)& info,
const Message_ProgressRange& theProgress,
const Standard_Boolean NonManifold) const
TopoDS_Shape XSAlgo_AlgoContainer::ProcessShape(const TopoDS_Shape& theShape,
const Standard_Real thePrec,
const Standard_Real theMaxTol,
const Standard_CString thePrscfile,
const Standard_CString thePseq,
Handle(Standard_Transient)& theInfo,
const Handle(ShapeBuild_ReShape)& theReShape,
const Message_ProgressRange& theProgress,
const Standard_Boolean theNonManifold) const
{
if ( shape.IsNull() ) return shape;
Handle(ShapeProcess_ShapeContext) context = Handle(ShapeProcess_ShapeContext)::DownCast(info);
if ( context.IsNull() )
if (theShape.IsNull())
{
Standard_CString rscfile = Interface_Static::CVal(prscfile);
if (rscfile != nullptr && strlen (rscfile) == 0)
return theShape;
}
Handle(ShapeProcess_ShapeContext) aContext = Handle(ShapeProcess_ShapeContext)::DownCast(theInfo);
if (aContext.IsNull())
{
Standard_CString aRscfile = Interface_Static::CVal(thePrscfile);
if (aRscfile != nullptr && strlen(aRscfile) == 0)
{
context = new ShapeProcess_ShapeContext(shape, nullptr);
Interface_Static::FillMap(context->ResourceManager()->GetMap());
aContext = new ShapeProcess_ShapeContext(theShape, nullptr);
Interface_Static::FillMap(aContext->ResourceManager()->GetMap());
}
else
{
if (!rscfile)
rscfile = prscfile;
context = new ShapeProcess_ShapeContext(shape, rscfile);
if (!aRscfile)
aRscfile = thePrscfile;
aContext = new ShapeProcess_ShapeContext(theShape, aRscfile);
}
context->SetDetalisation(TopAbs_EDGE);
aContext->SetDetalisation(TopAbs_EDGE);
}
context->SetNonManifold(NonManifold);
info = context;
Standard_CString seq = Interface_Static::CVal ( pseq );
if ( ! seq ) seq = pseq;
aContext->SetNonManifold(theNonManifold);
theInfo = aContext;
Standard_CString aSeq = Interface_Static::CVal(thePseq);
if (!aSeq) aSeq = thePseq;
// if resource file is not loaded or does not define <seq>.exec.op,
// do default fixes
Handle(Resource_Manager) rsc = context->ResourceManager();
TCollection_AsciiString str ( seq );
str += ".exec.op";
if ( ! rsc->Find ( str.ToCString() ) ) {
Handle(Resource_Manager) aRsc = aContext->ResourceManager();
TCollection_AsciiString aStr(aSeq);
aStr += ".exec.op";
if (!aRsc->Find(aStr.ToCString()))
{
#ifdef OCCT_DEBUG
{
static Standard_Integer time = 0;
if ( ! time )
std::cout << "Warning: XSAlgo_AlgoContainer::ProcessShape(): Sequence " << str.ToCString() <<
" is not defined in " << prscfile << " resource; do default processing" << std::endl;
time++;
static Standard_Integer aTime = 0;
if (!aTime)
std::cout << "Warning: XSAlgo_AlgoContainer::ProcessShape(): Sequence " << aStr.ToCString() <<
" is not defined in " << thePrscfile << " resource; do default processing" << std::endl;
aTime++;
}
#endif
// if reading, do default ShapeFix
if ( ! strncmp ( pseq, "read.", 5 ) ) {
if (!strncmp(thePseq, "read.", 5))
{
try {
OCC_CATCH_SIGNALS
Handle(ShapeExtend_MsgRegistrator) msg = new ShapeExtend_MsgRegistrator;
Handle(ShapeFix_Shape) sfs = ShapeAlgo::AlgoContainer()->ToolContainer()->FixShape();
sfs->Init ( shape );
sfs->SetMsgRegistrator ( msg );
sfs->SetPrecision ( Prec );
sfs->SetMaxTolerance ( maxTol );
sfs->FixFaceTool()->FixWireTool()->FixSameParameterMode() = Standard_False;
sfs->FixSolidTool()->CreateOpenSolidMode() = Standard_False;
sfs->Perform(theProgress);
Handle(ShapeExtend_MsgRegistrator) aMsg = new ShapeExtend_MsgRegistrator;
Handle(ShapeFix_Shape) aSfs = ShapeAlgo::AlgoContainer()->ToolContainer()->FixShape();
aSfs->Init(theShape);
aSfs->SetMsgRegistrator(aMsg);
aSfs->SetPrecision(thePrec);
aSfs->SetMaxTolerance(theMaxTol);
aSfs->FixFaceTool()->FixWireTool()->FixSameParameterMode() = Standard_False;
aSfs->FixSolidTool()->CreateOpenSolidMode() = Standard_False;
aSfs->SetContext(theReShape);
aSfs->Perform(theProgress);
TopoDS_Shape S = sfs->Shape();
if ( ! S.IsNull() && S != shape ) {
context->RecordModification ( sfs->Context(), msg );
context->SetResult ( S );
}
TopoDS_Shape aShape = aSfs->Shape();
if (!aShape.IsNull() && aShape != theShape)
{
aContext->RecordModification(aSfs->Context(), aMsg);
aContext->SetResult(aShape);
}
}
catch (Standard_Failure const& anException) {
catch (Standard_Failure const& anException)
{
#ifdef OCCT_DEBUG
std::cout << "Error: XSAlgo_AlgoContainer::ProcessShape(): Exception in ShapeFix::Shape" << std::endl;
std::cout << "Error: XSAlgo_AlgoContainer::ProcessShape(): Exception in ShapeFix::Shape" << std::endl;
anException.Print(std::cout); std::cout << std::endl;
#endif
(void)anException;
(void)anException;
}
return context->Result();
return aContext->Result();
}
// for writing, define default sequence of DirectFaces
else if ( ! strncmp ( pseq, "write.", 6 ) ) {
rsc->SetResource ( str.ToCString(), "DirectFaces" );
else if (!strncmp(thePseq, "write.", 6))
{
aRsc->SetResource(aStr.ToCString(), "DirectFaces");
}
}
// Define runtime tolerances and do Shape Processing
rsc->SetResource ( "Runtime.Tolerance", Prec );
rsc->SetResource ( "Runtime.MaxTolerance", maxTol );
aRsc->SetResource("Runtime.Tolerance", thePrec);
aRsc->SetResource("Runtime.MaxTolerance", theMaxTol);
if ( !ShapeProcess::Perform(context, seq, theProgress) )
return shape; // return original shape
if (!ShapeProcess::Perform(aContext, aSeq, theProgress))
return theShape; // return original shape
return context->Result();
return aContext->Result();
}
//=======================================================================
//function : ProcessShape
//purpose :
//=======================================================================
TopoDS_Shape XSAlgo_AlgoContainer::ProcessShape(const TopoDS_Shape& theShape,
const Standard_Real thePrec,
const Standard_Real theMaxTol,
const Standard_CString thePrscfile,
const Standard_CString thePseq,
Handle(Standard_Transient)& theInfo,
const Message_ProgressRange& theProgress,
const Standard_Boolean theNonManifold) const
{
Handle(ShapeBuild_ReShape) aReShape = new ShapeBuild_ReShape();
return ProcessShape(theShape, thePrec, theMaxTol, thePrscfile,
thePseq, theInfo, aReShape, theProgress,
theNonManifold);
}
//=======================================================================
//function : PerformFixShape
//purpose :

View File

@@ -23,6 +23,7 @@
#include <Standard_Integer.hxx>
#include <Message_ProgressRange.hxx>
class ShapeBuild_ReShape;
class XSAlgo_ToolContainer;
class TopoDS_Shape;
class TopoDS_Edge;
@@ -30,7 +31,6 @@ class TopoDS_Face;
class Transfer_TransientProcess;
class Transfer_FinderProcess;
class XSAlgo_AlgoContainer;
DEFINE_STANDARD_HANDLE(XSAlgo_AlgoContainer, Standard_Transient)
@@ -55,16 +55,44 @@ public:
Standard_EXPORT virtual void PrepareForTransfer() const;
//! Does shape processing with specified tolerances
//! and returns resulting shape and associated information
//! in the form of Transient.
//! This information should be later transmitted to
//! MergeTransferInfo in order to be recorded in the
//! translation map
Standard_EXPORT virtual TopoDS_Shape ProcessShape (
const TopoDS_Shape& shape, const Standard_Real Prec, const Standard_Real MaxTol,
const Standard_CString rscfile, const Standard_CString seq, Handle(Standard_Transient)& info,
const Message_ProgressRange& theProgress = Message_ProgressRange(),
const Standard_Boolean NonManifold = Standard_False) const;
//! @param[in] theShape shape to process
//! @param[in] thePrec basic precision and tolerance
//! @param[in] theMaxTol maximum allowed tolerance
//! @param[in] thePrscfile name of the resource file
//! @param[in] thePseq name of the sequence of operators defined in the resource file for Shape Processing
//! @param[out] theInfo information to be recorded in the translation map
//! @param[in] theProgress progress indicator
//! @param[in] theNonManifold flag to proceed with non-manifold topology
//! @return the processed shape
Standard_EXPORT virtual TopoDS_Shape ProcessShape (const TopoDS_Shape& theShape,
const Standard_Real thePrec,
const Standard_Real theMaxTol,
const Standard_CString thePrscfile,
const Standard_CString thePseq,
Handle(Standard_Transient)& theInfo,
const Message_ProgressRange& theProgress = Message_ProgressRange(),
const Standard_Boolean theNonManifold = Standard_False) const;
//! Does shape processing with specified tolerances
//! @param[in] theShape shape to process
//! @param[in] thePrec basic precision and tolerance
//! @param[in] theMaxTol maximum allowed tolerance
//! @param[in] thePrscfile name of the resource file
//! @param[in] thePseq name of the sequence of operators defined in the resource file for Shape Processing
//! @param[out] theInfo information to be recorded in the translation map
//! @param[in] theReShape tool to record the modifications of input shape
//! @param[in] theProgress progress indicator
//! @param[in] theNonManifold flag to proceed with non-manifold topology
//! @return the processed shape
Standard_EXPORT virtual TopoDS_Shape ProcessShape(const TopoDS_Shape& theShape,
const Standard_Real thePrec,
const Standard_Real theMaxTol,
const Standard_CString thePrscfile,
const Standard_CString thePseq,
Handle(Standard_Transient)& theInfo,
const Handle(ShapeBuild_ReShape)& theReShape,
const Message_ProgressRange& theProgress = Message_ProgressRange(),
const Standard_Boolean theNonManifold = Standard_False) const;
//! Checks quality of pcurve of the edge on the given face,
//! and corrects it if necessary.

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,3 @@
puts "TODO CR23671 Linux: Error"
puts "TODO CR23671 Linux: Draw_Failure: Could not open"
puts "============"
puts "CR23671"
puts "============"

View File

@@ -1,4 +1,4 @@
puts "TODO OCC23638 ALL: Faulty shapes in variables faulty_1 to faulty_"
puts "TODO OCC23638 ALL: Faulty shapes in variables faulty_1 to faulty_1"
puts "============"
puts "CR23638"
@@ -8,8 +8,6 @@ puts ""
# Reading IGES file produced invalid shape
#######################################################################
param read.surfacecurve.mode -3
igesread [locate_data_file bug23638_cadbad.igs] result *
checkshape result

16
tests/bugs/iges/bug33327 Normal file
View File

@@ -0,0 +1,16 @@
puts "============"
puts "0033327: Data Exchange, IGES Import - SubfigureDef can't read string"
puts "============"
pload DCAF
Close D -silent
ReadIges D [locate_data_file "bug33327.igs"]
vclear
vinit View1
XDisplay -dispMode 1 D
vfit
vdump "$imagedir/${casename}_src.png"
Close D

View File

@@ -0,0 +1,15 @@
puts "============"
puts "0033264: Modeling Algorithms - Result of section operation is incomplete"
puts "============"
puts ""
restore [locate_data_file bug33264_1.brep] srf1
restore [locate_data_file bug33264_2.brep] srf2
bsection res srf1 srf2
checknbshapes res -vertex 44 -edge 43
checkprops res -l 51.3377
checksection res
checkview -display res -2d -path ${imagedir}/${test_image}.png

14
tests/bugs/step/bug33331 Normal file
View File

@@ -0,0 +1,14 @@
puts "===================================="
puts "0033331: Data Exchange, Step Import - Unsupported Representation Items"
puts "===================================="
puts ""
pload DCAF
catch {Close D}
param "read.stepcaf.subshapes.name" 1
ReadStep D [locate_data_file bug33331.stp]
param "read.stepcaf.subshapes.name" 0
Close D

View File

@@ -1,6 +1,6 @@
# !!!! This file is generated automatically, do not edit manually! See end script
puts "TODO CR00000 ALL: Error: First - file was not read - exception "
puts "TODO CR00000 ALL: Error : Here is reading problem"
puts "TODO CR00000 ALL: Error: STEPCAFControl_Provider"
puts "TODO CR23096 ALL: Error: First - file was not read - exception "
puts "TODO CR23096 ALL: Error : Here is reading problem"
set filename tr9_r0301-pe-adjusted.stp

View File

@@ -1,7 +1,6 @@
# !!!! This file is generated automatically, do not edit manually! See end script
puts "TODO CR00000 ALL: Error: First - file was not read - exception "
puts "TODO CR00000 ALL: Error : Here is reading problem"
puts "TODO CR00000 ALL: Error: STEPCAFControl_Provider"
puts "TODO CR23096 ALL: Error: First - file was not read - exception "
puts "TODO CR23096 ALL: Error : Here is reading problem"
set filename buc60990.stp

View File

@@ -2,7 +2,9 @@ puts "========"
puts "0030691: test glTF reader on standard sample models"
puts "========"
set anAssetInfo [ReadGltf D [locate_data_file bug30691_DamagedHelmet.gltf] -assetInfo]
ReadGltf D [locate_data_file bug30691_DamagedHelmet.gltf]
set anAssetInfo [ReadGltf [locate_data_file bug30691_DamagedHelmet.gltf] -assetInfo]
if { "$anAssetInfo" != "generator: Khronos Blender glTF 2.0 exporter" } { puts "Error: unexpected asset info" }
XGetOneShape s D

View File

@@ -49,12 +49,7 @@ set fd [open ${imagedir}/${casename}_zero_ascii_dos.stl w]
fconfigure $fd -translation crlf
puts $fd "solid \nendsolid"
close $fd
puts "REQUIRED ALL: Error: RWStl_Provider :"
catch {
if {[readstl res_zero_ascii_dos ${imagedir}/${casename}_zero_ascii_dos.stl -brep]} {
puts "Error: empty file should be marked as invalid input file"
}
}
readstl res_zero_ascii_dos ${imagedir}/${casename}_zero_ascii_dos.stl -brep
puts "\n#======================================================================"
puts "# Ascii file with no facets, LF"
@@ -63,11 +58,7 @@ set fd [open ${imagedir}/${casename}_zero_ascii_unix.stl w]
fconfigure $fd -translation lf
puts $fd "solid \nendsolid"
close $fd
catch {
if {[readstl res_zero_ascii_unix ${imagedir}/${casename}_zero_ascii_unix.stl -brep] != 1} {
puts "Error: empty file should be marked as invalid input file"
}
}
readstl res_zero_ascii_unix ${imagedir}/${casename}_zero_ascii_unix.stl -brep
puts "\n#======================================================================"
puts "# Binary file with single facet"
@@ -88,11 +79,7 @@ set fd [open ${imagedir}/${casename}_zero_binary.stl w]
fconfigure $fd -translation binary
puts -nonewline $fd "stl [string repeat { } 76][binary format i 0]"
close $fd
catch {
if {[readstl res_zero_binary ${imagedir}/${casename}_zero_binary.stl -brep] != 1} {
puts "Error: empty file should be marked as invalid input file"
}
}
readstl res_zero_binary ${imagedir}/${casename}_zero_binary.stl -brep
puts "\n#======================================================================"
puts "# Empty file"
@@ -100,9 +87,5 @@ puts "#======================================================================"
puts "REQUIRED ALL: Error: premature end of file"
set fd [open ${imagedir}/${casename}_empty.stl w]
close $fd
catch {
if {[readstl res_empty ${imagedir}/${casename}_empty.stl -brep] != 1} {
puts "Error: empty file should be marked as invalid input file"
}
}
readstl res_empty ${imagedir}/${casename}_empty.stl -brep

View File

@@ -53,9 +53,7 @@ provider.STEP.OCC.write.product.name :
provider.STEP.OCC.write.surfacecurve.mode : 1
provider.STEP.OCC.write.unit : 2
provider.STEP.OCC.write.resource.name : STEP
provider.STEP.OCC.write.multi.prefix :
provider.STEP.OCC.write.sequence : ToSTEP
provider.STEP.OCC.write.labels :
provider.STEP.OCC.write.vertex.mode : 0
provider.STEP.OCC.write.stepcaf.subshapes.name : 0
provider.STEP.OCC.write.color : 1
@@ -70,14 +68,13 @@ provider.VRML.OCC.read.fill.incomplete : 1
provider.VRML.OCC.writer.version : 2
provider.VRML.OCC.write.representation.type : 1
provider.STL.OCC.read.merge.angle : 90
provider.STL.OCC.read.brep : 1
provider.STL.OCC.read.brep : 0
provider.STL.OCC.write.ascii : 1
provider.OBJ.OCC.file.length.unit : 1
provider.OBJ.OCC.system.cs : 0
provider.OBJ.OCC.file.cs : 1
provider.OBJ.OCC.read.single.precision : 0
provider.OBJ.OCC.read.create.shapes : 0
provider.OBJ.OCC.read.create.single : 0
provider.OBJ.OCC.read.root.prefix :
provider.OBJ.OCC.read.fill.doc : 1
provider.OBJ.OCC.read.fill.incomplete : 1
@@ -105,19 +102,10 @@ provider.GLTF.OCC.write.author :
provider.GLTF.OCC.write.trsf.format : 0
provider.GLTF.OCC.write.node.name.format : 3
provider.GLTF.OCC.write.mesh.name.format : 1
provider.GLTF.OCC.write.draco.compression : 0
provider.GLTF.OCC.write.draco.level : 7
provider.GLTF.OCC.write.draco.position.bits : 14
provider.GLTF.OCC.write.draco.normal.bits : 10
provider.GLTF.OCC.write.draco.texture.bits : 12
provider.GLTF.OCC.write.draco.color.bits : 8
provider.GLTF.OCC.write.draco.generic.bits : 12
provider.GLTF.OCC.write.draco.unified.quantization : 0
provider.GLTF.OCC.write.forced.uv.export : 0
provider.GLTF.OCC.write.embed.textures.in.glb : 1
provider.GLTF.OCC.write.merge.faces : 0
provider.GLTF.OCC.write.split.indices16 : 0
provider.GLTF.OCC.write.parallel : 0
provider.BREP.OCC.write.binary : 1
provider.BREP.OCC.write.version.binary : 4
provider.BREP.OCC.write.version.ascii : 3

View File

@@ -53,9 +53,7 @@ provider.STEP.OCC.write.product.name :
provider.STEP.OCC.write.surfacecurve.mode : 1
provider.STEP.OCC.write.unit : 2
provider.STEP.OCC.write.resource.name : STEP
provider.STEP.OCC.write.multi.prefix :
provider.STEP.OCC.write.sequence : ToSTEP
provider.STEP.OCC.write.labels :
provider.STEP.OCC.write.vertex.mode : 0
provider.STEP.OCC.write.stepcaf.subshapes.name : 0
provider.STEP.OCC.write.color : 1

View File

@@ -96,7 +96,7 @@ if [catch {ReadFile D7 $write_path -conf "global.general.length.unit : 0.0254 "}
}
XGetOneShape S7 D7
array set areas {0 11995.4 1 0.0119954 2 11979.2 3 11979.2 4 11979.2 5 0.0119792 6 11979.2 7 18.5678}
array set areas {0 11995.4 1 0.0119954 2 47916.8 3 11979.2 4 0.0479168 5 0.0119792 6 47916.8 7 18.5678}
array set results {0 S0 1 S1 2 S2 3 S3 4 S4 5 S5 6 S6 7 S7}
for { set anind 0} { $anind < 8 } { incr anind } {
checkprops $results($anind) -s $areas($anind) -eps 1e-2

View File

@@ -52,7 +52,7 @@ if [catch {readfile S5 $filename -conf "global.general.length.unit : 1000 "} cat
puts "OK : Reading is correct"
}
array set areas {0 1.21752e+13 1 1.21752e+07 2 1.21752e+13 3 1.21752e+07 4 1.21752e+13 5 1.21752e+07}
array set areas {0 1.21752e+07 1 1.21752e+07 2 1.21752e+13 3 1.21752e+07 4 1.21752e+13 5 1.21752e+07}
array set results {0 res0 1 res1 2 S2 3 S3 4 S4 5 S5}
for { set anind 0} { $anind < 6 } { incr anind } {
checkprops $results($anind) -s $areas($anind) -eps 1e-2

View File

@@ -96,7 +96,7 @@ if [catch {ReadFile D7 $write_path -conf "global.general.length.unit : 1000 "} c
}
XGetOneShape S7 D7
array set areas {0 1.21752e+13 1 12.1752 2 1.21752e+13 3 1.21752e+13 4 12.1752 5 12.1752 6 1.21752e+13 7 1.21773e-05}
array set areas {0 1.21752e+07 1 12.1752 2 1.21752e+07 3 1.21752e+07 4 12.1752 5 12.1752 6 1.21752e+07 7 1.21773e-05}
array set results {0 S0 1 S1 2 S2 3 S3 4 S4 5 S5 6 S6 7 S7}
for { set anind 0} { $anind < 8 } { incr anind } {
checkprops $results($anind) -s $areas($anind) -eps 1e-2