The existing data files in standard formats can be converted using OCCT 6.9.1 or a previous version, as follows.
+@note Reading / writing custom files capability from OCCT 6.9.1 is restored in OCCT 7.2.0. See details in @ref upgrade_720_persistence section.
+
#### CSFDB files
Files in *CSFDB* format (usually with extension .csfdb) contain OCCT shape data that can be converted to BRep format.
* The package *TestTopOpeDraw* has been removed;
* The package *TestTopOpeTools* has been removed.
* The packages *QANewModTopOpe*, *QANewBRepNaming* and *QANewDBRepNaming* have been removed as containing obsolete features.
+* The following methods of the *IntPolyh_Triangle* class have been removed as unused:
+ - *CheckCommonEdge*
+ - *SetEdgeandOrientation*
+ - *MultipleMiddleRefinement2*.
+* The method *IntPolyh_Triangle::TriangleDeflection* has been renamed to *IntPolyh_Triangle::ComputeDeflection*.
+* The following methods of the *IntPolyh_MaillageAffinage* class have been removed as unused:
+ - *LinkEdges2Triangles*;
+ - *TriangleEdgeContact2*;
+ - *StartingPointsResearch2*;
+ - *NextStartingPointsResearch2*;
+ - *TriangleComparePSP*;
+ - *StartPointsCalcul*.
@subsection upgrade_occt720_correction_of_Offset_API Corrections in BRepOffset API
@subsection upgrade_720_Removal_Of_Old_Boolean_Operations_Draw Removal of the Draw commands based on old Boolean operations
* The commands *fubl* and *cubl* have been removed. The alternative for these commands are the commands *bfuseblend* and *bcutblend* respectively.
-* The command *ksection* has been removed. The alternative for this command is the command *bsection*.
\ No newline at end of file
+* The command *ksection* has been removed. The alternative for this command is the command *bsection*.
+
+@subsection upgrade_720_Change_Of_FaceFace_Intersection Change of Face/Face intersection in Boolean operations
+
+* Previously, the intersection tolerance for all section curves between pair of faces has been calculated as the maximal tolerance among all curves.
+ Now, each curve has its own valid tolerance calculated as the maximal deviation of the 3D curve from its 2D curves or surfaces in case there are no 2D curves.
+* The methods *IntTools_FaceFace::TolReached3d()*, *IntTools_FaceFace::TolReal()* and *IntTools_FaceFace::TolReached2d()* have been removed.
+* Intersection tolerances of the curve can be obtained from the curve itself:
+ - *IntTools_Curve::Tolerance()* - returns the valid tolerance for the curve;
+ - *IntTools_Curve::TangentialTolerance()* - returns the tangential tolerance, which reflects the size of the common between faces.
+* 2d tolerance (*IntTools_FaceFace::TolReached2d()*) has been completely removed from the algorithm as unused.
+
+
+@subsection upgrade_720_persistence Restore OCCT 6.9.1 persistence
+
+The capability of reading / writing files in old format using *Storage_ShapeSchema* functionality from OCCT 6.9.1 has been restored in OCCT 7.2.0.
+
+One can use this functionality in two ways:
+- invoke DRAW Test Harness commands *fsdread / fsdwrite* for shapes;
+- call *StdStorage* class *Read / Write* functions in custom code.
+
+The code example below demonstrates how to read shapes from a storage driver using *StdStorage* class.
+
+~~~~
+// aDriver should be created and opened for reading
+Handle(StdStorage_Data) aData;
+
+// Read data from the driver
+// StdStorage::Read creates aData instance automatically if it is null
+Storage_Error anError = StdStorage::Read(*aDriver, aData);
+if (anError != Storage_VSOk)
+{
+ // Error processing
+}
+
+// Get root objects
+Handle(StdStorage_RootData) aRootData = aData->RootData();
+Handle(StdStorage_HSequenceOfRoots) aRoots = aRootData->Roots();
+if (!aRoots.IsNull())
+{
+ // Iterator over the sequence of root objects
+ for (StdStorage_HSequenceOfRoots::Iterator anIt(*aRoots); anIt.More(); anIt.Next())
+ {
+ Handle(StdStorage_Root)& aRoot = anIt.ChangeValue();
+ // Get a persistent root's object
+ Handle(StdObjMgt_Persistent) aPObject = aRoot->Object();
+ if (!aPObject.IsNull())
+ {
+ Handle(ShapePersistent_TopoDS::HShape) aHShape = Handle(ShapePersistent_TopoDS::HShape)::DownCast(aPObject);
+ if (aHShape) // Downcast to an expected type to import transient data
+ {
+ TopoDS_Shape aShape = aHShape->Import();
+ shapes.Append(aShape);
+ }
+ }
+ }
+}
+~~~~
+
+The following code demonstrates how to write shapes in OCCT 7.2.0 using *StdStorage* class.
+
+~~~~
+// Create a file driver
+NCollection_Handle<Storage_BaseDriver> aFileDriver(new FSD_File());
+
+// Try to open the file driver for writing
+try
+{
+ OCC_CATCH_SIGNALS
+ PCDM_ReadWriter::Open(*aFileDriver, TCollection_ExtendedString(CStringA(filename).GetBuffer()), Storage_VSWrite);
+}
+catch (Standard_Failure& e)
+{
+ // Error processing
+}
+
+// Create a storage data instance
+Handle(StdStorage_Data) aData = new StdStorage_Data;
+// Set an axiliary application name (optional)
+aData->HeaderData()->SetApplicationName(TCollection_ExtendedString("Application"));
+
+// Provide a map to track sharing
+StdObjMgt_TransientPersistentMap aMap;
+// Iterator over a collection of shapes
+for (Standard_Integer i = 1; i <= shapes.Length(); ++i)
+{
+ TopoDS_Shape aShape = shapes.Value(i);
+ // Translate a shape to a persistent object
+ Handle(ShapePersistent_TopoDS::HShape) aPShape =
+ ShapePersistent_TopoDS::Translate(aShape, aMap, ShapePersistent_WithTriangle);
+ if (aPShape.IsNull())
+ {
+ // Error processing
+ }
+
+ // Construct a root name
+ TCollection_AsciiString aName = "Shape_";
+ aName += i;
+
+ // Add a root to storage data
+ Handle(StdStorage_Root) aRoot = new StdStorage_Root(aName, aPShape);
+ aData->RootData()->AddRoot(aRoot);
+}
+
+// Write storage data to the driver
+Storage_Error anError = StdStorage::Write(*aFileDriver, aData);
+if (anError != Storage_VSOk)
+{
+ // Error processing
+}
+~~~~
+
+@subsection upgrade_720_Change_In_BRepLib_MakeFace_Algo Change in BRepLib_MakeFace algorithm
+
+ Previously, *BRepLib_MakeFace* algorithm changed orientation of the source wire in order to avoid creation of face as a hole (i.e. it is impossible to create the entire face as a hole; the hole can be created in context of another face only). New algorithm does not reverse the wire if it is open. Material of the face for the open wire will be located on the left side from the source wire.
+
+@subsection upgrade_720_Change_In_BRepFill_OffsetWire Change in BRepFill_OffsetWire algorithm
+
+ From now on, the offset will always be directed to the outer region in case of positive offset value and to the inner region in case of negative offset value.
+ Inner/Outer region for an open wire is defined by the following rule:
+ when we go along the wire (taking into account edges orientation) the outer region will be on the right side, the inner region will be on the left side.
+ In case of a closed wire, the inner region will always be inside the wire (at that, the edges orientation is not taken into account).
+
+@subsection upgrade_720_Change_In_GeomAdaptor_Curve Change in Geom(2d)Adaptor_Curve::IsPeriodic
+
+Since 7.2.0 version, method *IsPeriodic()* returns the corresponding status of periodicity of the basis curve regardless of closure status of the adaptor curve (see method *IsClosed()*).
+Method *IsClosed()* for adaptor can return false even on periodic curve, in the case if its parametric range is not full period, e.g. for adaptor on circle in range [0, @f$ \pi @f$].
+In previous versions, *IsPeriodic()* always returned false if *IsClosed()* returned false.