diff --git a/ExtDimension.cpp b/ExtDimension.cpp index 92b528f..cceafcf 100644 --- a/ExtDimension.cpp +++ b/ExtDimension.cpp @@ -78,14 +78,23 @@ ExtDimension::SetLinear( const Point3d& ptP1, const Point3d& ptP2, const Point3d if ( ! m_vtDir.Normalize()) return false ; // punti estremi della linea di misura ed esterni delle linee di estremità - Vector3d vtLine = m_vtDir ; - vtLine.Rotate( m_vtN, 0, 1) ; - if ( vtLine * ( m_ptPos - m_ptP1) < 0) - vtLine.Invert() ; - m_ptP5 = m_ptP1 + vtLine * ( m_ptPos - m_ptP1) * vtLine ; - m_ptP6 = m_ptP2 + vtLine * ( m_ptPos - m_ptP2) * vtLine ; - m_ptP3 = m_ptP5 + vtLine * m_dExtLineLen ; - m_ptP4 = m_ptP6 + vtLine * m_dExtLineLen ; + Vector3d vtLine1 = m_vtDir ; + vtLine1.Rotate( m_vtN, 0, 1) ; + Vector3d vtLine2 = vtLine1 ; + double dProSca1 = vtLine1 * ( m_ptPos - m_ptP1) ; + double dProSca2 = vtLine2 * ( m_ptPos - m_ptP2) ; + if ( dProSca1 < -EPS_SMALL) + vtLine1.Invert() ; + if ( dProSca2 < -EPS_SMALL) + vtLine2.Invert() ; + if ( abs( dProSca1) < EPS_SMALL) + vtLine1 = vtLine2 ; + 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 ; + m_ptP3 = m_ptP5 + vtLine1 * m_dExtLineLen ; + m_ptP4 = m_ptP6 + vtLine2 * m_dExtLineLen ; // assegnazione del testo m_sText = sText ; // assegno il tipo @@ -142,8 +151,11 @@ ExtDimension::CopyFrom( const ExtDimension& clSrc) m_ptPos = clSrc.m_ptPos ; m_sText = clSrc.m_sText ; m_bToCalc = clSrc.m_bToCalc ; - m_ptOutPos = clSrc.m_ptOutPos ; - m_sOutText = clSrc.m_sOutText ; + m_sCalcText = clSrc.m_sCalcText ; + m_ptCalcPos = clSrc.m_ptCalcPos ; + m_bCalcArrowIn = clSrc.m_bCalcArrowIn ; + m_ptCalcP7 = clSrc.m_ptCalcP7 ; + m_ptCalcP8 = clSrc.m_ptCalcP8 ; m_dExtLineLen = clSrc.m_dExtLineLen ; m_dArrowLen = clSrc.m_dArrowLen ; m_dTextDist = clSrc.m_dTextDist ; @@ -170,12 +182,40 @@ ExtDimension::GetTitle( void) const return sTitle ; } +//---------------------------------------------------------------------------- +const string& +ExtDimension::GetSubType( void) const +{ + static const string vsSubType[] = { "None", "Linear", "Radial", "Diametral", "Angular"} ; + if ( m_nType >= DT_NONE && m_nType <= DT_ANGULAR) + return vsSubType[m_nType] ; + else + return vsSubType[0] ; +} + //---------------------------------------------------------------------------- bool ExtDimension::Dump( string& sOut, bool bMM, const char* szNewLine) const { // parametri - sOut += "VN(" + ToString( m_vtN, 6) + ") " + szNewLine ; + sOut += GetSubType() + szNewLine ; + sOut += "VN(" + ToString( m_vtN, 3) + ") " + szNewLine ; + sOut += "VD(" + ToString( m_vtDir, 3) + ") " + szNewLine ; + sOut += "P1(" + ToString( GetInUiUnits( m_ptP1, bMM), 3) + ") " + szNewLine ; + sOut += "P2(" + ToString( GetInUiUnits( m_ptP2, bMM), 3) + ") " + szNewLine ; + sOut += "P3(" + ToString( GetInUiUnits( m_ptP3, bMM), 3) + ") " + szNewLine ; + sOut += "P4(" + ToString( GetInUiUnits( m_ptP4, bMM), 3) + ") " + szNewLine ; + sOut += "P5(" + ToString( GetInUiUnits( m_ptP5, bMM), 3) + ") " + szNewLine ; + sOut += "P6(" + ToString( GetInUiUnits( m_ptP6, bMM), 3) + ") " + szNewLine ; + sOut += "Pos(" + ToString( GetInUiUnits( m_ptPos, bMM), 3) + ") " + szNewLine ; + sOut += "Txt=" + m_sText + szNewLine ; + sOut += "El=" + ToString( GetInUiUnits( m_dExtLineLen, bMM), 3) + + " Al=" + ToString( GetInUiUnits( m_dArrowLen, bMM), 3) + + " Td=" + ToString( GetInUiUnits( m_dTextDist, bMM), 3) + szNewLine ; + sOut += "Mm=" + string( m_bLenIsMM ? "1" : "0") + + " Dec=" + ToString( m_nLenDec) + szNewLine ; + sOut += "Fnt=" + m_sFont + + " H=" + ToString( GetInUiUnits( m_dTextHeight, bMM), 3) + szNewLine ; return true ; } @@ -292,12 +332,16 @@ ExtDimension::Load( NgeReader& ngeIn) bool ExtDimension::GetLocalBBox( BBox3d& b3Loc, int nFlag) const { + // eventuale ricalcolo + Update() ; // se lineare if ( m_nType == DT_LINEAR) { b3Loc.Set( m_ptP1) ; b3Loc.Add( m_ptP2) ; - b3Loc.Set( m_ptP3) ; + b3Loc.Add( m_ptP3) ; b3Loc.Add( m_ptP4) ; + b3Loc.Add( m_ptCalcP7) ; + b3Loc.Add( m_ptCalcP8) ; // ingombro del testo BBox3d b3Text ; if ( GetTextLocalBBox( b3Text)) @@ -315,22 +359,29 @@ ExtDimension::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const // verifico validità del frame if ( frRef.GetType() == Frame3d::ERR) return false ; + // eventuale ricalcolo + Update() ; // se lineare if ( m_nType == DT_LINEAR) { - // porto i punti nel riferimento passato + // 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) ; - // assegno il box nel riferimento - b3Ref.Set( ptFrP1) ; - b3Ref.Add( ptFrP2) ; - b3Ref.Add( ptFrP3) ; 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)) @@ -501,6 +552,9 @@ ExtDimension::ToGlob( const Frame3d& frRef) // verifico validità del frame if ( frRef.GetType() == Frame3d::ERR) return false ; + // se riferimento globale, non devo fare alcunché + if ( AreSameFrame( frRef, GLOB_FRM)) + return true ; // imposto ricalcolo m_bToCalc = true ; m_OGrMgr.Reset() ; @@ -528,6 +582,9 @@ ExtDimension::ToLoc( const Frame3d& frRef) // verifico validità del frame if ( frRef.GetType() == Frame3d::ERR) return false ; + // se riferimento globale, non devo fare alcunché + if ( AreSameFrame( frRef, GLOB_FRM)) + return true ; // imposto ricalcolo m_bToCalc = true ; m_OGrMgr.Reset() ; @@ -561,16 +618,21 @@ ExtDimension::LocToLoc( const Frame3d& frOri, const Frame3d& frDest) // imposto ricalcolo m_bToCalc = true ; m_OGrMgr.Reset() ; - // trasformo punto e versori - return ( m_vtN.ToGlob( frOri) && m_vtN.ToLoc( frDest) && - m_vtDir.ToGlob( frOri) && m_vtDir.ToLoc( frDest) && - m_ptP1.ToGlob( frOri) && m_ptP1.ToLoc( frDest) && - m_ptP2.ToGlob( frOri) && m_ptP2.ToLoc( frDest) && - m_ptP3.ToGlob( frOri) && m_ptP3.ToLoc( frDest) && - m_ptP4.ToGlob( frOri) && m_ptP4.ToLoc( frDest) && - m_ptP5.ToGlob( frOri) && m_ptP5.ToLoc( frDest) && - m_ptP6.ToGlob( frOri) && m_ptP6.ToLoc( frDest) && - m_ptPos.ToGlob( frOri) && m_ptPos.ToLoc( frDest)) ; + // se lineare + if ( m_nType == DT_LINEAR) { + // trasformo punto e versori + return ( m_vtN.ToGlob( frOri) && m_vtN.ToLoc( frDest) && + m_vtDir.ToGlob( frOri) && m_vtDir.ToLoc( frDest) && + m_ptP1.ToGlob( frOri) && m_ptP1.ToLoc( frDest) && + m_ptP2.ToGlob( frOri) && m_ptP2.ToLoc( frDest) && + m_ptP3.ToGlob( frOri) && m_ptP3.ToLoc( frDest) && + m_ptP4.ToGlob( frOri) && m_ptP4.ToLoc( frDest) && + m_ptP5.ToGlob( frOri) && m_ptP5.ToLoc( frDest) && + m_ptP6.ToGlob( frOri) && m_ptP6.ToLoc( frDest) && + m_ptPos.ToGlob( frOri) && m_ptPos.ToLoc( frDest)) ; + } + else + return false ; } //---------------------------------------------------------------------------- @@ -583,14 +645,38 @@ ExtDimension::Update( void) const // se quota lineare if ( m_nType == DT_LINEAR) { // testo - m_sOutText = m_sText ; - if ( m_sOutText.find( IS_MEASURE) != string::npos) { + 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_nLenDec) ; - ReplaceString( m_sOutText, IS_MEASURE, sVal) ; + ReplaceString( m_sCalcText, IS_MEASURE, sVal) ; } // punto di inserimento del testo - m_ptOutPos = ( m_ptP5 + m_ptP6) / 2 ; + 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 ; + } + 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 ; + } + else { + m_bCalcArrowIn = false ; + m_ptCalcP7 = m_ptP5 - m_vtDir * 2 * m_dArrowLen ; + m_ptCalcP8 = m_ptP6 + m_vtDir * 2 * m_dArrowLen ; + 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 ; @@ -604,8 +690,7 @@ bool ExtDimension::ApproxWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST& lstPL) const { // eventuale ricalcolo - if ( m_bToCalc) - Update() ; + Update() ; // se quota lineare if ( m_nType == DT_LINEAR) { // prima linea di riferimento @@ -617,41 +702,27 @@ ExtDimension::ApproxWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST& lstPL.back().AddUPoint( 0, m_ptP2) ; lstPL.back().AddUPoint( 1, m_ptP4) ; // se non c'è testo, linea di misura intera - if ( IsEmptyOrSpaces( m_sOutText)) { + if ( IsEmptyOrSpaces( m_sCalcText)) { lstPL.emplace_back() ; lstPL.back().AddUPoint( 0, m_ptP5) ; lstPL.back().AddUPoint( 1, m_ptP6) ; } // altrimenti, linea di misura divisa in due parti else { - // semi distanza di interruzione - double dHalfDist = m_dTextHeight / 2 + m_dTextDist ; - // recupero il box di ingombro del testo - BBox3d b3Text ; - if ( GetTextLocalBBox( b3Text)) { - double dHalfL = ( b3Text.GetMax().x - b3Text.GetMin().x) / 2 ; - double dHalfH = ( b3Text.GetMax().y - b3Text.GetMin().y) / 2 ; - dHalfDist = sqrt( dHalfL * dHalfL + dHalfH * dHalfH) ; - if ( abs( m_vtDir.x) > EPS_ZERO) - dHalfDist = min( dHalfDist, dHalfL / abs( m_vtDir.x)) ; - if ( abs( m_vtDir.y) > EPS_ZERO) - dHalfDist = min( dHalfDist, dHalfH / abs( m_vtDir.y)) ; - dHalfDist += m_dTextDist ; - } // prima parte lstPL.emplace_back() ; lstPL.back().AddUPoint( 0, m_ptP5) ; - lstPL.back().AddUPoint( 1, m_ptOutPos - m_vtDir * dHalfDist) ; + lstPL.back().AddUPoint( 1, m_ptCalcP7) ; // seconda parte lstPL.emplace_back() ; - lstPL.back().AddUPoint( 0, m_ptOutPos + m_vtDir * dHalfDist) ; - lstPL.back().AddUPoint( 1, m_ptP6) ; + lstPL.back().AddUPoint( 0, m_ptP6) ; + lstPL.back().AddUPoint( 1, m_ptCalcP8) ; } // frecce lstPL.emplace_back() ; - GetArrowHead( m_ptP5, -m_vtDir, lstPL.back()) ; + GetArrowHead( m_ptP5, ( m_bCalcArrowIn ? -m_vtDir : m_vtDir), lstPL.back()) ; lstPL.emplace_back() ; - GetArrowHead( m_ptP6, m_vtDir, lstPL.back()) ; + GetArrowHead( m_ptP6, ( m_bCalcArrowIn ? m_vtDir : -m_vtDir), lstPL.back()) ; // testo POLYLINELIST lstTxt ; if ( ApproxTextWithLines( dLinTol, dAngTolDeg, lstTxt)) @@ -661,6 +732,27 @@ ExtDimension::ApproxWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST& return true ; } +//---------------------------------------------------------------------------- +double +ExtDimension::GetTextHalfDist( const Point3d& ptText) const +{ + // semi distanza di interruzione + double dHalfDist = m_dTextHeight / 2 + m_dTextDist ; + // recupero il box di ingombro del testo + BBox3d b3Text ; + if ( GetTextMyBBox( ptText, b3Text)) { + double dHalfL = ( b3Text.GetMax().x - b3Text.GetMin().x) / 2 ; + double dHalfH = ( b3Text.GetMax().y - b3Text.GetMin().y) / 2 ; + dHalfDist = sqrt( dHalfL * dHalfL + dHalfH * dHalfH) ; + if ( abs( m_vtDir.x) > EPS_ZERO) + dHalfDist = min( dHalfDist, dHalfL / abs( m_vtDir.x)) ; + if ( abs( m_vtDir.y) > EPS_ZERO) + dHalfDist = min( dHalfDist, dHalfH / abs( m_vtDir.y)) ; + dHalfDist += m_dTextDist ; + } + return dHalfDist ; +} + //---------------------------------------------------------------------------- bool ExtDimension::GetArrowHead( const Point3d& ptTip, const Vector3d& vtDir, PolyLine& PL) const @@ -681,8 +773,7 @@ bool ExtDimension::ApproxTextWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST& lstPL) const { // eventuale ricalcolo - if ( m_bToCalc) - Update() ; + Update() ; // imposto il font corrente e i suoi dati FontManager& fntMgr = FontManager::GetFontManager() ; @@ -690,12 +781,12 @@ ExtDimension::ApproxTextWithLines( double dLinTol, double dAngTolDeg, POLYLINELI return false ; // richiedo l'outline - if ( ! fntMgr.ApproxWithLines( m_sOutText, ETXT_IPMC, dLinTol, dAngTolDeg, lstPL)) + if ( ! fntMgr.ApproxWithLines( m_sCalcText, ETXT_IPMC, dLinTol, dAngTolDeg, lstPL)) return false ; // calcolo la trasformazione Frame3d frRef ; - if ( ! frRef.Set( m_ptOutPos, m_vtN)) + if ( ! frRef.Set( m_ptCalcPos, m_vtN)) return false ; // eseguo la trasformazione @@ -713,7 +804,7 @@ ExtDimension::GetTextMyBBox( const Point3d& ptPos, BBox3d& b3Loc) const b3Loc.Reset() ; // se testo vuoto, box vuoto - if ( IsEmptyOrSpaces( m_sOutText)) + if ( IsEmptyOrSpaces( m_sCalcText)) return true ; // imposto il font corrente e i suoi dati @@ -722,7 +813,7 @@ ExtDimension::GetTextMyBBox( const Point3d& ptPos, BBox3d& b3Loc) const return false ; // richiedo il box - if ( ! fntMgr.GetBBox( m_sOutText, ETXT_IPMC, b3Loc)) + if ( ! fntMgr.GetBBox( m_sCalcText, ETXT_IPMC, b3Loc)) return false ; // calcolo ed eseguo la trasformazione @@ -739,11 +830,10 @@ bool ExtDimension::GetTextLocalBBox( BBox3d& b3Loc) const { // eventuale ricalcolo - if ( m_bToCalc) - Update() ; + Update() ; // calcolo il box - return GetTextMyBBox( m_ptOutPos, b3Loc) ; + return GetTextMyBBox( m_ptCalcPos, b3Loc) ; } //---------------------------------------------------------------------------- @@ -751,11 +841,10 @@ bool ExtDimension::GetTextBBox( const Frame3d& frRef, BBox3d& b3Ref) const { // eventuale ricalcolo - if ( m_bToCalc) - Update() ; + Update() ; // calcolo il box - if ( ! GetTextMyBBox( m_ptOutPos, b3Ref)) + if ( ! GetTextMyBBox( m_ptCalcPos, b3Ref)) return false ; // porto il box nel riferimento passato diff --git a/ExtDimension.h b/ExtDimension.h index ac1fb40..2d83757 100644 --- a/ExtDimension.h +++ b/ExtDimension.h @@ -78,7 +78,9 @@ class ExtDimension : public IExtDimension, public IGeoObjRW private : bool CopyFrom( const ExtDimension& gpSrc) ; + const std::string& GetSubType( void) const ; bool Update( void) const ; + double GetTextHalfDist( const Point3d& ptText) const ; bool GetArrowHead( const Point3d& ptTip, const Vector3d& vtDir, PolyLine& PL) const ; bool ApproxTextWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST& lstPL) const ; bool GetTextMyBBox( const Point3d& ptPos, BBox3d& b3Loc) const ; @@ -99,8 +101,11 @@ class ExtDimension : public IExtDimension, public IGeoObjRW Point3d m_ptPos ; // posizione ricevuta della quota std::string m_sText ; // testo della quota mutable bool m_bToCalc ; // flag dati effettivi da ricalcolare - mutable Point3d m_ptOutPos ; // posizione effettiva della quota - mutable std::string m_sOutText ; // testo effettivo della quota + mutable std::string m_sCalcText ; // testo effettivo della quota + mutable Point3d m_ptCalcPos ; // posizione effettiva della quota + mutable bool m_bCalcArrowIn ; // flag posizione effettiva delle frecce + mutable Point3d m_ptCalcP7 ; // settimo punto effettivo + mutable Point3d m_ptCalcP8 ; // ottavo punto effettivo double m_dExtLineLen ; // lunghezza di estensione della linea double m_dArrowLen ; // lunghezza delle frecce double m_dTextDist ; // distanza della linea di quotatura dal testo diff --git a/ExtText.cpp b/ExtText.cpp index d0031a7..34d5425 100644 --- a/ExtText.cpp +++ b/ExtText.cpp @@ -201,8 +201,8 @@ ExtText::Dump( string& sOut, bool bMM, const char* szNewLine) const // parametri sOut += "P(" + ToString( GetInUiUnits( m_ptP, bMM), 3) + ") " ; sOut += " IP=" + ToString( m_nInsPos) + szNewLine ; - sOut += "VN(" + ToString( m_vtN, 6) + ") " + szNewLine ; - sOut += "VS(" + ToString( m_vtD, 6) + ") " + szNewLine ; + sOut += "VN(" + ToString( m_vtN, 3) + ") " + szNewLine ; + sOut += "VS(" + ToString( m_vtD, 3) + ") " + szNewLine ; sOut += "Txt=" + m_sText + szNewLine ; sOut += "Fnt=" + m_sFont + szNewLine ; sOut += "W=" + ToString( m_nWeight) ;