Merge branch 'ExtDimension_angular'
This commit is contained in:
+293
-285
@@ -2,7 +2,7 @@
|
||||
// EgalTech 2019-2019
|
||||
//----------------------------------------------------------------------------
|
||||
// File : ExtDimension.cpp Data : 27.12.19 Versione : 2.2a1
|
||||
// Contenuto : Implementazione della classe Dimension (quota).
|
||||
// Contenuto : Implementazione della classe Dimension ( quota).
|
||||
//
|
||||
//
|
||||
//
|
||||
@@ -63,7 +63,7 @@ ExtDimension::~ExtDimension( void)
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
ExtDimension::SetStyle( double dExtLineLen, double dArrowLen, double dTextDist, bool bLenIsMM,
|
||||
int nDecDigit, const string& sFont, double dTextHeight)
|
||||
int nDecDigit, const string& sFont, double dTextHeight)
|
||||
{
|
||||
m_dExtLineLen = max( dExtLineLen, MIN_EXTLINELEN) ;
|
||||
m_dArrowLen = max( dArrowLen, MIN_ARROWLEN) ;
|
||||
@@ -93,7 +93,7 @@ ExtDimension::SetLinear( const Point3d& ptP1, const Point3d& ptP2, const Point3d
|
||||
// verifico che i punti di misura non siano coincidenti
|
||||
if ( AreSamePointApprox( m_ptP1, m_ptP2))
|
||||
return false ;
|
||||
// direzione di riferimento (nel piano perpendicolare a vtN)
|
||||
// direzione di riferimento ( nel piano perpendicolare a vtN)
|
||||
m_vtDir = vtDir ;
|
||||
if ( m_vtDir.IsSmall())
|
||||
m_vtDir = m_ptP2 - m_ptP1 ;
|
||||
@@ -137,7 +137,7 @@ ExtDimension::SetLinear( const Point3d& ptP1, const Point3d& ptP2, const Point3d
|
||||
bool
|
||||
ExtDimension::SetRadial( const Point3d& ptCen, const Point3d& ptPos,
|
||||
const Vector3d& vtN, const string& sText)
|
||||
{
|
||||
{ // il punto m_ptP6 viene utilizzato per il centro
|
||||
// dichiaro quota non ancora determinata
|
||||
m_nType = DT_NONE ;
|
||||
// verifico la definizione del versore normale e del versore X
|
||||
@@ -145,25 +145,20 @@ ExtDimension::SetRadial( const Point3d& ptCen, const Point3d& ptPos,
|
||||
m_vtDir = ptPos - ptCen ;
|
||||
if ( ! m_vtN.Normalize() || ! m_vtDir.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_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))
|
||||
if ( AreSamePointApprox( m_ptP6, m_ptPos))
|
||||
return false ;
|
||||
|
||||
// assegnazione del testo
|
||||
// assegnazione del testo
|
||||
m_sText = sText ;
|
||||
// assegno il tipo
|
||||
// assegno il tipo
|
||||
m_nType = DT_RADIAL ;
|
||||
// imposto da calcolare
|
||||
// imposto da calcolare
|
||||
m_bToCalc = true ;
|
||||
m_OGrMgr.Reset() ;
|
||||
|
||||
@@ -174,7 +169,7 @@ ExtDimension::SetRadial( const Point3d& ptCen, const Point3d& ptPos,
|
||||
bool
|
||||
ExtDimension::SetDiametral( const Point3d& ptCen, const Point3d& ptPos,
|
||||
const Vector3d& vtN, const string& sText)
|
||||
{
|
||||
{ // il punto m_ptP6 viene utilizzato per il centro
|
||||
// dichiaro quota non ancora determinata
|
||||
m_nType = DT_NONE ;
|
||||
// verifico la definizione del versore normale e del versore X
|
||||
@@ -182,26 +177,21 @@ ExtDimension::SetDiametral( const Point3d& ptCen, const Point3d& ptPos,
|
||||
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 ;
|
||||
// porto i punti nel piano definito da ptP6 e vtN
|
||||
m_ptP6 = ptCen ;
|
||||
m_ptPos = ptPos - ( ptPos - m_ptP6) * 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
|
||||
// assegnazione del testo
|
||||
m_sText = sText ;
|
||||
// assegno il tipo
|
||||
// assegno il tipo
|
||||
m_nType = DT_DIAMETRAL ;
|
||||
// imposto da calcolare
|
||||
// imposto da calcolare
|
||||
m_bToCalc = true ;
|
||||
m_OGrMgr.Reset() ;
|
||||
|
||||
@@ -210,7 +200,7 @@ ExtDimension::SetDiametral( const Point3d& ptCen, const Point3d& ptPos,
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
ExtDimension::SetAngular( const Point3d& ptP1, const Point3d& ptP2, const Point3d& ptV, const Point3d& ptPos,
|
||||
ExtDimension::SetAngular( const Point3d& ptP1, const Point3d& ptV, const Point3d& ptP2, const Point3d& ptPos,
|
||||
const Vector3d& vtN, const string& sText)
|
||||
{
|
||||
// dichiaro quota non ancora determinata
|
||||
@@ -222,32 +212,25 @@ ExtDimension::SetAngular( const Point3d& ptP1, const Point3d& ptP2, const Point3
|
||||
// porto i punti nel piano definito da P1 e N
|
||||
m_ptP1 = ptP1 ;
|
||||
m_ptP2 = ptP2 - ( ptP2 - m_ptP1) * m_vtN * m_vtN ;
|
||||
m_ptP5 = ptV - ( ptV - m_ptP1) * m_vtN * m_vtN ;
|
||||
m_ptP6 = 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_ptP1, m_ptP2) || AreSamePointApprox( m_ptP1, m_ptP5) || AreSamePointApprox( m_ptP2, m_ptP5))
|
||||
if ( AreSamePointApprox( m_ptP1, m_ptP2) || AreSamePointApprox( m_ptP1, m_ptP6) || AreSamePointApprox( m_ptP2, m_ptP5))
|
||||
return false ;
|
||||
// calcolo le direzioni su cui giacciono i due lati dell'angolo
|
||||
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 ;
|
||||
// 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 dHalfDist ;
|
||||
double dFactor ;
|
||||
if ( m_sCalcText.find( IS_MEASURE) != string::npos) {
|
||||
dHalfDist = GetTextHalfDist( m_ptPos) ;
|
||||
m_sCalcText = "300.00" ;
|
||||
double dHalfDist = GetTextHalfDist( m_ptPos) ;
|
||||
dFactor = 2.5 * dHalfDist ;
|
||||
m_sCalcText = "" ;
|
||||
}
|
||||
else {
|
||||
dHalfDist = GetTextHalfDist( m_ptPos) ;
|
||||
double dHalfDist = GetTextHalfDist( m_ptPos) ;
|
||||
dFactor = 2.5 * dHalfDist ;
|
||||
}
|
||||
// allungo m_vtDir se è troppo vicino al centro
|
||||
@@ -255,24 +238,26 @@ ExtDimension::SetAngular( const Point3d& ptP1, const Point3d& ptP2, const Point3
|
||||
Vector3d vtDir_n = m_vtDir ;
|
||||
if ( ! vtDir_n.Normalize())
|
||||
return false ;
|
||||
m_ptPos = m_ptP5 + dFactor * vtDir_n ;
|
||||
m_ptPos = m_ptP6 + dFactor * vtDir_n ;
|
||||
// ricalcolo m_vtDir
|
||||
m_vtDir = m_ptPos - m_ptP5 ;
|
||||
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 ;
|
||||
double dLen1 = vtLine1.Len() ;
|
||||
double dLen2 = vtLine2.Len() ;
|
||||
if ( ! vtLine1.Normalize() || ! vtLine2.Normalize())
|
||||
return false ;
|
||||
// segnalo se i punti che definiscono i lati sono più lontani dal centro di ptPos
|
||||
bool bPt1Close = false ;
|
||||
bool bPt2Close = false ;
|
||||
if ( dLenDir < dLen1)
|
||||
bPt1Close = true ;
|
||||
if ( dLenDir < dLen2)
|
||||
bPt2Close = true ;
|
||||
bool bPt1Close = ( dLenDir < dLen1 ? true : false) ;
|
||||
bool bPt2Close = ( dLenDir < dLen2 ? true : false) ;
|
||||
m_ptP5 = m_ptP1 + ( dLenDir - dLen1) * vtLine1 ;
|
||||
m_ptP6 = m_ptP2 + ( dLenDir - dLen2) * vtLine2 ;
|
||||
Point3d ptP5_bis = m_ptP2 + ( dLenDir - dLen2) * vtLine2 ;
|
||||
m_ptP3 = m_ptP5 + ( bPt1Close ? - vtLine1 : vtLine1) * m_dExtLineLen ;
|
||||
m_ptP4 = m_ptP6 + ( bPt2Close ? - vtLine2 : vtLine2) * m_dExtLineLen ;
|
||||
|
||||
m_ptP4 = ptP5_bis + ( bPt2Close ? - vtLine2 : vtLine2) * m_dExtLineLen ;
|
||||
|
||||
// assegnazione del testo
|
||||
m_sText = sText ;
|
||||
// assegno il tipo
|
||||
@@ -332,6 +317,7 @@ ExtDimension::CopyFrom( const ExtDimension& clSrc)
|
||||
m_sCalcText = clSrc.m_sCalcText ;
|
||||
m_ptCalcPos = clSrc.m_ptCalcPos ;
|
||||
m_bCalcArrowIn = clSrc.m_bCalcArrowIn ;
|
||||
m_bCalcTextOn = clSrc.m_bCalcTextOn ;
|
||||
m_ptCalcP7 = clSrc.m_ptCalcP7 ;
|
||||
m_ptCalcP8 = clSrc.m_ptCalcP8 ;
|
||||
m_dExtLineLen = clSrc.m_dExtLineLen ;
|
||||
@@ -380,15 +366,15 @@ ExtDimension::Dump( string& sOut, bool bMM, const char* szNewLine) const
|
||||
{
|
||||
// parametri
|
||||
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 += "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) +
|
||||
@@ -529,7 +515,7 @@ ExtDimension::GetLocalBBox( BBox3d& b3Loc, int nFlag) const
|
||||
return true ;
|
||||
}
|
||||
else if ( m_nType == DT_RADIAL) {
|
||||
b3Loc.Set( m_ptP5) ;
|
||||
b3Loc.Set( m_ptP6) ;
|
||||
b3Loc.Add( m_ptPos) ;
|
||||
// ingombro del testo
|
||||
BBox3d b3Text ;
|
||||
@@ -538,7 +524,7 @@ ExtDimension::GetLocalBBox( BBox3d& b3Loc, int nFlag) const
|
||||
return true ;
|
||||
}
|
||||
else if ( m_nType == DT_DIAMETRAL) {
|
||||
b3Loc.Set( m_ptP5) ;
|
||||
b3Loc.Set( m_ptP6) ;
|
||||
b3Loc.Add( m_ptPos) ;
|
||||
// ingombro del testo
|
||||
BBox3d b3Text ;
|
||||
@@ -552,6 +538,7 @@ ExtDimension::GetLocalBBox( BBox3d& b3Loc, int nFlag) const
|
||||
b3Loc.Add( m_ptP3) ;
|
||||
b3Loc.Add( m_ptP4) ;
|
||||
b3Loc.Set( m_ptP5) ;
|
||||
b3Loc.Set( m_ptP6) ;
|
||||
b3Loc.Add( m_ptCalcP7) ;
|
||||
b3Loc.Add( m_ptCalcP8) ;
|
||||
// ingombro del testo
|
||||
@@ -575,7 +562,7 @@ ExtDimension::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
|
||||
Update() ;
|
||||
// se valido
|
||||
if ( m_nType == DT_LINEAR) {
|
||||
// ingombro dei punti (portati nel riferimento passato)
|
||||
// ingombro dei punti ( portati nel riferimento passato)
|
||||
Point3d ptFrP1 = m_ptP1 ;
|
||||
ptFrP1.ToGlob( frRef) ;
|
||||
b3Ref.Set( ptFrP1) ;
|
||||
@@ -601,8 +588,8 @@ ExtDimension::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
|
||||
return true ;
|
||||
}
|
||||
else if ( m_nType == DT_RADIAL) {
|
||||
// ingombro dei punti (portati nel riferimento passato)
|
||||
Point3d ptFrP5 = m_ptP5 ;
|
||||
// ingombro dei punti ( portati nel riferimento passato)
|
||||
Point3d ptFrP5 = m_ptP6 ;
|
||||
ptFrP5.ToGlob( frRef) ;
|
||||
b3Ref.Set( ptFrP5) ;
|
||||
Point3d ptFrPos = m_ptPos ;
|
||||
@@ -615,8 +602,8 @@ ExtDimension::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
|
||||
return true ;
|
||||
}
|
||||
else if ( m_nType == DT_DIAMETRAL) {
|
||||
// ingombro dei punti (portati nel riferimento passato)
|
||||
Point3d ptFrP5 = m_ptP5 ;
|
||||
// ingombro dei punti ( portati nel riferimento passato)
|
||||
Point3d ptFrP5 = m_ptP6 ;
|
||||
ptFrP5.ToGlob( frRef) ;
|
||||
b3Ref.Set( ptFrP5) ;
|
||||
Point3d ptFrPos = m_ptPos ;
|
||||
@@ -629,9 +616,6 @@ ExtDimension::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
|
||||
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) ;
|
||||
@@ -644,6 +628,12 @@ ExtDimension::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
|
||||
Point3d ptFrP4 = m_ptP4 ;
|
||||
ptFrP4.ToGlob( frRef) ;
|
||||
b3Ref.Add( ptFrP4) ;
|
||||
Point3d ptFrP5 = m_ptP5 ;
|
||||
ptFrP5.ToGlob( frRef) ;
|
||||
b3Ref.Set( ptFrP5) ;
|
||||
Point3d ptFrP6 = m_ptP6 ;
|
||||
ptFrP6.ToGlob( frRef) ;
|
||||
b3Ref.Set( ptFrP6) ;
|
||||
Point3d ptFrP7 = m_ptCalcP7 ;
|
||||
ptFrP7.ToGlob( frRef) ;
|
||||
b3Ref.Add( ptFrP7) ;
|
||||
@@ -698,14 +688,14 @@ ExtDimension::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng,
|
||||
// se valido
|
||||
if ( m_nType >= DT_LINEAR && m_nType <= DT_ANGULAR) {
|
||||
return ( m_vtN.Rotate( vtAx, dCosAng, dSinAng) &&
|
||||
m_vtDir.Rotate( vtAx, dCosAng, dSinAng) &&
|
||||
m_ptP1.Rotate( ptAx, vtAx, dCosAng, dSinAng) &&
|
||||
m_ptP2.Rotate( ptAx, vtAx, dCosAng, dSinAng) &&
|
||||
m_ptP3.Rotate( ptAx, vtAx, dCosAng, dSinAng) &&
|
||||
m_ptP4.Rotate( ptAx, vtAx, dCosAng, dSinAng) &&
|
||||
m_ptP5.Rotate( ptAx, vtAx, dCosAng, dSinAng) &&
|
||||
m_ptP6.Rotate( ptAx, vtAx, dCosAng, dSinAng) &&
|
||||
m_ptPos.Rotate( ptAx, vtAx, dCosAng, dSinAng)) ;
|
||||
m_vtDir.Rotate( vtAx, dCosAng, dSinAng) &&
|
||||
m_ptP1.Rotate( ptAx, vtAx, dCosAng, dSinAng) &&
|
||||
m_ptP2.Rotate( ptAx, vtAx, dCosAng, dSinAng) &&
|
||||
m_ptP3.Rotate( ptAx, vtAx, dCosAng, dSinAng) &&
|
||||
m_ptP4.Rotate( ptAx, vtAx, dCosAng, dSinAng) &&
|
||||
m_ptP5.Rotate( ptAx, vtAx, dCosAng, dSinAng) &&
|
||||
m_ptP6.Rotate( ptAx, vtAx, dCosAng, dSinAng) &&
|
||||
m_ptPos.Rotate( ptAx, vtAx, dCosAng, dSinAng)) ;
|
||||
}
|
||||
else
|
||||
return false ;
|
||||
@@ -739,6 +729,8 @@ ExtDimension::Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, doubl
|
||||
return false ;
|
||||
if ( ! m_ptP2.Scale( frRef, dCoeffX, dCoeffY, dCoeffZ))
|
||||
return false ;
|
||||
if ( ! m_ptP6.Scale( frRef, dCoeffX, dCoeffY, dCoeffZ))
|
||||
return false ;
|
||||
if ( ! m_ptPos.Scale( frRef, dCoeffX, dCoeffY, dCoeffZ))
|
||||
return false ;
|
||||
// ricalcolo completamente la quota
|
||||
@@ -746,11 +738,11 @@ ExtDimension::Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, doubl
|
||||
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) ;
|
||||
return SetRadial( m_ptP6, m_ptPos, m_vtN, m_sText) ;
|
||||
case DT_DIAMETRAL :
|
||||
return SetDiametral( m_ptP5, m_ptPos, m_vtN, m_sText) ;
|
||||
return SetDiametral( m_ptP6, m_ptPos, m_vtN, m_sText) ;
|
||||
case DT_ANGULAR :
|
||||
return SetAngular( m_ptP5, m_ptP1, m_ptP2, m_ptPos, m_vtN, m_sText) ;
|
||||
return SetAngular( m_ptP1, m_ptP6, m_ptP2, m_ptPos, m_vtN, m_sText) ;
|
||||
default :
|
||||
return false ;
|
||||
}
|
||||
@@ -773,12 +765,12 @@ ExtDimension::Mirror( const Point3d& ptOn, const Vector3d& vtNorm)
|
||||
|
||||
// se valido
|
||||
if ( m_nType >= DT_LINEAR && m_nType <= DT_ANGULAR) {
|
||||
// eseguo il mirror dei versori
|
||||
// eseguo il mirror dei versori
|
||||
if ( ! m_vtN.Mirror( 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))
|
||||
@@ -827,6 +819,8 @@ ExtDimension::Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector3d
|
||||
return false ;
|
||||
if ( ! m_ptP2.Shear( ptOn, vtNorm, vtDir, dCoeff))
|
||||
return false ;
|
||||
if ( ! m_ptP6.Shear( ptOn, vtNorm, vtDir, dCoeff))
|
||||
return false ;
|
||||
if ( ! m_ptPos.Shear( ptOn, vtNorm, vtDir, dCoeff))
|
||||
return false ;
|
||||
// ricalcolo completamente la quota
|
||||
@@ -834,11 +828,11 @@ ExtDimension::Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector3d
|
||||
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) ;
|
||||
return SetRadial( m_ptP6, m_ptPos, m_vtN, m_sText) ;
|
||||
case DT_DIAMETRAL :
|
||||
return SetDiametral( m_ptP5, m_ptPos, m_vtN, m_sText) ;
|
||||
return SetDiametral( m_ptP6, m_ptPos, m_vtN, m_sText) ;
|
||||
case DT_ANGULAR :
|
||||
return SetAngular( m_ptP5, m_ptP1, m_ptP2, m_ptPos, m_vtN, m_sText) ;
|
||||
return SetAngular( m_ptP1, m_ptP6, m_ptP2, m_ptPos, m_vtN, m_sText) ;
|
||||
default :
|
||||
return false ;
|
||||
}
|
||||
@@ -865,16 +859,16 @@ ExtDimension::ToGlob( const Frame3d& frRef)
|
||||
|
||||
// se valido
|
||||
if ( m_nType >= DT_LINEAR && m_nType <= DT_ANGULAR) {
|
||||
// trasformo punto e versori
|
||||
// trasformo punto e versori
|
||||
return ( m_vtN.ToGlob( frRef) &&
|
||||
m_vtDir.ToGlob( frRef) &&
|
||||
m_ptP1.ToGlob( frRef) &&
|
||||
m_ptP2.ToGlob( frRef) &&
|
||||
m_ptP3.ToGlob( frRef) &&
|
||||
m_ptP4.ToGlob( frRef) &&
|
||||
m_ptP5.ToGlob( frRef) &&
|
||||
m_ptP6.ToGlob( frRef) &&
|
||||
m_ptPos.ToGlob( frRef)) ;
|
||||
m_vtDir.ToGlob( frRef) &&
|
||||
m_ptP1.ToGlob( frRef) &&
|
||||
m_ptP2.ToGlob( frRef) &&
|
||||
m_ptP3.ToGlob( frRef) &&
|
||||
m_ptP4.ToGlob( frRef) &&
|
||||
m_ptP5.ToGlob( frRef) &&
|
||||
m_ptP6.ToGlob( frRef) &&
|
||||
m_ptPos.ToGlob( frRef)) ;
|
||||
}
|
||||
else
|
||||
return false ;
|
||||
@@ -898,16 +892,16 @@ ExtDimension::ToLoc( const Frame3d& frRef)
|
||||
|
||||
// se valido
|
||||
if ( m_nType >= DT_LINEAR && m_nType <= DT_ANGULAR) {
|
||||
// trasformo punto e versori
|
||||
// trasformo punto e versori
|
||||
return ( m_vtN.ToLoc( frRef) &&
|
||||
m_vtDir.ToLoc( frRef) &&
|
||||
m_ptP1.ToLoc( frRef) &&
|
||||
m_ptP2.ToLoc( frRef) &&
|
||||
m_ptP3.ToLoc( frRef) &&
|
||||
m_ptP4.ToLoc( frRef) &&
|
||||
m_ptP5.ToLoc( frRef) &&
|
||||
m_ptP6.ToLoc( frRef) &&
|
||||
m_ptPos.ToLoc( frRef)) ;
|
||||
m_vtDir.ToLoc( frRef) &&
|
||||
m_ptP1.ToLoc( frRef) &&
|
||||
m_ptP2.ToLoc( frRef) &&
|
||||
m_ptP3.ToLoc( frRef) &&
|
||||
m_ptP4.ToLoc( frRef) &&
|
||||
m_ptP5.ToLoc( frRef) &&
|
||||
m_ptP6.ToLoc( frRef) &&
|
||||
m_ptPos.ToLoc( frRef)) ;
|
||||
}
|
||||
else
|
||||
return false ;
|
||||
@@ -933,14 +927,14 @@ ExtDimension::LocToLoc( const Frame3d& frOri, const Frame3d& frDest)
|
||||
if ( m_nType >= DT_LINEAR && m_nType <= DT_ANGULAR) {
|
||||
// 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)) ;
|
||||
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 ;
|
||||
@@ -993,7 +987,7 @@ ExtDimension::Update( void) const
|
||||
else
|
||||
m_ptCalcPos = m_ptCalcP8 + m_vtDir * dHalfDist ;
|
||||
}
|
||||
// dichiaro ricalcolo eseguito
|
||||
// dichiaro ricalcolo eseguito
|
||||
m_bToCalc = false ;
|
||||
return true ;
|
||||
}
|
||||
@@ -1012,21 +1006,27 @@ ExtDimension::Update( void) const
|
||||
ReplaceString( m_sCalcText, IS_MEASURE, sVal) ;
|
||||
}
|
||||
// punto di inserimento del testo
|
||||
m_ptCalcPos = ( m_ptP5 + m_ptP6) / 2 ;
|
||||
m_ptCalcPos = ( m_ptP5 + m_ptP2) / 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))
|
||||
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_ptP6 - m_ptP5).Len() ;
|
||||
double dLen = Dist( m_ptP1, m_ptP2) ;
|
||||
// determino come orientare le frecce e dove mettere il testo
|
||||
if ( dLen - 2 * m_dArrowLen >= 2 * dHalfDist) {
|
||||
m_bCalcArrowIn = true ;
|
||||
@@ -1039,7 +1039,7 @@ ExtDimension::Update( void) const
|
||||
m_bCalcArrowIn = false ;
|
||||
m_bCalcTextOn = true ;
|
||||
m_ptCalcP7 = m_ptP5 - m_vtDir * 2 * m_dArrowLen ;
|
||||
m_ptCalcP8 = m_ptP6 + m_vtDir * 2 * m_dArrowLen ;
|
||||
m_ptCalcP8 = m_ptP2 + m_vtDir * 2 * m_dArrowLen ;
|
||||
}
|
||||
// stanno fuori sia le frecce sia il testo
|
||||
else {
|
||||
@@ -1047,7 +1047,8 @@ ExtDimension::Update( void) const
|
||||
m_bCalcTextOn = false ;
|
||||
// metto la quotatura dal lato di ptPos
|
||||
Vector3d vtRad = m_ptPos - m_ptP5 ;
|
||||
vtRad.Normalize() ;
|
||||
if ( ! vtRad.Normalize())
|
||||
return false ;
|
||||
m_ptCalcPos = m_ptPos + vtRad * ( dHalfDist + 2 * m_dArrowLen) ;
|
||||
}
|
||||
// dichiaro ricalcolo eseguito
|
||||
@@ -1057,9 +1058,11 @@ ExtDimension::Update( void) const
|
||||
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 ;
|
||||
Vector3d vtLine1 = m_ptP1 - m_ptP6 ;
|
||||
Vector3d vtLine2 = m_ptP2 - m_ptP6 ;
|
||||
Vector3d vtLine3 = m_ptPos - m_ptP6 ;
|
||||
// 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
|
||||
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)
|
||||
@@ -1067,14 +1070,17 @@ ExtDimension::Update( void) const
|
||||
// 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 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<CurveArc> pCrvPos( CreateBasicCurveArc()) ;
|
||||
if ( IsNull( pCrvPos) || ! pCrvPos->Set3P( m_ptP6, m_ptPos, m_ptP5, false))
|
||||
if ( IsNull( pCrvPos) || ! pCrvPos->Set3P( ptP5_bis, m_ptPos, m_ptP5, false))
|
||||
return false ;
|
||||
// punto di inserimento del testo
|
||||
pCrvPos->GetMidPoint( m_ptCalcPos) ;
|
||||
@@ -1085,15 +1091,14 @@ ExtDimension::Update( void) const
|
||||
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 ;
|
||||
double dDist = Dist( m_ptCalcPos, m_ptP6) ;
|
||||
double 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) ;
|
||||
@@ -1104,12 +1109,11 @@ ExtDimension::Update( void) const
|
||||
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) ;
|
||||
//pCrvPosExt->GetStartPoint( m_ptCalcP8) ;
|
||||
//pCrvPosExt->GetEndPoint( m_ptCalcP7) ;
|
||||
if ( dLen < 2 * dHalfDist) {
|
||||
m_ptCalcPos += ( m_ptCalcPos - m_ptP5) ;
|
||||
m_bCalcTextOn = false ;
|
||||
@@ -1119,11 +1123,9 @@ ExtDimension::Update( void) const
|
||||
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)) {
|
||||
if ( Dist( m_ptPos, m_ptP5) < Dist( m_ptPos, ptP5_bis)) {
|
||||
Vector3d vtDirEnd ;
|
||||
pCrvPos->GetEndDir( vtDirEnd) ;
|
||||
m_ptCalcPos = m_ptP5 + dHalfDist * ( vtDirEnd + vtLine1) ;
|
||||
@@ -1131,7 +1133,7 @@ ExtDimension::Update( void) const
|
||||
else {
|
||||
Vector3d vtDirStart ;
|
||||
pCrvPos->GetStartDir( vtDirStart) ;
|
||||
m_ptCalcPos = m_ptP6 + dHalfDist * ( - vtDirStart + vtLine2) ;
|
||||
m_ptCalcPos = ptP5_bis + dHalfDist * ( - vtDirStart + vtLine2) ;
|
||||
}
|
||||
}
|
||||
// dichiaro ricalcolo eseguito
|
||||
@@ -1156,12 +1158,18 @@ ExtDimension::GetMidPoint( Point3d& ptMid) const
|
||||
ptMid = ( m_ptP1 + m_ptP2) / 2;
|
||||
return true ;
|
||||
case DT_ANGULAR :
|
||||
{ PtrOwner<CurveArc> pCrvPos( CreateBasicCurveArc()) ;
|
||||
if ( ! pCrvPos->Set3P( m_ptP6, m_ptPos, m_ptP5, false))
|
||||
return false ;
|
||||
pCrvPos->GetMidPoint( ptMid) ;
|
||||
return true ;
|
||||
}
|
||||
{ // 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 ;
|
||||
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 ;
|
||||
}
|
||||
@@ -1181,7 +1189,7 @@ ExtDimension::GetCenterPoint( Point3d& ptCen) const
|
||||
case DT_RADIAL :
|
||||
case DT_DIAMETRAL :
|
||||
case DT_ANGULAR :
|
||||
ptCen = m_ptP5 ;
|
||||
ptCen = m_ptP6 ;
|
||||
return true ;
|
||||
default :
|
||||
return false ;
|
||||
@@ -1196,153 +1204,154 @@ ExtDimension::ApproxWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST&
|
||||
Update() ;
|
||||
// se quota valida
|
||||
switch ( m_nType) {
|
||||
case DT_LINEAR : {
|
||||
// prima linea di riferimento
|
||||
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.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.emplace_back() ;
|
||||
lstPL.back().AddUPoint(0, m_ptP5) ;
|
||||
lstPL.back().AddUPoint(1, m_ptP6) ;
|
||||
}
|
||||
// altrimenti, linea di misura divisa in due parti
|
||||
else {
|
||||
// prima parte
|
||||
lstPL.emplace_back() ;
|
||||
lstPL.back().AddUPoint(0, m_ptP5) ;
|
||||
lstPL.back().AddUPoint(1, m_ptCalcP7) ;
|
||||
// seconda parte
|
||||
lstPL.emplace_back() ;
|
||||
lstPL.back().AddUPoint(0, m_ptP6) ;
|
||||
lstPL.back().AddUPoint(1, m_ptCalcP8) ;
|
||||
}
|
||||
// frecce
|
||||
lstPL.emplace_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()) ;
|
||||
// testo
|
||||
POLYLINELIST lstTxt;
|
||||
if ( ApproxTextWithLines(dLinTol, dAngTolDeg, lstTxt))
|
||||
lstPL.splice(lstPL.end(), lstTxt) ;
|
||||
return true ;
|
||||
lstPL.back().AddUPoint( 0, m_ptP5) ;
|
||||
lstPL.back().AddUPoint( 1, m_ptP6) ;
|
||||
}
|
||||
case DT_RADIAL :
|
||||
case DT_DIAMETRAL : {
|
||||
Vector3d vtRad = m_ptPos - m_ptP5 ;
|
||||
vtRad.Normalize() ;
|
||||
// prima linea di riferimento
|
||||
// altrimenti, linea di misura divisa in due parti
|
||||
else {
|
||||
// prima parte
|
||||
lstPL.emplace_back() ;
|
||||
lstPL.back().AddUPoint(0, m_ptP1) ;
|
||||
lstPL.back().AddUPoint(1, m_ptP2) ;
|
||||
// freccia
|
||||
lstPL.back().AddUPoint( 0, m_ptP5) ;
|
||||
lstPL.back().AddUPoint( 1, m_ptCalcP7) ;
|
||||
// seconda parte
|
||||
lstPL.emplace_back() ;
|
||||
GetArrowHead(m_ptP6, ( m_bCalcArrowIn ? vtRad : - vtRad), lstPL.back()) ;
|
||||
Point3d ptArrowTail ;
|
||||
if ( ! m_bCalcArrowIn) {
|
||||
lstPL.emplace_back() ;
|
||||
ptArrowTail = m_ptP6 + vtRad * m_dArrowLen * 2 ;
|
||||
lstPL.back().AddUPoint(0, m_ptP6) ;
|
||||
lstPL.back().AddUPoint(1, ptArrowTail) ;
|
||||
}
|
||||
if ( m_nType == DT_DIAMETRAL) {
|
||||
lstPL.emplace_back() ;
|
||||
GetArrowHead(m_ptP5, ( m_bCalcArrowIn ? - vtRad : vtRad), lstPL.back()) ;
|
||||
if ( ! m_bCalcArrowIn) {
|
||||
lstPL.emplace_back() ;
|
||||
ptArrowTail = m_ptP5 - vtRad * m_dArrowLen * 2 ;
|
||||
lstPL.back().AddUPoint(0, m_ptP5) ;
|
||||
lstPL.back().AddUPoint(1, ptArrowTail) ;
|
||||
}
|
||||
}
|
||||
// testo
|
||||
POLYLINELIST lstTxt;
|
||||
if ( ApproxTextWithLines(dLinTol, dAngTolDeg, lstTxt))
|
||||
lstPL.splice(lstPL.end(), lstTxt) ;
|
||||
return true ;
|
||||
lstPL.back().AddUPoint( 0, m_ptP6) ;
|
||||
lstPL.back().AddUPoint( 1, m_ptCalcP8) ;
|
||||
}
|
||||
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) ;
|
||||
lstPL.back().AddUPoint( 1, m_ptP3) ;
|
||||
// seconda linea di riferimento
|
||||
// frecce
|
||||
lstPL.emplace_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()) ;
|
||||
// testo
|
||||
POLYLINELIST lstTxt;
|
||||
if ( ApproxTextWithLines( dLinTol, dAngTolDeg, lstTxt))
|
||||
lstPL.splice( lstPL.end(), lstTxt) ;
|
||||
return true ;
|
||||
}
|
||||
case DT_RADIAL :
|
||||
case DT_DIAMETRAL : {
|
||||
// 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 ;
|
||||
vtRad.Normalize() ;
|
||||
GetArrowHead( m_ptP2, ( m_bCalcArrowIn ? vtRad : - vtRad), lstPL.back()) ;
|
||||
if ( ! m_bCalcArrowIn) {
|
||||
lstPL.emplace_back() ;
|
||||
Point3d ptArrowTail = m_ptP2 + vtRad * m_dArrowLen * 2 ;
|
||||
lstPL.back().AddUPoint( 0, m_ptP2) ;
|
||||
lstPL.back().AddUPoint( 1, m_ptP4) ;
|
||||
// curva per l'arco
|
||||
PtrOwner<CurveArc> pCrvPos( CreateBasicCurveArc()) ;
|
||||
if ( IsNull( pCrvPos))
|
||||
return false ;
|
||||
//double dHalfDist = GetTextHalfDist( m_ptCalcPos) ;
|
||||
|
||||
// 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_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_ptP5, m_ptP6, m_ptCalcP8, m_vtN) || ! pCrvPos->ApproxWithLines(dLinTol, dAngTolDeg, ICurve::APL_STD, plApprox))
|
||||
return false ;
|
||||
lstPL.emplace_back( plApprox) ;
|
||||
}
|
||||
// frecce
|
||||
Vector3d vtStartDir ;
|
||||
Vector3d vtEndDir ;
|
||||
if ( ! pCrvPos->Set3P( m_ptP6, m_ptPos, m_ptP5, false))
|
||||
return false ;
|
||||
pCrvPos->GetStartDir( vtStartDir) ;
|
||||
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
|
||||
lstPL.back().AddUPoint( 1, ptArrowTail) ;
|
||||
}
|
||||
if ( m_nType == DT_DIAMETRAL) {
|
||||
lstPL.emplace_back() ;
|
||||
GetArrowHead( m_ptP5, ( m_bCalcArrowIn ? - vtRad : vtRad), lstPL.back()) ;
|
||||
if ( ! m_bCalcArrowIn) {
|
||||
Point3d ptArrowTail1, ptArrowTail2 ;
|
||||
ptArrowTail1 = m_ptP5 + vtEndDir * m_dArrowLen *2 ;
|
||||
lstPL.emplace_back() ;
|
||||
Point3d ptArrowTail = m_ptP5 - vtRad * m_dArrowLen * 2 ;
|
||||
lstPL.back().AddUPoint( 0, m_ptP5) ;
|
||||
lstPL.back().AddUPoint( 1, ptArrowTail1) ;
|
||||
ptArrowTail2 = m_ptP6 - vtStartDir * m_dArrowLen *2 ;
|
||||
lstPL.emplace_back() ;
|
||||
lstPL.back().AddUPoint( 0, m_ptP6) ;
|
||||
lstPL.back().AddUPoint( 1, ptArrowTail2) ;
|
||||
dFactor = 0 ;
|
||||
lstPL.back().AddUPoint( 1, ptArrowTail) ;
|
||||
}
|
||||
lstPL.emplace_back() ;
|
||||
GetArrowHead( m_ptP5, ( m_bCalcArrowIn ? vtEndDir : - vtEndDir) + vtLine1 * dFactor, lstPL.back()) ;
|
||||
lstPL.emplace_back() ;
|
||||
GetArrowHead( m_ptP6, ( m_bCalcArrowIn ? - vtStartDir : vtStartDir) + vtLine2 * dFactor, lstPL.back()) ;
|
||||
// testo
|
||||
POLYLINELIST lstTxt ;
|
||||
if ( ApproxTextWithLines( dLinTol, dAngTolDeg, lstTxt))
|
||||
lstPL.splice( lstPL.end(), lstTxt) ;
|
||||
return true ;
|
||||
}
|
||||
default:
|
||||
// testo
|
||||
POLYLINELIST lstTxt;
|
||||
if ( ApproxTextWithLines( dLinTol, dAngTolDeg, lstTxt))
|
||||
lstPL.splice( lstPL.end(), lstTxt) ;
|
||||
return true ;
|
||||
}
|
||||
case DT_ANGULAR : {
|
||||
// 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) ;
|
||||
// curva per l'arco
|
||||
PtrOwner<CurveArc> pCrvPos( CreateBasicCurveArc()) ;
|
||||
if ( IsNull( pCrvPos))
|
||||
return false ;
|
||||
// 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 ;
|
||||
// approssimerò l'arco con una polyline
|
||||
PolyLine plApprox ;
|
||||
double dLinTol = 0.01 ;
|
||||
double dAngTolDeg = 0.01 ;
|
||||
// se non ho testo
|
||||
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))
|
||||
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))
|
||||
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))
|
||||
return false ;
|
||||
lstPL.emplace_back( plApprox) ;
|
||||
}
|
||||
// frecce
|
||||
if ( ! pCrvPos->Set3P( ptP5_bis, m_ptPos, m_ptP5, false))
|
||||
return false ;
|
||||
Vector3d vtStartDir ;
|
||||
Vector3d vtEndDir ;
|
||||
pCrvPos->GetStartDir( vtStartDir) ;
|
||||
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
|
||||
// se però le frecce sono fuori non le storto e faccio le code dritte anziché curvilinee
|
||||
if ( ! m_bCalcArrowIn) {
|
||||
Point3d ptArrowTail1, ptArrowTail2 ;
|
||||
ptArrowTail1 = m_ptP5 + vtEndDir * m_dArrowLen *2 ;
|
||||
lstPL.emplace_back() ;
|
||||
lstPL.back().AddUPoint( 0, m_ptP5) ;
|
||||
lstPL.back().AddUPoint( 1, ptArrowTail1) ;
|
||||
ptArrowTail2 = ptP5_bis - vtStartDir * m_dArrowLen *2 ;
|
||||
lstPL.emplace_back() ;
|
||||
lstPL.back().AddUPoint( 0, ptP5_bis) ;
|
||||
lstPL.back().AddUPoint( 1, ptArrowTail2) ;
|
||||
dFactor = 0 ;
|
||||
}
|
||||
lstPL.emplace_back() ;
|
||||
Vector3d vtLine1 = m_ptP1 - m_ptP6 ;
|
||||
if ( ! vtLine1.Normalize())
|
||||
return false ;
|
||||
GetArrowHead( m_ptP5, ( m_bCalcArrowIn ? vtEndDir : - vtEndDir) + vtLine1 * dFactor, lstPL.back()) ;
|
||||
lstPL.emplace_back() ;
|
||||
GetArrowHead( ptP5_bis, ( m_bCalcArrowIn ? - vtStartDir : vtStartDir) + vtLine2 * dFactor, lstPL.back()) ;
|
||||
// testo
|
||||
POLYLINELIST lstTxt ;
|
||||
if ( ApproxTextWithLines( dLinTol, dAngTolDeg, lstTxt))
|
||||
lstPL.splice( lstPL.end(), lstTxt) ;
|
||||
return true ;
|
||||
}
|
||||
default:
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@@ -1420,12 +1429,11 @@ 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) {
|
||||
double dAngDeg = 0 ;
|
||||
Vector3d vtRad = m_ptPos - m_ptP5 ;
|
||||
m_vtDir.GetAngle( vtRad, dAngDeg) ;
|
||||
if ( ! frRef.Set( m_ptCalcPos, m_vtN, ( dAngDeg > 90 ? - vtRad : vtRad)))
|
||||
m_vtDir.GetAngle( frRef.VersX(), dAngDeg) ;
|
||||
if ( ! frRef.Set( m_ptCalcPos, m_vtN, ( dAngDeg > 90 ? - m_vtDir : m_vtDir)))
|
||||
return false ;
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -71,7 +71,7 @@ class ExtDimension : public IExtDimension, public IGeoObjRW
|
||||
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,
|
||||
bool SetAngular( const Point3d& ptP1, const Point3d& ptV, const Point3d& ptP2, const Point3d& ptPos,
|
||||
const Vector3d& vtN, const std::string& sText) override ;
|
||||
const Vector3d& GetNormVersor( void) const override
|
||||
{ return m_vtN ; }
|
||||
@@ -145,7 +145,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
|
||||
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
|
||||
@@ -162,7 +162,7 @@ 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
|
||||
double m_dTempParam[2] ; // vettore parametri temporanei
|
||||
} ;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user