EgtMachKernel 1.6k9 :

- aggiunti campi Rot2Stroke e SolCh a teste per limitare corse secondo asse rotante e dare criterio scelta soluzione
- utilizzo di questi dati nel calcolo assi macchina
- aggiunta GetCurrMachineName.
This commit is contained in:
Dario Sassi
2015-11-24 22:13:21 +00:00
parent 2f016585bb
commit ebccd64daa
11 changed files with 143 additions and 26 deletions
BIN
View File
Binary file not shown.
+9 -2
View File
@@ -15,6 +15,7 @@
#include "stdafx.h"
#include "Head.h"
#include "MachConst.h"
#include "/EgtDev/Include/EMkSimuGenConst.h"
#include "/EgtDev/Include/EGkGdbConst.h"
#include "/EgtDev/Include/EGkUserObjFactory.h"
#include "/EgtDev/Include/EGkStringUtils3d.h"
@@ -95,13 +96,17 @@ Head::GetGeomDB( void) const
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
Head::Head( void)
: m_nOwnerId( GDB_ID_NULL), m_pGeomDB( nullptr), m_nType( MCH_HT_NONE), m_dRot1W( 1)
: m_nOwnerId( GDB_ID_NULL), m_pGeomDB( nullptr), m_nType( MCH_HT_NONE),
m_dRot1W( 1), m_nSolCh( MCH_SCC_NONE)
{
m_Rot2Stroke.Min = - INFINITO ;
m_Rot2Stroke.Max = INFINITO ;
}
//----------------------------------------------------------------------------
bool
Head::Set( const string& sName, int nType, const string& sHSet, const Vector3d& vtADir, double dRot1W)
Head::Set( const string& sName, int nType, const string& sHSet, const Vector3d& vtADir,
double dRot1W, const STROKE& Rot2Stroke, int nSolCh)
{
m_sName = sName ;
m_nType = nType ;
@@ -109,6 +114,8 @@ Head::Set( const string& sName, int nType, const string& sHSet, const Vector3d&
m_vsHSet.push_back( sHSet) ;
m_vtADir = vtADir ;
m_dRot1W = dRot1W ;
m_Rot2Stroke = Rot2Stroke ;
m_nSolCh = nSolCh ;
return true ;
}
+18 -6
View File
@@ -30,13 +30,23 @@ class Head : public IUserObj
public :
Head( void) ;
bool Set( const std::string& sName, int nType, const std::string& sHSet, const Vector3d& vtADir, double dRot1W) ;
bool Set( const std::string& sName, int nType, const std::string& sHSet, const Vector3d& vtADir,
double dRot1W, const STROKE& Rot2Stroke, int nSolCh) ;
bool AddHeadToHSet( const std::string& sHead) ;
const std::string& GetName( void) { return m_sName ; }
int GetType( void) { return m_nType ; }
const STRVECTOR& GetHSet(void) { return m_vsHSet ; }
const Vector3d& GetADir( void) { return m_vtADir ; }
double GetRot1W( void) { return m_dRot1W ; }
const std::string& GetName( void)
{ return m_sName ; }
int GetType( void)
{ return m_nType ; }
const STRVECTOR& GetHSet(void)
{ return m_vsHSet ; }
const Vector3d& GetADir( void)
{ return m_vtADir ; }
double GetRot1W( void)
{ return m_dRot1W ; }
const STROKE& GetRot2Stroke( void)
{ return m_Rot2Stroke ; }
int GetSolCh( void)
{ return m_nSolCh ; }
private :
int m_nOwnerId ;
@@ -46,4 +56,6 @@ class Head : public IUserObj
STRVECTOR m_vsHSet ;
Vector3d m_vtADir ;
double m_dRot1W ;
STROKE m_Rot2Stroke ;
int m_nSolCh ;
} ;
+1
View File
@@ -59,6 +59,7 @@ class MachMgr : public IMachMgr
virtual bool Insert( int nInsGrp) ;
// Machines
virtual bool SetCurrMachine( const std::string& sMachineName) ;
virtual bool GetCurrMachineName( std::string& sMachineName) const ;
// MachGroups
virtual int GetMachGroupCount( void) const ;
virtual int GetFirstMachGroup( void) const ;
+1 -1
View File
@@ -284,7 +284,7 @@ MachMgr::SetCurrMachGroup( int nId)
}
// verifica ed eventuale caricamento della macchina
if ( ! LoadMachine( mgData.MGeoName))
return GDB_ID_NULL ;
return false ;
// se esiste gruppo corrente, lo disabilito
if ( m_nCurrMGrpId != GDB_ID_NULL) {
// riporto i pezzi nei grezzi precedenti nella loro posizione standard
+10
View File
@@ -90,6 +90,16 @@ MachMgr::SetCurrMachine( const string& sMachineName)
return true ;
}
//----------------------------------------------------------------------------
bool
MachMgr::GetCurrMachineName( string& sMachineName) const
{
if ( GetCurrMachine() == nullptr)
return false ;
sMachineName = GetCurrMachine()->GetMachineName() ;
return true ;
}
//----------------------------------------------------------------------------
int
MachMgr::GetCurrMGeoId( void) const
+12 -6
View File
@@ -34,6 +34,12 @@ Machine::Machine( void)
m_pGeomDB = nullptr ;
m_nGroupId = GDB_ID_NULL ;
m_nTempGroupId = GDB_ID_NULL ;
m_nCalcTabId = GDB_ID_NULL ;
m_nCalcHeadId = GDB_ID_NULL ;
m_nCalcExitId = GDB_ID_NULL ;
m_nCalcToolId = GDB_ID_NULL ;
m_dCalcRot1W = 1 ;
m_nCalcSolCh = MCH_SCC_NONE ;
}
//----------------------------------------------------------------------------
@@ -339,8 +345,8 @@ Machine::AdjustAxisVector( int nLay, const string& sPart, const string& sName,
//----------------------------------------------------------------------------
bool
Machine::LoadMachineStdHead( const string& sName, const string& sParent, const std::string& sHSet,
const Point3d& ptPos, const Vector3d& vtTDir,
const Vector3d& vtADir, double dRot1W, const string& sGeo)
const Point3d& ptPos, const Vector3d& vtTDir, const Vector3d& vtADir,
double dRot1W, const STROKE& Rot2Stroke, int nSolCh, const string& sGeo)
{
// recupero pezzo e layer della geometria originale dell'asse
string sPart, sLay ;
@@ -364,7 +370,7 @@ Machine::LoadMachineStdHead( const string& sName, const string& sParent, const s
Head* pHead = new(nothrow) Head ;
if ( pHead == nullptr)
return false ;
pHead->Set( sName, MCH_HT_STD, sHSet, vtADir, dRot1W) ;
pHead->Set( sName, MCH_HT_STD, sHSet, vtADir, dRot1W, Rot2Stroke, nSolCh) ;
m_pGeomDB->SetUserObj( nLay, pHead) ;
// aggiorno la testa capostipite
if ( ! AddHeadToSet( sHSet, sName))
@@ -381,8 +387,8 @@ Machine::LoadMachineStdHead( const string& sName, const string& sParent, const s
//----------------------------------------------------------------------------
bool
Machine::LoadMachineMultiHead( const string& sName, const string& sParent, const std::string& sHSet,
const MUEXITVECTOR& vMuExit,
const Vector3d& vtADir, double dRot1W, const string& sGeo)
const MUEXITVECTOR& vMuExit, const Vector3d& vtADir,
double dRot1W, const STROKE& Rot2Stroke, int nSolCh, const string& sGeo)
{
// recupero pezzo e layer della geometria originale dell'asse
string sPart, sLay ;
@@ -406,7 +412,7 @@ Machine::LoadMachineMultiHead( const string& sName, const string& sParent, const
Head* pHead = new(nothrow) Head ;
if ( pHead == nullptr)
return false ;
pHead->Set( sName, MCH_HT_MULTI, sHSet, vtADir, dRot1W) ;
pHead->Set( sName, MCH_HT_MULTI, sHSet, vtADir, dRot1W, Rot2Stroke, nSolCh) ;
m_pGeomDB->SetUserObj( nLay, pHead) ;
// aggiorno la testa capostipite
if ( ! AddHeadToSet( sHSet, sName))
+6 -4
View File
@@ -90,11 +90,11 @@ class Machine
bool AdjustAxisVector( int nLay, const std::string& sPart, const std::string& sName,
int nType, const Point3d& ptPos, const Vector3d& vtDir) ;
bool LoadMachineStdHead( const std::string& sName, const std::string& sParent, const std::string& sHSet,
const Point3d& ptPos, const Vector3d& vtTDir,
const Vector3d& vtADir, double dRot1W, const std::string& sGeo) ;
const Point3d& ptPos, const Vector3d& vtTDir, const Vector3d& vtADir,
double dRot1W, const STROKE& Rot2Stroke, int nSolCh, const std::string& sGeo) ;
bool LoadMachineMultiHead( const std::string& sName, const std::string& sParent, const std::string& sHSet,
const MUEXITVECTOR& vMuExit,
const Vector3d& vtADir, double dRot1W, const std::string& sGeo) ;
const MUEXITVECTOR& vMuExit, const Vector3d& vtADir,
double dRot1W, const STROKE& Rot2Stroke, int nSolCh, const std::string& sGeo) ;
int GetGroup( const std::string& sGroup) const ;
Axis* GetAxis( int nGroup) const ;
bool IsAxisGroup( int nGroup) const { return ( GetAxis( nGroup) != nullptr) ; }
@@ -110,6 +110,7 @@ class Machine
bool CreateExitGroups( int nLay, const MUEXITVECTOR& vMuExit) ;
bool CalculateKinematicChain( void) ;
bool AddKinematicAxis( bool bOnHead, int nId) ;
bool VerifyScc( const Vector3d& vtDirI, const Vector3d& vtDirA, int nSolCh) ;
bool AdjustAngleInStroke( int nId, double& dAng) ;
bool LuaInit( const std::string& sMachineName) ;
bool LuaExit( void) ;
@@ -133,6 +134,7 @@ class Machine
int m_nCalcExitId ; // uscita corrente per calcoli
int m_nCalcToolId ; // utensile corrente per calcoli
double m_dCalcRot1W ; // peso del primo asse rotante per i confronti
int m_nCalcSolCh ; // criterio di scelta della soluzione
Point3d m_ptCalcPos ; // posizione utensile a riposo per calcoli
Vector3d m_vtCalcDir ; // direzione utensile a riposo per calcoli
Vector3d m_vtCalcADir ; // direzione ausiliaria a riposo per calcoli
+64 -1
View File
@@ -75,6 +75,8 @@ Machine::SetCurrTool( const string& sTool, const string& sHead, int nExit)
m_nCalcHeadId = GDB_ID_NULL ;
m_nCalcExitId = GDB_ID_NULL ;
m_nCalcToolId = GDB_ID_NULL ;
m_dCalcRot1W = 1 ;
m_nCalcSolCh = MCH_SCC_NONE ;
m_dCalcTLen = 0 ;
// recupero il gruppo della testa
int nHeadId = GetGroup( sHead) ;
@@ -103,6 +105,7 @@ Machine::SetCurrTool( const string& sTool, const string& sHead, int nExit)
m_nCalcExitId = nExitId ;
m_nCalcToolId = nToolId ;
m_dCalcRot1W = pHead->GetRot1W() ;
m_nCalcSolCh = pHead->GetSolCh() ;
m_ptCalcPos = pExit->GetPos() ;
m_vtCalcDir = pExit->GetTDir() ;
m_vtCalcADir = pHead->GetADir() ;
@@ -201,6 +204,14 @@ Machine::CalculateKinematicChain( void)
// se entrambi di testa devo invertirne l'ordine
if ( m_vCalcRotAx[0].bHead && m_vCalcRotAx[1].bHead)
swap( m_vCalcRotAx[0], m_vCalcRotAx[1]) ;
// impongo limiti di corsa sul secondo asse rotante di testa
if ( m_vCalcRotAx[1].bHead) {
Head* pHead = GetHead( m_nCalcHeadId) ;
if ( pHead != nullptr) {
m_vCalcRotAx[1].stroke.Min = max( m_vCalcRotAx[1].stroke.Min, pHead->GetRot2Stroke().Min) ;
m_vCalcRotAx[1].stroke.Max = min( m_vCalcRotAx[1].stroke.Max, pHead->GetRot2Stroke().Max) ;
}
}
return true ;
}
// altrimenti non ancora gestito, quindi errore
@@ -300,7 +311,7 @@ Machine::GetAngles( const Vector3d& vtDirT, const Vector3d& vtDirA,
vtAx2.Invert() ;
// calcolo secondo angolo di rotazione
nStat = GetRotationComponent( vtDirH, dCompTSuAxR1, vtAx1, vtAx2, dAngB1, dAngB2, bDet) ;
// aggiornamento direzione fresa su testa
// aggiornamento direzioni fresa e ausiliaria su testa
if ( nStat >= 1) {
// se indeterminato lo azzero
if ( ! bDet)
@@ -347,8 +358,13 @@ Machine::GetAngles( const Vector3d& vtDirT, const Vector3d& vtDirA,
if ( ! bDet2) {
bool bDetX ;
vtDirI2.GetRotation( vtDirAn, vtAx1, dAngA2, bDetX) ;
if ( ! bDetX)
dAngA2 = 0 ;
}
}
// aggiornamento direzioni fresa e ausiliaria su testa
vtDirH2.Rotate( vtAx1, dAngA2) ;
vtDirI2.Rotate( vtAx1, dAngA2) ;
}
// calcolo primo angolo di rotazione per prima soluzione
@@ -361,6 +377,27 @@ Machine::GetAngles( const Vector3d& vtDirT, const Vector3d& vtDirA,
if ( ! bDet1) {
bool bDetX ;
vtDirI1.GetRotation( vtDirAn, vtAx1, dAngA1, bDetX) ;
if ( ! bDetX)
dAngA1 = 0 ;
}
}
// aggiornamento direzioni fresa e ausiliaria su testa
vtDirH1.Rotate( vtAx1, dAngA1) ;
vtDirI1.Rotate( vtAx1, dAngA1) ;
}
// verifiche per criterio scelta soluzione
if ( nStat >= 2) {
if ( ! VerifyScc( vtDirI2, vtDirAn, m_nCalcSolCh))
-- nStat ;
}
if ( nStat >= 1) {
if ( ! VerifyScc( vtDirI1, vtDirAn, m_nCalcSolCh)) {
-- nStat ;
// riloco eventuale soluzione rimasta
if ( nStat >= 1) {
dAngA1 = dAngA2 ;
dAngB1 = dAngB2 ;
}
}
}
@@ -441,6 +478,32 @@ Machine::GetPositions( const Point3d& ptP, double dAngA, double dAngB,
return true ;
}
//----------------------------------------------------------------------------
bool
Machine::VerifyScc( const Vector3d& vtDirI, const Vector3d& vtDirA, int nSolCh)
{
switch ( nSolCh) {
default :
return true ;
case MCH_SCC_ADIR_XP :
return ( vtDirI.x > - EPS_ZERO) ;
case MCH_SCC_ADIR_XM :
return ( vtDirI.x < EPS_ZERO) ;
case MCH_SCC_ADIR_YP :
return ( vtDirI.y > - EPS_ZERO) ;
case MCH_SCC_ADIR_YM :
return ( vtDirI.y < EPS_ZERO) ;
case MCH_SCC_ADIR_ZP :
return ( vtDirI.z > - EPS_ZERO) ;
case MCH_SCC_ADIR_ZM :
return ( vtDirI.z < EPS_ZERO) ;
case MCH_SCC_ADIR_NEAR :
return ( ( vtDirI * vtDirA) > cos( 60 * DEGTORAD)) ;
case MCH_SCC_ADIR_FAR :
return ( ( vtDirI * vtDirA) < cos( 120 * DEGTORAD)) ;
}
}
//----------------------------------------------------------------------------
bool
Machine::AdjustAngleInStroke( int nId, double& dAng)
+16 -2
View File
@@ -358,6 +358,12 @@ Machine::LuaEmtStdHead( lua_State* L)
// lettura eventuale campo 'Rot1W' dalla tabella (default 1)
double dRot1W = 1 ;
LuaGetTabFieldParam( L, 1, "Rot1W", dRot1W) ;
// lettura eventuale campo 'Rot2Stroke' dalla tabella
STROKE Rot2Stroke = { - INFINITO, INFINITO} ;
LuaGetTabFieldParam( L, 1, "Rot2Stroke", Rot2Stroke.v) ;
// lettura eventuale campo 'SolCh' dalla tabella
int nSolCh = MCH_SCC_NONE ;
LuaGetTabFieldParam( L, 1, "SolCh", nSolCh) ;
// lettura campo 'Geo' dalla tabella
string sGeo ;
LuaCheckTabFieldParam( L, 1, "Geo", sGeo)
@@ -372,7 +378,8 @@ Machine::LuaEmtStdHead( lua_State* L)
return luaL_error( L, " Unknown Machine") ;
// carico i dati della testa standard
if ( ! m_pMchLua->LoadMachineStdHead( sName, sParent, sHSet, ptPos, vtTDir, vtADir, dRot1W, sGeo))
if ( ! m_pMchLua->LoadMachineStdHead( sName, sParent, sHSet, ptPos, vtTDir, vtADir,
dRot1W, Rot2Stroke, nSolCh, sGeo))
return luaL_error( L, " Load Machine Standard Head failed") ;
return 0 ;
@@ -417,6 +424,12 @@ Machine::LuaEmtMultiHead( lua_State* L)
// lettura eventuale campo 'Rot1W' dalla tabella (default 1)
double dRot1W = 1 ;
LuaGetTabFieldParam( L, 1, "Rot1W", dRot1W) ;
// lettura eventuale campo 'Rot2Stroke' dalla tabella
STROKE Rot2Stroke = { - INFINITO, INFINITO} ;
LuaGetTabFieldParam( L, 1, "Rot2Stroke", Rot2Stroke.v) ;
// lettura eventuale campo 'SolCh' dalla tabella
int nSolCh = MCH_SCC_NONE ;
LuaGetTabFieldParam( L, 1, "SolCh", nSolCh) ;
// lettura campo 'Geo' dalla tabella
string sGeo ;
LuaCheckTabFieldParam( L, 1, "Geo", sGeo)
@@ -431,7 +444,8 @@ Machine::LuaEmtMultiHead( lua_State* L)
return luaL_error( L, " Unknown Machine") ;
// carico i dati della testa multipla
if ( ! m_pMchLua->LoadMachineMultiHead( sName, sParent, sHSet, vMuExit, vtADir, dRot1W, sGeo))
if ( ! m_pMchLua->LoadMachineMultiHead( sName, sParent, sHSet, vMuExit, vtADir,
dRot1W, Rot2Stroke, nSolCh, sGeo))
return luaL_error( L, " Load Machine Standard Head failed") ;
return 0 ;
+6 -4
View File
@@ -359,6 +359,9 @@ MachiningsMgr::GetMachiningNewName( string& sName) const
bool
MachiningsMgr::AddMachining( const string& sName, int nType)
{
// annullo lavorazione corrente
if ( m_pCurrMach != nullptr)
delete m_pCurrMach ;
// verifico unicità del nome
if ( m_suData.find( sName) != m_suData.end())
return false ;
@@ -378,8 +381,6 @@ MachiningsMgr::AddMachining( const string& sName, int nType)
bOk = bOk && m_suData.emplace( pMch->m_sName, pMch->m_Uuid).second ;
m_bModified = true ;
// la rendo la nuova lavorazione corrente
if ( m_pCurrMach != nullptr)
delete m_pCurrMach ;
m_pCurrMach = pMch->Clone() ;
Release( pMch) ;
@@ -390,6 +391,9 @@ MachiningsMgr::AddMachining( const string& sName, int nType)
bool
MachiningsMgr::CopyMachining( const string& sSource, const string& sName)
{
// annullo lavorazione corrente
if ( m_pCurrMach != nullptr)
delete m_pCurrMach ;
// verifico unicità del nome
if ( m_suData.find( sName) != m_suData.end())
return false ;
@@ -410,8 +414,6 @@ MachiningsMgr::CopyMachining( const string& sSource, const string& sName)
bOk = bOk && m_suData.emplace( pMch->m_sName, pMch->m_Uuid).second ;
m_bModified = true ;
// la rendo la nuova lavorazione corrente
if ( m_pCurrMach != nullptr)
delete m_pCurrMach ;
m_pCurrMach = pMch->Clone() ;
Release( pMch) ;