From 68800a1dfa5ac4f35ee67bc5a5d0635fd77fd9e6 Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Thu, 16 Feb 2023 14:40:48 +0100 Subject: [PATCH 1/8] EgtGeomKernel : - modifica box3d archi. --- CurveArc.cpp | 123 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 101 insertions(+), 22 deletions(-) diff --git a/CurveArc.cpp b/CurveArc.cpp index b411c0d..abd126a 100644 --- a/CurveArc.cpp +++ b/CurveArc.cpp @@ -699,29 +699,9 @@ CurveArc::Load( NgeReader& ngeIn) bool CurveArc::GetLocalBBox( BBox3d& b3Loc, int nFlag) const { - // verifico lo stato - if ( m_nStatus != OK) - return false ; - // assegno il box in locale - b3Loc.Reset() ; - double dLinTol = LIN_TOL_APPROX ; - double dAngTolDeg = ANG_TOL_APPROX_DEG ; - if ( ( nFlag & BBF_EXACT) != 0) - dLinTol = LIN_TOL_MIN ; - ArcApproxer aAppr( dLinTol, dAngTolDeg, false, *this) ; - double dU ; - Point3d ptPos ; - while ( aAppr.GetPoint( dU, ptPos)) - b3Loc.Add( ptPos) ; - // se c'è estrusione, devo tenerne conto - if ( ! m_VtExtr.IsSmall() && abs( m_dThick) > EPS_SMALL) { - Point3d ptMinExtr = b3Loc.GetMin() + m_VtExtr * m_dThick ; - Point3d ptMaxExtr = b3Loc.GetMax() + m_VtExtr * m_dThick ; - b3Loc.Add( ptMinExtr) ; - b3Loc.Add( ptMaxExtr) ; - } + // richiamo della funzione generale + return GetBBox( GLOB_FRM, b3Loc, nFlag) ; - return true ; } //---------------------------------------------------------------------------- @@ -736,6 +716,102 @@ CurveArc::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const return false ; // assegno il box nel riferimento b3Ref.Reset() ; + + // ricavo il Frame3D solidale all'arco + Frame3d frArc; frArc.Set( m_PtCen, m_dAngCenDeg > 0 ? m_VtN : - m_VtN, m_VtS) ; + + // cordinate nel FrRef dei versori del sistema di riferimento dell'arco + Vector3d a = frArc.VersX() ; + a.ToGlob( frRef) ; + double ax = a.x ; + double ay = a.y ; + double az = a.z ; + + Vector3d b = frArc.VersY() ; + b.ToGlob( frRef) ; + double bx = b.x ; + double by = b.y ; + double bz = b.z ; + + Vector3d c = frArc.VersZ() ; + c.ToGlob( frRef) ; + double nx = c.x ; + double ny = c.y ; + double nz = c.z ; + + // vettore degli angoli e dei punti di estremi + PNTVECTOR vPoints ; + DBLVECTOR vdTheta ; + + // il punto iniziale e finale sono punti candidati per estremanti + Point3d ptS, ptE ; + GetPointD1D2( 0, FROM_PLUS, ptS) ; if ( ! abs( m_dAngCenDeg - 360) < EPS_SMALL) { GetPointD1D2( 1, FROM_MINUS, ptE) ; } + vPoints.push_back( ptS) ; if ( ! abs( m_dAngCenDeg - 360) < EPS_SMALL) { vPoints.push_back( ptE) ; } + + // angolo al centro, raggio e parametro Q + double dAngCenRad = m_dAngCenDeg * DEGTORAD ; + ptE.ToLoc( frArc) ; ptS.ToLoc( frArc) ; + double Q = ( ptE.z - ptS.z) / abs( dAngCenRad) ; + double dRad = m_dRad ; + + if ( abs( Q) < EPS_SMALL) { + if ( abs( ax) > EPS_SMALL) { + vdTheta.push_back( atan( bx / ax)) ; + vdTheta.push_back( vdTheta.back() > 0 ? vdTheta.back() + PIGRECO : vdTheta.back() - PIGRECO) ; + } + if ( abs( ay) > EPS_SMALL) { + vdTheta.push_back( atan( by / ay)) ; + vdTheta.push_back( vdTheta.back() > 0 ? vdTheta.back() + PIGRECO : vdTheta.back() - PIGRECO) ; + } + if ( abs( az) > EPS_SMALL) { + vdTheta.push_back( atan( bz / az)) ; + vdTheta.push_back( vdTheta.back() > 0 ? vdTheta.back() + PIGRECO : vdTheta.back() - PIGRECO) ; + } + } + else { + + vector Va ; Va.push_back( ax) ; Va.push_back( ay) ; Va.push_back( az) ; + vector Vb ; Vb.push_back( bx) ; Vb.push_back( by) ; Vb.push_back( bz) ; + vector Vn ; Vn.push_back( nx) ; Vn.push_back( ny) ; Vn.push_back( nz) ; + + for ( int i = 0 ; i < 3 ; i++) { + double delta = dRad * dRad * Va[i] * Va[i] - Q * Q * Vn[i] * Vn[i] + Vb[i] * Vb[i] * dRad * dRad ; + if ( delta > 0) { + double t1 = ( dRad * Va[i] + sqrt( delta)) / ( Q * Vn[i] - dRad * Vb[i]) ; + if ( abs( 1 - t1 * t1) > EPS_SMALL) { + vdTheta.push_back( atan( 2 * t1 / (1 - t1 * t1))) ; + vdTheta.push_back(vdTheta.back() > 0 ? vdTheta.back() + PIGRECO : vdTheta.back() - PIGRECO); + } + double t2 = ( dRad * Va[i] - sqrt( delta)) / ( Q * Vn[i] - dRad * Vb[i]) ; + if ( abs( 1 - t2 * t2) > EPS_SMALL){ + vdTheta.push_back( atan( 2 * t2 / ( 1 - t2 * t2))) ; + vdTheta.push_back( vdTheta.back() > 0 ? vdTheta.back() + PIGRECO : vdTheta.back() - PIGRECO) ; + } + } + } + } + + vdTheta.push_back( PIGRECO) ; + vdTheta.push_back( PIGRECO / 2) ; + vdTheta.push_back( 3 * PIGRECO / 2) ; + + for ( int i = 0 ; i < vdTheta.size() ; i++) { + double dTheta = vdTheta[i] > 0 ? vdTheta[i] : 2 * PIGRECO + vdTheta[i] ; + if ( dTheta < abs( dAngCenRad)) { + Point3d pt ; + GetPointD1D2( dTheta / ( abs( dAngCenRad)), FROM_MINUS, pt) ; + vPoints.push_back( pt) ; + } + } + + for (int i = 0; i < vPoints.size(); i++) { + vPoints[i].ToGlob( frRef) ; + b3Ref.Add( vPoints[i]) ; + } + + return true ; + + /* double dLinTol = LIN_TOL_APPROX ; double dAngTolDeg = ANG_TOL_APPROX_DEG ; if ( ( nFlag & BBF_EXACT) != 0) @@ -747,6 +823,9 @@ CurveArc::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const ptPos.ToGlob( frRef) ; b3Ref.Add( ptPos) ; } + + */ + // se c'è estrusione, devo tenerne conto if ( ! m_VtExtr.IsSmall() && abs( m_dThick) > EPS_SMALL) { Vector3d vtFrExtr = m_VtExtr ; From 053410f43bb93fa444773935abf8c4dbf509f68b Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Thu, 16 Mar 2023 08:03:35 +0100 Subject: [PATCH 2/8] EgtGeomKernel : - Offset delle regioni, seconda tmpProp delle curve contiene il loop da cui deriva --- SurfFlatRegionOffset.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/SurfFlatRegionOffset.cpp b/SurfFlatRegionOffset.cpp index 50c04e0..7c6e761 100644 --- a/SurfFlatRegionOffset.cpp +++ b/SurfFlatRegionOffset.cpp @@ -55,6 +55,15 @@ SurfFlatRegion::Offset( double dDist, int nType) // recupero le curve di offset PtrOwner pOffs( OffsCrv.GetLongerCurve()) ; while ( bOk && ! IsNull( pOffs)) { + if( pOffs->GetType() == CRV_COMPO) { + PtrOwner pOffsCompo( CloneCurveComposite( pOffs)) ; + pOffsCompo->SetTempProp( j, 1) ; + for( int k = 0 ; k < pOffsCompo->GetCurveCount() ; ++k) + pOffsCompo->SetCurveTempProp( k, j, 1) ; + pOffs.Set( Release( pOffsCompo)) ; + } + else + pOffs->SetTempProp( j, 1) ; // se prima curva esterna, è il primo contorno esterno della nuova regione if ( j == 0 && bFirstCurve) { if ( ! pSfrChk->AddExtLoop( Release( pOffs))) From 64a904b6284dd33cd7887cfba3f966274a8aadab Mon Sep 17 00:00:00 2001 From: DarioS Date: Mon, 20 Mar 2023 08:12:18 +0100 Subject: [PATCH 3/8] EgtGeomKernel : - inserita modifica calcolo box archi da Riccardo. --- CurveArc.cpp | 152 ++++++++++++++++------------------------ CurveAux.cpp | 5 +- SurfTriMeshBooleans.cpp | 7 +- 3 files changed, 68 insertions(+), 96 deletions(-) diff --git a/CurveArc.cpp b/CurveArc.cpp index abd126a..f78f842 100644 --- a/CurveArc.cpp +++ b/CurveArc.cpp @@ -25,6 +25,7 @@ #include "/EgtDev/Include/EGkAngle.h" #include "/EgtDev/Include/EGkStringUtils3d.h" #include "/EgtDev/Include/EGkUiUnits.h" +#include "/EgtDev/Include/ENkPolynomialRoots.h" #include "/EgtDev/Include/EgtPointerOwner.h" #include @@ -701,7 +702,6 @@ CurveArc::GetLocalBBox( BBox3d& b3Loc, int nFlag) const { // richiamo della funzione generale return GetBBox( GLOB_FRM, b3Loc, nFlag) ; - } //---------------------------------------------------------------------------- @@ -717,115 +717,87 @@ CurveArc::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const // assegno il box nel riferimento b3Ref.Reset() ; - // ricavo il Frame3D solidale all'arco - Frame3d frArc; frArc.Set( m_PtCen, m_dAngCenDeg > 0 ? m_VtN : - m_VtN, m_VtS) ; + // ricavo il riferimento intrinseco dell'arco + Frame3d frArc; + frArc.Set( m_PtCen, ( m_dAngCenDeg > 0 ? m_VtN : -m_VtN), m_VtS) ; - // cordinate nel FrRef dei versori del sistema di riferimento dell'arco - Vector3d a = frArc.VersX() ; - a.ToGlob( frRef) ; - double ax = a.x ; - double ay = a.y ; - double az = a.z ; + // pendenza intrinseca + double dPitch = m_dDeltaN * ( m_dAngCenDeg > 0 ? 1 : -1) / abs( m_dAngCenDeg * DEGTORAD) ; - Vector3d b = frArc.VersY() ; - b.ToGlob( frRef) ; - double bx = b.x ; - double by = b.y ; - double bz = b.z ; - - Vector3d c = frArc.VersZ() ; - c.ToGlob( frRef) ; - double nx = c.x ; - double ny = c.y ; - double nz = c.z ; - - // vettore degli angoli e dei punti di estremi - PNTVECTOR vPoints ; - DBLVECTOR vdTheta ; + // cordinate nel frRef dei versori del sistema di riferimento dell'arco + Vector3d vtXRef = frArc.VersX() ; + vtXRef.ToGlob( frRef) ; + Vector3d vtYRef = frArc.VersY() ; + vtYRef.ToGlob( frRef) ; + Vector3d vtZRef = frArc.VersZ() ; + vtZRef.ToGlob( frRef) ; // il punto iniziale e finale sono punti candidati per estremanti Point3d ptS, ptE ; - GetPointD1D2( 0, FROM_PLUS, ptS) ; if ( ! abs( m_dAngCenDeg - 360) < EPS_SMALL) { GetPointD1D2( 1, FROM_MINUS, ptE) ; } - vPoints.push_back( ptS) ; if ( ! abs( m_dAngCenDeg - 360) < EPS_SMALL) { vPoints.push_back( ptE) ; } + GetStartPoint( ptS) ; + ptS.ToGlob( frRef) ; + b3Ref.Add( ptS) ; + GetEndPoint( ptE) ; + ptE.ToGlob( frRef) ; + b3Ref.Add( ptE) ; - // angolo al centro, raggio e parametro Q - double dAngCenRad = m_dAngCenDeg * DEGTORAD ; - ptE.ToLoc( frArc) ; ptS.ToLoc( frArc) ; - double Q = ( ptE.z - ptS.z) / abs( dAngCenRad) ; - double dRad = m_dRad ; + // vettore degli angoli dei punti candidati estremi + DBLVECTOR vdTheta ; - if ( abs( Q) < EPS_SMALL) { - if ( abs( ax) > EPS_SMALL) { - vdTheta.push_back( atan( bx / ax)) ; - vdTheta.push_back( vdTheta.back() > 0 ? vdTheta.back() + PIGRECO : vdTheta.back() - PIGRECO) ; + // arco piatto + if ( abs( dPitch) < EPS_SMALL) { + double dAngXDeg = atan2( vtYRef.x, vtXRef.x) * RADTODEG ; + bool bAngXSmall = (abs( dAngXDeg) <= EPS_ANG_ZERO) ; + if ( ! bAngXSmall) { + vdTheta.push_back( dAngXDeg) ; + vdTheta.push_back( dAngXDeg + ANG_STRAIGHT) ; } - if ( abs( ay) > EPS_SMALL) { - vdTheta.push_back( atan( by / ay)) ; - vdTheta.push_back( vdTheta.back() > 0 ? vdTheta.back() + PIGRECO : vdTheta.back() - PIGRECO) ; + double dAngYDeg = atan2( vtYRef.y, vtXRef.y) * RADTODEG ; + bool bAngYSmall = (abs( dAngYDeg) <= EPS_ANG_ZERO) ; + if ( ! bAngYSmall) { + vdTheta.push_back( dAngYDeg) ; + vdTheta.push_back( dAngYDeg + ANG_STRAIGHT) ; } - if ( abs( az) > EPS_SMALL) { - vdTheta.push_back( atan( bz / az)) ; - vdTheta.push_back( vdTheta.back() > 0 ? vdTheta.back() + PIGRECO : vdTheta.back() - PIGRECO) ; + double dAngZDeg = atan2( vtYRef.z, vtXRef.z) * RADTODEG ; + bool bAngZSmall = (abs( dAngZDeg) <= EPS_ANG_ZERO) ; + if ( ! bAngZSmall) { + vdTheta.push_back( dAngZDeg) ; + vdTheta.push_back( dAngZDeg + ANG_STRAIGHT) ; } + if ( bAngXSmall || bAngYSmall || bAngZSmall) + vdTheta.push_back( ANG_STRAIGHT) ; } + // altrimenti arco di elica else { - - vector Va ; Va.push_back( ax) ; Va.push_back( ay) ; Va.push_back( az) ; - vector Vb ; Vb.push_back( bx) ; Vb.push_back( by) ; Vb.push_back( bz) ; - vector Vn ; Vn.push_back( nx) ; Vn.push_back( ny) ; Vn.push_back( nz) ; - - for ( int i = 0 ; i < 3 ; i++) { - double delta = dRad * dRad * Va[i] * Va[i] - Q * Q * Vn[i] * Vn[i] + Vb[i] * Vb[i] * dRad * dRad ; - if ( delta > 0) { - double t1 = ( dRad * Va[i] + sqrt( delta)) / ( Q * Vn[i] - dRad * Vb[i]) ; - if ( abs( 1 - t1 * t1) > EPS_SMALL) { - vdTheta.push_back( atan( 2 * t1 / (1 - t1 * t1))) ; - vdTheta.push_back(vdTheta.back() > 0 ? vdTheta.back() + PIGRECO : vdTheta.back() - PIGRECO); - } - double t2 = ( dRad * Va[i] - sqrt( delta)) / ( Q * Vn[i] - dRad * Vb[i]) ; - if ( abs( 1 - t2 * t2) > EPS_SMALL){ - vdTheta.push_back( atan( 2 * t2 / ( 1 - t2 * t2))) ; - vdTheta.push_back( vdTheta.back() > 0 ? vdTheta.back() + PIGRECO : vdTheta.back() - PIGRECO) ; + for ( int i = 0 ; i < 3 ; ++ i) { + DBLVECTOR vdPoly{ m_dRad * vtYRef.v[i] + dPitch * vtZRef.v[i], + - 2 * m_dRad * vtXRef.v[i], + - m_dRad * vtYRef.v[i] + dPitch * vtZRef.v[i]} ; + DBLVECTOR vdRoot ; + int nRoot = PolynomialRoots( 2, vdPoly, vdRoot) ; + for ( int i = 0 ; i < nRoot ; ++ i) { + double dAngDeg = atan2( 2 * vdRoot[i], (1 - vdRoot[i] * vdRoot[i])) * RADTODEG ; + if ( abs( dAngDeg) > EPS_ANG_ZERO) { + vdTheta.push_back( dAngDeg) ; + vdTheta.push_back( dAngDeg + ANG_STRAIGHT) ; } + else + vdTheta.push_back( ANG_STRAIGHT) ; } } } - vdTheta.push_back( PIGRECO) ; - vdTheta.push_back( PIGRECO / 2) ; - vdTheta.push_back( 3 * PIGRECO / 2) ; - - for ( int i = 0 ; i < vdTheta.size() ; i++) { - double dTheta = vdTheta[i] > 0 ? vdTheta[i] : 2 * PIGRECO + vdTheta[i] ; - if ( dTheta < abs( dAngCenRad)) { - Point3d pt ; - GetPointD1D2( dTheta / ( abs( dAngCenRad)), FROM_MINUS, pt) ; - vPoints.push_back( pt) ; + // verifica degli angoli sull'arco ed eventuale considerazione dei punti + for ( int i = 0 ; i < int( vdTheta.size()) ; ++ i) { + double dTheta = ( vdTheta[i] > 0 ? vdTheta[i] : vdTheta[i] + ANG_FULL) ; + if ( dTheta < abs( m_dAngCenDeg)) { + Point3d ptP ; + GetPointD1D2( dTheta / ( abs( m_dAngCenDeg)), FROM_MINUS, ptP) ; + ptP.ToGlob( frRef) ; + b3Ref.Add( ptP) ; } } - - for (int i = 0; i < vPoints.size(); i++) { - vPoints[i].ToGlob( frRef) ; - b3Ref.Add( vPoints[i]) ; - } - return true ; - - /* - double dLinTol = LIN_TOL_APPROX ; - double dAngTolDeg = ANG_TOL_APPROX_DEG ; - if ( ( nFlag & BBF_EXACT) != 0) - dLinTol = LIN_TOL_MIN ; - ArcApproxer aAppr( dLinTol, dAngTolDeg, false, *this) ; - double dU ; - Point3d ptPos ; - while ( aAppr.GetPoint( dU, ptPos)) { - ptPos.ToGlob( frRef) ; - b3Ref.Add( ptPos) ; - } - - */ - // se c'è estrusione, devo tenerne conto if ( ! m_VtExtr.IsSmall() && abs( m_dThick) > EPS_SMALL) { Vector3d vtFrExtr = m_VtExtr ; diff --git a/CurveAux.cpp b/CurveAux.cpp index 0c401aa..239b8df 100644 --- a/CurveAux.cpp +++ b/CurveAux.cpp @@ -30,9 +30,8 @@ using namespace std ; bool IsClosed( const ICurve& crvC) { - Point3d ptStart ; - Point3d ptEnd ; - return ( crvC.GetStartPoint( ptStart) && crvC.GetEndPoint( ptEnd) && AreSamePointApprox( ptStart, ptEnd)) ; + Point3d ptStart, ptEnd ; + return ( crvC.GetStartPoint( ptStart) && crvC.GetEndPoint( ptEnd) && AreSamePointApprox( ptStart, ptEnd)) ; } //---------------------------------------------------------------------------- diff --git a/SurfTriMeshBooleans.cpp b/SurfTriMeshBooleans.cpp index 6a4f967..b8a27ad 100644 --- a/SurfTriMeshBooleans.cpp +++ b/SurfTriMeshBooleans.cpp @@ -694,7 +694,7 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT // Elimino loop interni non validi bool bDouble = true ; for ( int nInnLoop = 0 ; nInnLoop < int( vInnerLoop.size()) ; ++ nInnLoop) { - if ( int( cvClosedChain[vInnerLoop[nInnLoop]].size()) > 2) { + if ( cvClosedChain[vInnerLoop[nInnLoop]].size() > 2) { bDouble = false ; break ; } @@ -820,6 +820,7 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT } } } + // Divido i loop che si autointercettano int nInitialLoopNum = int( vPolygons.size()) ; for ( int nL = 1 ; nL < nInitialLoopNum ; ++ nL) { @@ -868,8 +869,8 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT itSt2 = LoopPointList.emplace( itEn2, vAddingPointWithOrder[nPi]) ; } } + // Spezzo i loop autointersecantesi - POLYLINEVECTOR vAuxPolygons ; vAuxPolygons.emplace_back( vPolygons[nL]) ; @@ -917,7 +918,7 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT } bool bReplaced = false ; for ( int nl = 0 ; nl < int( vAuxPolygons.size()) ; ++ nl) { - if ( true/*vAuxPolygons.GetAreaXY(double& dArea)*/) { + if ( true) { if ( ! bReplaced) { vPolygons[nL].Clear() ; Point3d ptP ; From 29138a63c8005b50b3ae7df4cd28f6101b8702cf Mon Sep 17 00:00:00 2001 From: DarioS Date: Tue, 21 Mar 2023 14:19:28 +0100 Subject: [PATCH 4/8] =?UTF-8?q?EgtGeomKernel=202.5c2=20:=20-=20nella=20cre?= =?UTF-8?q?azione=20delle=20regioni=20si=20tiene=20conto=20delle=20proprie?= =?UTF-8?q?t=C3=A0=20delle=20curve=20di=20contorno=20nell'unirle.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AdjustLoops.cpp | 4 ++-- AdjustLoops.h | 2 +- EgtGeomKernel.rc | Bin 11710 -> 11710 bytes SfrCreate.cpp | 2 +- SurfFlatRegion.cpp | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/AdjustLoops.cpp b/AdjustLoops.cpp index df4d6f5..af1df8c 100644 --- a/AdjustLoops.cpp +++ b/AdjustLoops.cpp @@ -278,7 +278,7 @@ MyAdjustLoops( ICurve* pCurve, ICURVEPLIST& CrvLst) //---------------------------------------------------------------------------- bool -AdjustLoops( ICurve* pCurve, ICURVEPLIST& CrvLst) +AdjustLoops( ICurve* pCurve, ICURVEPLIST& CrvLst, bool bNeedSameProp) { // elimino eventuali sovrapposizioni e accostamenti if ( ! MyAdjustLoops( pCurve, CrvLst)) @@ -291,7 +291,7 @@ AdjustLoops( ICurve* pCurve, ICURVEPLIST& CrvLst) // elimino eventuali Spikes e Small Z pCrvCo->RemoveSmallDefects( 2 * LIN_TOL_MIN, ANG_TOL_STD_DEG, true) ; // unisco eventuali tratti allineati - pCrvCo->MergeCurves( LIN_TOL_MIN, ANG_TOL_STD_DEG) ; + pCrvCo->MergeCurves( LIN_TOL_MIN, ANG_TOL_STD_DEG, true, bNeedSameProp) ; } } diff --git a/AdjustLoops.h b/AdjustLoops.h index 78f30c5..463ab93 100644 --- a/AdjustLoops.h +++ b/AdjustLoops.h @@ -17,4 +17,4 @@ //---------------------------------------------------------------------------- -bool AdjustLoops( ICurve* pCurve, ICURVEPLIST& CrvLst) ; +bool AdjustLoops( ICurve* pCurve, ICURVEPLIST& CrvLst, bool bNeedSameProp) ; diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index a0bf9fe8b4150a9a0b9f5d4d9744da79559a37a4..bd9bfb8aa64455234d2ec9b51756e0ee04b0eaca 100644 GIT binary patch delta 94 zcmdlNy)SyhFE&P_&A-_cnHh~HD{|{@_Trkr0u;H;XNwSVW8B;$>;>dw2zN+>g;Df- LFmBFL4&ed-Vf-5U delta 94 zcmdlNy)SyhFE&QQ&A-_cnHdcyD{|{@_Trkr0u;H;XNwSVW8B;$>;>dw2zN+>g;Df- LFmBFL4&ed-U|t&X diff --git a/SfrCreate.cpp b/SfrCreate.cpp index 5e7beaf..c3daeb9 100644 --- a/SfrCreate.cpp +++ b/SfrCreate.cpp @@ -436,7 +436,7 @@ SurfFlatRegionByContours::AddCurve( ICurve* pCrv) pMyCrv->SetThickness( 0) ; // rimuovo eventuali sovrapposizioni (calcolate nel suo piano) ICURVEPLIST CrvLst ; - if ( ! AdjustLoops( Release( pMyCrv), CrvLst)) + if ( ! AdjustLoops( Release( pMyCrv), CrvLst, true)) return false ; // la/le inserisco nel vettore delle curve for ( auto& pSingCrv : CrvLst) diff --git a/SurfFlatRegion.cpp b/SurfFlatRegion.cpp index d2bd04a..0fdb481 100644 --- a/SurfFlatRegion.cpp +++ b/SurfFlatRegion.cpp @@ -103,7 +103,7 @@ SurfFlatRegion::AddExtLoop( ICurve* pCrv) pMyCrv->SetThickness( 0) ; // rimuovo eventuali sovrapposizioni (calcolate nel suo piano) ICURVEPLIST CrvLst ; - if ( ! AdjustLoops( Release( pMyCrv), CrvLst)) + if ( ! AdjustLoops( Release( pMyCrv), CrvLst, true)) return false ; // aggiungo le singole curve bool bOk = true ; @@ -247,7 +247,7 @@ SurfFlatRegion::AddIntLoop( ICurve* pCrv) pMyCrv->SetThickness( 0) ; // rimuovo eventuali sovrapposizioni (calcolate nel suo piano) ICURVEPLIST CrvLst ; - if ( ! AdjustLoops( Release( pMyCrv), CrvLst)) + if ( ! AdjustLoops( Release( pMyCrv), CrvLst, true)) return false ; // aggiungo le singole curve bool bOk = true ; From aa8ae0146dfbee823f92dde41ea2844951be35c0 Mon Sep 17 00:00:00 2001 From: DarioS Date: Thu, 23 Mar 2023 10:05:03 +0100 Subject: [PATCH 5/8] EgtGeomKernel : - ricompilazione con cambio versione. --- EgtGeomKernel.vcxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EgtGeomKernel.vcxproj b/EgtGeomKernel.vcxproj index 960f459..f1ddf40 100644 --- a/EgtGeomKernel.vcxproj +++ b/EgtGeomKernel.vcxproj @@ -22,7 +22,7 @@ {9A98A202-2853-454A-84CA-DCD1714176C9} EgtGeomKernel MFCDLLProj - 10.0.17763.0 + 10.0.20348.0 From ca19f9e7351e2dd6f49f335375d85c1631bf2420 Mon Sep 17 00:00:00 2001 From: DarioS Date: Mon, 27 Mar 2023 13:31:00 +0200 Subject: [PATCH 6/8] EgtGeomKernel 2.5c3 : - eliminato memory leak in AddCurve di CurveComposite quando fallisce l'aggiunta di curve partendo da un'altra composita. --- CurveComposite.cpp | 6 ++---- EgtGeomKernel.rc | Bin 11710 -> 11710 bytes 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/CurveComposite.cpp b/CurveComposite.cpp index 76edd77..a642003 100644 --- a/CurveComposite.cpp +++ b/CurveComposite.cpp @@ -136,11 +136,9 @@ CurveComposite::AddCurve( ICurve* pCrv, bool bEndOrStart, double dLinTol) // altrimenti curva composita, devo aggiungere le singole curve semplici else { // riloco le curve dalla composita sorgente alla corrente - CurveComposite* pCrvCompo = dynamic_cast( pCrv) ; - if ( ! AddCurveByRelocate( *pCrvCompo, bEndOrStart, dLinTol)) + PtrOwner pCrvCompo( GetBasicCurveComposite( pCrv)) ; + if ( IsNull( pCrvCompo) || ! AddCurveByRelocate( *pCrvCompo, bEndOrStart, dLinTol)) return false ; - // cancello la curva composita originaria - delete pCrvCompo ; } // imposto ricalcolo della grafica diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index bd9bfb8aa64455234d2ec9b51756e0ee04b0eaca..ff39627f4fa45b744a83a8201def82f61dc2822e 100644 GIT binary patch delta 94 zcmdlNy)SyhFE&Qw&A-_cnHh~ID{|{@_Trkr0u;H;XNwSVW8B;$>;>dw2zN+>g;Df- LFmBFL4&ed-W11TR delta 94 zcmdlNy)SyhFE&P_&A-_cnHh~HD{|{@_Trkr0u;H;XNwSVW8B;$>;>dw2zN+>g;Df- LFmBFL4&ed-Vf-5U From 4410a836312a5c4b48ce1ad20a9209363f2f765a Mon Sep 17 00:00:00 2001 From: DarioS Date: Mon, 27 Mar 2023 18:41:16 +0200 Subject: [PATCH 7/8] EgtGeomKernel : - piccole modifiche per nuovo Set di PtrOwner. --- ArcCenTgCurvePnt.cpp | 2 +- ArcPntDirTgCurve.cpp | 2 +- CircleCenTgCurve.cpp | 2 +- LinePntPerpCurve.cpp | 2 +- LinePntTgCurve.cpp | 2 +- OffsetCurve.cpp | 2 +- StmFromCurves.cpp | 39 ++++++++++++-------------- StmStandard.cpp | 67 +++++++++++++++++++++----------------------- SurfTriMesh.cpp | 4 +-- 9 files changed, 58 insertions(+), 64 deletions(-) diff --git a/ArcCenTgCurvePnt.cpp b/ArcCenTgCurvePnt.cpp index 4db710e..4f52885 100644 --- a/ArcCenTgCurvePnt.cpp +++ b/ArcCenTgCurvePnt.cpp @@ -168,7 +168,7 @@ CurveArc* GetArcCenTgCompoPnt( const Point3d& ptCen, const CurveComposite& crvCo double dSqDist = SqDist( ptNearStart, ptTg) ; if ( dSqDist < dMinSqDist) { dMinSqDist = dSqDist ; - pCrvArc.Set( Release( pCrvAtmp)) ; + pCrvArc.Set( pCrvAtmp) ; if ( pPtTg != nullptr) *pPtTg = ptTg ; } diff --git a/ArcPntDirTgCurve.cpp b/ArcPntDirTgCurve.cpp index 93cd95b..bb74150 100644 --- a/ArcPntDirTgCurve.cpp +++ b/ArcPntDirTgCurve.cpp @@ -337,7 +337,7 @@ GetArcPntDirTgCompo( const Point3d& ptP, const Vector3d& vtDir, const CurveCompo double dSqDist = SqDist( ptNear, ptTg) ; if ( dSqDist < dMinSqDist) { dMinSqDist = dSqDist ; - pCrvNew.Set( Release( pCrvTmp)) ; + pCrvNew.Set( pCrvTmp) ; if ( pPtTg != nullptr) *pPtTg = ptTg ; } diff --git a/CircleCenTgCurve.cpp b/CircleCenTgCurve.cpp index fd5fc55..d71978f 100644 --- a/CircleCenTgCurve.cpp +++ b/CircleCenTgCurve.cpp @@ -239,7 +239,7 @@ GetCircleCenTgCompo( const Point3d& ptCen, const Vector3d& vtN, const CurveCompo double dSqDist = SqDist( ptNear, ptTg) ; if ( dSqDist < dMinSqDist) { dMinSqDist = dSqDist ; - pCrvArc.Set( Release( pCrvAtmp)) ; + pCrvArc.Set( pCrvAtmp) ; if ( pPtTg != nullptr) *pPtTg = ptTg ; } diff --git a/LinePntPerpCurve.cpp b/LinePntPerpCurve.cpp index cc5e253..92efa52 100644 --- a/LinePntPerpCurve.cpp +++ b/LinePntPerpCurve.cpp @@ -162,7 +162,7 @@ GetLinePointPerpCompo( const Point3d& ptP, const CurveComposite& crvCompo, const double dSqDist = SqDist( ptNear, pCrvLtmp->GetEnd()) ; if ( dSqDist < dMinSqDist) { dMinSqDist = dSqDist ; - pCrvLine.Set( Release( pCrvLtmp)) ; + pCrvLine.Set( pCrvLtmp) ; } } diff --git a/LinePntTgCurve.cpp b/LinePntTgCurve.cpp index 92c974e..a9bf01b 100644 --- a/LinePntTgCurve.cpp +++ b/LinePntTgCurve.cpp @@ -195,7 +195,7 @@ GetLinePointTgCompo( const Point3d& ptP, const CurveComposite& crvCompo, const P double dSqDist = SqDist( ptNear, pCrvLtmp->GetEnd()) ; if ( dSqDist < dMinSqDist) { dMinSqDist = dSqDist ; - pCrvLine.Set( Release( pCrvLtmp)) ; + pCrvLine.Set( pCrvLtmp) ; } } diff --git a/OffsetCurve.cpp b/OffsetCurve.cpp index fe11e60..78a14d2 100644 --- a/OffsetCurve.cpp +++ b/OffsetCurve.cpp @@ -257,7 +257,7 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType) } // aggiorno curva precedente ++ nInd1 ; - pCrv1.Set( Release( pCrv2)) ; + pCrv1.Set( pCrv2) ; // passo alla curva successiva pCrv2.Set( ccCopy2.RemoveFirstOrLastCurve( false)) ; } diff --git a/StmFromCurves.cpp b/StmFromCurves.cpp index fb40f7f..65d1bf7 100644 --- a/StmFromCurves.cpp +++ b/StmFromCurves.cpp @@ -17,6 +17,7 @@ #include "CurveLine.h" #include "CurveArc.h" #include "CurveComposite.h" +#include "SurfTriMesh.h" #include "/EgtDev/Include/EGkOffsetCurve.h" #include "/EgtDev/Include/EGkStmFromCurves.h" #include "/EgtDev/Include/EgtPointerOwner.h" @@ -40,7 +41,7 @@ GetSurfTriMeshByFlatContour( const ICurve* pCurve, double dLinTol) if ( ! pCurve->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL)) return nullptr ; // creo e setto la superficie trimesh - PtrOwner pSTM( CreateSurfTriMesh()) ; + PtrOwner pSTM( CreateBasicSurfTriMesh()) ; if ( IsNull( pSTM) || ! pSTM->CreateByFlatContour( PL)) return nullptr ; // salvo tolleranza lineare usata @@ -62,7 +63,7 @@ GetSurfTriMeshByRegion( const CICURVEPVECTOR& vpCurve, double dLinTol) if ( ! CalcRegionPolyLines( vpCurve, dLinTol, vPL, vtN)) return nullptr ; // creo e setto la superficie trimesh - PtrOwner pSTM( CreateSurfTriMesh()) ; + PtrOwner pSTM( CreateBasicSurfTriMesh()) ; if ( IsNull( pSTM) || ! pSTM->CreateByRegion( vPL)) return nullptr ; // salvo tolleranza lineare usata @@ -101,25 +102,23 @@ GetSurfTriMeshByExtrusion( const ICurve* pCurve, const Vector3d& vtExtr, } } // creo e setto la superficie trimesh - PtrOwner pSTM( CreateSurfTriMesh()) ; + PtrOwner pSTM( CreateBasicSurfTriMesh()) ; if ( IsNull( pSTM) || ! pSTM->CreateByExtrusion( PL, vtExtr)) return nullptr ; // se da fare, metto i tappi sulle estremità if ( bDoCapEnds) { // creo la prima superficie di estremità - PtrOwner pSTM1( CreateSurfTriMesh()) ; - if ( IsNull( pSTM1) || ! pSTM1->CreateByFlatContour( PL)) + SurfTriMesh STM1 ; + if ( ! STM1.CreateByFlatContour( PL)) return nullptr ; // la copio - PtrOwner pSTM2( pSTM1->Clone()) ; - if ( IsNull( pSTM2)) - return nullptr ; + SurfTriMesh STM2 = STM1 ; // inverto la prima superficie - pSTM1->Invert() ; + STM1.Invert() ; // traslo la seconda - pSTM2->Translate( vtExtr) ; + STM2.Translate( vtExtr) ; // le unisco alla superficie del fianco - if ( ! pSTM->DoSewing( *pSTM1) || ! pSTM->DoSewing( *pSTM2)) + if ( ! pSTM->DoSewing( STM1) || ! pSTM->DoSewing( STM2)) return nullptr ; } // salvo tolleranza lineare usata @@ -153,30 +152,28 @@ GetSurfTriMeshByRegionExtrusion( const CICURVEPVECTOR& vpCurve, const Vector3d& vPL[i].Invert() ; } // creo la prima superficie di estremità - PtrOwner pSTM( CreateSurfTriMesh()) ; + PtrOwner pSTM( CreateBasicSurfTriMesh()) ; if ( IsNull( pSTM) || ! pSTM->CreateByRegion( vPL)) return nullptr ; // creo la seconda superficie e la unisco alla prima { // copio la prima superficie - PtrOwner pSTM2( pSTM->Clone()) ; - if ( IsNull( pSTM2)) - return nullptr ; + SurfTriMesh STM2 = *pSTM ; // inverto la prima superficie pSTM->Invert() ; // traslo la seconda - pSTM2->Translate( vtExtr) ; + STM2.Translate( vtExtr) ; // la unisco alla prima - if ( ! pSTM->DoSewing( *pSTM2)) + if ( ! pSTM->DoSewing( STM2)) return nullptr ; } // creo e unisco le diverse superfici di estrusione for ( int i = 0 ; i < int( vPL.size()) ; ++ i) { // estrusione - PtrOwner pSTM2( CreateSurfTriMesh()) ; - if ( IsNull( pSTM2) || ! pSTM2->CreateByExtrusion( vPL[i], vtExtr)) + SurfTriMesh STM2 ; + if ( ! STM2.CreateByExtrusion( vPL[i], vtExtr)) return nullptr ; // la unisco alla superficie principale - if ( ! pSTM->DoSewing( *pSTM2)) + if ( ! pSTM->DoSewing( STM2)) return nullptr ; } // compatto la superficie @@ -685,7 +682,7 @@ GetSurfTriMeshSwept( const ICurve* pSect, const ICurve* pGuide, bool bCapEnds, d pSTM->DoSewing( *pSr) ; } // salvo la curva come prossima precedente - pPrevCrv.Set( Release( pCurrCrv)) ; + pPrevCrv.Set( pCurrCrv) ; // prossimo punto bPoint = PL.GetNextPoint( ptP) ; } diff --git a/StmStandard.cpp b/StmStandard.cpp index 9906aa9..e0eaa79 100644 --- a/StmStandard.cpp +++ b/StmStandard.cpp @@ -14,6 +14,7 @@ //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "CurveArc.h" +#include "SurfTriMesh.h" #include "/EgtDev/Include/EGkStmStandard.h" #include "/EgtDev/Include/EGkStmFromCurves.h" #include "/EgtDev/Include/EGkPolygon3d.h" @@ -22,7 +23,7 @@ using namespace std ; //------------------------------------------------------------------------------- -static ISurfTriMesh* +static SurfTriMesh* GetStandardSurfTriMeshBox( double dDimX, double dDimY, double dHeight) { // creo la polilinea del contorno della base @@ -38,29 +39,27 @@ GetStandardSurfTriMeshBox( double dDimX, double dDimY, double dHeight) // vettore altezza (estrusione) Vector3d vtExtr( 0, 0, dHeight) ; // creo e setto la superficie trimesh laterale - PtrOwner pSTM( CreateSurfTriMesh()) ; + PtrOwner pSTM( CreateBasicSurfTriMesh()) ; if ( IsNull( pSTM) || ! pSTM->CreateByExtrusion( PL, vtExtr)) return nullptr ; // creo la prima superficie di estremità - PtrOwner pSTM1( CreateSurfTriMesh()) ; - if ( IsNull( pSTM1) || ! pSTM1->CreateByFlatContour( PL)) + SurfTriMesh STM1 ; + if ( ! STM1.CreateByFlatContour( PL)) return nullptr ; // la copio - PtrOwner pSTM2( pSTM1->Clone()) ; - if ( IsNull( pSTM2)) - return nullptr ; + SurfTriMesh STM2 = STM1 ; // inverto la prima superficie - pSTM1->Invert() ; + STM1.Invert() ; // traslo la seconda - pSTM2->Translate( Vector3d( 0, 0, dHeight)) ; + STM2.Translate( Vector3d( 0, 0, dHeight)) ; // le unisco alla superficie del fianco - if ( ! pSTM->DoSewing( *pSTM1) || ! pSTM->DoSewing( *pSTM2)) + if ( ! pSTM->DoSewing( STM1) || ! pSTM->DoSewing( STM2)) return nullptr ; // restituisco la superficie return Release( pSTM) ; } //------------------------------------------------------------------------------- -static ISurfTriMesh* +static SurfTriMesh* GetRegularSurfTriMeshBox( double dDimX, double dDimY, double dHeight) { // i triangoli devono essere quasi equilateri pertanto calcolo come dividere le varie parti @@ -92,15 +91,15 @@ GetRegularSurfTriMeshBox( double dDimX, double dDimY, double dHeight) // vettore altezza (estrusione) Vector3d vtExtr1( 0, 0, dStepZ) ; // creo e unisco le superfici trimesh laterali - PtrOwner pSTM1 ; + PtrOwner pSTM1 ; for ( int k = 0 ; k < nStepZ ; ++ k) { - PtrOwner pSTMz( CreateSurfTriMesh()) ; - if ( IsNull( pSTMz) || ! pSTMz->CreateByExtrusion( PL1, vtExtr1)) + SurfTriMesh STMz ; + if ( ! STMz.CreateByExtrusion( PL1, vtExtr1)) return nullptr ; - pSTMz->Translate( Vector3d( 0, 0, k * dStepZ)) ; + STMz.Translate( Vector3d( 0, 0, k * dStepZ)) ; if ( IsNull( pSTM1)) - pSTM1.Set( Release( pSTMz)) ; - else if ( ! pSTM1->DoSewing( *pSTMz)) + pSTM1.Set( STMz.Clone()) ; + else if ( ! pSTM1->DoSewing( STMz)) return nullptr ; } // creo la polilinea del lato sinistro della superficie inferiore @@ -112,26 +111,24 @@ GetRegularSurfTriMeshBox( double dDimX, double dDimY, double dHeight) // vettore estrusione Vector3d vtExtr2( dStepX, 0, 0) ; // creo e unisco le superfici trimesh inferiori - PtrOwner pSTM2 ; + SurfTriMesh STM2 ; for ( int i = 0 ; i < nStepX ; ++ i) { - PtrOwner pSTMx( CreateSurfTriMesh()) ; - if ( IsNull( pSTMx) || ! pSTMx->CreateByExtrusion( PL2, vtExtr2)) + SurfTriMesh STMx ; + if ( ! STMx.CreateByExtrusion( PL2, vtExtr2)) return nullptr ; - pSTMx->Translate( Vector3d( i * dStepX, 0, 0)) ; - if ( IsNull( pSTM2)) - pSTM2.Set( Release( pSTMx)) ; - else if ( ! pSTM2->DoSewing( *pSTMx)) + STMx.Translate( Vector3d( i * dStepX, 0, 0)) ; + if ( STM2.IsEmpty()) + STM2 = STMx ; + else if ( ! STM2.DoSewing( STMx)) return nullptr ; } // la copio - PtrOwner pSTM3( pSTM2->Clone()) ; - if ( IsNull( pSTM3)) - return nullptr ; + SurfTriMesh STM3 = STM2 ; // inverto e traslo la superficie superiore - pSTM3->Invert() ; - pSTM3->Translate( Vector3d( 0, 0, dHeight)) ; + STM3.Invert() ; + STM3.Translate( Vector3d( 0, 0, dHeight)) ; // le unisco alla superficie del fianco - if ( ! pSTM1->DoSewing( *pSTM2) || ! pSTM1->DoSewing( *pSTM3)) + if ( ! pSTM1->DoSewing( STM2) || ! pSTM1->DoSewing( STM3)) return nullptr ; // restituisco la superficie return Release( pSTM1) ; @@ -171,16 +168,16 @@ GetSurfTriMeshPyramid( double dDimX, double dDimY, double dHeight) // punto di vertice Point3d ptTip( 0.5 * dDimX, 0.5 * dDimY, dHeight) ; // creo e setto la superficie trimesh laterale - PtrOwner pSTM( CreateSurfTriMesh()) ; + PtrOwner pSTM( CreateBasicSurfTriMesh()) ; if ( IsNull( pSTM) || ! pSTM->CreateByPointCurve( ptTip, PL)) return nullptr ; // creo la superficie di base e ne inverto la normale - PtrOwner pSTM1( CreateSurfTriMesh()) ; - if ( IsNull( pSTM1) || ! pSTM1->CreateByFlatContour( PL)) + SurfTriMesh STM1 ; + if ( ! STM1.CreateByFlatContour( PL)) return nullptr ; - pSTM1->Invert() ; + STM1.Invert() ; // la unisco alla superficie del fianco - if ( ! pSTM->DoSewing( *pSTM1)) + if ( ! pSTM->DoSewing( STM1)) return nullptr ; // restituisco la superficie return Release( pSTM) ; diff --git a/SurfTriMesh.cpp b/SurfTriMesh.cpp index 2acf8db..75de929 100644 --- a/SurfTriMesh.cpp +++ b/SurfTriMesh.cpp @@ -1105,7 +1105,7 @@ SurfTriMesh::GetSilhouette( const Vector3d& vtDir, double dTol, POLYLINEVECTOR& pSfrPart->Offset( dTol, ICurve::OFF_FILLET) ; if ( IsNull( pSfr)) if ( pSfrPart->GetNormVersor() * vtVers > 0) - bOk = pSfr.Set( Release( pSfrPart)) ; + bOk = pSfr.Set( pSfrPart) ; else bOk = false ; else { @@ -1151,7 +1151,7 @@ SurfTriMesh::GetSilhouette( const Vector3d& vtDir, double dTol, POLYLINEVECTOR& if ( ! IsNull( pSfrTria)) { pSfrTria->Offset( dTol, ICurve::OFF_FILLET) ; if ( IsNull( pSfr)) - pSfr.Set( Release( pSfrTria)) ; + pSfr.Set( pSfrTria) ; else pSfr->Add( *pSfrTria) ; } From 21b4af444b6a7729951522056403678142971100 Mon Sep 17 00:00:00 2001 From: DarioS Date: Mon, 27 Mar 2023 20:40:04 +0200 Subject: [PATCH 8/8] EgtGeomKernel : - aggiustamenti per PtrOwner nuova funzione Set. --- CurveBezier.cpp | 2 +- CurveByApprox.cpp | 2 +- SurfFlatRegionOffset.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CurveBezier.cpp b/CurveBezier.cpp index 5462637..ac0e967 100644 --- a/CurveBezier.cpp +++ b/CurveBezier.cpp @@ -1478,7 +1478,7 @@ CurveBezier::BiArcOrSplit( int nLev, PolyLine& PL, double dLinTol, double dAngTo return false ; if ( ! pCC->FromPolyLine( PL)) return false ; - pCrv.Set( Release( pCC)) ; + pCrv.Set( pCC) ; dMaxDist = 0 ; } // se la polilinea ha un solo punto, esco diff --git a/CurveByApprox.cpp b/CurveByApprox.cpp index cc84baf..89e30f3 100644 --- a/CurveByApprox.cpp +++ b/CurveByApprox.cpp @@ -460,7 +460,7 @@ CurveByApprox::BiArcOrSplit( int nLev, PolyLine& PL, double dLinTol, double dAng return false ; if ( ! pCC->FromPolyLine( PL)) return false ; - pCrv.Set( Release( pCC)) ; + pCrv.Set( pCC) ; dMaxDist = 0 ; } // se la polilinea ha un solo punto, esco diff --git a/SurfFlatRegionOffset.cpp b/SurfFlatRegionOffset.cpp index 7c6e761..a54fc51 100644 --- a/SurfFlatRegionOffset.cpp +++ b/SurfFlatRegionOffset.cpp @@ -60,7 +60,7 @@ SurfFlatRegion::Offset( double dDist, int nType) pOffsCompo->SetTempProp( j, 1) ; for( int k = 0 ; k < pOffsCompo->GetCurveCount() ; ++k) pOffsCompo->SetCurveTempProp( k, j, 1) ; - pOffs.Set( Release( pOffsCompo)) ; + pOffs.Set( pOffsCompo) ; } else pOffs->SetTempProp( j, 1) ;