EgtMachKernel 1.6f2 :

- aggiunto UserObj CamData per rappresentare dati tipo CL in entità geometriche
- possibilità di ruotare i sottopezzi
- aggiunto calcolo percorsi di lavorazione di fori
- aggiunte prime versioni parziali di taglio con lama e fresatura.
This commit is contained in:
Dario Sassi
2015-06-16 07:43:02 +00:00
parent 64ed8babd1
commit b96b43e1ec
33 changed files with 2206 additions and 232 deletions
+87 -46
View File
@@ -18,20 +18,33 @@
#include "Disposition.h"
#include "Table.h"
#include "/EgtDev/Include/EGkStringUtils3d.h"
#include "/EgtDev/Include/EGkObjUserFactory.h"
#include "/EgtDev/Include/EGkUserObjFactory.h"
#include "/EgtDev/Include/EGnStringKeyVal.h"
#include "/EgtDev/Include/EGnFileUtils.h"
using namespace std ;
//----------------------------------------------------------------------------
OBJUSER_REGISTER( "EMkDisposition", Disposition) ;
static std::string DIS_TABLE = "Tab" ;
static std::string DIS_FXD_TOT = "FxT" ;
static std::string DIS_FXD_NAME = "FxN" ;
static std::string DIS_FXD_POS = "FxP" ;
static std::string DIS_FXD_ANG = "FxA" ;
static std::string DIS_MVD_TOT = "MvT" ;
static std::string DIS_MVD_ID = "MvI" ;
static std::string DIS_MVD_TYPE = "MvT" ;
static std::string DIS_MVD_PNT = "MvP" ;
static std::string DIS_MVD_ANG = "MvA" ;
static std::string DIS_MVD_FLAG = "MvF" ;
//----------------------------------------------------------------------------
USEROBJ_REGISTER( "EMkDisposition", Disposition) ;
//----------------------------------------------------------------------------
const string&
Disposition::GetClassName( void) const
{
return OBJUSER_GETNAME( Disposition) ;
return USEROBJ_GETNAME( Disposition) ;
}
//----------------------------------------------------------------------------
@@ -64,25 +77,26 @@ Disposition::Dump( string& sOut, const char* szNewLine) const
{
sOut += GetClassName() + szNewLine ;
sOut += "Tab=" + m_sTabName + ( m_bTabOk ? " (ok)" : " (to verify)") + szNewLine ;
for ( int i = 0 ; i < int( m_vFixData.size()) ; ++ i) {
sOut += "FxD=" + m_vFixData[i].sName + "," +
ToString( m_vFixData[i].nId) + ",(" +
ToString( m_vFixData[i].ptPos) + ")" + szNewLine ;
for ( const auto& FixData : m_vFixData) {
sOut += "FxD=" + FixData.sName + "," +
ToString( FixData.nId) + ",(" +
ToString( FixData.ptPos) + ")," +
ToString( FixData.dAng) + szNewLine ;
}
for ( int i = 0 ; i < int( m_vMvrData.size()) ; ++ i) {
sOut += "MvD=" + ToString( m_vMvrData[i].nRawId) + "," ;
switch (m_vMvrData[i].nType) {
for ( const auto& MvrData : m_vMvrData) {
sOut += "MvD=" + ToString( MvrData.nRawId) + "," ;
switch ( MvrData.nType) {
case MoveRawData::NONE :
sOut += string( " NONE") + szNewLine ;
break ;
case MoveRawData::COR :
sOut += " COR,(" + ToString( m_vMvrData[i].ptP) + ")," + ToString( m_vMvrData[i].nFlag) + szNewLine ;
sOut += " COR,(" + ToString( MvrData.ptP) + ")," + ToString( MvrData.nFlag) + szNewLine ;
break ;
case MoveRawData::CEN :
sOut += " CEN,(" + ToString( m_vMvrData[i].ptP) + ")," + ToString( m_vMvrData[i].nFlag) + szNewLine ;
sOut += " CEN,(" + ToString( MvrData.ptP) + ")," + ToString( MvrData.nFlag) + szNewLine ;
break ;
case MoveRawData::ROT :
sOut += " ROT,(" + ToString( m_vMvrData[i].ptP) + ")" + szNewLine ;
sOut += " ROT,(" + ToString( MvrData.ptP) + ")" + szNewLine ;
break ;
}
}
@@ -96,7 +110,7 @@ Disposition::Save( STRVECTOR& vString) const
try {
int k = - 1 ;
int nFxdTot = int( m_vFixData.size()) ;
int nFxdLines = 1 + 2 * nFxdTot ;
int nFxdLines = 1 + 3 * nFxdTot ;
int nMvdTot = int( m_vMvrData.size()) ;
int nMvdLines = 1 + 4 * nMvdTot ;
vString.insert( vString.begin(), 1 + nFxdLines + nMvdLines, "") ;
@@ -106,19 +120,20 @@ Disposition::Save( STRVECTOR& vString) const
// dati sottopezzi
if ( ! SetVal( DIS_FXD_TOT, nFxdTot, vString[++k]))
return false ;
for ( int i = 0 ; i < nFxdTot ; ++ i) {
if ( ! SetVal( DIS_FXD_NAME, m_vFixData[i].sName, vString[++k]) ||
! SetVal( DIS_FXD_POS, m_vFixData[i].ptPos, vString[++k]))
for ( const auto& FixData : m_vFixData) {
if ( ! SetVal( DIS_FXD_NAME, FixData.sName, vString[++k]) ||
! SetVal( DIS_FXD_POS, FixData.ptPos, vString[++k]) ||
! SetVal( DIS_FXD_ANG, FixData.dAng, vString[++k]))
return false ;
}
// dati posizionamento grezzi
if ( ! SetVal( DIS_MVD_TOT, nMvdTot, vString[++k]))
return false ;
for ( int i = 0 ; i < nMvdTot ; ++ i) {
if ( ! SetVal( DIS_MVD_ID, m_vMvrData[i].nRawId, vString[++k]) ||
! SetVal( DIS_MVD_TYPE, m_vMvrData[i].nType, vString[++k]) ||
! SetVal( DIS_MVD_PNT, m_vMvrData[i].ptP, vString[++k]) ||
! SetVal( DIS_MVD_FLAG, m_vMvrData[i].nFlag, vString[++k]))
for ( const auto& MvrData : m_vMvrData) {
if ( ! SetVal( DIS_MVD_ID, MvrData.nRawId, vString[++k]) ||
! SetVal( DIS_MVD_TYPE, MvrData.nType, vString[++k]) ||
! SetVal( DIS_MVD_PNT, MvrData.ptP, vString[++k]) ||
! SetVal( DIS_MVD_FLAG, MvrData.nFlag, vString[++k]))
return false ;
}
}
@@ -140,13 +155,14 @@ Disposition::Load( const STRVECTOR& vString)
int nFxdTot ;
if ( ! GetVal( vString[++k], DIS_FXD_TOT, nFxdTot))
return false ;
int nFxdLines = 1 + 2 * nFxdTot ;
int nFxdLines = 1 + 3 * nFxdTot ;
if ( int( vString.size()) < 1 + nFxdLines + 1)
return false ;
m_vFixData.insert( m_vFixData.begin(), nFxdTot, FixtureData()) ;
for ( int i = 0 ; i < nFxdTot ; ++ i) {
if ( ! GetVal( vString[++k], DIS_FXD_NAME, m_vFixData[i].sName) ||
! GetVal( vString[++k], DIS_FXD_POS, m_vFixData[i].ptPos))
for ( auto& FixData : m_vFixData) {
if ( ! GetVal( vString[++k], DIS_FXD_NAME, FixData.sName) ||
! GetVal( vString[++k], DIS_FXD_POS, FixData.ptPos) ||
! GetVal( vString[++k], DIS_FXD_ANG, FixData.dAng))
return false ;
}
// dati posizionamento grezzi
@@ -157,11 +173,11 @@ Disposition::Load( const STRVECTOR& vString)
if ( int( vString.size()) < 1 + nFxdLines + nMvdLines)
return false ;
m_vMvrData.insert( m_vMvrData.begin(), nMvdTot, MoveRawData()) ;
for ( int i = 0 ; i < nMvdTot ; ++ i) {
if ( ! GetVal( vString[++k], DIS_MVD_ID, m_vMvrData[i].nRawId) ||
! GetVal( vString[++k], DIS_MVD_TYPE, m_vMvrData[i].nType) ||
! GetVal( vString[++k], DIS_MVD_PNT, m_vMvrData[i].ptP) ||
! GetVal( vString[++k], DIS_MVD_FLAG, m_vMvrData[i].nFlag))
for ( auto& MvrData : m_vMvrData) {
if ( ! GetVal( vString[++k], DIS_MVD_ID, MvrData.nRawId) ||
! GetVal( vString[++k], DIS_MVD_TYPE, MvrData.nType) ||
! GetVal( vString[++k], DIS_MVD_PNT, MvrData.ptP) ||
! GetVal( vString[++k], DIS_MVD_FLAG, MvrData.nFlag))
return false ;
}
return true ;
@@ -244,36 +260,36 @@ bool
Disposition::Apply(void)
{
// aggiornamento sottopezzi
for ( auto iIter = m_vFixData.begin() ; iIter != m_vFixData.end() ; ++ iIter) {
for ( auto& FixData : m_vFixData) {
// se sottopezzo da caricare
if ( iIter->nId == GDB_ID_NULL) {
int nId = AddSubPiece( iIter->sName, iIter->ptPos, false) ;
if ( FixData.nId == GDB_ID_NULL) {
int nId = AddSubPiece( FixData.sName, FixData.ptPos, false) ;
if ( nId == GDB_ID_NULL) {
string sOut = "Error adding subpiece " + iIter->sName ;
string sOut = "Error adding subpiece " + FixData.sName ;
LOG_ERROR( GetEMkLogger(), sOut.c_str()) ;
}
else
iIter->nId = nId ;
FixData.nId = nId ;
}
}
// aggiornamento movimento pezzi
for ( auto iIter = m_vMvrData.begin() ; iIter != m_vMvrData.end() ; ++ iIter) {
switch ( iIter->nType) {
for ( const auto& vMvrData : m_vMvrData) {
switch ( vMvrData.nType) {
case MoveRawData::COR :
if ( ! MoveToCornerRawPart( iIter->nRawId, iIter->ptP, iIter->nFlag, false)) {
string sOut = "Error in MoveToCornerRawPart " + ToString( iIter->nRawId) ;
if ( ! MoveToCornerRawPart( vMvrData.nRawId, vMvrData.ptP, vMvrData.nFlag, false)) {
string sOut = "Error in MoveToCornerRawPart " + ToString( vMvrData.nRawId) ;
LOG_ERROR( GetEMkLogger(), sOut.c_str()) ;
}
break ;
case MoveRawData::CEN :
if ( ! MoveToCenterRawPart( iIter->nRawId, iIter->ptP, iIter->nFlag, false)) {
string sOut = "Error in MoveToCenterRawPart " + ToString( iIter->nRawId) ;
if ( ! MoveToCenterRawPart( vMvrData.nRawId, vMvrData.ptP, vMvrData.nFlag, false)) {
string sOut = "Error in MoveToCenterRawPart " + ToString( vMvrData.nRawId) ;
LOG_ERROR( GetEMkLogger(), sOut.c_str()) ;
}
break ;
case MoveRawData::ROT :
if ( ! ApplyRotationToRawPart( iIter->nRawId, iIter->ptP.x, iIter->ptP.y, iIter->ptP.z)) {
string sOut = "Error in ApplyRotationToRawPart " + ToString( iIter->nRawId) ;
if ( ! ApplyRotationToRawPart( vMvrData.nRawId, vMvrData.ptP.x, vMvrData.ptP.y, vMvrData.ptP.z)) {
string sOut = "Error in ApplyRotationToRawPart " + ToString( vMvrData.nRawId) ;
LOG_ERROR( GetEMkLogger(), sOut.c_str()) ;
}
break ;
@@ -285,7 +301,7 @@ Disposition::Apply(void)
//----------------------------------------------------------------------------
int
Disposition::AddSubPiece( const string& sName, const Point3d& ptPos, bool bAddToList)
Disposition::AddSubPiece( const string& sName, const Point3d& ptPos, double dAngDeg, bool bAddToList)
{
// verifico MachMgr e GeomDB
if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr)
@@ -312,9 +328,12 @@ Disposition::AddSubPiece( const string& sName, const Point3d& ptPos, bool bAddTo
// la muovo nella posizione voluta
Vector3d vtMove = ( m_ptRef1 + ptPos) - ORIG ;
m_pGeomDB->TranslateGlob( nFixtId, vtMove) ;
// la ruoto
if ( fabs( dAngDeg) > EPS_ANG_SMALL)
m_pGeomDB->RotateGroup( nFixtId, ORIG, Z_AX, dAngDeg) ;
// se da aggiungere alla lista
if ( bAddToList)
m_vFixData.emplace_back( sName, nFixtId, ptPos) ;
m_vFixData.emplace_back( sName, nFixtId, ptPos, 0) ;
return nFixtId ;
}
@@ -340,6 +359,28 @@ Disposition::MoveSubPiece( int nId, const Vector3d& vtMove)
return true ;
}
//----------------------------------------------------------------------------
bool
Disposition::RotateSubPiece( int nId, double dAngDeg)
{
// verifica validità sottopezzo
if ( ! VerifyFixture( nId))
return false ;
// verifico aggiornamento tavola
if ( ! m_bTabOk && ! SetTable( m_sTabName))
return false ;
// muovo l'oggetto
m_pGeomDB->RotateGroup( nId, ORIG, Z_AX, dAngDeg) ;
// aggiorno la posizione dell'oggetto nel vettore dei comandi
for ( auto& FixData : m_vFixData) {
if ( FixData.nId == nId) {
FixData.dAng += dAngDeg ;
break ;
}
}
return true ;
}
//----------------------------------------------------------------------------
bool
Disposition::RemoveSubPiece( int nId)