diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index ff39627..40c1ad1 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/ExtDimension.cpp b/ExtDimension.cpp index 131cc0c..eed2c3b 100644 --- a/ExtDimension.cpp +++ b/ExtDimension.cpp @@ -45,7 +45,7 @@ static const double STD_TEXTHEIGHT = 10.0 ; static const double MIN_TEXTHEIGHT = 1.0 ; //---------------------------------------------------------------------------- -GEOOBJ_REGISTER( EXT_DIMENSION, NGE_E_DIM, ExtDimension ) ; +GEOOBJ_REGISTER( EXT_DIMENSION, NGE_E_DIM, ExtDimension) ; //---------------------------------------------------------------------------- ExtDimension::ExtDimension( void) @@ -100,7 +100,7 @@ ExtDimension::SetLinear( const Point3d& ptP1, const Point3d& ptP2, const Point3d m_vtDir = m_ptP2 - m_ptP1 ; else { m_vtDir -= m_vtDir * m_vtN * m_vtN ; - if ( m_vtDir * ( m_ptP2 - m_ptP1) < 0 ) + if ( m_vtDir * ( m_ptP2 - m_ptP1) < 0) m_vtDir.Invert() ; } if ( ! m_vtDir.Normalize()) @@ -115,9 +115,9 @@ ExtDimension::SetLinear( const Point3d& ptP1, const Point3d& ptP2, const Point3d vtLine1.Invert() ; if ( dProSca2 < -EPS_SMALL) vtLine2.Invert() ; - if ( abs( dProSca1 ) < EPS_SMALL) + if ( abs( dProSca1) < EPS_SMALL) vtLine1 = vtLine2 ; - if ( abs( dProSca2 ) < EPS_SMALL) + if ( abs( dProSca2) < EPS_SMALL) vtLine2 = vtLine1 ; m_ptP5 = m_ptP1 + vtLine1 * ( m_ptPos - m_ptP1) * vtLine1 ; m_ptP6 = m_ptP2 + vtLine2 * ( m_ptPos - m_ptP2) * vtLine2 ; @@ -136,63 +136,143 @@ ExtDimension::SetLinear( const Point3d& ptP1, const Point3d& ptP2, const Point3d //---------------------------------------------------------------------------- bool -ExtDimension::SetAngular( const Point3d& ptP1, const Point3d& ptCen, const Point3d& ptP2, const Point3d& ptPos, +ExtDimension::SetRadial( const Point3d& ptCen, const Point3d& ptPos, + const Vector3d& vtN, const string& sText) +{ + // dichiaro quota non ancora determinata + m_nType = DT_NONE ; + // verifico la definizione del versore normale e del versore X + m_vtN = vtN ; + m_vtDir = ptPos - ptCen ; + if ( ! m_vtN.Normalize() || ! m_vtDir.Normalize()) + return false ; + + // porto i punti nel piano definito da ptCen e vtN + m_ptP1 = ptCen ; + m_ptPos = ptPos - ( ptPos - m_ptP5) * m_vtN * m_vtN ; + m_ptP3 = m_ptP1 ; + m_ptP5 = m_ptP1 ; + m_ptP2 = m_ptPos ; + m_ptP4 = m_ptPos ; + m_ptP6 = m_ptPos ; + + // verifico che i punti di misura non siano coincidenti + if ( AreSamePointApprox( m_ptP5, m_ptPos)) + return false ; + + // assegnazione del testo + m_sText = sText ; + // assegno il tipo + m_nType = DT_RADIAL ; + // imposto da calcolare + m_bToCalc = true ; + m_OGrMgr.Reset() ; + + return true ; +} + +//---------------------------------------------------------------------------- +bool +ExtDimension::SetDiametral( const Point3d& ptCen, const Point3d& ptPos, + const Vector3d& vtN, const string& sText) +{ + // dichiaro quota non ancora determinata + m_nType = DT_NONE ; + // verifico la definizione del versore normale + m_vtN = vtN ; + m_vtDir = ptPos - ptCen ; + if ( ! m_vtN.Normalize() || ! m_vtDir.Normalize()) + return false ; + + // porto i punti nel piano definito da ptP1 e vtN + m_ptPos = ptPos - ( ptPos - ptCen) * m_vtN * m_vtN ; + m_ptP2 = m_ptPos ; + m_ptP6 = m_ptPos ; + m_ptP4 = m_ptPos ; + // ottengo il punto diametralmente opposto a ptPos + m_ptP1 = ptCen - ( m_ptPos - ptCen) ; + m_ptP5 = m_ptP1 ; + m_ptP3 = m_ptP1 ; + + // verifico che i punti di misura non siano coincidenti + if ( AreSamePointApprox( m_ptP5, m_ptPos)) + return false ; + // assegnazione del testo + m_sText = sText ; + // assegno il tipo + m_nType = DT_DIAMETRAL ; + // imposto da calcolare + m_bToCalc = true ; + m_OGrMgr.Reset() ; + + return true; +} + +//---------------------------------------------------------------------------- +bool +ExtDimension::SetAngular( const Point3d& ptP1, const Point3d& ptP2, const Point3d& ptV, const Point3d& ptPos, const Vector3d& vtN, const string& sText) -{ // ptCen è il vertice dell'angolo e l'ordine di inserimento dei punti nella funzione è: punto1, vertice, punto2 - // il punto m_ptP6 viene utilizzato per il centro anziché come estremo della quotatura, che verrà calcolata come specchiatura di m_ptP5 +{ // dichiaro quota non ancora determinata m_nType = DT_NONE ; // verifico la definizione del versore normale m_vtN = vtN ; if ( ! m_vtN.Normalize()) return false ; - // porto i punti nel piano definito da ptP1 e vtN + // porto i punti nel piano definito da P1 e N m_ptP1 = ptP1 ; - m_ptP6 = ptCen - ( ptCen - m_ptP1) * m_vtN * m_vtN ; - m_ptPos = ptPos - ( ptPos - m_ptP1) * m_vtN * m_vtN ; m_ptP2 = ptP2 - ( ptP2 - m_ptP1) * m_vtN * m_vtN ; + m_ptP5 = ptV - ( ptV - m_ptP1) * m_vtN * m_vtN ; + m_ptPos = ptPos - ( ptPos - m_ptP1) * m_vtN * m_vtN ; // verifico che i punti di misura non siano coincidenti - if ( AreSamePointApprox( m_ptP6, m_ptP1) || AreSamePointApprox( m_ptP6, m_ptP2) || AreSamePointApprox( m_ptP1, m_ptP2)) + if ( AreSamePointApprox( m_ptP1, m_ptP2) || AreSamePointApprox( m_ptP1, m_ptP5) || AreSamePointApprox( m_ptP2, m_ptP5)) return false ; - // direzione di riferimento (nel piano perpendicolare a vtN) - m_vtDir = m_ptPos - m_ptP6 ; - double dLenDir = m_vtDir.Len() ; - // controllo se è testo o se è la misura - double dFactor ; - if ( m_sCalcText.find( IS_MEASURE) != string::npos) { - m_sCalcText = "300.00" ; - double dHalfDist = GetTextHalfDist( m_ptPos) ; - dFactor = 2.5 * dHalfDist ; - m_sCalcText = "" ; - } - else { - double dHalfDist = GetTextHalfDist( m_ptPos) ; - dFactor = 2.5 * dHalfDist ; - } - //allungo m_vtDir se è troppo vicino al centro - if ( m_vtDir.Len() < dFactor) { - Vector3d vtDir_n = m_vtDir ; - if ( ! vtDir_n.Normalize()) - return false ; - m_ptPos = m_ptP6 + dFactor * vtDir_n ; - // ricalcolo m_vtDir - m_vtDir = m_ptPos - m_ptP6 ; - dLenDir = m_vtDir.Len() ; - } // calcolo le direzioni su cui giacciono i due lati dell'angolo - Vector3d vtLine1 = m_ptP1 - m_ptP6 ; - Vector3d vtLine2 = m_ptP2 - m_ptP6 ; + Vector3d vtLine1 = m_ptP1 - m_ptP5 ; + Vector3d vtLine2 = m_ptP2 - m_ptP5 ; double dLen1 = vtLine1.Len() ; double dLen2 = vtLine2.Len() ; if ( ! vtLine1.Normalize() || ! vtLine2.Normalize()) return false ; + // direzione di riferimento (nel piano perpendicolare a vtN) + m_vtDir = m_ptPos - m_ptP5 ; + double dLenDir = m_vtDir.Len() ; + + // controllo se è testo o se è la misura + double dHalfDist ; + double dFactor ; + if ( m_sCalcText.find( IS_MEASURE) != string::npos) { + dHalfDist = GetTextHalfDist( m_ptPos) ; + dFactor = 2.5 * dHalfDist ; + m_sCalcText = "" ; + } + else { + dHalfDist = GetTextHalfDist( m_ptPos) ; + dFactor = 2.5 * dHalfDist ; + } + // allungo m_vtDir se è troppo vicino al centro + if ( m_vtDir.Len() < dFactor) { + Vector3d vtDir_n = m_vtDir ; + if ( ! vtDir_n.Normalize()) + return false ; + m_ptPos = m_ptP5 + dFactor * vtDir_n ; + // ricalcolo m_vtDir + m_vtDir = m_ptPos - m_ptP5 ; + dLenDir = m_vtDir.Len() ; + } + // segnalo se i punti che definiscono i lati sono più lontani dal centro di ptPos - bool bPt1Close = ( dLenDir < dLen1 ? true : false) ; - bool bPt2Close = ( dLenDir < dLen2 ? true : false) ; + bool bPt1Close = false ; + bool bPt2Close = false ; + if ( dLenDir < dLen1) + bPt1Close = true ; + if ( dLenDir < dLen2) + bPt2Close = true ; m_ptP5 = m_ptP1 + ( dLenDir - dLen1) * vtLine1 ; - Point3d ptP5_bis = m_ptP2 + ( dLenDir - dLen2) * vtLine2 ; + m_ptP6 = m_ptP2 + ( dLenDir - dLen2) * vtLine2 ; m_ptP3 = m_ptP5 + ( bPt1Close ? - vtLine1 : vtLine1) * m_dExtLineLen ; - m_ptP4 = ptP5_bis + ( bPt2Close ? - vtLine2 : vtLine2) * m_dExtLineLen ; + m_ptP4 = m_ptP6 + ( bPt2Close ? - vtLine2 : vtLine2) * m_dExtLineLen ; + // assegnazione del testo m_sText = sText ; // assegno il tipo @@ -204,78 +284,6 @@ ExtDimension::SetAngular( const Point3d& ptP1, const Point3d& ptCen, const Point return true; } -//---------------------------------------------------------------------------- -bool -ExtDimension::SetRadial( const Point3d& ptCen, const Point3d& ptPos, const Vector3d& vtN, const string& sText) -{ // ptCen è il vertice del cerchio e ptPos è un punto sulla circonferenza - // il punto m_ptP6 viene utilizzato per il centro - // dichiaro quota non ancora determinata - m_nType = DT_NONE ; - // verifico la definizione del versore normale - m_vtN = vtN ; - if ( ! m_vtN.Normalize()) - return false ; - // porto i punti nel piano definito da ptCen e vtN - m_ptP6 = ptCen ; - m_ptPos = ptPos - ( ptPos - m_ptP6) * m_vtN * m_vtN ; - m_ptP1 = ptCen ; - m_ptP5 = ptCen ; - m_ptP2 = m_ptPos ; - // definisco la direzione vtDir - m_vtDir = m_ptPos - m_ptP6 ; - if ( ! m_vtDir.Normalize()) - return false ; - // verifico che i punti di misura non siano coincidenti - if ( AreSamePointApprox( m_ptP6, m_ptPos)) - return false ; - // assegnazione del testo - m_sText = sText ; - // assegno il tipo - m_nType = DT_RADIAL ; - // imposto da calcolare - m_bToCalc = true ; - m_OGrMgr.Reset() ; - - return true; -} - -//---------------------------------------------------------------------------- -bool -ExtDimension::SetDiametral( const Point3d& ptCen, const Point3d& ptPos, const Vector3d& vtN, const string& sText) -{ // ptCen è il vertice del cerchio e ptPos è un punto sulla circonferenza - // il punto m_ptP6 viene utilizzato per il centro - // dichiaro quota non ancora determinata - m_nType = DT_NONE ; - // verifico la definizione del versore normale - m_vtN = vtN ; - if ( ! m_vtN.Normalize()) - return false ; - // porto i punti nel piano definito da ptCen e vtN - m_ptP6 = ptCen ; - m_ptPos = ptPos - ( ptPos - m_ptP6) * m_vtN * m_vtN ; - m_ptP2 = m_ptPos ; - //ottengo il punto diametralmente opposto a ptPos - m_ptP1 = m_ptPos ; - m_ptP1.Mirror( m_ptP6, m_ptPos - m_ptP6) ; - m_ptP5 = m_ptP1 ; - // definisco la direzione vtDir - m_vtDir = m_ptPos - m_ptP6 ; - if ( ! m_vtDir.Normalize()) - return false ; - // verifico che i punti di misura non siano coincidenti - if ( AreSamePointApprox( m_ptP6, m_ptPos)) - return false ; - // assegnazione del testo - m_sText = sText ; - // assegno il tipo - m_nType = DT_DIAMETRAL ; - // imposto da calcolare - m_bToCalc = true ; - m_OGrMgr.Reset() ; - - return true; -} - //---------------------------------------------------------------------------- ExtDimension* ExtDimension::Clone( void) const @@ -358,7 +366,7 @@ ExtDimension::GetTitle( void) const const string& ExtDimension::GetSubType( void) const { - static const string vsSubType[] = { "None", "Linear", "Radial", "Diametral", "Angular" } ; + static const string vsSubType[] = { "None", "Linear", "Radial", "Diametral", "Angular"} ; if ( m_nType >= DT_NONE && m_nType <= DT_ANGULAR) return vsSubType[m_nType] ; else @@ -506,139 +514,149 @@ ExtDimension::GetLocalBBox( BBox3d& b3Loc, int nFlag) const { // eventuale ricalcolo Update() ; - switch ( m_nType) { - // se lineare - case DT_LINEAR: { - b3Loc.Set( m_ptP1) ; - b3Loc.Add( m_ptP2) ; - b3Loc.Add( m_ptP3) ; - b3Loc.Add( m_ptP4) ; - b3Loc.Add( m_ptCalcP7) ; - b3Loc.Add( m_ptCalcP8) ; - // ingombro del testo - BBox3d b3Text ; - if ( GetTextLocalBBox( b3Text)) - b3Loc.Add( b3Text) ; - return true; - } - // se radiale o diametrale - case DT_RADIAL: - case DT_DIAMETRAL: { - b3Loc.Set(m_ptP6) ; - b3Loc.Add(m_ptPos) ; - // ingombro del testo - BBox3d b3Text ; - if ( GetTextLocalBBox(b3Text) ) - b3Loc.Add(b3Text) ; - return true; - } - // se angolare - case DT_ANGULAR: { - b3Loc.Add( m_ptP1) ; - b3Loc.Add( m_ptP2) ; - b3Loc.Add( m_ptP3) ; - b3Loc.Add( m_ptP4) ; - b3Loc.Add( m_ptP5) ; - b3Loc.Set( m_ptP6) ; - b3Loc.Add( m_ptCalcP7) ; - b3Loc.Add( m_ptCalcP8) ; - // ingombro del testo - BBox3d b3Text ; - if ( GetTextLocalBBox( b3Text)) - b3Loc.Add( b3Text) ; - return true ; - } - default: - return false ; - } + if ( m_nType == DT_LINEAR) { + b3Loc.Set( m_ptP1) ; + b3Loc.Add( m_ptP2) ; + b3Loc.Add( m_ptP3) ; + b3Loc.Add( m_ptP4) ; + b3Loc.Add( m_ptCalcP7) ; + b3Loc.Add( m_ptCalcP8) ; + // ingombro del testo + BBox3d b3Text ; + if ( GetTextLocalBBox( b3Text)) + b3Loc.Add( b3Text) ; + return true ; + } + else if ( m_nType == DT_RADIAL) { + b3Loc.Set( m_ptP5) ; + b3Loc.Add( m_ptPos) ; + // ingombro del testo + BBox3d b3Text ; + if ( GetTextLocalBBox( b3Text)) + b3Loc.Add( b3Text) ; + return true ; + } + else if ( m_nType == DT_DIAMETRAL) { + b3Loc.Set( m_ptP5) ; + b3Loc.Add( m_ptPos) ; + // ingombro del testo + BBox3d b3Text ; + if ( GetTextLocalBBox( b3Text)) + b3Loc.Add( b3Text) ; + return true ; + } + else if ( m_nType == DT_ANGULAR) { + b3Loc.Add( m_ptP1) ; + b3Loc.Add( m_ptP2) ; + b3Loc.Add( m_ptP3) ; + b3Loc.Add( m_ptP4) ; + b3Loc.Set( m_ptP5) ; + b3Loc.Add( m_ptCalcP7) ; + b3Loc.Add( m_ptCalcP8) ; + // ingombro del testo + BBox3d b3Text ; + if ( GetTextLocalBBox( b3Text)) + b3Loc.Add( b3Text) ; + return true ; + } + else + return false ; } //---------------------------------------------------------------------------- bool ExtDimension::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const { - // verifico validit� del frame + // verifico validità del frame if ( frRef.GetType() == Frame3d::ERR) return false ; // eventuale ricalcolo Update() ; // se valido - switch ( m_nType) { - case DT_LINEAR: { - // ingombro dei punti (portati nel riferimento passato) - Point3d ptFrP1 = m_ptP1 ; - ptFrP1.ToGlob( frRef) ; - b3Ref.Set( ptFrP1) ; - Point3d ptFrP2 = m_ptP2 ; - ptFrP2.ToGlob( frRef) ; - b3Ref.Add( ptFrP2) ; - Point3d ptFrP3 = m_ptP3 ; - ptFrP3.ToGlob( frRef) ; - b3Ref.Add( ptFrP3) ; - Point3d ptFrP4 = m_ptP4 ; - ptFrP4.ToGlob( frRef) ; - b3Ref.Add( ptFrP4) ; - Point3d ptFrP7 = m_ptCalcP7 ; - ptFrP7.ToGlob( frRef) ; - b3Ref.Add( ptFrP7) ; - Point3d ptFrP8 = m_ptCalcP8 ; - ptFrP8.ToGlob( frRef) ; - b3Ref.Add( ptFrP8) ; - // ingombro del testo - BBox3d b3Text ; - if ( GetTextBBox( frRef, b3Text)) - b3Ref.Add( b3Text) ; - return true ; - } - case DT_RADIAL: - case DT_DIAMETRAL: { - // ingombro dei punti (portati nel riferimento passato) - Point3d ptFrP6 = m_ptP6 ; - ptFrP6.ToGlob( frRef) ; - b3Ref.Set( ptFrP6) ; - Point3d ptFrPos = m_ptPos ; - ptFrPos.ToGlob( frRef) ; - b3Ref.Set( ptFrPos) ; - // ingombro del testo - BBox3d b3Text ; - if ( GetTextBBox( frRef, b3Text)) - b3Ref.Add( b3Text) ; - return true ; - } - case DT_ANGULAR: { - Point3d ptFrP1 = m_ptP1 ; - ptFrP1.ToGlob( frRef) ; - b3Ref.Add( ptFrP1) ; - Point3d ptFrP2 = m_ptP2 ; - ptFrP2.ToGlob( frRef) ; - b3Ref.Add( ptFrP2) ; - Point3d ptFrP3 = m_ptP3 ; - ptFrP3.ToGlob( frRef) ; - b3Ref.Add( ptFrP3) ; - Point3d ptFrP4 = m_ptP4 ; - ptFrP4.ToGlob( frRef) ; - b3Ref.Add( ptFrP4) ; - Point3d ptFrP5 = m_ptP5 ; - ptFrP5.ToGlob( frRef) ; - b3Ref.Add( ptFrP5) ; - Point3d ptFrP6 = m_ptP6; - ptFrP6.ToGlob( frRef); - b3Ref.Set( ptFrP6); - Point3d ptFrP7 = m_ptCalcP7 ; - ptFrP7.ToGlob( frRef) ; - b3Ref.Add( ptFrP7) ; - Point3d ptFrP8 = m_ptCalcP8 ; - ptFrP8.ToGlob( frRef) ; - b3Ref.Add( ptFrP8) ; - // ingombro del testo - BBox3d b3Text ; - if ( GetTextBBox( frRef, b3Text)) - b3Ref.Add( b3Text) ; - return true ; - } - default: - return false ; - } + if ( m_nType == DT_LINEAR) { + // ingombro dei punti (portati nel riferimento passato) + Point3d ptFrP1 = m_ptP1 ; + ptFrP1.ToGlob( frRef) ; + b3Ref.Set( ptFrP1) ; + Point3d ptFrP2 = m_ptP2 ; + ptFrP2.ToGlob( frRef) ; + b3Ref.Add( ptFrP2) ; + Point3d ptFrP3 = m_ptP3 ; + ptFrP3.ToGlob( frRef) ; + b3Ref.Add( ptFrP3) ; + Point3d ptFrP4 = m_ptP4 ; + ptFrP4.ToGlob( frRef) ; + b3Ref.Add( ptFrP4) ; + Point3d ptFrP7 = m_ptCalcP7 ; + ptFrP7.ToGlob( frRef) ; + b3Ref.Add( ptFrP7) ; + Point3d ptFrP8 = m_ptCalcP8 ; + ptFrP8.ToGlob( frRef) ; + b3Ref.Add( ptFrP8) ; + // ingombro del testo + BBox3d b3Text ; + if ( GetTextBBox( frRef, b3Text)) + b3Ref.Add( b3Text) ; + return true ; + } + else if ( m_nType == DT_RADIAL) { + // ingombro dei punti (portati nel riferimento passato) + Point3d ptFrP5 = m_ptP5 ; + ptFrP5.ToGlob( frRef) ; + b3Ref.Set( ptFrP5) ; + Point3d ptFrPos = m_ptPos ; + ptFrPos.ToGlob( frRef) ; + b3Ref.Set( ptFrPos) ; + // ingombro del testo + BBox3d b3Text ; + if ( GetTextBBox( frRef, b3Text)) + b3Ref.Add( b3Text) ; + return true ; + } + else if ( m_nType == DT_DIAMETRAL) { + // ingombro dei punti (portati nel riferimento passato) + Point3d ptFrP5 = m_ptP5 ; + ptFrP5.ToGlob( frRef) ; + b3Ref.Set( ptFrP5) ; + Point3d ptFrPos = m_ptPos ; + ptFrPos.ToGlob( frRef) ; + b3Ref.Set( ptFrPos) ; + // ingombro del testo + BBox3d b3Text ; + if ( GetTextBBox( frRef, b3Text)) + b3Ref.Add( b3Text) ; + return true ; + } + else if ( m_nType == DT_ANGULAR) { + Point3d ptFrP5 = m_ptP5 ; + ptFrP5.ToGlob( frRef) ; + b3Ref.Set( ptFrP5) ; + Point3d ptFrP1 = m_ptP1 ; + ptFrP1.ToGlob( frRef) ; + b3Ref.Add( ptFrP1) ; + Point3d ptFrP2 = m_ptP2 ; + ptFrP2.ToGlob( frRef) ; + b3Ref.Add( ptFrP2) ; + Point3d ptFrP3 = m_ptP3 ; + ptFrP3.ToGlob( frRef) ; + b3Ref.Add( ptFrP3) ; + Point3d ptFrP4 = m_ptP4 ; + ptFrP4.ToGlob( frRef) ; + b3Ref.Add( ptFrP4) ; + Point3d ptFrP7 = m_ptCalcP7 ; + ptFrP7.ToGlob( frRef) ; + b3Ref.Add( ptFrP7) ; + Point3d ptFrP8 = m_ptCalcP8 ; + ptFrP8.ToGlob( frRef) ; + b3Ref.Add( ptFrP8) ; + // ingombro del testo + BBox3d b3Text ; + if ( GetTextBBox( frRef, b3Text)) + b3Ref.Add( b3Text) ; + return true ; + } + else + return false ; } //---------------------------------------------------------------------------- @@ -650,14 +668,14 @@ ExtDimension::Translate( const Vector3d& vtMove) m_OGrMgr.Reset() ; // se valido if ( m_nType >= DT_LINEAR && m_nType <= DT_ANGULAR) { - m_ptP1.Translate( vtMove) ; - m_ptP2.Translate( vtMove) ; - m_ptP3.Translate( vtMove) ; - m_ptP4.Translate( vtMove) ; - m_ptP5.Translate( vtMove) ; - m_ptP6.Translate( vtMove) ; - m_ptPos.Translate( vtMove) ; - return true ; + m_ptP1.Translate( vtMove) ; + m_ptP2.Translate( vtMove) ; + m_ptP3.Translate( vtMove) ; + m_ptP4.Translate( vtMove) ; + m_ptP5.Translate( vtMove) ; + m_ptP6.Translate( vtMove) ; + m_ptPos.Translate( vtMove) ; + return true ; } else return false ; @@ -700,12 +718,12 @@ ExtDimension::Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, doubl if ( m_nType >= DT_LINEAR && m_nType <= DT_ANGULAR) { // sistemo i vettori Vector3d vtTmp = m_vtN ^ m_vtDir ; - if ( ! vtTmp.Scale( frRef, dCoeffX, dCoeffY, dCoeffZ) || ! vtTmp.Normalize() ) + if ( ! vtTmp.Scale( frRef, dCoeffX, dCoeffY, dCoeffZ) || ! vtTmp.Normalize()) return false ; - if ( ! m_vtDir.Scale( frRef, dCoeffX, dCoeffY, dCoeffZ) || ! m_vtDir.Normalize() ) + if ( ! m_vtDir.Scale( frRef, dCoeffX, dCoeffY, dCoeffZ) || ! m_vtDir.Normalize()) return false ; m_vtN = m_vtDir ^ vtTmp ; - if ( ! m_vtN.Normalize() ) + if ( ! m_vtN.Normalize()) return false ; // scalo i punti di base if ( ! m_ptP1.Scale( frRef, dCoeffX, dCoeffY, dCoeffZ)) @@ -717,15 +735,17 @@ ExtDimension::Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, doubl if ( ! m_ptPos.Scale( frRef, dCoeffX, dCoeffY, dCoeffZ)) return false ; // ricalcolo completamente la quota - switch ( m_nType ) { - case DT_LINEAR: - return SetLinear( m_ptP1, m_ptP2, m_ptPos, m_vtN, m_vtDir, m_sText) ; - case DT_RADIAL: - return SetRadial( m_ptP6, m_ptPos, m_vtN, m_sText) ; - case DT_ANGULAR: - return SetAngular( m_ptP1, m_ptP6, m_ptP2, m_ptPos, m_vtN, m_sText) ; - default: - return false ; + switch ( m_nType) { + case DT_LINEAR : + return SetLinear( m_ptP1, m_ptP2, m_ptPos, m_vtN, m_vtDir, m_sText) ; + case DT_RADIAL : + return SetRadial( m_ptP5, m_ptPos, m_vtN, m_sText) ; + case DT_DIAMETRAL : + return SetDiametral( m_ptP5, m_ptPos, m_vtN, m_sText) ; + case DT_ANGULAR : + return SetAngular( m_ptP5, m_ptP1, m_ptP2, m_ptPos, m_vtN, m_sText) ; + default : + return false ; } } else @@ -749,7 +769,7 @@ ExtDimension::Mirror( const Point3d& ptOn, const Vector3d& vtNorm) return false ; if ( ! m_vtDir.Mirror( vtNorm)) return false ; - // eseguo il mirror dei punti + // eseguo il mirror dei punti if ( ! m_ptP1.Mirror( ptOn, vtNorm)) return false ; if ( ! m_ptP2.Mirror( ptOn, vtNorm)) @@ -784,9 +804,9 @@ ExtDimension::Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector3d if ( m_nType >= DT_LINEAR && m_nType <= DT_ANGULAR) { // sistemo i vettori Vector3d vtTmp = m_vtN ^ m_vtDir ; - if ( ! vtTmp.Shear( vtNorm, vtDir, dCoeff ) || ! vtTmp.Normalize()) + if ( ! vtTmp.Shear( vtNorm, vtDir, dCoeff) || ! vtTmp.Normalize()) return false ; - if ( ! m_vtDir.Shear( vtNorm, vtDir, dCoeff ) || ! m_vtDir.Normalize()) + if ( ! m_vtDir.Shear( vtNorm, vtDir, dCoeff) || ! m_vtDir.Normalize()) return false ; m_vtN = m_vtDir ^ vtTmp ; if ( ! m_vtN.Normalize()) @@ -801,15 +821,17 @@ ExtDimension::Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector3d if ( ! m_ptPos.Shear( ptOn, vtNorm, vtDir, dCoeff)) return false ; // ricalcolo completamente la quota - switch ( m_nType ) { - case DT_LINEAR: - return SetLinear( m_ptP1, m_ptP2, m_ptPos, m_vtN, m_vtDir, m_sText) ; - case DT_RADIAL: - return SetRadial(m_ptP6, m_ptPos, m_vtN, m_sText) ; - case DT_ANGULAR: - return SetAngular( m_ptP1, m_ptP6, m_ptP2, m_ptPos, m_vtN, m_sText) ; - default: - return false ; + switch ( m_nType) { + case DT_LINEAR : + return SetLinear( m_ptP1, m_ptP2, m_ptPos, m_vtN, m_vtDir, m_sText) ; + case DT_RADIAL : + return SetRadial( m_ptP5, m_ptPos, m_vtN, m_sText) ; + case DT_DIAMETRAL : + return SetDiametral( m_ptP5, m_ptPos, m_vtN, m_sText) ; + case DT_ANGULAR : + return SetAngular( m_ptP5, m_ptP1, m_ptP2, m_ptPos, m_vtN, m_sText) ; + default : + return false ; } } else @@ -820,7 +842,7 @@ ExtDimension::Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector3d bool ExtDimension::ToGlob( const Frame3d& frRef) { - // verifico validit� del frame + // verifico validità del frame if ( frRef.GetType() == Frame3d::ERR) return false ; // se riferimento globale, non devo fare alcunch� @@ -850,7 +872,7 @@ ExtDimension::ToGlob( const Frame3d& frRef) bool ExtDimension::ToLoc( const Frame3d& frRef) { - // verifico validit� del frame + // verifico validità del frame if ( frRef.GetType() == Frame3d::ERR) return false ; // se riferimento globale, non devo fare alcunch� @@ -909,205 +931,198 @@ ExtDimension::LocToLoc( const Frame3d& frOri, const Frame3d& frDest) //---------------------------------------------------------------------------- bool ExtDimension::Update( void) const -{// se ricalcolo non richiesto, esco +{ + // se ricalcolo non richiesto, esco if ( ! m_bToCalc) return true ; + + // a seconda del tipo, ... switch ( m_nType) { - // se quota lineare, radiale o diametrale - case DT_LINEAR: { - // testo - m_sCalcText = m_sText ; - if ( m_sCalcText.find( IS_MEASURE) != string::npos) { - double dVal = ( m_ptP2 - m_ptP1 ) * m_vtDir * ( m_bLenIsMM ? 1 : 1. / ONEINCH) ; - string sVal = ToString( dVal, m_nDecDigit) ; - ReplaceString( m_sCalcText, IS_MEASURE, sVal) ; - } - // punto di inserimento del testo - m_ptCalcPos = ( m_ptP5 + m_ptP6) / 2 ; - // semidistanza di interruzione - double dHalfDist = GetTextHalfDist( m_ptCalcPos) ; - // lunghezza della linea di misura - double dLen = ( m_ptP6 - m_ptP5).Len() ; - // determino come orientare le frecce e dove mettere il testo - if ( dLen - 2 * m_dArrowLen >= 2 * dHalfDist) { - m_bCalcArrowIn = true ; - m_ptCalcP7 = m_ptCalcPos - m_vtDir * dHalfDist ; - m_ptCalcP8 = m_ptCalcPos + m_vtDir * dHalfDist ; - } - // le frecce stanno fuori ma il testo dentro - else if ( dLen >= 2 * dHalfDist) { - m_bCalcArrowIn = false ; - m_ptCalcP7 = m_ptP5 - m_vtDir * 2 * m_dArrowLen ; - m_ptCalcP8 = m_ptP6 + m_vtDir * 2 * m_dArrowLen ; - } - // stanno fuori sia le frecce sia il testo - else { - m_bCalcArrowIn = false ; - m_ptCalcP7 = m_ptP5 - m_vtDir * 2 * m_dArrowLen ; - m_ptCalcP8 = m_ptP6 + m_vtDir * 2 * m_dArrowLen ; - // metto la quotatura dal lato di ptPos - if ( ( m_ptPos - m_ptCalcP7).SqLen() <= ( m_ptPos - m_ptCalcP8).SqLen()) - m_ptCalcPos = m_ptCalcP7 - m_vtDir * dHalfDist ; - else - m_ptCalcPos = m_ptCalcP8 + m_vtDir * dHalfDist ; - } - // dichiaro ricalcolo eseguito - m_bToCalc = false ; - return true ; + case DT_LINEAR : { + // testo + m_sCalcText = m_sText ; + if ( m_sCalcText.find( IS_MEASURE) != string::npos) { + double dVal = ( m_ptP2 - m_ptP1) * m_vtDir * ( m_bLenIsMM ? 1 : 1. / ONEINCH) ; + string sVal = ToString( dVal, m_nDecDigit) ; + ReplaceString( m_sCalcText, IS_MEASURE, sVal) ; } - case DT_RADIAL: - case DT_DIAMETRAL: { - // testo - m_sCalcText = m_sText ; - if ( m_sCalcText.find( IS_MEASURE) != string::npos) { - double dVal = 0 ; - dVal = Dist( m_ptP1, m_ptP2) * ( m_bLenIsMM ? 1 : 1. / ONEINCH ) ; - string sVal = ToString( dVal, m_nDecDigit) ; - if ( m_nType == DT_RADIAL ) - sVal = "R " + sVal ; - else if ( m_nType == DT_DIAMETRAL) - sVal = u8"\u00D8 " + sVal ; - ReplaceString( m_sCalcText, IS_MEASURE, sVal) ; - } - // punto di inserimento del testo - m_ptCalcPos = ( m_ptP5 + m_ptP2) / 2 ; - // alzo il testo dalla linea di misura - BBox3d b3Text ; - if ( ! GetTextMyBBox( m_ptCalcPos, b3Text) && ! b3Text.IsEmpty()) - return false ; - double dHeight = b3Text.GetMax().y - b3Text.GetMin().y ; - Vector3d vtPerpDir = m_ptPos - m_ptP6 ; - if ( ! vtPerpDir.Normalize()) - return false ; - // calcolo il frame dell'arco per valutare la posizione del testo - Frame3d frRef ; - if ( ! frRef.Set( m_ptP6, m_vtN)) - return false ; - double dAngDeg = 0 ; - if ( ! m_vtDir.GetAngle( frRef.VersX(), dAngDeg) || ! vtPerpDir.Rotate(m_vtN, ( dAngDeg < 90 ? 90 : -90 )) ) - return false ; - m_ptCalcPos = m_ptCalcPos + 0.6 * dHeight * vtPerpDir ; - // semidistanza di interruzione - double dHalfDist = GetTextHalfDist( m_ptCalcPos) ; - // lunghezza della linea di misura - double dLen = ( m_ptP5 - m_ptP2).Len() ; - // determino come orientare le frecce e dove mettere il testo - if ( dLen - 2 * m_dArrowLen >= 2 * dHalfDist) { - m_bCalcArrowIn = true ; - m_bCalcTextOn = true ; - m_ptCalcP7 = m_ptCalcPos - m_vtDir * dHalfDist ; - m_ptCalcP8 = m_ptCalcPos + m_vtDir * dHalfDist ; - } - // le frecce stanno fuori ma il testo dentro - else if ( dLen >= 2 * dHalfDist) { - m_bCalcArrowIn = false ; - m_bCalcTextOn = true ; - m_ptCalcP7 = m_ptP5 - m_vtDir * 2 * m_dArrowLen ; - m_ptCalcP8 = m_ptP2 + m_vtDir * 2 * m_dArrowLen ; - } - // stanno fuori sia le frecce sia il testo - else { - m_bCalcArrowIn = false ; - m_bCalcTextOn = false ; - // metto la quotatura dal lato di ptPos - Vector3d vtRad = m_ptPos - m_ptP6 ; - if ( ! vtRad.Normalize()) - return false ; - m_ptCalcPos = m_ptPos + vtRad * ( dHalfDist + 2 * m_dArrowLen) ; - } - // dichiaro ricalcolo eseguito - m_bToCalc = false ; - return true ; + // punto di inserimento del testo + m_ptCalcPos = ( m_ptP5 + m_ptP6) / 2 ; + // semidistanza di interruzione + double dHalfDist = GetTextHalfDist( m_ptCalcPos) ; + // lunghezza della linea di misura + double dLen = ( m_ptP6 - m_ptP5).Len() ; + // determino come orientare le frecce e dove mettere il testo + if ( dLen - 2 * m_dArrowLen >= 2 * dHalfDist) { + m_bCalcArrowIn = true ; + m_ptCalcP7 = m_ptCalcPos - m_vtDir * dHalfDist ; + m_ptCalcP8 = m_ptCalcPos + m_vtDir * dHalfDist ; } - //se quota angolare - case DT_ANGULAR: { - // testo - m_sCalcText = m_sText ; - if ( m_sCalcText.find( IS_MEASURE ) != string::npos) { - // calcolo gli angoli tra m_ptPos e i due punti che identificano i lati dell'angolo - // per capire se sto calcolando l'angolo interno o esterno - double dAngDeg, dAngDeg1, dAngDeg2 = 0 ; - Vector3d vtLine1 = m_ptP1 - m_ptP6 ; - Vector3d vtLine2 = m_ptP2 - m_ptP6 ; - Vector3d vtLine3 = m_ptPos - m_ptP6 ; - if ( ! vtLine1.GetAngle(vtLine2, dAngDeg) || ! vtLine1.GetAngle(vtLine3, dAngDeg1) || ! vtLine2.GetAngle(vtLine3, dAngDeg2)) - return false ; - if ( dAngDeg < dAngDeg1 + dAngDeg2 - EPS_SMALL || dAngDeg > dAngDeg1 + dAngDeg2 + EPS_SMALL) - dAngDeg = 360 - dAngDeg ; - string sAngDeg = ToString( dAngDeg, m_nDecDigit) ; - ReplaceString( m_sCalcText, IS_MEASURE, sAngDeg + "°") ; - // calcolo ptP5_bis - double dLen2 = vtLine2.Len() ; - if ( ! vtLine2.Normalize()) - return false ; - Point3d ptP5_bis = m_ptP2 + ( m_vtDir.Len() - dLen2) * vtLine2 ; - //calcolo l'arco su cui metterò la misura - PtrOwner pCrvPos( CreateBasicCurveArc()) ; - if ( IsNull( pCrvPos) || ! pCrvPos->Set3P(ptP5_bis, m_ptPos, m_ptP5, false)) - return false ; - // punto di inserimento del testo - pCrvPos->GetMidPoint( m_ptCalcPos) ; - // semidistanza di interruzione - double dHalfDist = GetTextHalfDist( m_ptCalcPos) ; - // lunghezza della linea di misura - double dLen = 0 ; - if ( ! pCrvPos->GetLength( dLen)) - return false ; - // calcolo lo spazio anche ad una distanza dal centro maggiorata - double dLenPos = 0 ; - double dDist = Dist( m_ptCalcPos, m_ptP6) ; - dLenPos = dDist * dAngDeg * DEGTORAD ; - // determino come orientare le frecce e dove mettere il testo - // frecce e testo dentro - if ( dLen - 2 * m_dArrowLen >= 2 * dHalfDist) { - m_bCalcArrowIn = true ; - m_bCalcTextOn = true ; - double dU ; - pCrvPos->GetParamAtLength( dLen / 2. + dHalfDist, dU) ; - pCrvPos->GetPointD1D2( dU, ICurve::FROM_MINUS, m_ptCalcP7) ; - pCrvPos->GetParamAtLength( dLen / 2. - dHalfDist, dU) ; - pCrvPos->GetPointD1D2( dU, ICurve::FROM_MINUS, m_ptCalcP8) ; - } - // le frecce stanno fuori ma il testo dentro - // se allontanadomi dal centro il testo ci sta, allora mi allontano dal centro anziché metter il testo fuori - else if ( dLen > 2 * dHalfDist || ( dLen < 2 * dHalfDist && dLenPos > 2 * dHalfDist)) { - m_bCalcArrowIn = false ; - m_bCalcTextOn = true ; - double dU ; - pCrvPos->GetParamAtLength( dLen / 2. + dHalfDist, dU) ; - pCrvPos->GetPointD1D2( dU, ICurve::FROM_MINUS, m_ptCalcP7) ; - pCrvPos->GetParamAtLength( dLen / 2. - dHalfDist, dU) ; - pCrvPos->GetPointD1D2( dU, ICurve::FROM_MINUS, m_ptCalcP8) ; - if ( dLen < 2 * dHalfDist) { - m_ptCalcPos += ( m_ptCalcPos - m_ptP6) ; - m_bCalcTextOn = false ; - } - } - // stanno fuori sia le frecce sia il testo - else { - m_bCalcArrowIn = false ; - m_bCalcTextOn = false ; - if ( ! vtLine1.Normalize()) - return false ; - if ( Dist( m_ptPos, m_ptP5) < Dist( m_ptPos, ptP5_bis)) { - Vector3d vtDirEnd ; - pCrvPos->GetEndDir( vtDirEnd) ; - m_ptCalcPos = m_ptP5 + dHalfDist * ( vtDirEnd + vtLine1) ; - } - else { - Vector3d vtDirStart ; - pCrvPos->GetStartDir( vtDirStart) ; - m_ptCalcPos = ptP5_bis + dHalfDist * ( - vtDirStart + vtLine2) ; - } - } - // dichiaro ricalcolo eseguito - m_bToCalc = false ; - return true ; - } + // le frecce stanno fuori ma il testo dentro + else if ( dLen >= 2 * dHalfDist) { + m_bCalcArrowIn = false ; + m_ptCalcP7 = m_ptP5 - m_vtDir * 2 * m_dArrowLen ; + m_ptCalcP8 = m_ptP6 + m_vtDir * 2 * m_dArrowLen ; } - default: + // stanno fuori sia le frecce sia il testo + else { + m_bCalcArrowIn = false ; + m_ptCalcP7 = m_ptP5 - m_vtDir * 2 * m_dArrowLen ; + m_ptCalcP8 = m_ptP6 + m_vtDir * 2 * m_dArrowLen ; + // metto la quotatura dal lato di ptPos + if ( ( m_ptPos - m_ptCalcP7).SqLen() <= ( m_ptPos - m_ptCalcP8).SqLen()) + m_ptCalcPos = m_ptCalcP7 - m_vtDir * dHalfDist ; + else + m_ptCalcPos = m_ptCalcP8 + m_vtDir * dHalfDist ; + } + // dichiaro ricalcolo eseguito + m_bToCalc = false ; + return true ; + } + case DT_RADIAL : + case DT_DIAMETRAL : { + // testo + m_sCalcText = m_sText ; + if ( m_sCalcText.find( IS_MEASURE) != string::npos) { + double dVal = 0 ; + dVal = Dist( m_ptP1, m_ptP2) * ( m_bLenIsMM ? 1 : 1. / ONEINCH) ; + string sVal = ToString( dVal, m_nDecDigit) ; + if ( m_nType == DT_RADIAL) + sVal = "R " + sVal ; + else if ( m_nType == DT_DIAMETRAL) + sVal = u8"\u00D8 " + sVal ; + ReplaceString( m_sCalcText, IS_MEASURE, sVal) ; + } + // punto di inserimento del testo + m_ptCalcPos = ( m_ptP5 + m_ptP6) / 2 ; + // alzo il testo dalla linea di misura + BBox3d b3Text ; + if ( ! GetTextMyBBox( b3Text) && ! b3Text.IsEmpty()) return false ; + double dHeight = b3Text.GetMax().y - b3Text.GetMin().y ; + Vector3d vtPerpDir = m_ptPos - m_ptP5 ; + vtPerpDir.Normalize() ; + if ( ! vtPerpDir.Rotate( m_vtN, 90)) + return false ; + m_ptCalcPos = m_ptCalcPos + 0.6 * dHeight * vtPerpDir ; + // semidistanza di interruzione + double dHalfDist = GetTextHalfDist( m_ptCalcPos) ; + // lunghezza della linea di misura + double dLen = ( m_ptP6 - m_ptP5).Len() ; + // determino come orientare le frecce e dove mettere il testo + if ( dLen - 2 * m_dArrowLen >= 2 * dHalfDist) { + m_bCalcArrowIn = true ; + m_bCalcTextOn = true ; + m_ptCalcP7 = m_ptCalcPos - m_vtDir * dHalfDist ; + m_ptCalcP8 = m_ptCalcPos + m_vtDir * dHalfDist ; } + // le frecce stanno fuori ma il testo dentro + else if ( dLen >= 2 * dHalfDist) { + m_bCalcArrowIn = false ; + m_bCalcTextOn = true ; + m_ptCalcP7 = m_ptP5 - m_vtDir * 2 * m_dArrowLen ; + m_ptCalcP8 = m_ptP6 + m_vtDir * 2 * m_dArrowLen ; + } + // stanno fuori sia le frecce sia il testo + else { + m_bCalcArrowIn = false ; + m_bCalcTextOn = false ; + // metto la quotatura dal lato di ptPos + Vector3d vtRad = m_ptPos - m_ptP5 ; + vtRad.Normalize() ; + m_ptCalcPos = m_ptPos + vtRad * ( dHalfDist + 2 * m_dArrowLen) ; + } + // dichiaro ricalcolo eseguito + m_bToCalc = false ; + return true ; + } + case DT_ANGULAR : { + // angolo + double dAngDeg, dAngDeg1, dAngDeg2 = 0 ; + Vector3d vtLine1 = m_ptP1 - m_ptP5 ; + Vector3d vtLine2 = m_ptP2 - m_ptP5 ; + Vector3d vtLine3 = m_ptPos - m_ptP5 ; + if ( ! vtLine1.GetAngle( vtLine2, dAngDeg) || ! vtLine1.GetAngle( vtLine3, dAngDeg1) || ! vtLine2.GetAngle( vtLine3, dAngDeg2)) + return false ; + if ( dAngDeg < dAngDeg1 + dAngDeg2 - EPS_SMALL || dAngDeg > dAngDeg1 + dAngDeg2 + EPS_SMALL) + dAngDeg = 360 - dAngDeg ; + // testo + m_sCalcText = m_sText ; + if ( m_sCalcText.find( IS_MEASURE) != string::npos) { + // calcolo gli angoli tra m_ptPos e i due punti che identificano i lati dell'angolo + // per capire se sto calcolando l'angolo interno o esterno + string sAngDeg = ToString( dAngDeg, m_nDecDigit) ; + ReplaceString( m_sCalcText, IS_MEASURE, sAngDeg + "°") ; + } + // calcolo l'arco su cui metterò la misura + PtrOwner pCrvPos( CreateBasicCurveArc()) ; + if ( IsNull( pCrvPos) || ! pCrvPos->Set3P( m_ptP6, m_ptPos, m_ptP5, false)) + return false ; + // punto di inserimento del testo + pCrvPos->GetMidPoint( m_ptCalcPos) ; + // semidistanza di interruzione + double dHalfDist = GetTextHalfDist( m_ptCalcPos) ; + // lunghezza della linea di misura + double dLen = 0 ; + if ( ! pCrvPos->GetLength( dLen)) + return false ; + // calcolo anche lo spazio ad una distanza dal centro maggiorata + double dLenPos = 0 ; + double dDist = Dist( m_ptCalcPos, m_ptP5) ; + dLenPos = dDist * dAngDeg * DEGTORAD ; + // determino come orientare le frecce e dove mettere il testo + double dU ; + // frecce e testo dentro + if ( dLen - 2 * m_dArrowLen >= 2 * dHalfDist) { + m_bCalcArrowIn = true ; + m_bCalcTextOn = true ; + pCrvPos->GetParamAtLength( dLen / 2. + dHalfDist, dU) ; + pCrvPos->GetPointD1D2( dU, ICurve::FROM_MINUS, m_ptCalcP7) ; + pCrvPos->GetParamAtLength( dLen / 2. - dHalfDist, dU) ; + pCrvPos->GetPointD1D2( dU, ICurve::FROM_MINUS, m_ptCalcP8) ; + } + // le frecce stanno fuori ma il testo dentro + // se allontanadomi dal centro il testo ci sta, allora mi allontano dal centro anziché metter il testo fuori + else if ( dLen > 2 * dHalfDist || ( dLen < 2 * dHalfDist && dLenPos > 2 * dHalfDist)) { + m_bCalcArrowIn = false ; + m_bCalcTextOn = true ; + pCrvPos->GetParamAtLength( dLen / 2. + dHalfDist, dU) ; + pCrvPos->GetPointD1D2( dU, ICurve::FROM_MINUS, m_ptCalcP7) ; + pCrvPos->GetParamAtLength( dLen / 2. - dHalfDist, dU) ; + pCrvPos->GetPointD1D2( dU, ICurve::FROM_MINUS, m_ptCalcP8) ; + //pCrvPosExt->GetStartPoint( m_ptCalcP8) ; + //pCrvPosExt->GetEndPoint( m_ptCalcP7) ; + if ( dLen < 2 * dHalfDist) { + m_ptCalcPos += ( m_ptCalcPos - m_ptP5) ; + m_bCalcTextOn = false ; + } + } + // stanno fuori sia le frecce sia il testo + else { + m_bCalcArrowIn = false ; + m_bCalcTextOn = false ; + //pCrvPosExt->GetStartPoint( m_ptCalcP8) ; + //pCrvPosExt->GetEndPoint( m_ptCalcP7) ; + vtLine1.Normalize() ; + vtLine2.Normalize() ; + if ( Dist( m_ptPos, m_ptP5) < Dist( m_ptPos, m_ptP6)) { + Vector3d vtDirEnd ; + pCrvPos->GetEndDir( vtDirEnd) ; + m_ptCalcPos = m_ptP5 + dHalfDist * ( vtDirEnd + vtLine1) ; + } + else { + Vector3d vtDirStart ; + pCrvPos->GetStartDir( vtDirStart) ; + m_ptCalcPos = m_ptP6 + dHalfDist * ( - vtDirStart + vtLine2) ; + } + } + // dichiaro ricalcolo eseguito + m_bToCalc = false ; + return true ; + } + default : + return false ; + } } //---------------------------------------------------------------------------- @@ -1117,30 +1132,21 @@ ExtDimension::GetMidPoint( Point3d& ptMid) const // eventuale ricalcolo Update() ; switch ( m_nType) { - // se quota lineare o radiale - case DT_LINEAR : - case DT_RADIAL : - case DT_DIAMETRAL: { - ptMid = ( m_ptP1 + m_ptP2) / 2; - return true; - } - // se quota angolare - case DT_ANGULAR : { - // calcolo ptP5_bis - Vector3d vtLine2 = m_ptP2 - m_ptP6 ; - double dLen2 = vtLine2.Len() ; - if ( ! vtLine2.Normalize()) + case DT_LINEAR : + case DT_RADIAL : + case DT_DIAMETRAL: + ptMid = ( m_ptP1 + m_ptP2) / 2; + return true ; + case DT_ANGULAR : + { PtrOwner pCrvPos( CreateBasicCurveArc()) ; + if ( ! pCrvPos->Set3P( m_ptP6, m_ptPos, m_ptP5, false)) return false ; - Point3d ptP5_bis = m_ptP2 + ( m_vtDir.Len() - dLen2) * vtLine2 ; - Vector3d vtMid = ( ptP5_bis + m_ptP5) / 2 - m_ptP6 ; - if ( ! vtMid.Normalize()) - return false ; - ptMid = m_ptP6 + vtMid * m_vtDir.Len() ; - return true; - } - default: - return false ; + pCrvPos->GetMidPoint( ptMid) ; + return true ; } + default : + return false ; + } } //---------------------------------------------------------------------------- @@ -1149,21 +1155,19 @@ ExtDimension::GetCenterPoint( Point3d& ptCen) const { // eventuale ricalcolo Update() ; - //se valido + // se valido switch ( m_nType) { - case DT_LINEAR: { - ptCen = ( m_ptP5 + m_ptP6) / 2 ; - return true ; - } - case DT_RADIAL : - case DT_DIAMETRAL : - case DT_ANGULAR : { - ptCen = m_ptP6 ; - return true ; - } - default: - return false ; - } + case DT_LINEAR : + ptCen = ( m_ptP5 + m_ptP6) / 2 ; + return true ; + case DT_RADIAL : + case DT_DIAMETRAL : + case DT_ANGULAR : + ptCen = m_ptP5 ; + return true ; + default : + return false ; + } } //---------------------------------------------------------------------------- @@ -1174,17 +1178,17 @@ ExtDimension::ApproxWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST& Update() ; // se quota valida switch ( m_nType) { - case DT_LINEAR: { + case DT_LINEAR : { // prima linea di riferimento lstPL.emplace_back() ; lstPL.back().AddUPoint( 0, m_ptP1) ; lstPL.back().AddUPoint( 1, m_ptP3) ; // seconda linea di riferimento lstPL.emplace_back() ; - lstPL.back().AddUPoint( 0, m_ptP2) ; - lstPL.back().AddUPoint( 1, m_ptP4) ; - // se non c'� testo, linea di misura intera - if ( IsEmptyOrSpaces(m_sCalcText) ) { + lstPL.back().AddUPoint(0, m_ptP2) ; + lstPL.back().AddUPoint(1, m_ptP4) ; + // se non c'è testo, linea di misura intera + if ( IsEmptyOrSpaces(m_sCalcText)) { lstPL.emplace_back() ; lstPL.back().AddUPoint( 0, m_ptP5) ; lstPL.back().AddUPoint( 1, m_ptP6) ; @@ -1202,27 +1206,27 @@ ExtDimension::ApproxWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST& } // frecce lstPL.emplace_back() ; - GetArrowHead( m_ptP5, ( m_bCalcArrowIn ? -m_vtDir : m_vtDir), lstPL.back()) ; + GetArrowHead(m_ptP5, ( m_bCalcArrowIn ? -m_vtDir : m_vtDir), lstPL.back()) ; lstPL.emplace_back() ; - GetArrowHead( m_ptP6, ( m_bCalcArrowIn ? m_vtDir : -m_vtDir), lstPL.back()) ; + GetArrowHead(m_ptP6, ( m_bCalcArrowIn ? m_vtDir : -m_vtDir), lstPL.back()) ; // testo POLYLINELIST lstTxt; if ( ApproxTextWithLines(dLinTol, dAngTolDeg, lstTxt)) lstPL.splice(lstPL.end(), lstTxt) ; return true ; } - case DT_RADIAL: - case DT_DIAMETRAL :{ + case DT_RADIAL : + case DT_DIAMETRAL : { + Vector3d vtRad = m_ptPos - m_ptP5 ; + vtRad.Normalize() ; // prima linea di riferimento lstPL.emplace_back() ; lstPL.back().AddUPoint( 0, m_ptP1) ; lstPL.back().AddUPoint( 1, m_ptP2) ; // freccia lstPL.emplace_back() ; - Vector3d vtRad = m_ptPos - m_ptP6; - if ( ! vtRad.Normalize()) - return false ; - GetArrowHead(m_ptP2, ( m_bCalcArrowIn ? vtRad : - vtRad), lstPL.back()) ; + GetArrowHead(m_ptP6, ( m_bCalcArrowIn ? vtRad : - vtRad), lstPL.back()) ; + Point3d ptArrowTail ; if ( ! m_bCalcArrowIn) { lstPL.emplace_back() ; Point3d ptArrowTail = m_ptP2 + vtRad * m_dArrowLen * 2 ; @@ -1245,7 +1249,12 @@ ExtDimension::ApproxWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST& lstPL.splice( lstPL.end(), lstTxt) ; return true ; } - case DT_ANGULAR: { + case DT_ANGULAR : { + // approssimerò l'arco con una polyline + PolyLine plApprox ; + // cerca nel geom kernel delle tolleranze standard + double dLinTol = 0.01 ; + double dAngTolDeg = 0.01 ; // prima linea di riferimento lstPL.emplace_back() ; lstPL.back().AddUPoint( 0, m_ptP1) ; @@ -1259,30 +1268,21 @@ ExtDimension::ApproxWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST& if ( IsNull( pCrvPos)) return false ; double dHalfDist = GetTextHalfDist( m_ptCalcPos) ; - // calcolo ptP5_bis - Vector3d vtLine2 = m_ptP2 - m_ptP6 ; - double dLen2 = vtLine2.Len() ; - if ( ! vtLine2.Normalize()) - return false ; - Point3d ptP5_bis = m_ptP2 + ( m_vtDir.Len() - dLen2) * vtLine2 ; - // approssimo l'arco con una polyline - PolyLine plApprox ; - double dLinTol = 0.01 ; - double dAngTolDeg = 0.01 ; - // se non ho testo o se l'ho allontanato - if ( IsEmptyOrSpaces( m_sCalcText) || ! m_bCalcTextOn) { - if ( ! pCrvPos->SetC2PN( m_ptP6, ptP5_bis, m_ptP5, m_vtN) || ! pCrvPos->ApproxWithLines(dLinTol, dAngTolDeg, ICurve::APL_STD, plApprox)) + + // se non ho testo + if ( IsEmptyOrSpaces( m_sCalcText)) { + if ( ! pCrvPos->SetC2PN( m_ptP5, m_ptP6, m_ptP5, m_vtN) || ! pCrvPos->ApproxWithLines(dLinTol, dAngTolDeg, ICurve::APL_STD, plApprox)) return false ; lstPL.emplace_back( plApprox) ; } // altrimenti, linea di misura divisa in due parti else { // prima parte - if ( ! pCrvPos->SetC2PN( m_ptP6, m_ptP5, m_ptCalcP7, m_vtN) || ! pCrvPos->ApproxWithLines(dLinTol, dAngTolDeg, ICurve::APL_STD, plApprox)) + if ( ! pCrvPos->SetC2PN( m_ptP5, m_ptP5, m_ptCalcP7, m_vtN) || ! pCrvPos->ApproxWithLines(dLinTol, dAngTolDeg, ICurve::APL_STD, plApprox)) return false ; lstPL.emplace_back( plApprox) ; // seconda parte - if ( ! pCrvPos->SetC2PN( m_ptP6, ptP5_bis, m_ptCalcP8, m_vtN) || ! pCrvPos->ApproxWithLines(dLinTol, dAngTolDeg, ICurve::APL_STD, plApprox)) + if ( ! pCrvPos->SetC2PN( m_ptP5, m_ptP6, m_ptCalcP8, m_vtN) || ! pCrvPos->ApproxWithLines(dLinTol, dAngTolDeg, ICurve::APL_STD, plApprox)) return false ; lstPL.emplace_back( plApprox) ; } @@ -1295,6 +1295,10 @@ ExtDimension::ApproxWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST& pCrvPos->GetEndDir( vtEndDir) ; //storto la punta delle frecce su una direzione mediata tra l'arco e la perpendicolare al lato double dFactor = 1 / ( 0.6 * m_vtDir.Len()) ; // questo fattore dipende direttamente dalla distanza di m_ptPos dal centro e smorza lo scostamento + Vector3d vtLine1 = m_ptP1 - m_ptP5 ; + Vector3d vtLine2 = m_ptP2 - m_ptP5 ; + vtLine1.Normalize() ; + vtLine2.Normalize() ; // se però le frecce sono fuori non le storto e faccio le code dritte anziché curvilinee if ( ! m_bCalcArrowIn) { Point3d ptArrowTail1, ptArrowTail2 ; @@ -1359,8 +1363,8 @@ ExtDimension::GetArrowHead( const Point3d& ptTip, const Vector3d& vtDir, PolyLin return false ; const double A_WIDTH_COEFF = 0.1666 ; PL.AddUPoint( 0, ptTip) ; - PL.AddUPoint( 1, ptTip - ( vtDir + vtPerp * A_WIDTH_COEFF ) * m_dArrowLen) ; - PL.AddUPoint( 2, ptTip - ( vtDir - vtPerp * A_WIDTH_COEFF ) * m_dArrowLen) ; + PL.AddUPoint( 1, ptTip - ( vtDir + vtPerp * A_WIDTH_COEFF) * m_dArrowLen) ; + PL.AddUPoint( 2, ptTip - ( vtDir - vtPerp * A_WIDTH_COEFF) * m_dArrowLen) ; PL.AddUPoint( 4, ptTip) ; return true ; } @@ -1401,11 +1405,12 @@ ExtDimension::ApproxTextWithLines( double dLinTol, double dAngTolDeg, POLYLINELI Frame3d frRef ; if ( ! frRef.Set( m_ptCalcPos, m_vtN)) return false ; - // oriento il testo con il raggio/diametro, ma solo se il testo è dentro la circonferenza - if ( ( m_nType == DT_RADIAL || m_nType == DT_DIAMETRAL) && m_bCalcTextOn ) { + + if ( ( m_nType == DT_RADIAL || m_nType == DT_DIAMETRAL) && m_bCalcTextOn) { double dAngDeg = 0 ; - m_vtDir.GetAngle( frRef.VersX(), dAngDeg) ; - if ( ! frRef.Set( m_ptCalcPos, m_vtN, ( dAngDeg > 90 ? - m_vtDir : m_vtDir ))) + Vector3d vtRad = m_ptPos - m_ptP5 ; + m_vtDir.GetAngle( vtRad, dAngDeg) ; + if ( ! frRef.Set( m_ptCalcPos, m_vtN, ( dAngDeg > 90 ? - vtRad : vtRad))) return false ; } @@ -1418,7 +1423,7 @@ ExtDimension::ApproxTextWithLines( double dLinTol, double dAngTolDeg, POLYLINELI //---------------------------------------------------------------------------- bool -ExtDimension::GetTextMyBBox( const Point3d& ptPos, BBox3d& b3Loc) const +ExtDimension::GetTextMyBBox( BBox3d& b3Loc) const { // imposto box vuoto b3Loc.Reset() ; @@ -1436,6 +1441,17 @@ ExtDimension::GetTextMyBBox( const Point3d& ptPos, BBox3d& b3Loc) const if ( ! fntMgr.GetBBox( m_sCalcText, ETXT_IPMC, b3Loc)) return false ; + return true ; +} + +//---------------------------------------------------------------------------- +bool +ExtDimension::GetTextMyBBox( const Point3d& ptPos, BBox3d& b3Loc) const +{ + // determino il box del testo + if ( ! GetTextMyBBox( b3Loc)) + return false ; + // calcolo ed eseguo la trasformazione Frame3d frRef ; if ( ! frRef.Set( ptPos, m_vtN)) diff --git a/ExtDimension.h b/ExtDimension.h index 31f5804..ceb49be 100644 --- a/ExtDimension.h +++ b/ExtDimension.h @@ -62,10 +62,12 @@ class ExtDimension : public IExtDimension, public IGeoObjRW int nDecDigit, const std::string& sFont, double dTextHeight) override ; bool SetLinear( const Point3d& ptP1, const Point3d& ptP2, const Point3d& ptPos, const Vector3d& vtN, const Vector3d& vtDir, const std::string& sText) override ; - bool SetAngular( const Point3d& ptP1, const Point3d& ptCen, const Point3d& ptP2, const Point3d& ptPos, - const Vector3d& vtN, const std::string& sText ) override ; - bool SetRadial( const Point3d& ptCen, const Point3d& ptPos, const Vector3d& vtN, const std::string& sText) override ; - bool SetDiametral( const Point3d& ptCen, const Point3d& ptPos, const Vector3d& vtN, const std::string& sText) override ; + bool SetRadial( const Point3d& ptCen, const Point3d& ptPos, + const Vector3d& vtN, const std::string& sText) override ; + bool SetDiametral( const Point3d& ptCen, const Point3d& ptPos, + const Vector3d& vtN, const std::string& sText) override ; + bool SetAngular( const Point3d& ptP1, const Point3d& ptP2, const Point3d& ptV, const Point3d& ptPos, + const Vector3d& vtN, const std::string& sText) override ; const Vector3d& GetNormVersor( void) const override { return m_vtN ; } const Vector3d& GetDirVersor( void) const override @@ -123,6 +125,7 @@ class ExtDimension : public IExtDimension, public IGeoObjRW bool GetArrowHead( const Point3d& ptTip, const Vector3d& vtDir, PolyLine& PL) const ; bool SetCurrFont( FontManager& fntMgr) const ; bool ApproxTextWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST& lstPL) const ; + bool GetTextMyBBox( BBox3d& b3Loc) const ; bool GetTextMyBBox( const Point3d& ptPos, BBox3d& b3Loc) const ; bool GetTextLocalBBox( BBox3d& b3Loc) const ; bool GetTextBBox( const Frame3d& frRef, BBox3d& b3Ref) const ; @@ -137,7 +140,7 @@ class ExtDimension : public IExtDimension, public IGeoObjRW Point3d m_ptP3 ; // terzo punto Point3d m_ptP4 ; // quarto punto Point3d m_ptP5 ; // quinto punto - Point3d m_ptP6 ; // sesto punto; nel caso delle quotature angolari è il centro + Point3d m_ptP6 ; // sesto punto; nel caso delle quotature angolari � il centro Point3d m_ptPos ; // posizione ricevuta della quota std::string m_sText ; // testo della quota mutable bool m_bToCalc ; // flag dati effettivi da ricalcolare @@ -154,5 +157,5 @@ class ExtDimension : public IExtDimension, public IGeoObjRW int m_nDecDigit ; // numero di cifre decimali std::string m_sFont ; // font del testo double m_dTextHeight ; // altezza del testo - int m_nTempProp[2] ; // vettore proprietà temporanee + int m_nTempProp[2] ; // vettore propriet� temporanee } ; diff --git a/IntersCurveCurve.cpp b/IntersCurveCurve.cpp index 1f9d472..7c05360 100644 --- a/IntersCurveCurve.cpp +++ b/IntersCurveCurve.cpp @@ -659,11 +659,8 @@ IntersCurveCurve::CalcCurveInOrOut( const ICurve* pCurveA, const ICurve* pCurveB bool IntersCurveCurve::GetCurveOutClass( const ICurve* pCurve, int& nClass) { - PolyLine PL ; - if ( ! pCurve->ApproxWithLines( LIN_TOL_APPROX, ANG_TOL_APPROX_DEG, ICurve::APL_SPECIAL, PL)) - return false ; double dArea ; - if ( ! PL.GetAreaXY( dArea)) + if ( ! pCurve->GetAreaXY( dArea)) return false ; nClass = (( dArea > 0) ? CRVC_OUT : CRVC_IN) ; return true ; diff --git a/IntersLineLine.cpp b/IntersLineLine.cpp index d536654..dae77ba 100644 --- a/IntersLineLine.cpp +++ b/IntersLineLine.cpp @@ -66,7 +66,7 @@ IntersLineLine::IntersInfiniteLines( const ICurveLine& Line1, const ICurveLine& double dLen1XY = vtDir1.LenXY() ; if ( dLen1XY < EPS_SMALL) return ; - // linea 2 : Start, Direzione e Lunghezza + // linea 2 : Start, End, Direzione e Lunghezza Point3d ptS2 = Line2.GetStart() ; Point3d ptE2 = Line2.GetEnd() ; Vector3d vtDir2 = ptE2 - ptS2 ; diff --git a/OffsetCurve.cpp b/OffsetCurve.cpp index 78a14d2..d3e5adc 100644 --- a/OffsetCurve.cpp +++ b/OffsetCurve.cpp @@ -615,18 +615,16 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType) pCrvCo2->GetEndPoint( ptEnd2) ; // verifiche di concatenamento if ( AreSamePointEpsilon( ptEnd, ptStart2, 10 * EPS_SMALL)) { - if ( pCrvCo->AddCurve( pCrvCo2, true, 10 * EPS_SMALL)) { - m_CrvLst.erase( iIter2) ; + if ( pCrvCo->AddCurve( pCrvCo2, true, 10 * EPS_SMALL)) ptEnd = ptEnd2 ; - iIter2 = next( iIter) ; - } + m_CrvLst.erase( iIter2) ; + iIter2 = next( iIter) ; } else if ( AreSamePointEpsilon( ptEnd2, ptStart, 10 * EPS_SMALL)) { - if ( pCrvCo->AddCurve( pCrvCo2, false, 10 * EPS_SMALL)) { - m_CrvLst.erase( iIter2) ; + if ( pCrvCo->AddCurve( pCrvCo2, false, 10 * EPS_SMALL)) ptStart = ptStart2 ; - iIter2 = next( iIter) ; - } + m_CrvLst.erase( iIter2) ; + iIter2 = next( iIter) ; } else ++ iIter2 ; @@ -961,7 +959,7 @@ VerifyAndAdjustExternalAngle( ICurve* pCrv1, ICurve* pCrv2, double dAngDeg, doub nType = ICurve::OFF_CHAMFER ; // se angolo esterno molto piccolo, semplifico tutto - const double SMALL_EXT_ANG = 1.0 ; + const double SMALL_EXT_ANG = 0.1 ; bool bAngSmall = ( abs( dAngDeg) < SMALL_EXT_ANG) ; if ( bAngSmall) nType = ICurve::OFF_EXTEND ; diff --git a/SurfFlatRegionBooleans.cpp b/SurfFlatRegionBooleans.cpp index f2b7f5e..aa92e4d 100644 --- a/SurfFlatRegionBooleans.cpp +++ b/SurfFlatRegionBooleans.cpp @@ -396,11 +396,18 @@ SurfFlatRegion::MyNewSurfFromLoops( PCRV_DEQUE& vpLoop) typedef vector INDAREAVECTOR ; // vettore di coppie indice, area INDAREAVECTOR vArea ; vArea.reserve( vpLoop.size()) ; - for ( int i = 0 ; i < int( vpLoop.size()) ; ++ i) { + for ( int i = 0 ; i < int( vpLoop.size()) ;) { double dArea ; if ( ! vpLoop[i]->GetAreaXY( dArea)) return nullptr ; - vArea.emplace_back( i, dArea) ; + if ( abs( dArea) > SQ_EPS_SMALL) { + vArea.emplace_back( i, dArea) ; + ++ i ; + } + else { + delete vpLoop[i] ; + vpLoop.erase( vpLoop.begin() + i) ; + } } // ordino in senso decrescente sull'area sort( vArea.begin(), vArea.end(), diff --git a/Vector3d.cpp b/Vector3d.cpp index cb8143f..927768b 100644 --- a/Vector3d.cpp +++ b/Vector3d.cpp @@ -470,18 +470,20 @@ Vector3d::GetAngleXY( const Vector3d& vtEnd, double& dAngDeg) const // all'asse di rotazione sulla stessa direzione della componente perpendicolare di vtEnd //---------------------------------------------------------------------------- bool -Vector3d::GetRotation( const Vector3d& vtEnd, const Vector3d& vtAx, double& dAngDeg, bool& bDet) const +Vector3d::GetRotation( const Vector3d& vtEnd, const Vector3d& vtAx, double dEpsZero, double& dAngDeg, bool& bDet) const { // ricavo versore asse di rotazione Vector3d vtDirAx = vtAx ; if ( ! vtDirAx.Normalize()) return false ; + // verifico epsilon per vettore nullo + dEpsZero = std::min( EPS_SMALL, abs( dEpsZero)) ; // ricavo le componenti perpendicolari all'asse di rotazione Vector3d vtPerp = *this - vtDirAx * ( *this * vtDirAx) ; Vector3d vtPerpE = vtEnd - vtDirAx * ( vtEnd * vtDirAx) ; // se sono entrambe non nulle : angolo determinato - if ( ! vtPerp.IsZero() && ! vtPerpE.IsZero()) { + if ( vtPerp.SqLen() > dEpsZero * dEpsZero && vtPerpE.SqLen() > dEpsZero * dEpsZero) { // secondo vettore perpendicolare ad asse e a componente perpendicolare Vector3d vtPerp2 = vtDirAx ^ vtPerp ; // proporzionali a seno e coseno del perpendicolare E