EgtGeomKernel 1.5f1 :

- aggiunta entità testo (con font Nfe e di sistema)
- in tutte le rotate ora l'angolo è in gradi
- aggiunta trasformazione Shear (scorrimento)
- aggiunta trsformazione LocToLoc
- Set/GetInfo specializzate per i diversi tipi di informazioni
- Copy e Relocate con possibilità di indicare l'entità di riferimento rispetto a cui inserire
- aggiunte trasformazioni a PolyLine.
This commit is contained in:
Dario Sassi
2014-06-03 13:19:54 +00:00
parent a52d73aa7a
commit 41a38fef3b
44 changed files with 3257 additions and 248 deletions
+301 -10
View File
@@ -31,6 +31,7 @@
#include "/EgtDev/Include/EgkCurveComposite.h"
#include "/EgtDev/Include/EgkDistPointCurve.h"
#include "/EgtDev/Include/EgkSurfTriMesh.h"
#include "/EgtDev/Include/EgkExtText.h"
#include "/EgtDev/Include/EgtPointerOwner.h"
#include "/EgtDev/Include/EGkStmFromTriangleSoup.h"
@@ -73,6 +74,7 @@ GdbExecutor::GdbExecutor( void)
m_ExecMgr.Insert( "CURVECOMPO", &GdbExecutor::ExecuteCurveCompo) ;
m_ExecMgr.Insert( "STM", &GdbExecutor::ExecuteSurfTriMesh) ;
m_ExecMgr.Insert( "SURFTRIMESH", &GdbExecutor::ExecuteSurfTriMesh) ;
m_ExecMgr.Insert( "TEXT", &GdbExecutor::ExecuteText) ;
m_ExecMgr.Insert( "LEV", &GdbExecutor::ExecuteLevel) ;
m_ExecMgr.Insert( "LEVEL", &GdbExecutor::ExecuteLevel) ;
m_ExecMgr.Insert( "MOD", &GdbExecutor::ExecuteMode) ;
@@ -103,6 +105,7 @@ GdbExecutor::GdbExecutor( void)
m_ExecMgr.Insert( "SCALE", &GdbExecutor::ExecuteScale) ;
m_ExecMgr.Insert( "MIR", &GdbExecutor::ExecuteMirror) ;
m_ExecMgr.Insert( "MIRROR", &GdbExecutor::ExecuteMirror) ;
m_ExecMgr.Insert( "SHEAR", &GdbExecutor::ExecuteShear) ;
m_ExecMgr.Insert( "INVC", &GdbExecutor::ExecuteInvertCurve) ;
m_ExecMgr.Insert( "INVERTCURVE", &GdbExecutor::ExecuteInvertCurve) ;
m_ExecMgr.Insert( "INVS", &GdbExecutor::ExecuteInvertSurf) ;
@@ -1904,6 +1907,186 @@ GdbExecutor::SurfTriMeshDoSewing( const STRVECTOR& vsParams)
return true ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::ExecuteText( const string& sCmd2, const STRVECTOR& vsParams)
{
// testo nel piano locale
if ( sCmd2 == "XY" || sCmd2 == "PLANEXY") {
if ( vsParams.size() == 6)
return TextSimple( vsParams) ;
else
return TextComplete( vsParams) ;
}
// flip del testo
else if ( sCmd2 == "FLIP") {
return TextFlip( vsParams) ;
}
// auto-mirror del testo
else if ( sCmd2 == "MIR") {
return TextMir( vsParams) ;
}
// estrazione dei contorni
else if ( sCmd2 == "OUTLINE")
return TextOutline( vsParams) ;
else
return false ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::TextSimple( const STRVECTOR& vsParams)
{
// parametri : Id, ParentId, Text, Point, AngDeg, H
if ( vsParams.size() != 6)
return false ;
// recupero il riferimento in cui è immerso
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
return false ;
// recupero il punto di inserimento
Point3d ptP ;
if ( ! GetPointParam( vsParams[3], frRef, ptP))
return false ;
// recupero l'angolo di rotazione
double dAngRotDeg ;
if ( ! FromString( vsParams[4], dAngRotDeg))
return false ;
// recupero l'altezza del carattere
double dH ;
if ( ! FromString( vsParams[5], dH))
return false ;
// creo il testo
PtrOwner<IExtText> pTXT( CreateExtText()) ;
if ( ! IsValid( pTXT))
return false ;
// lo riempio
if ( ! pTXT->Set( vsParams[2], ptP, dAngRotDeg, dH))
return false ;
// inserisco il testo nel DB
return AddGeoObj( vsParams[0], vsParams[1], Release( pTXT)) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::TextComplete( const STRVECTOR& vsParams)
{
// parametri : Id, ParentId, Text, Point, AngDeg, Font, W, Italic, H, Rat, AddAdv
if ( vsParams.size() != 11)
return false ;
// recupero il riferimento in cui è immerso
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
return false ;
// recupero il punto di inserimento
Point3d ptP ;
if ( ! GetPointParam( vsParams[3], frRef, ptP))
return false ;
// recupero l'angolo di rotazione
double dAngRotDeg ;
if ( ! FromString( vsParams[4], dAngRotDeg))
return false ;
// font
// recupero il peso (larghezza del filamento)
int nW ;
if ( ! FromString( vsParams[6], nW))
return false ;
// recupero il flag di italico
bool bItl = ( vsParams[7] == "I" || vsParams[7] == "i") ;
// recupero l'altezza del carattere
double dH ;
if ( ! FromString( vsParams[8], dH))
return false ;
// rapporto larghezza/altezza del carattere
double dRat ;
if ( ! FromString( vsParams[9], dRat))
return false ;
// avanzamento aggiuntivo
double dAddAdv ;
if ( ! FromString( vsParams[10], dAddAdv))
return false ;
// creo il testo
PtrOwner<IExtText> pTXT( CreateExtText()) ;
if ( ! IsValid( pTXT))
return false ;
// lo riempio
if ( ! pTXT->Set( vsParams[2], ptP, dAngRotDeg, vsParams[5], nW, bItl, dH, dRat, dAddAdv))
return false ;
// inserisco il testo nel DB
return AddGeoObj( vsParams[0], vsParams[1], Release( pTXT)) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::TextFlip( const STRVECTOR& vsParams)
{
// 1 parametro : Id
if ( vsParams.size() != 1)
return false ;
// recupero il testo
IExtText* pTXT = GetExtText( m_pGDB->GetGeoObj( GetIdParam( vsParams[0]))) ;
if ( pTXT == nullptr)
return false ;
// eseguo l'operazione
return pTXT->Flip() ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::TextMir( const STRVECTOR& vsParams)
{
// 1 o 2 parametri : Id [, LorH]
if ( vsParams.size() != 1 && vsParams.size() != 2)
return false ;
// calcolo il flag
bool bOnL = true ;
if ( vsParams.size() == 2)
bOnL = ( vsParams[1] != "H" && vsParams[1] != "h") ;
// recupero il testo
IExtText* pTXT = GetExtText( m_pGDB->GetGeoObj( GetIdParam( vsParams[0]))) ;
if ( pTXT == nullptr)
return false ;
// eseguo l'operazione
return pTXT->Mir( bOnL) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::TextOutline( const STRVECTOR& vsParams)
{
// 2 parametri : Id , IdDest
if ( vsParams.size() != 2)
return false ;
// recupero il testo
int nIdTXT = GetIdParam( vsParams[0]) ;
IExtText* pTXT = GetExtText( m_pGDB->GetGeoObj( nIdTXT)) ;
if ( pTXT == nullptr)
return false ;
// recupero il suo outline
ICURVEPLIST lstPCRV ;
pTXT->GetOutline( lstPCRV) ;
// recupero il riferimento del testo
Frame3d frTXT ;
if ( ! m_pGDB->GetGlobFrame( nIdTXT, frTXT))
return false ;
// recupero il riferimento del gruppo destinazione
int nIdDest = GetIdParam( vsParams[1]) ;
Frame3d frDest ;
if ( ! m_pGDB->GetGroupGlobFrame( nIdDest, frDest))
return false ;
// inserisco le curve nel gruppo destinazione dopo aver sistemato il cambio di riferimento
bool bOk = true ;
ICURVEPLIST::iterator iIter ;
for ( iIter = lstPCRV.begin() ; iIter != lstPCRV.end() ; ++ iIter) {
(*iIter)->LocToLoc( frTXT, frDest) ;
if ( ! m_pGDB->AddGeoObj( GDB_ID_NULL, nIdDest, (*iIter))) {
delete (*iIter) ;
bOk = false ;
}
}
return bOk ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::AddGeoObj( const string& sId, const string& sIdParent, IGeoObj* pGeoObj)
@@ -2257,8 +2440,29 @@ GdbExecutor::GetPointParam( const string& sParam, const Frame3d& frPnt, Point3d&
case 'O' : // origine
ptP = pGF->GetFrame().Orig() ;
return ptP.LocToLoc( frEnt, frPnt) ;
default :
return false ;
}
}
// se testo
else if ( pGObj->GetType() == EXT_TEXT) {
// recupero il testo
const IExtText* pTxt = GetExtText( pGObj) ;
switch ( cType) {
case 'S' : // punto iniziale
if ( ! pTxt->GetStartPoint( ptP))
return false ;
return ptP.LocToLoc( frEnt, frPnt) ;
case 'E' : // punto finale
if ( ! pTxt->GetEndPoint( ptP))
return false ;
return ptP.LocToLoc( frEnt, frPnt) ;
case 'M' : // punto medio
if ( ! pTxt->GetMidPoint( ptP))
return false ;
return ptP.LocToLoc( frEnt, frPnt) ;
case 'C' : // centro
if ( ! pTxt->GetCenterPoint( ptP))
return false ;
return ptP.LocToLoc( frEnt, frPnt) ;
}
}
}
@@ -3109,18 +3313,28 @@ GdbExecutor::ExecuteMatLibrary( const string& sCmd2, const STRVECTOR& vsParams)
bool
GdbExecutor::ExecuteCopy( const string& sCmd2, const STRVECTOR& vsParams)
{
// 3 parametri ( IdSou, IdDest, ParentIdDest)
if ( vsParams.size() != 3)
// 3 o 4 parametri : IdSou, IdDest, RefIdDest [, SonBeforeAfter]
if ( vsParams.size() != 3 && vsParams.size() != 4)
return false ;
// recupero tipo di inserimento della copia
int nSonBeforeAfter = GDB_SON ;
if ( vsParams.size() == 4) {
string sFlag = vsParams[3] ;
ToUpper( sFlag) ;
if ( sFlag == "BEFORE")
nSonBeforeAfter = GDB_BEFORE ;
else if ( sFlag == "AFTER")
nSonBeforeAfter = GDB_AFTER ;
}
// recupero flag per globale
bool bGlob = ( sCmd2 == "GLOB" || sCmd2 == "G") ;
// esecuzione copia
int nIdDest = GetIdParam( vsParams[1], true) ;
int nIdNew ;
if ( bGlob)
nIdNew = m_pGDB->CopyGlob( GetIdParam( vsParams[0]), nIdDest, GetIdParam( vsParams[2])) ;
nIdNew = m_pGDB->CopyGlob( GetIdParam( vsParams[0]), nIdDest, GetIdParam( vsParams[2]), nSonBeforeAfter) ;
else
nIdNew = m_pGDB->Copy( GetIdParam( vsParams[0]), nIdDest, GetIdParam( vsParams[2])) ;
nIdNew = m_pGDB->Copy( GetIdParam( vsParams[0]), nIdDest, GetIdParam( vsParams[2]), nSonBeforeAfter) ;
// se IdDest da calcolare, può essere una variabili a cui cambiare il valore
if ( nIdDest == GDB_ID_NULL)
m_pParser->SetVariable( vsParams[1], nIdNew) ;
@@ -3132,24 +3346,34 @@ GdbExecutor::ExecuteCopy( const string& sCmd2, const STRVECTOR& vsParams)
bool
GdbExecutor::ExecuteRelocate( const string& sCmd2, const STRVECTOR& vsParams)
{
// 2 parametri ( Id, NewParentId)
if ( vsParams.size() != 2)
// 2 o 3 parametri : Id, NewRefId [, SonBeforeAfter]
if ( vsParams.size() != 2 && vsParams.size() != 3)
return false ;
// recupero lista nomi
INTVECTOR vnNames ;
if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
// recupero tipo di inserimento
int nSonBeforeAfter = GDB_SON ;
if ( vsParams.size() == 3) {
string sFlag = vsParams[2] ;
ToUpper( sFlag) ;
if ( sFlag == "BEFORE")
nSonBeforeAfter = GDB_BEFORE ;
else if ( sFlag == "AFTER")
nSonBeforeAfter = GDB_AFTER ;
}
// recupero flag per globale
bool bGlob = ( sCmd2 == "GLOB" || sCmd2 == "G") ;
// esecuzione rilocazioni
INTVECTOR::iterator Iter ;
for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
if ( bGlob) {
if ( ! m_pGDB->RelocateGlob( *Iter, GetIdParam( vsParams[1])))
if ( ! m_pGDB->RelocateGlob( *Iter, GetIdParam( vsParams[1]), nSonBeforeAfter))
return false ;
}
else {
if ( ! m_pGDB->Relocate( *Iter, GetIdParam( vsParams[1])))
if ( ! m_pGDB->Relocate( *Iter, GetIdParam( vsParams[1]), nSonBeforeAfter))
return false ;
}
}
@@ -3426,6 +3650,73 @@ GdbExecutor::ExecuteMirror( const string& sCmd2, const STRVECTOR& vsParams)
return true ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::ExecuteShear( const string& sCmd2, const STRVECTOR& vsParams)
{
// 5 parametri ( Nome, Punto, VettNorm, VettDir, Coeff)
if ( vsParams.size() != 5)
return false ;
// recupero lista nomi
INTVECTOR vnNames ;
if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
// recupero flag e riferimento per globale/gruppo/locale
enum { MIR_LOC = 0, MIR_GLOB = 1, MIR_GROUP = 2} ;
int nMirType ;
Frame3d frRef ;
if ( sCmd2 == "GLOB" || sCmd2 == "G") {
nMirType = MIR_GLOB ;
frRef = GLOB_FRM ;
}
else if ( sCmd2 == "GROUP" || sCmd2 == "GR") {
nMirType = MIR_GROUP ;
if ( ! m_pGDB->GetGroupGlobFrame( vnNames[0], frRef))
return false ;
}
else {
nMirType = MIR_LOC ;
if ( ! m_pGDB->GetGlobFrame( vnNames[0], frRef))
return false ;
}
// recupero il punto
Point3d ptPC ;
if ( ! GetPointParam( vsParams[1], frRef, ptPC))
return false ;
// recupero il versore normale
Vector3d vtNorm ;
if ( ! GetVectorParam( vsParams[2], frRef, vtNorm))
return false ;
// recupero il versore direzione
Vector3d vtDir ;
if ( ! GetVectorParam( vsParams[3], frRef, vtDir))
return false ;
// recupero il coefficiente
double dCoeff ;
if ( ! FromString( vsParams[4], dCoeff))
return false ;
// esecuzione scorrimenti
INTVECTOR::iterator Iter ;
for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
switch ( nMirType) {
case MIR_LOC :
if ( ! m_pGDB->Shear( *Iter, ptPC, vtNorm, vtDir, dCoeff))
return false ;
break ;
case MIR_GLOB :
if ( ! m_pGDB->ShearGlob( *Iter, ptPC, vtNorm, vtDir, dCoeff))
return false ;
break ;
case MIR_GROUP :
if ( ! m_pGDB->ShearGroup( *Iter, ptPC, vtNorm, vtDir, dCoeff))
return false ;
break ;
}
}
return true ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::ExecuteInvertCurve( const string& sCmd2, const STRVECTOR& vsParams)