//---------------------------------------------------------------------------- // EgalTech 2015-2016 //---------------------------------------------------------------------------- // File : EXE_ModifyVol.cpp Data : 27.10.16 Versione : 1.6v7 // Contenuto : Funzioni di modifica dei solidi per EXE. // // // // Modifiche : 27.10.16 DS Creazione modulo. // // //---------------------------------------------------------------------------- //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "EXE.h" #include "EXE_Macro.h" #include "AuxTools.h" #include "GeoTools.h" #include "/EgtDev/Include/EXeExecutor.h" #include "/EgtDev/Include/EXeConst.h" #include "/EgtDev/Include/EGkVolZmap.h" #include "/EgtDev/Include/EGkStringUtils3d.h" using namespace std ; //------------------------------------------------------------------------------- static int MyExplodeVolZmap( int nId, int* pnCount) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero il solido VolZmap const IVolZmap* pVZM = GetVolZmap( pGeomDB->GetGeoObj( nId)) ; if ( pVZM == nullptr) return GDB_ID_NULL ; // recupero il numero di parti connesse int nPart = pVZM->GetPartCount() ; // se c'è una sola parte o non definibile, non devo fare alcunché if ( nPart == 1 || nPart == - 1) { if ( pnCount != nullptr) *pnCount = 1 ; return nId ; } // copio tutti i componenti connessi (parti) int nFirstId = GDB_ID_NULL ; int nCount = 0 ; for ( int i = 0 ; i < nPart ; ++ i) { IVolZmap* pPrt = pVZM->ClonePart( i) ; if ( pPrt == nullptr) continue ; // inserisco il solido nello stesso gruppo e nello stesso posto del GeomDB int nNewId = pGeomDB->InsertGeoObj( GDB_ID_NULL, nId, GDB_BEFORE, pPrt) ; if ( nNewId == GDB_ID_NULL) return GDB_ID_NULL ; // copio gli attributi if ( ! pGeomDB->CopyAttributes( nId, nNewId)) return GDB_ID_NULL ; // aggiorno contatori if ( nFirstId == GDB_ID_NULL) nFirstId = nNewId ; ++ nCount ; } // elimino il solido originale pGeomDB->Erase( nId) ; // restituisco risultati if ( pnCount != nullptr) *pnCount = nCount ; return nFirstId ; } //------------------------------------------------------------------------------- int ExeExplodeVolume( int nId, int* pnCount) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero il tipo di solido int nFirstId = GDB_ID_NULL ; int nCount = 0 ; switch ( pGeomDB->GetGeoType( nId)) { case VOL_ZMAP : nFirstId = MyExplodeVolZmap( nId, &nCount) ; break ; } ExeSetModified() ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtExplodeVolume(" + ToString( nId) + ")" + " -- Id1=" + ToString( nFirstId) + ",Nbr=" + ToString( nCount) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultati if ( pnCount != nullptr) *pnCount = nCount ; return nFirstId ; } //----------------------------------------------------------------------------- bool ExeVolZmapChangeResolution( int nId, int nNewRes) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, false) // recupero lo Zmap IVolZmap* pVZM = GetVolZmap( pGeomDB->GetGeoObj( nId)) ; bool bOk = ( pVZM != nullptr) ; // cambio la risoluzione (rapporto Voxel/Dexel, valori ammessi 1 e 2) bOk = bOk && pVZM->ChangeResolution( nNewRes) ; ExeSetModified() ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtVolZmapChangeResolution(" + ToString( nId) + "," + ToString( nNewRes) + ")" + " -- Ok=" + ToString( bOk) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultato return bOk ; } //---------------------------------------------------------------------------- bool ExeVolZmapSetShowEdges( int nId, bool bShow) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, false) // recupero lo Zmap IVolZmap* pVZM = GetVolZmap( pGeomDB->GetGeoObj( nId)) ; bool bOk = ( pVZM != nullptr) ; // imposto lo stato di visualizzazione degli spigoli vivi if ( bOk) pVZM->SetShowEdges( bShow) ; ExeSetModified() ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtVolZmapSetShowEdges(" + ToString( nId) + "," + ToString( bShow) + ")" + " -- Ok=" + ToString( bOk) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } return bOk ; } //------------------------------------------------------------------------------- bool ExeRemoveVolZmapPart( int nId, int nPart) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, false) // recupero lo Zmap e rimuovo la parte indicata IVolZmap* pVZM = GetVolZmap( pGeomDB->GetGeoObj( nId)) ; bool bOk = ( pVZM != nullptr && pVZM->RemovePart( nPart)) ; ExeSetModified() ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtRemoveVolZmapPart(" + ToString( nId) + "," + ToString( nPart) + ")" + " -- Ok=" + ToString( bOk) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultato return bOk ; } //---------------------------------------------------------------------------- bool ExeVolZmapSetStdTool( const INTVECTOR& vIds, const string& sToolName, double dLen, double dDiam, double dCornR, double dCutterH, int nFlag, bool bFirst) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, false) // recupero gli Zmap e assegno i dati dell'utensile bool bOk = true ; for ( int i = 0 ; i < int( vIds.size()) ; ++ i) { IVolZmap* pVZM = GetVolZmap( pGeomDB->GetGeoObj( vIds[i])) ; bOk = ( pVZM != nullptr && pVZM->SetStdTool( sToolName, dLen, 0.5 * dDiam, dCornR, dCutterH, nFlag, bFirst)) && bOk ; } // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtVolZmapSetStdTool({" + IdListToString( vIds) + "}," + sToolName + "," + ToString( dLen) + "," + ToString( dDiam) + "," + ToString( dCornR) + "," + ToString( dCutterH) + "," + ToString( nFlag) + ")" + " -- Ok=" + ToString( bOk) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultato return bOk ; } //---------------------------------------------------------------------------- bool ExeVolZmapSetAdvTool( const INTVECTOR& vIds, const string& sToolName, double dLen, double dDiam, double dTipLen, double dTipDiam, double dCornR, double dCutterH, int nFlag, bool bFirst) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, false) // recupero gli Zmap e assegno i dati dell'utensile bool bOk = true ; for ( int i = 0 ; i < int( vIds.size()) ; ++ i) { IVolZmap* pVZM = GetVolZmap( pGeomDB->GetGeoObj( vIds[i])) ; bOk = ( pVZM != nullptr && pVZM->SetAdvTool( sToolName, dLen, dDiam / 2, dTipLen, dTipDiam / 2, dCornR, dCutterH, nFlag, bFirst)) && bOk ; } // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtVolZmapSetAdvTool({" + IdListToString( vIds) + "}," + sToolName + "," + ToString( dLen) + "," + ToString( dDiam) + "," + ToString( dTipLen) + "," + ToString( dTipDiam) + "," + ToString( dCornR) + "," + ToString( dCutterH) + "," + ToString( nFlag) + ")" + " -- Ok=" + ToString( bOk) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultato return bOk ; } //---------------------------------------------------------------------------- bool ExeVolZmapSetSawTool( const INTVECTOR& vIds, const string& sToolName, double dLen, double dDiam, double dThick, double dStemDiam, double dCornR, int nFlag, bool bFirst) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, false) // recupero gli Zmap e assegno i dati dell'utensile bool bOk = true ; for ( int i = 0 ; i < int( vIds.size()) ; ++ i) { IVolZmap* pVZM = GetVolZmap( pGeomDB->GetGeoObj( vIds[i])) ; bOk = ( pVZM != nullptr && pVZM->SetSawTool( sToolName, dLen, dDiam / 2, dThick, dStemDiam / 2, dCornR, nFlag, bFirst)) && bOk ; } // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtVolZmapSetSawTool({" + IdListToString( vIds) + "}," + sToolName + "," + ToString( dLen) + "," + ToString( dDiam) + "," + ToString( dThick) + "," + ToString( dStemDiam) + "," + ToString( dCornR) + "," + ToString( nFlag) + ")" + " -- Ok=" + ToString( bOk) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultato return bOk ; } //---------------------------------------------------------------------------- bool ExeVolZmapSetGenTool( const INTVECTOR& vIds, const string& sToolName, int nToolSectId, int nFlag, bool bFirst) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, false) // recupero la sezione dell'utensile const ICurveComposite* pCC = GetCurveComposite( pGeomDB->GetGeoObj( nToolSectId)) ; bool bOk = ( pCC != nullptr) ; // recupero gli Zmap e assegno i dati dell'utensile for ( int i = 0 ; i < int( vIds.size()) ; ++ i) { IVolZmap* pVZM = GetVolZmap( pGeomDB->GetGeoObj( vIds[i])) ; bOk = ( pVZM != nullptr && pVZM->SetGenTool( sToolName, pCC, nFlag, bFirst) && bOk) ; } // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtVolZmapSetGenTool({" + IdListToString( vIds) + "}," + sToolName + "," + IdToString( nToolSectId) + "," + ToString( nFlag) + ")" + " -- Ok=" + ToString( bOk) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultato return bOk ; } //---------------------------------------------------------------------------- bool ExeVolZmapSetMortiserTool( const INTVECTOR& vIds, const string& sToolName, double dLen, double dWidth, double dThick, double dCornR, int nFlag, bool bFirst) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, false) // recupero gli Zmap e assegno i dati dell'utensile bool bOk = true ; for ( int i = 0 ; i < int( vIds.size()) ; ++ i) { IVolZmap* pVZM = GetVolZmap( pGeomDB->GetGeoObj( vIds[i])) ; bOk = ( pVZM != nullptr && pVZM->SetMortiserTool( sToolName, dLen, dWidth, dThick, dCornR, nFlag, bFirst) && bOk) ; } // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtVolZmapSetMortiserTool({" + IdListToString( vIds) + "}," + sToolName + "," + ToString( dLen) + "," + ToString( dWidth) + "," + ToString( dThick) + "," + ToString( dCornR) + "," + ToString( nFlag) + ")" + " -- Ok=" + ToString( bOk) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultato return bOk ; } //---------------------------------------------------------------------------- bool ExeVolZmapSetChiselTool( const INTVECTOR& vIds, const string& sToolName, double dLen, double dWidth, double dThick, int nFlag, bool bFirst) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, false) // recupero gli Zmap e assegno i dati dell'utensile bool bOk = true ; for ( int i = 0 ; i < int( vIds.size()) ; ++ i) { IVolZmap* pVZM = GetVolZmap( pGeomDB->GetGeoObj( vIds[i])) ; bOk = ( pVZM != nullptr && pVZM->SetChiselTool( sToolName, dLen, dWidth, dThick, nFlag, bFirst) && bOk) ; } // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtVolZmapSetChiselTool({" + IdListToString( vIds) + "}," + sToolName + "," + ToString( dLen) + "," + ToString( dWidth) + "," + ToString( dThick) + "," + ToString( nFlag) + ")" + " -- Ok=" + ToString( bOk) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultato return bOk ; } //---------------------------------------------------------------------------- bool ExeVolZmapResetTools( const INTVECTOR& vIds) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, false) // recupero gli Zmap e assegno i dati dell'utensile bool bOk = true ; for ( int i = 0 ; i < int( vIds.size()) ; ++ i) { IVolZmap* pVZM = GetVolZmap( pGeomDB->GetGeoObj( vIds[i])) ; bOk = ( pVZM != nullptr && pVZM->ResetTools() && bOk) ; } // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtVolZmapResetTool({" + IdListToString( vIds) + "})" + " -- Ok=" + ToString( bOk) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultato return bOk ; } //---------------------------------------------------------------------------- int MyVolZmapGetToolOutline( int nId, int nDestGrpId, bool bApprox) { // verifico DB geometrico IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero lo Zmap e recupero il profilo dell'utensile IVolZmap* pVZM = GetVolZmap( pGeomDB->GetGeoObj( nId)) ; if ( pVZM == nullptr) return GDB_ID_NULL ; // recupero outline dell'utensile const ICurveComposite& CC = pVZM->GetToolOutline( bApprox) ; if ( ! CC.IsValid()) return GDB_ID_NULL ; // ne faccio una copia PtrOwner pCopy( CC.Clone()) ; if ( IsNull( pCopy)) return GDB_ID_NULL ; // inserisco la copia nel DB geometrico int nNewId = pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pCopy)) ; return nNewId ; } //---------------------------------------------------------------------------- int ExeVolZmapGetToolOutline( int nId, int nDestGrpId, bool bApprox) { int nNewId = MyVolZmapGetToolOutline( nId, nDestGrpId, bApprox) ; if ( nNewId != GDB_ID_NULL) ExeSetModified() ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtVolZmapGetToolOutline(" + IdToString( nId) + "," + IdToString( nDestGrpId) + "," + ( bApprox ? "true" : "false") + ")" + " -- Id=" + IdToString( nNewId) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultato return nNewId ; } //---------------------------------------------------------------------------- bool ExeVolZmapMillingStep( int nId, const Point3d& ptPs, const Vector3d& vtDs, const Point3d& ptPe, const Vector3d& vtDe, int nRefType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, false) // recupero il riferimento locale Frame3d frLoc ; bool bOk = pGeomDB->GetGlobFrame( nId, frLoc) ; // porto in locale i punti e i vettori Point3d ptPsL = GetPointLocal( pGeomDB, ptPs, nRefType, frLoc) ; Vector3d vtDsL = GetVectorLocal( pGeomDB, vtDs, nRefType, frLoc) ; Point3d ptPeL = GetPointLocal( pGeomDB, ptPe, nRefType, frLoc) ; Vector3d vtDeL = GetVectorLocal( pGeomDB, vtDe, nRefType, frLoc) ; // recupero lo Zmap e eseguo movimento di fresatura con l'utensile già associato IVolZmap* pVZM = GetVolZmap( pGeomDB->GetGeoObj( nId)) ; bOk = bOk && ( pVZM != nullptr && pVZM->MillingStep( 0, ptPsL, vtDsL, ptPeL, vtDeL)) ; ExeSetModified() ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtVolZmapMillingStep(" + IdToString( nId) + ",{" + ToString( ptPs) + "},{" + ToString( vtDs) + "},{" + ToString( ptPe) + "},{" + ToString( vtDe) + "}," + RefTypeToString( nRefType) + ")" + " -- Ok=" + ToString( bOk) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultato return bOk ; } //---------------------------------------------------------------------------- bool ExeVolZmapMillingStep( int nId, const Point3d& ptPs, const Vector3d& vtDs, const Vector3d& vtAs, const Point3d& ptPe, const Vector3d& vtDe, const Vector3d& vtAe, int nRefType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, false) // recupero il riferimento locale Frame3d frLoc ; bool bOk = pGeomDB->GetGlobFrame( nId, frLoc) ; // porto in locale i punti e i vettori Point3d ptPsL = GetPointLocal( pGeomDB, ptPs, nRefType, frLoc) ; Vector3d vtDsL = GetVectorLocal( pGeomDB, vtDs, nRefType, frLoc) ; Vector3d vtAsL = GetVectorLocal( pGeomDB, vtAs, nRefType, frLoc) ; Point3d ptPeL = GetPointLocal( pGeomDB, ptPe, nRefType, frLoc) ; Vector3d vtDeL = GetVectorLocal( pGeomDB, vtDe, nRefType, frLoc) ; Vector3d vtAeL = GetVectorLocal( pGeomDB, vtAe, nRefType, frLoc) ; // recupero lo Zmap e eseguo movimento di fresatura con l'utensile già associato IVolZmap* pVZM = GetVolZmap( pGeomDB->GetGeoObj( nId)) ; bOk = bOk && ( pVZM != nullptr && pVZM->MillingStep( 0, ptPsL, vtDsL, vtAsL, ptPeL, vtDeL, vtAeL)) ; ExeSetModified() ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtVolZmapMillingStep(" + IdToString( nId) + ",{" + ToString( ptPs) + "},{" + ToString( vtDs) + "},{" + ToString( vtAs) + "},{" + ToString( ptPe) + "},{" + ToString( vtDe) + "},{" + ToString( vtAe) + "}," + RefTypeToString( nRefType) + ")" + " -- Ok=" + ToString( bOk) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultato return bOk ; } //------------------------------------------------------------------------------- bool ExeCutVolZmapPlane( int nId, const Point3d& ptOn, const Vector3d& vtN, int nRefType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero lo Zmap IVolZmap* pVZM = GetVolZmap( pGeomDB->GetGeoObj( nId)) ; bool bOk = ( pVZM != nullptr) ; // recupero il riferimento locale Frame3d frLoc ; bOk = bOk && pGeomDB->GetGlobFrame( nId, frLoc) ; // porto in locale il punto e la normale del piano Point3d ptOnL = GetPointLocal( pGeomDB, ptOn, nRefType, frLoc) ; Vector3d vtNL = GetVectorLocal( pGeomDB, vtN, nRefType, frLoc) ; // calcolo il piano di taglio Plane3d plPlane ; bOk = bOk && plPlane.Set( ptOnL, vtNL) ; // eseguo il taglio bOk = bOk && pVZM->Cut( plPlane) ; ExeSetModified() ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtCutVolZmapPlane(" + ToString( nId) + ",{" + ToString( ptOn) + "},{" + ToString( vtN) + "}," + RefTypeToString( nRefType) + ")" + " -- Ok=" + ToString( bOk) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultato return bOk ; }