diff --git a/Tool.cpp b/Tool.cpp index 36eef84..aa8b665 100644 --- a/Tool.cpp +++ b/Tool.cpp @@ -814,6 +814,7 @@ Tool::SetAdditiveTool( const std::string& sToolName, double dH, double dR, doubl m_Outline.SetCurveTempProp( 0, 1, 1) ; CurveArc cvArc ; cvArc.SetC2P( Point3d( m_dRadius - m_dRCorner, - m_dRCorner, 0), Point3d( m_dRadius - m_dRCorner, 0, 0), Point3d( m_dRadius, - m_dRCorner, 0)) ; + m_Outline.AddCurve( cvArc) ; m_Outline.SetCurveTempProp( 1, 1, 1) ; m_Outline.AddLine( Point3d( m_dRadius, - m_dHeight + m_dRCorner, 0)) ; m_Outline.SetCurveTempProp( 2, 1, 1) ; diff --git a/VolZmap.h b/VolZmap.h index 8f03eca..bd4689b 100644 --- a/VolZmap.h +++ b/VolZmap.h @@ -340,7 +340,11 @@ class VolZmap : public IVolZmap, public IGeoObjRW // Additivo bool AddingMotion( int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtAx) ; bool AddingCylinder( int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtAx, double dHei, double dRad) ; - bool AddingTruncatedCone( int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtAx, double dHei, double dMaxRad, double dMinRad) ; + bool AddingTruncatedCone( int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtAx, + double dMaxRad, double dMinRad, double dHei, + const Vector3d& vtArcNormMaxR, const Vector3d& vtArcNormMinR) ; + bool AddingGeneral( int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtAx) ; + // Intersezioni bool IntersLineZMapLattice( const Point3d& ptP, const Vector3d& vtV, double& dU1, double& dU2) const ; diff --git a/VolZmapVolume.cpp b/VolZmapVolume.cpp index 4978fb6..73374cc 100644 --- a/VolZmapVolume.cpp +++ b/VolZmapVolume.cpp @@ -315,7 +315,7 @@ VolZmap::AddIntervals( int nGrid, int nI, int nJ, bool bModified = false ; // Non esistono segmenti - if ( m_Values[nGrid][nPos].size() == 0) { + if ( int( vDexel.size()) == 0) { vDexel.emplace_back() ; vDexel.back().dMin = dMin ; @@ -495,16 +495,6 @@ VolZmap::AddIntervals( int nGrid, int nI, int nJ, if ( ! bModified) return true ; - // Elimino residui di intervalli inutili - for ( int i = 0 ; i < int( vDexel.size()) ; ++ i) { - int nMaxN = int( floor( ( vDexel[i].dMax + 2 * EPS_SMALL - 0.5 * m_dStep) / m_dStep)) ; - int nMinN = int( floor( ( vDexel[i].dMin - 2 * EPS_SMALL - 0.5 * m_dStep) / m_dStep)) ; - if ( nMinN == nMaxN) { - vDexel.erase( vDexel.begin() + i) ; - -- i ; - } - } - // Imposto ricalcolo della grafica m_OGrMgr.Reset() ; // Imposto forma generica @@ -737,9 +727,6 @@ VolZmap::MillingTranslationStep( const Point3d& ptPs, const Point3d& ptPe, const Vector3d vtALs[N_MAPS] ; InitializePointsAndVectors( ptPs, ptPe, vtD, vtA, ptLs, ptLe, vtLs, vtALs) ; // Ciclo sulle mappe - /*for ( int i = 0 ; i < m_nMapNum ; ++ i) { - SelectMotion( i, ptLs[i], ptLe[i], vtLs[i], vtALs[i]) ; - }*/ vector< future> vRes ; vRes.resize( m_nMapNum) ; for ( int i = 0 ; i < m_nMapNum ; ++ i) { @@ -7816,117 +7803,88 @@ VolZmap::AddingMotion( int nGrid, const Point3d& ptS, const Point3d& ptE, const AddingCylinder( nGrid, ptS, ptE, vtAx, dHei, dRad) ; } else { - ; + AddingGeneral( nGrid, ptS, ptE, vtAx) ; } return true ; } //---------------------------------------------------------------------------- bool -VolZmap::AddingGeneral( int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir) +VolZmap::AddingGeneral( int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtAx) { - //// Descrizione geometrica del moto - // Point3d ptI = ptS ; - // Point3d ptF = ptE ; - // Vector3d vtMove = ptE - ptS ; - //// Vettore delle normali agli archi - // const VCT3DVECTOR& vArcNorm = m_vTool[m_nCurrTool].GetArcNormalVec() ; - //// Poinch� l'asse utensile � parallelo all'asse Z, definisco un sistema di - //// riferimento ad hoc in cui le normali agli archi giacciano nel piano XZ. - // Frame3d frNormFrame ; - // frNormFrame.Set( ORIG, X_AX, -Z_AX, Y_AX) ; - //// Ciclo sulle curve del profilo - // const CurveComposite& ToolProfile = m_vTool[m_nCurrTool].GetApproxOutline() ; - // int i = - 1 ; - // const ICurve* pPrevCurve = nullptr ; - // const ICurve* pCurve = ToolProfile.GetCurve( ++ i) ; - // while ( pCurve != nullptr) { - // - // double dHeight = 0 ; - // // Se segmento - // if ( pCurve->GetType() == CRV_LINE) { - // // Recupero gli estremi - // const ICurveLine* pLine = GetCurveLine( pCurve) ; - // Point3d ptStart = pLine->GetStart() ; - // Point3d ptEnd = pLine->GetEnd() ; - // int nNormNum = pLine->GetTempProp(); - // Vector3d vtNormSt, vtNormEn; - // if ( nNormNum != 0) { - // vtNormSt = vArcNorm[nNormNum - 1] ; - // vtNormEn = vArcNorm[nNormNum] ; - // vtNormSt.ToLoc(frNormFrame); - // vtNormEn.ToLoc(frNormFrame); - // } - // // Ne determino l'altezza - // dHeight = ptStart.y - ptEnd.y ; - // if ( dHeight > EPS_SMALL) { - // // verifiche curva precedente per eventuale tappo sopra - // if ( pPrevCurve != nullptr && pPrevCurve->GetType() == CRV_LINE) { - // const ICurveLine* pOthLine = GetCurveLine( pPrevCurve) ; - // Point3d ptOthStart = pOthLine->GetStart() ; - // Point3d ptOthEnd = pOthLine->GetEnd() ; - // } - // // verifiche curva successiva per eventuale tappo sotto - // int j = i ; - // const ICurve* pNextCurve = ToolProfile.GetCurve( ++ j) ; - // if ( pNextCurve != nullptr && pNextCurve->GetType() == CRV_LINE) { - // const ICurveLine* pOthLine = GetCurveLine( pNextCurve) ; - // Point3d ptOthStart = pOthLine->GetStart() ; - // Point3d ptOthEnd = pOthLine->GetEnd() ; - // } - // // Se X costante, � un cilindro - // if ( abs( ptStart.x - ptEnd.x) < EPS_SMALL) { - // double dRadius = ptStart.x ; - // if ( dRadius > 10 * EPS_SMALL) { - // CompCyl_Milling( nGrid, ptI, ptF, vtToolDir, dHeight, dRadius, bTapB, bTapT) ; - // } - // } - // // Se X crescente, � un cono con vettore equiverso a quello dell'utensile - // else if ( ptStart.x > ptEnd.x) { - // double dMaxRad = ptStart.x ; - // double dMinRad = ptEnd.x ; - // CompConus_Milling( nGrid, ptI, ptF, vtToolDir, dHeight, dMaxRad, dMinRad, bTapB, bTapT, vtNormSt, vtNormEn) ; - // } - // // Se X decrescente, � un cono con vettore opposto a quello dell'utensile - // else if ( ptStart.x < ptEnd.x) { - // double dMaxRad = ptEnd.x ; - // double dMinRad = ptStart.x ; - // Point3d ptIn = ptI - vtToolDir * dSignedHeight ; - // Point3d ptFn = ptIn + vtMove ; - // vtNormEn.z *= -1 ; - // vtNormSt.z *= -1 ; - // CompConus_Milling( nGrid, ptIn, ptFn, - vtToolDir, dHeight, dMaxRad, dMinRad, bTapT, bTapB, vtNormEn, vtNormSt) ; - // } - // } - // } + // Descrizione geometrica del moto + Point3d ptI = ptS ; + Point3d ptF = ptE ; + Vector3d vtMove = ptE - ptS ; + // Vettore delle normali agli archi + const VCT3DVECTOR& vArcNorm = m_vTool[m_nCurrTool].GetArcNormalVec() ; + // Poinché l'asse utensile è parallelo all'asse Z, definisco un sistema di + // riferimento ad hoc in cui le normali agli archi giacciano nel piano XZ. + Frame3d frNormFrame ; + frNormFrame.Set( ORIG, X_AX, -Z_AX, Y_AX) ; + // Ciclo sulle curve del profilo + const CurveComposite& ToolProfile = m_vTool[m_nCurrTool].GetApproxOutline() ; + int i = - 1 ; + const ICurve* pCurve = ToolProfile.GetCurve( ++ i) ; + while ( pCurve != nullptr) { + + double dHeight = 0 ; - // // Se arco - // else if ( pCurve->GetType() == CRV_ARC) { - // // Recupero estremi, centro e raggio - // const ICurveArc* pArc = GetCurveArc( pCurve) ; - // Point3d ptStart ; pArc->GetStartPoint( ptStart) ; - // Point3d ptEnd ; pArc->GetEndPoint( ptEnd) ; - // Point3d ptCen = pArc->GetCenter() ; - // double dRadius = pArc->GetRadius() ; - // // Determino le posizioni iniziale e finale del centro della sfera - // Point3d ptCenS = ptI - vtToolDir * ( ptStart.y - ptCen.y) ; - // Point3d ptCenE = ptCenS + vtMove ; - // // Eseguo l'asportazione del materiale - // CompBall_Milling( nGrid, ptCenS, ptCenE, dRadius) ; - // // aggiorno l'altezza - // //dHeight = abs( ptStart.y - ptEnd.y) ; - // } + // Se segmento + if ( pCurve->GetType() == CRV_LINE) { + // Recupero gli estremi + const ICurveLine* pLine = GetCurveLine( pCurve) ; + Point3d ptStart = pLine->GetStart() ; + Point3d ptEnd = pLine->GetEnd() ; + int nNormNum = pLine->GetTempProp(); + Vector3d vtNormSt, vtNormEn; + if ( nNormNum != 0) { + vtNormSt = vArcNorm[nNormNum - 1] ; + vtNormEn = vArcNorm[nNormNum] ; + vtNormSt.ToLoc(frNormFrame); + vtNormEn.ToLoc(frNormFrame); + } + // Ne determino l'altezza + dHeight = abs( ptStart.y - ptEnd.y) ; + if ( dHeight > EPS_SMALL) { + // Se X costante, è un cilindro + if ( abs( ptStart.x - ptEnd.x) < EPS_SMALL) { + double dRadius = ptStart.x ; + if (dRadius > 10 * EPS_SMALL) + AddingCylinder( nGrid, ptI, ptF, vtAx, dHeight, dRadius) ; + } + // Se X crescente, è un cono con vettore equiverso a quello dell'utensile + else if ( ptStart.x > ptEnd.x) { + double dMaxRad = ptStart.x ; + double dMinRad = ptEnd.x ; + AddingTruncatedCone( nGrid, ptI, ptF, vtAx, dMaxRad, dMinRad, dHeight, vtNormSt, vtNormEn) ; + } + // Se X decrescente, è un cono con vettore opposto a quello dell'utensile + else if ( ptStart.x < ptEnd.x) { + double dMaxRad = ptEnd.x ; + double dMinRad = ptStart.x ; + Point3d ptIn = ptI - vtAx * dHeight ; + Point3d ptFn = ptIn + vtMove ; + vtNormEn.z *= -1 ; + vtNormSt.z *= -1 ; + AddingTruncatedCone( nGrid, ptIn, ptFn, - vtAx, dMaxRad, dMinRad, dHeight, vtNormEn, vtNormSt) ; + + } + // Passo alla curva successiva + pCurve = ToolProfile.GetCurve( ++ i) ; + } + else { + // Passo alla curva successiva + pCurve = ToolProfile.GetCurve( ++ i) ; + } + } - // // Determino le posizioni iniziale e finale del componente successivo - // ptI = ptI - vtToolDir * dSignedHeight ; - // ptF = ptI + vtMove ; + // Determino le posizioni iniziale e finale del componente successivo + ptI = ptI - vtAx * dHeight ; + ptF = ptI + vtMove ; + } - // // Passo alla curva successiva - // pPrevCurve = pCurve ; - // pCurve = ToolProfile.GetCurve( ++ i) ; - // } - - // return true ; + return true ; } //---------------------------------------------------------------------------- @@ -7993,39 +7951,39 @@ VolZmap::AddingCylinder( int nGrid, const Point3d& ptS, const Point3d& ptE, cons } } } - return true + return true ; } //---------------------------------------------------------------------------- bool VolZmap::AddingTruncatedCone( int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtAx, - double dHei, double dMaxRad, double dMinRad, + double dMaxRad, double dMinRad, double dHei, const Vector3d& vtArcNormMaxR, const Vector3d& vtArcNormMinR) { // Verifico interferenza int nStartI, nStartJ, nEndI, nEndJ ; - if ( ! TestCompoBBox( nGrid, ptS, ptE, vtToolDir, dMaxRad, dMinRad, dHei, nStartI, nStartJ, nEndI, nEndJ)) + if ( ! TestCompoBBox( nGrid, ptS, ptE, vtAx, dMaxRad, dMinRad, dHei, nStartI, nStartJ, nEndI, nEndJ)) return true ; // Geometria del cono double dDeltaR = dMaxRad - dMinRad ; // Studio simmetrie - Point3d ptI = ( vtToolDir * ( ptE - ptS) > 0 ? ptS : ptE) ; - Point3d ptF = ( vtToolDir * ( ptE - ptS) > 0 ? ptE : ptS) ; + Point3d ptI = ( vtAx * ( ptE - ptS) > 0 ? ptS : ptE) ; + Point3d ptF = ( vtAx * ( ptE - ptS) > 0 ? ptE : ptS) ; double dL = ( dMaxRad * dHei) / dDeltaR ; double dl = dL - dHei ; - Point3d ptV = ptI - vtToolDir * dL ; + Point3d ptV = ptI - vtAx * dL ; // Vettori caratteristici del movimento Vector3d vtMove = ptF - ptI ; - Vector3d vtMvLong = ( vtMove * vtToolDir) * vtToolDir ; + Vector3d vtMvLong = ( vtMove * vtAx) * vtAx ; Vector3d vtMvOrt = vtMove - vtMvLong ; // Terna destrorsa e unitaria - Vector3d vtV1 = vtToolDir ; + Vector3d vtV1 = vtAx ; Vector3d vtV2 = vtMvOrt ; vtV2.Normalize() ; Vector3d vtV3 = vtV1 ^ vtV2 ; @@ -8080,7 +8038,7 @@ VolZmap::AddingTruncatedCone( int nGrid, const Point3d& ptS, const Point3d& ptE, for ( int i = nStartI ; i <= nEndI ; ++ i) { for ( int j = nStartJ ; j <= nEndJ ; ++ j) { - + Point3d ptC( ( i + 0.5) * m_dStep, ( j + 0.5) * m_dStep, 0) ; Point3d ptInt1, ptInt2 ; @@ -8089,25 +8047,27 @@ VolZmap::AddingTruncatedCone( int nGrid, const Point3d& ptS, const Point3d& ptE, // Cono iniziale ConusFrame.ChangeOrig( ptV) ; if ( IntersLineConus( ptC, Z_AX, ConusFrame, dTan, dl, dL, true, true, ptInt1, vtN1, ptInt2, vtN2)) { + vtN1 *= - 1 ; + vtN2 *= - 1 ; if ( ! ( vtArcNormMaxR.IsSmall() || vtArcNormMinR.IsSmall())) { - if ( ! AreSameOrOppositeVectorEpsilon( vtN1, vtToolDir, 0.1 * EPS_SMALL)) { + if ( ! AreSameOrOppositeVectorEpsilon( vtN1, vtAx, 0.1 * EPS_SMALL)) { Vector3d vtL1 = ptInt1 - ptV ; - vtL1 -= ( vtL1 * vtToolDir) * vtToolDir ; + vtL1 -= ( vtL1 * vtAx) * vtAx ; double dL1 = vtL1.Len() ; vtL1 /= dL1 ; Vector3d vtOriginalN1 = ( ( dDeltaR - dL1 + dMinRad) / dDeltaR) * vtArcNormMinR + ((dL1 - dMinRad) / dDeltaR) * vtArcNormMaxR; vtOriginalN1.Normalize() ; - vtN1 = vtOriginalN1.z * vtToolDir + vtOriginalN1.x * vtL1 ; + vtN1 = vtOriginalN1.z * vtAx + vtOriginalN1.x * vtL1 ; vtN1.Normalize() ; } - if ( ! AreSameOrOppositeVectorEpsilon( vtN2, vtToolDir, 0.1 * EPS_SMALL)) { + if ( ! AreSameOrOppositeVectorEpsilon( vtN2, vtAx, 0.1 * EPS_SMALL)) { Vector3d vtL2 = ptInt2 - ptV ; - vtL2 -= ( vtL2 * vtToolDir) * vtToolDir ; + vtL2 -= ( vtL2 * vtAx) * vtAx ; double dL2 = vtL2.Len() ; vtL2 /= dL2 ; Vector3d vtOriginalN2 = ( ( dDeltaR - dL2 + dMinRad) / dDeltaR) * vtArcNormMinR + ( ( dL2 - dMinRad) / dDeltaR) * vtArcNormMaxR ; vtOriginalN2.Normalize() ; - vtN2 = vtOriginalN2.z * vtToolDir + vtOriginalN2.x * vtL2 ; + vtN2 = vtOriginalN2.z * vtAx + vtOriginalN2.x * vtL2 ; vtN2.Normalize() ; } } @@ -8117,25 +8077,27 @@ VolZmap::AddingTruncatedCone( int nGrid, const Point3d& ptS, const Point3d& ptE, // Cono finale ConusFrame.ChangeOrig( ptV + vtMove) ; if ( IntersLineConus( ptC, Z_AX, ConusFrame, dTan, dl, dL, true, true, ptInt1, vtN1, ptInt2, vtN2)) { + vtN1 *= - 1 ; + vtN2 *= - 1 ; if ( ! ( vtArcNormMaxR.IsSmall() || vtArcNormMinR.IsSmall())) { - if ( ! AreSameOrOppositeVectorEpsilon( vtN1, vtToolDir, 0.1 * EPS_SMALL)) { + if ( ! AreSameOrOppositeVectorEpsilon( vtN1, vtAx, 0.1 * EPS_SMALL)) { Vector3d vtL1 = ptInt1 - ptV - vtMove ; - vtL1 -= ( vtL1 * vtToolDir) * vtToolDir ; + vtL1 -= ( vtL1 * vtAx) * vtAx ; double dL1 = vtL1.Len() ; vtL1 /= dL1 ; Vector3d vtOriginalN1 = ( ( dDeltaR - dL1 + dMinRad) / dDeltaR) * vtArcNormMinR + ( ( dL1 - dMinRad) / dDeltaR) * vtArcNormMaxR ; vtOriginalN1.Normalize() ; - vtN1 = vtOriginalN1.z * vtToolDir + vtOriginalN1.x * vtL1 ; + vtN1 = vtOriginalN1.z * vtAx + vtOriginalN1.x * vtL1 ; vtN1.Normalize() ; } - if ( ! AreSameOrOppositeVectorEpsilon(vtN2, vtToolDir, 0.1 * EPS_SMALL)) { + if ( ! AreSameOrOppositeVectorEpsilon(vtN2, vtAx, 0.1 * EPS_SMALL)) { Vector3d vtL2 = ptInt2 - ptV - vtMove ; - vtL2 -= (vtL2 * vtToolDir) * vtToolDir; + vtL2 -= (vtL2 * vtAx) * vtAx; double dL2 = vtL2.Len() ; vtL2 /= dL2 ; Vector3d vtOriginalN2 = ( ( dDeltaR - dL2 + dMinRad) / dDeltaR) * vtArcNormMinR + ( ( dL2 - dMinRad) / dDeltaR) * vtArcNormMaxR ; vtOriginalN2.Normalize() ; - vtN2 = vtOriginalN2.z * vtToolDir + vtOriginalN2.x * vtL2 ; + vtN2 = vtOriginalN2.z * vtAx + vtOriginalN2.x * vtL2 ; vtN2.Normalize() ; } } @@ -8339,25 +8301,27 @@ VolZmap::AddingTruncatedCone( int nGrid, const Point3d& ptS, const Point3d& ptE, // Cono ConusFrame.ChangeOrig( ptV) ; if ( IntersLineConus( ptC, Z_AX, ConusFrame, dTan, dl, dL, true, true, ptInt1, vtN1, ptInt2, vtN2)) { + vtN1 *= - 1 ; + vtN2 *= - 1 ; if ( ! ( vtArcNormMaxR.IsSmall() || vtArcNormMinR.IsSmall())) { - if ( ! AreSameOrOppositeVectorEpsilon( vtN1, vtToolDir, 0.1 * EPS_SMALL)) { + if ( ! AreSameOrOppositeVectorEpsilon( vtN1, vtAx, 0.1 * EPS_SMALL)) { Vector3d vtL1 = ptInt1 - ptV ; - vtL1 -= ( vtL1 * vtToolDir) * vtToolDir ; + vtL1 -= ( vtL1 * vtAx) * vtAx ; double dL1 = vtL1.Len() ; vtL1 /= dL1 ; Vector3d vtOriginalN1 = ( ( dDeltaR - dL1 + dMinRad) / dDeltaR) * vtArcNormMinR + ( ( dL1 - dMinRad) / dDeltaR) * vtArcNormMaxR ; vtOriginalN1.Normalize() ; - vtN1 = vtOriginalN1.z * vtToolDir + vtOriginalN1.x * vtL1 ; + vtN1 = vtOriginalN1.z * vtAx + vtOriginalN1.x * vtL1 ; vtN1.Normalize() ; } - if ( ! AreSameOrOppositeVectorEpsilon( vtN2, vtToolDir, 0.1 * EPS_SMALL)) { + if ( ! AreSameOrOppositeVectorEpsilon( vtN2, vtAx, 0.1 * EPS_SMALL)) { Vector3d vtL2 = ptInt2 - ptV ; - vtL2 -= ( vtL2 * vtToolDir) * vtToolDir ; + vtL2 -= ( vtL2 * vtAx) * vtAx ; double dL2 = vtL2.Len() ; vtL2 /= dL2 ; Vector3d vtOriginalN2 = ( ( dDeltaR - dL2 + dMinRad) / dDeltaR) * vtArcNormMinR + ( ( dL2 - dMinRad) / dDeltaR) * vtArcNormMaxR ; vtOriginalN2.Normalize() ; - vtN2 = vtOriginalN2.z * vtToolDir + vtOriginalN2.x * vtL2 ; + vtN2 = vtOriginalN2.z * vtAx + vtOriginalN2.x * vtL2 ; vtN2.Normalize() ; } }