EgtMachKernel 3.1h4 :

- corretta gestione inserimento punto medio in rapidi con lama con cambio di direzioni T e A a spirale
- eliminata funzione AdjustEndPointForAxesCalc da SurfFinishing, SurfRoughing e WaterJetting
- a AdjustEndPointForAxesCalc aggiunto parametro per indicare se da punto di lavoro a tip o viceversa.
This commit is contained in:
DarioS
2026-08-28 10:06:34 +02:00
parent b63914f60b
commit 56774c497f
21 changed files with 67 additions and 108 deletions
+44 -34
View File
@@ -1444,7 +1444,7 @@ Operation::CalcAndSetBBox( int nClId)
continue ;
// recupero il punto finale e lo uso per aggiornare l'ingombro
Point3d ptP = pCamData->GetEndPoint() ;
AdjustEndPointForAxesCalc( pCamData, ptP) ;
AdjustEndPointForAxesCalc( pCamData->GetCorrDir(), ptP) ;
b3Grp.Add( ptP) ;
// se arco, determino anche alcuni punti intermedi
if ( pCamData->IsArc()) {
@@ -2123,7 +2123,7 @@ Operation::MyCalculateClPathMcentAxesValues( int nClPathId, double dAngDeltaMinF
}
// ricavo posizione con eventuali modifiche dipendenti dalla lavorazione
Point3d ptP = pCamData->GetEndPoint() ;
AdjustEndPointForAxesCalc( pCamData, ptP) ;
AdjustEndPointForAxesCalc( pCamData->GetCorrDir(), ptP) ;
// calcolo gli assi lineari della macchina
double dX, dY, dZ ;
bool bLOk = m_pMchMgr->GetCalcPositions( ptP, vAxRot, dX, dY, dZ) ;
@@ -2525,8 +2525,8 @@ Operation::VerifyMcentLineMidPoint( const Point3d& ptPrec, const Vector3d& vtDir
bAxError = false ;
Machine* pMachine = m_pMchMgr->GetCurrMachine() ;
// se disposizione o finitura di cornici con lama non vanno fatti controlli
if ( GetType() == OPER_DISP || GetType() == OPER_SAWFINISHING)
// se disposizione non vanno fatti controlli
if ( GetType() == OPER_DISP)
return true ;
// se superato il limite di ricursioni, non devo fare alcunché
@@ -2555,13 +2555,44 @@ Operation::VerifyMcentLineMidPoint( const Point3d& ptPrec, const Vector3d& vtDir
Point3d ptMoveMid ;
if ( ! pMachine->GetTipFromPositions( vAxMid[0], vAxMid[1], vAxMid[2], vAxRotMid, false, false, true, ptMoveMid))
return false ;
// verifico le differenze
// ne calcolo le direzioni associate
bool bDirFromAngles = false ;
Vector3d vtDirMid = Media( vtDirPrec, vtDir) ;
Vector3d vtAuxMid = Media( vtAuxPrec, vtAux) ;
if ( ! vtDirMid.Normalize() ||
( ! vtAuxPrec.IsSmall() && ! vtAux.IsSmall() && ( nMoveType == 0 || ! vtAuxMid.Normalize() || abs( vtAuxMid * vtDirMid) > SQRT1_2))) {
if ( ! pMachine->GetBackToolDirFromAngles( vAxRotMid, vtDirMid))
return false ;
if ( ! pMachine->GetBackAuxDirFromAngles( vAxRotMid, vtAuxMid))
return false ;
bDirFromAngles = true ;
}
Vector3d vtCorrMid = Media( vtCorrPrec, vtCorr) ;
if ( ! vtCorrPrec.IsSmall() && ! vtCorr.IsSmall() && ( bDirFromAngles || ! vtCorrMid.Normalize())) {
// assegno il versore correzione precedente
vtCorrMid = vtCorrPrec ;
// se possibile, cerco di migliorarlo considerando i rif. prec. e sul medio da direzioni fresa (Z) e ausiliaria (X)
Frame3d refPrec, refMid ;
if ( refPrec.Set( ORIG, vtDirPrec, vtAuxPrec) &&
refMid.Set( ORIG, vtDirMid, vtAuxMid)) {
// versore correzione in locale al precente coincide con quello in locale al corrente
vtCorrMid.ToLoc( refPrec) ;
vtCorrMid.ToGlob( refMid) ;
}
}
// verifico le differenze sui punti aggiustati
Point3d ptPrecAdj = ptPrec ;
AdjustEndPointForAxesCalc( vtCorrPrec, ptPrecAdj, false) ;
Point3d ptCurrAdj = ptP ;
AdjustEndPointForAxesCalc( vtCorr, ptCurrAdj, false) ;
Point3d ptMoveMidAdj = ptMoveMid ;
AdjustEndPointForAxesCalc( vtCorrMid, ptMoveMidAdj, false) ;
double dDist ;
if ( ! DistPointLine( ptMoveMid, ptPrec, ptP).GetDist( dDist))
if ( ! DistPointLine( ptMoveMidAdj, ptPrecAdj, ptCurrAdj).GetDist( dDist))
return false ;
double dLinTol = GetApproxLinTol() ;
if ( nMoveType == 0)
dLinTol = max( 10 * dLinTol, LIN_TOL_RAW) ;
dLinTol = max( 10 * dLinTol, MIN_SAFERAPID) ;
else
dLinTol = max( dLinTol, 2 * EPS_SMALL) ;
bool bInTol = ( dDist <= dLinTol) ;
@@ -2577,37 +2608,16 @@ Operation::VerifyMcentLineMidPoint( const Point3d& ptPrec, const Vector3d& vtDir
// Va inserito il punto medio
bAdded = true ;
Point3d ptMid = Media( ptPrec, ptP) ;
Vector3d vtDirMid = Media( vtDirPrec, vtDir) ;
if ( ! vtDirMid.Normalize()) {
if ( ! pMachine->GetBackToolDirFromAngles( vAxRotMid, vtDirMid))
return ( nMoveType == 0) ;
}
Vector3d vtAuxMid = Media( vtAuxPrec, vtAux) ;
if ( ! vtAuxPrec.IsSmall() && ! vtAux.IsSmall() && ! vtAuxMid.Normalize()) {
if ( ! pMachine->GetBackAuxDirFromAngles( vAxRotMid, vtAuxMid))
return ( nMoveType == 0) ;
}
Vector3d vtCorrMid = Media( vtCorrPrec, vtCorr) ;
if ( ! vtCorrPrec.IsSmall() && ! vtCorr.IsSmall() && ! vtCorrMid.Normalize()) {
// assegno il versore correzione precedente
vtCorrMid = vtCorrPrec ;
// se possibile, cerco di migliorarlo considerando i rif. prec. e sul medio da direzioni fresa (Z) e ausiliaria (X)
Frame3d refPrec, refMid ;
if ( refPrec.Set( ORIG, vtDirPrec, vtAuxPrec) &&
refMid.Set( ORIG, vtDirMid, vtAuxMid)) {
// versore correzione in locale al precente coincide con quello in locale al corrente
vtCorrMid.ToLoc( refPrec) ;
vtCorrMid.ToGlob( refMid) ;
}
}
// inserisco nuova entità punto (per evitare problemi di lunghezza linea)
// creo oggetto punto per DB geometrico
PtrOwner<IGeoPoint3d> pGP( CreateGeoPoint3d()) ;
if ( IsNull( pGP))
return false ;
// assegno le coordinate del punto
pGP->Set( ptMid) ;
Point3d ptMidAdj = Media( ptPrecAdj, ptCurrAdj) ;
Point3d ptMid = ptMidAdj ;
AdjustEndPointForAxesCalc( vtCorrMid, ptMid) ;
pGP->Set( ptMidAdj) ;
// inserisco l'oggetto nel DB geometrico
int nMidEntId = m_pGeomDB->InsertGeoObj( GDB_ID_NULL, nEntId, GDB_BEFORE, Release( pGP)) ;
if ( nMidEntId == GDB_ID_NULL)
@@ -2625,7 +2635,7 @@ Operation::VerifyMcentLineMidPoint( const Point3d& ptPrec, const Vector3d& vtDir
CamData* pMidCamData = GetCamData( m_pGeomDB->GetUserObj( nMidEntId)) ;
if ( pMidCamData == nullptr)
return false ;
pMidCamData->SetEndPoint( ptMid) ;
pMidCamData->SetEndPoint( ptMidAdj) ;
pMidCamData->SetToolDir( vtDirMid) ;
pMidCamData->SetAuxDir( vtAuxMid) ;
pMidCamData->SetCorrDir( vtCorrMid) ;
@@ -2736,7 +2746,7 @@ Operation::CalculateClPathRobotAxesValues( int nClPathId, double dAngDeltaMinFor
}
// ricavo posizione con eventuali modifiche dipendenti dalla lavorazione
Point3d ptP = pCamData->GetEndPoint() ;
AdjustEndPointForAxesCalc( pCamData, ptP) ;
AdjustEndPointForAxesCalc( pCamData->GetCorrDir(), ptP) ;
// recupero direzioni
Vector3d vtDir = pCamData->GetToolDir() ;
Vector3d vtAux ;