Open CASCADE Technology Version 8.0.0 Release Candidate 3
Open Cascade is delighted to announce the release of Open CASCADE Technology version 8.0.0 Release Candidate 3 to the public.
Overview
Version 8.0.0-rc3 is a candidate release incorporating 157 improvements and bug fixes compared to version 8.0.0-rc2, bringing the total improvements since version 7.9.0 to over 290 changes.
This release focuses on:
- Modernization of math functions with migration to C++ standard library
- Threading improvements with migration from
Standard_Mutextostd::mutex - Performance optimizations across Foundation Classes, especially BSpline computations
- API improvements with
constexpr/noexceptannotations throughout the codebase - Data Exchange enhancements including stream support and STEP metadata export
What is a Release Candidate
A Release Candidate is a tag on the master branch that has completed all test rounds and is stable to use. Release candidates progress in parallel with maintenance releases, with the difference that maintenance releases remain binary compatible with minor releases and cannot include most improvements. The cycle for a release candidate is planned to be 5-10 weeks, while maintenance releases occur once per quarter.
What's New in OCCT 8.0.0-rc3
Foundation Classes
Math Functions Modernization
- Deprecated math global functions in favor of
stdequivalents #833: The following functions are now deprecated and will be removed in future releases:ACos(),ASin(),ATan(),ATan2()→ usestd::acos,std::asin,std::atan,std::atan2Sinh(),Cosh(),Tanh()→ usestd::sinh,std::cosh,std::tanhASinh(),ACosh(),ATanh()→ usestd::asinh,std::acosh,std::atanhSqrt(),Log(),Log10(),Exp()→ usestd::sqrt,std::log,std::log10,std::expPow(),Abs(),Sign()→ usestd::pow,std::abs,std::copysignSin(),Cos(),Tan()→ usestd::sin,std::cos,std::tanFloor(),Ceiling(),Round()→ usestd::floor,std::ceil,std::roundIntegerPart()→ usestd::truncMin(),Max()→ usestd::min,std::maxNextAfter()→ usestd::nextafter
Threading Modernization
- Replaced
Standard_Mutexwithstd::mutex#766: Migrated from legacy mutex implementation to standard C++ mutexes across all modules:- Use
std::lock_guardorstd::unique_lockinstead ofStandard_Mutex::Sentry - Use
std::mutexinstead ofStandard_Mutex - Optional mutex holders now use
std::unique_ptr<std::mutex>
- Use
Geometric Primitives (gp)
- Added standard direction enumerations #803: New
gp_Dir::Dandgp_Dir2d::Denums for standard directions (X, Y, Z, NX, NY, NZ) - Enhanced constructors with
constexpr/noexcept#798, #796, #790: Geometric primitives (circles, cones, cylinders, axes) now have constexpr constructors
Strings
- Added
EmptyString()methods #788: NewTCollection_AsciiString::EmptyString()andTCollection_ExtendedString::EmptyString()for efficient empty string access - Optimized
TCollection_AsciiString#752: Pre-defined string optimization for better performance
Math Containers
- Move semantics for
math_Matrixandmath_Vector#841: Added move constructors and move assignment operators for efficient container transfers
BSpline Optimizations
- Optimized BSpline cache #906, #897: Improved BSpline data containers with
constexprand validation, optimized local calls - Enhanced B-Spline curve computation #855: Performance improvements for curve calculations
Other Foundation Improvements
- Optimized
Bndpackage #839, #856: Bounding box optimizations and fixes - Modernized
Bnd_B2andBnd_B3#838: Template-based implementation - Enhanced BVH implementation #842, #858: Generic vector types and transformation tests
- Performance improvements for
TopExppackage #831 - Optimized
Quantitypackage #834 - Improved
NCollectionvector constructors #835 - Modernized
NCollection_SparseArrayBase#804 - EigenValuesSearcher improvements #714
- Refactored
CSLibpackage with GTests #857 - Refactored
Extremapackage #869 - Compile-time sqrt constants #789
- Precomputed Jacobi coefficients #778
- Constexpr Pascal allocator for
PLib::Bin#777 - Added precision-related methods in
Precision.hxx#811 - Angle normalization refactor for
ElSLib/ElCLib#813
Modeling Data
- New
GeomHashandGeom2dHashpackages #845: Hash functions for geometric curves and surfaces enabling efficient comparison and caching
Modeling Algorithms
- Enhanced periodic curve handling in
ChFi3d_Builder#892 - Improved parameter validation logic in BSplineCache #829
Shape Healing
Data Exchange
Stream Support
- Implemented stream support for
DE_Wrapper#663: Stream-based read/write methods for STEP, STL, VRML, and other formats with validation utilities
STEP Improvements
- STEP General Attributes export #634: Export string metadata as STEP
property_definitionentities - STEP coordinate system connection points import #779
std::string_viewfor STEP type names #784: Performance improvement usingstd::string_viewfor type recognition- Refactored
StepTypeselection #786 - Custom hasher for string_view types in
RWStepAP214#888
Plugin System
- Reorganized DE plugin system #696: New
Register/UnRegistermethods for configuration nodes,DE_MultiPluginHolderfor multiple registrations
Visualization
Build and Configuration
- Fixed C++ standard options and NOMINMAX scope #907
- Modernized compiler flags for C++17 #867
- Updated macOS compiler flags and includes #884
- Updated VCPKG version #878
- Validated configuration on CMake 3.10+ #762
- C++17 version macro #785
- Updated
.gitignorewith explicit allowlist #787
Testing
- Migrated QA DRAW tests to GTest #818, #823
- Migrated QA NCollection to GTests #709
- Added Boolean operation GTests #721
- Added
ShapeAnalysis_CanonicalRecognitionunit tests #720 - Added
Standard_ArrayStreamBufferunit tests #708 - Added PLib functionality unit tests #705
- Covered math module with GTests #684
- Enhanced
BRepOffsetAPI_ThruSections_Testwith B-spline support #891
Bug Fixes
Modeling
- Fixed thickness operation regression on circle-to-polygon lofts #889
- Fixed
ShapeUpgrade_UnifySameDomaincrash #876 - Fixed
BRepBuilderAPI_GTransformface stretch crash #875 - Fixed out-of-range access in
BSplCLib_Reverse#863 - Fixed Boolean fuse segfault on loft #860
- Fixed
BRepFilletAPI_MakeFillet::Addhang #859 - Fixed
BRepFilletAPI_MakeChamfercrash #743 - Fixed
BRepOffsetAPI_MakePipeShellcrash #740 - Fixed chamfer/fillet crash approaching ellipse #738
- Fixed array indexing bug in
IntAna_IntQuadQuad::NextCurve#703 - Fixed null surface crash in
fixshape#623 - Fixed null surface crash in
UnifySameDomain#624 - Fixed
Bnd_Box::CornerMaxincorrect implementation #664 - Fixed memory consumption in
BOPAlgo_PaveFiller_6#864
Shape Healing
- Fixed regression after #584 #753, #769
- Fixed inverted revolved shape import from STEP #699
- Reverted BSpline check for
ShapeConstruct_ProjectCurveOnSurface#894
Data Exchange
Mesh
- Fixed stack overflow when meshing #695
- Fixed STEP file import crash when visualizing boundary curves #745
Application Framework
- Early-return null
NamedShapewhenTNaming_UsedShapesis missing #760
Visualization
- Fixed unexpected moving with
AIS_ViewCube#727
Draw
- Fixed message color mixing #685
- Fixed dangerous use of 'cin' #681
- Fixed incorrect return-value check for scanf-like functions #680
Migration Guide
Deprecated Math Functions
All OCCT math wrapper functions that duplicate C++ standard library functionality are now deprecated. While they still work, you should migrate to std:: equivalents:
// Before (deprecated)
double angle = ACos(value);
double dist = Sqrt(x*x + y*y);
double result = Max(a, b);
double val = Abs(x);
// After (recommended)
double angle = std::acos(value);
double dist = std::sqrt(x*x + y*y);
double result = std::max(a, b);
double val = std::abs(x);Complete Mapping
| Deprecated Function | Standard Replacement |
|---|---|
ACos(x)
| std::acos(x)
|
ASin(x)
| std::asin(x)
|
ATan(x)
| std::atan(x)
|
ATan2(y, x)
| std::atan2(y, x)
|
Cos(x)
| std::cos(x)
|
Sin(x)
| std::sin(x)
|
Tan(x)
| std::tan(x)
|
Cosh(x)
| std::cosh(x)
|
Sinh(x)
| std::sinh(x)
|
Tanh(x)
| std::tanh(x)
|
ACosh(x)
| std::acosh(x)
|
ASinh(x)
| std::asinh(x)
|
ATanh(x)
| std::atanh(x)
|
Sqrt(x)
| std::sqrt(x)
|
Log(x)
| std::log(x)
|
Log10(x)
| std::log10(x)
|
Exp(x)
| std::exp(x)
|
Pow(x, y)
| std::pow(x, y)
|
Abs(x)
| std::abs(x)
|
Sign(a, b)
| std::copysign(a, b)
|
Floor(x)
| std::floor(x)
|
Ceiling(x)
| std::ceil(x)
|
Round(x)
| std::round(x)
|
IntegerPart(x)
| std::trunc(x)
|
Min(a, b)
| std::min(a, b)
|
Max(a, b)
| std::max(a, b)
|
NextAfter(x, y)
| std::nextafter(x, y)
|
Note: ACosApprox() is also deprecated; use std::acos() instead.
Standard_Mutex Migration
Replace legacy mutex usage with standard C++ threading primitives:
// Before
#include <Standard_Mutex.hxx>
Standard_Mutex myMutex;
Standard_Mutex::Sentry aSentry(myMutex);
// or
myMutex.Lock();
// ... critical section ...
myMutex.Unlock();
// After
#include <mutex>
std::mutex myMutex;
std::lock_guard<std::mutex> aLock(myMutex);
// or for more control:
std::unique_lock<std::mutex> aLock(myMutex);For optional/heap-allocated mutexes:
// Before
Standard_Mutex* myOptionalMutex;
// After
std::unique_ptr<std::mutex> myOptionalMutex;PLib_Base Removal
PLib_Base abstract base class has been removed. PLib_JacobiPolynomial and PLib_HermitJacobi are now value types (not Handle-based):
// Before
Handle(PLib_JacobiPolynomial) aJacobi = new PLib_JacobiPolynomial(...);
aJacobi->D0(...);
// After
PLib_JacobiPolynomial aJacobi(...);
aJacobi.D0(...); // Note: method is now constPLib_DoubleJacobiPolynomial Removal
The PLib_DoubleJacobiPolynomial class has been completely removed. If you were using it, you'll need to refactor your code to use PLib_JacobiPolynomial directly.
TopTools_MutexForShapeProvider Removal
The TopTools_MutexForShapeProvider class has been removed. Use std::mutex with shape providers directly.
OSD_MAllocHook Removal
The OSD_MAllocHook class and the Draw command mallochook have been removed. Use platform-specific memory debugging tools instead (Valgrind, AddressSanitizer, etc.).
QANCollection Package Removal
The QANCollection package (test utilities for collections) has been removed. Use GTest-based tests in src/*/GTests/ directories instead.
Transfer_TransferDeadLoop Deprecation
The Transfer_TransferDeadLoop exception class is deprecated. Dead loop detection now uses local status flags instead of exceptions. The class is kept for backward compatibility but should not be used in new code.
StepData_ReadWriteModule::StepType() API Change
The StepType() method now returns const std::string_view& instead of TCollection_AsciiString:
// Before
TCollection_AsciiString aType = aModule->StepType(aTypeNum);
// After
const std::string_view& aType = aModule->StepType(aTypeNum);
// If you need TCollection_AsciiString:
TCollection_AsciiString aTypeStr(aType.data(), static_cast<int>(aType.length()));Using Standard Direction Enumerations
New convenient enumerations for standard directions:
// Before
gp_Dir aDir(1.0, 0.0, 0.0); // X direction
gp_Dir aNegZ(0.0, 0.0, -1.0); // Negative Z
// After
gp_Dir aDir(gp_Dir::D::X); // X direction
gp_Dir aNegZ(gp_Dir::D::NZ); // Negative Z
// Available: X, Y, Z, NX, NY, NZ for gp_Dir
// Available: X, Y, NX, NY for gp_Dir2dEmpty String Access
Use the new static methods for efficient empty string access:
// Before
TCollection_AsciiString anEmpty;
const TCollection_AsciiString& GetEmpty() { static TCollection_AsciiString s; return s; }
// After
const TCollection_AsciiString& anEmpty = TCollection_AsciiString::EmptyString();
const TCollection_ExtendedString& anEmptyExt = TCollection_ExtendedString::EmptyString();Removed Functionality
| Item | Commit | Replacement |
|---|---|---|
OSD_MAllocHook class
| #707 | Platform memory tools |
PLib_Base class
| #795 | Direct value types |
PLib_DoubleJacobiPolynomial
| #781 | PLib_JacobiPolynomial
|
TopTools_MutexForShapeProvider
| #766 | std::mutex
|
QANCollection package
| #718 | GTests |
Standard_Mutex (effectively)
| #766 | std::mutex
|
Deprecated Functionality
| Item | Commit | Replacement |
|---|---|---|
Math global functions (ACos, Sin, etc.)
| #833 | std:: equivalents
|
ACosApprox()
| #833 | std::acos()
|
Transfer_TransferDeadLoop exception
| #817 | Status flags |
Performance Improvements Summary
- BSpline cache optimized for local calls #906
- BSpline data containers with
constexprand validation #897 - PCurve projection optimization #890
- BndLib optimization #856
- Bnd package optimization and fixes #839
- B-Spline curve computation enhancement #855
- Quantity package optimization #834
- TopExp package performance improvements #831
- AsciiString optimization with pre-defined strings #752
- FixFaceOrientation optimization #584
- EigenValuesSearcher improvements #714
- Math container optimization #717
- Move semantics for math_Matrix/math_Vector #841
- Precomputed Jacobi coefficients #778
- Constexpr Pascal allocator for PLib::Bin #777
- STEP type recognition using
std::string_view#784
Documentation
Extensive documentation improvements including:
- Whitespace and typo fixes across the codebase #806-#824
- Comment uniformity improvements #767, #771
- Updated AI Assistant guidelines #854
- TCollection documentation update #665
Acknowledgments
We thank all contributors who helped make this release possible through their code contributions, bug reports, and testing.
New Contributors
- @sander-adamson-cloudnc made their first contribution in #624
- @petrasvestartas made their first contribution in #634
- @Rodrigo-BLyra made their first contribution in #735
- @gsegon made their first contribution in #741
Full Changelog: V8_0_0_rc2...V8_0_0_rc3