From 839633d072b4144d347525e6a0a5f55fe295638a Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Mon, 7 Dec 2020 08:16:06 +0000 Subject: [PATCH] EgtMachKernel 2.2l1 : - aggiunti minimi e massi dei valori assi per percorso di lavoro e lavorazione a Postproc - modificata scelta punto di inizio lavorazione WaterJetting chiusa. --- Chiseling.cpp | 3 ++ Drilling.cpp | 3 ++ EgtMachKernel.rc | Bin 11782 -> 11782 bytes EgtMachKernel.vcxproj | 1 + EgtMachKernel.vcxproj.filters | 3 ++ GenMachining.cpp | 3 ++ Milling.cpp | 3 ++ Mortising.cpp | 3 ++ Operation.cpp | 87 ++++++++++++++++++++++++++++++---- Operation.h | 1 + OutputConst.h | 4 ++ Pocketing.cpp | 3 ++ Processor.cpp | 25 ++++++++-- Processor.h | 6 ++- SawFinishing.cpp | 3 ++ SawRoughing.cpp | 3 ++ Sawing.cpp | 3 ++ SurfFinishing.cpp | 3 ++ WaterJetting.cpp | 39 +++++++++------ 19 files changed, 166 insertions(+), 30 deletions(-) diff --git a/Chiseling.cpp b/Chiseling.cpp index a004756..fd457fd 100644 --- a/Chiseling.cpp +++ b/Chiseling.cpp @@ -620,6 +620,9 @@ Chiseling::Update( bool bPostApply) return false ; } + // assegno estremi degli assi dei vari percorsi di lavorazione e della lavorazione nel suo complesso + CalcAndSetAxesBBox() ; + // esecuzione eventuali personalizzazioni string sErr ; if ( bPostApply && ! PostApply( sErr)) { diff --git a/Drilling.cpp b/Drilling.cpp index 95065d4..dfb43fd 100644 --- a/Drilling.cpp +++ b/Drilling.cpp @@ -639,6 +639,9 @@ Drilling::Update( bool bPostApply) return false ; } + // assegno estremi degli assi dei vari percorsi di lavorazione e della lavorazione nel suo complesso + CalcAndSetAxesBBox() ; + // esecuzione eventuali personalizzazioni string sErr ; if ( bPostApply && ! PostApply( sErr)) { diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index 34bc8f6bff3de400baad6af5e6d7e5ed91fb17ca..5f66eb49855fb80349aa99c3df12cb44a22caf29 100644 GIT binary patch delta 121 zcmZpRX^YwLgN@aQL5IO`^ItY=X67sg!^w`qx|_3v+!!~nNOI~D}d`2)2NkJbA OTnNOI~D}d`2)2NkJbA OTn + diff --git a/EgtMachKernel.vcxproj.filters b/EgtMachKernel.vcxproj.filters index 2c3f52e..93369db 100644 --- a/EgtMachKernel.vcxproj.filters +++ b/EgtMachKernel.vcxproj.filters @@ -665,6 +665,9 @@ Header Files + + Header Files\Include + diff --git a/GenMachining.cpp b/GenMachining.cpp index f9af0c0..084f81b 100644 --- a/GenMachining.cpp +++ b/GenMachining.cpp @@ -664,6 +664,9 @@ GenMachining::Update( bool bPostApply) return false ; } + // assegno estremi degli assi dei vari percorsi di lavorazione e della lavorazione nel suo complesso + CalcAndSetAxesBBox() ; + // esecuzione eventuali personalizzazioni string sErr ; if ( bPostApply && ! PostApply( sErr)) { diff --git a/Milling.cpp b/Milling.cpp index badb74e..05e15de 100644 --- a/Milling.cpp +++ b/Milling.cpp @@ -853,6 +853,9 @@ Milling::Update( bool bPostApply) return false ; } + // assegno estremi degli assi dei vari percorsi di lavorazione e della lavorazione nel suo complesso + CalcAndSetAxesBBox() ; + // esecuzione eventuali personalizzazioni string sErr ; if ( bPostApply && ! PostApply( sErr)) { diff --git a/Mortising.cpp b/Mortising.cpp index de341a6..3b2e391 100644 --- a/Mortising.cpp +++ b/Mortising.cpp @@ -659,6 +659,9 @@ Mortising::Update( bool bPostApply) return false ; } + // assegno estremi degli assi dei vari percorsi di lavorazione e della lavorazione nel suo complesso + CalcAndSetAxesBBox() ; + // esecuzione eventuali personalizzazioni string sErr ; if ( bPostApply && ! PostApply( sErr)) { diff --git a/Operation.cpp b/Operation.cpp index 513ba80..92f0ef1 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -20,6 +20,7 @@ #include "OutputConst.h" #include "GeoConst.h" #include "/EgtDev/Include/EGkAngle.h" +#include "/EgtDev/Include/EGkBBox1d.h" #include "/EgtDev/Include/EGkGeoPoint3d.h" #include "/EgtDev/Include/EGkCurveLine.h" #include "/EgtDev/Include/EGkCurveArc.h" @@ -970,15 +971,13 @@ Operation::CalcAndSetBBox( int nClId) double dDeltaN = pCamData->GetDeltaN() ; // ricavo i punti const double ANG_STEP = 15.0 ; - int nStep = int( abs( dAngCen) / ANG_STEP) ; - if ( nStep > 1) { - double dCoeff = 1. / nStep ; - for ( int i = 1 ; i < nStep ; ++ i) { - Point3d ptT = ptP ; - ptT.Rotate( ptCen, vtN, dAngCen * ( dCoeff - 1.)) ; - ptT.Translate( vtN * ( dDeltaN * ( dCoeff - 1.))) ; - b3Grp.Add( ptT) ; - } + int nStep = 1 + int( abs( dAngCen) / ANG_STEP) ; + double dCoeff = -1. / nStep ; + for ( int i = 1 ; i < nStep ; ++ i) { + Point3d ptT = ptP ; + ptT.Rotate( ptCen, vtN, i * dCoeff * dAngCen) ; + ptT.Translate( vtN * ( i * dCoeff * dDeltaN)) ; + b3Grp.Add( ptT) ; } } } @@ -993,6 +992,76 @@ Operation::CalcAndSetBBox( int nClId) return true ; } +//---------------------------------------------------------------------------- +bool +Operation::CalcAndSetAxesBBox( void) +{ + if ( m_pGeomDB == nullptr || m_pMchMgr == nullptr) + return false ; + // recupero gruppo della geometria di lavorazione (Cutter Location) + int nClId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_CL) ; + if ( nClId == GDB_ID_NULL) + return false ; + // recupero numero totale assi correnti + int nLinAxes = m_pMchMgr->GetCurrLinAxes() ; + int nRotAxes = m_pMchMgr->GetCurrRotAxes() ; + int nTotAxes = nLinAxes + nRotAxes ; + // assegno estremi assi dei vari percorsi di lavorazione e della lavorazione nel suo complesso + vector vMmAxAll( nTotAxes) ; + int nClPathId = m_pGeomDB->GetFirstInGroup( nClId) ; + while ( nClPathId != GDB_ID_NULL) { + vector vMmAxGrp( nTotAxes) ; + for ( int nEntId = m_pGeomDB->GetFirstInGroup( nClPathId) ; + nEntId != GDB_ID_NULL ; + nEntId = m_pGeomDB->GetNext( nEntId)) { + // recupero i dati Cam dell'entità + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nEntId)) ; + if ( pCamData == nullptr) + continue ; + // recupero gli assi macchina e li uso per aggiornare l'ingombro + DBLVECTOR AxesVal = pCamData->GetAxesVal() ; + for ( int i = 0 ; i < nTotAxes ; ++ i) + vMmAxGrp[i].Add( AxesVal[i]) ; + Point3d ptAxEnd( AxesVal[0], AxesVal[1], AxesVal[2]) ; + // se arco, determino anche alcuni valori intermedi + if ( pCamData->IsArc()) { + // dati dell'arco + Point3d ptCen = pCamData->GetAxesCen() ; + double dAngCen = pCamData->GetAxesAngCen() ; + Vector3d vtN = pCamData->GetAxesNormDir() ; + double dDeltaN = ( ptAxEnd - ptCen) * vtN ; + // ricavo i punti + const double ANG_STEP = 15.0 ; + int nStep = 1 + int( abs( dAngCen) / ANG_STEP) ; + double dCoeff = -1. / nStep ; + for ( int i = 1 ; i < nStep ; ++ i) { + // assi lineari + Point3d ptAxT = ptAxEnd ; + ptAxT.Rotate( ptCen, vtN, i * dCoeff * dAngCen) ; + ptAxT.Translate( vtN * ( i * dCoeff * dDeltaN)) ; + for ( int i = 0 ; i < min( nLinAxes, 3) ; ++ i) + vMmAxGrp[i].Add( ptAxT.v[i]) ; + } + } + } + DBLVECTOR vMinAxGrp( nTotAxes, +INFINITO), vMaxAxGrp( nTotAxes, -INFINITO) ; + for ( int i = 0 ; i < nTotAxes ; ++ i) { + vMmAxGrp[i].GetMinMax( vMinAxGrp[i], vMaxAxGrp[i]) ; + vMmAxAll[i].Add( vMmAxGrp[i]) ; + } + m_pGeomDB->SetInfo( nClPathId, KEY_PAXMIN, vMinAxGrp) ; + m_pGeomDB->SetInfo( nClPathId, KEY_PAXMAX, vMaxAxGrp) ; + nClPathId = m_pGeomDB->GetNext( nClPathId) ; + } + DBLVECTOR vMinAxAll( nTotAxes, +INFINITO), vMaxAxAll( nTotAxes, -INFINITO) ; + for ( int i = 0 ; i < nTotAxes ; ++ i) + vMmAxAll[i].GetMinMax( vMinAxAll[i], vMaxAxAll[i]) ; + m_pGeomDB->SetInfo( nClId, KEY_MAXMIN, vMinAxAll) ; + m_pGeomDB->SetInfo( nClId, KEY_MAXMAX, vMaxAxAll) ; + + return true ; +} + //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- bool diff --git a/Operation.h b/Operation.h index 881a381..6443b1d 100644 --- a/Operation.h +++ b/Operation.h @@ -90,6 +90,7 @@ class Operation : public IUserObj bool VerifyArcs( ICurveComposite* pCompo, double dMaxAngCen = MAX_ANG_CEN) const ; bool CalcAndSetBBox( int nClId) ; + bool CalcAndSetAxesBBox( void) ; bool GetInitialAxesValues( DBLVECTOR& vAxVal) const ; bool GetClPathInitialAxesValues( int nClPathId, DBLVECTOR& vAxVal) const ; diff --git a/OutputConst.h b/OutputConst.h index 26dc4a7..5c7b6fc 100644 --- a/OutputConst.h +++ b/OutputConst.h @@ -76,6 +76,8 @@ static const std::string GVAR_MCHID = ".MCHID" ; // (int) identifica static const std::string GVAR_MCHIND = ".MCHIND" ; // (int) indice lavorazione static const std::string GVAR_MMIN = ".MMIN" ; // (Point3d) punto minimo di ingombro della lavorazione static const std::string GVAR_MMAX = ".MMAX" ; // (Point3d) punto massimo di ingombro della lavorazione +static const std::string GVAR_MAXMIN = ".MAXMIN" ; // (double/s) minimo di ingombro degli assi della lavorazione +static const std::string GVAR_MAXMAX = ".MAXMAX" ; // (double/s) massimo di ingombro degli assi della lavorazione static const std::string GVAR_PATHID = ".PATHID" ; // (int) identificativo percorso di lavorazione static const std::string GVAR_PATHIND = ".PATHIND" ; // (int) indice percorso di lavorazione static const std::string GVAR_START = ".START" ; // (Point3d) punto iniziale del percorso originale @@ -83,6 +85,8 @@ static const std::string GVAR_END = ".END" ; // (Point3d) punto fina static const std::string GVAR_EXTR = ".EXTR" ; // (Vector3d)versore estrusione static const std::string GVAR_PMIN = ".PMIN" ; // (Point3d) punto minimo di ingombro del percorso di lavorazione static const std::string GVAR_PMAX = ".PMAX" ; // (Point3d) punto massimo di ingombro del percorso di lavorazione +static const std::string GVAR_PAXMIN = ".PAXMIN" ; // (double/s) minimo di ingombro degli assi del percorso di lavorazione +static const std::string GVAR_PAXMAX = ".PAXMAX" ; // (double/s) massimo di ingombro degli assi del percorso di lavorazione static const std::string GVAR_ELEV = ".ELEV" ; // (double) massima elevazione static const std::string GVAR_AUXTOT = ".AUXTOT" ; // (int) numero totale dati ausiliari inizio/fine percorso di lavorazione static const std::string GVAR_AUXIND = ".AUXIND" ; // (int) indice dato ausiliario inizio/fine percorso di lavorazione diff --git a/Pocketing.cpp b/Pocketing.cpp index 9494478..4270bc6 100644 --- a/Pocketing.cpp +++ b/Pocketing.cpp @@ -719,6 +719,9 @@ Pocketing::Update( bool bPostApply) return false ; } + // assegno estremi degli assi dei vari percorsi di lavorazione e della lavorazione nel suo complesso + CalcAndSetAxesBBox() ; + // esecuzione eventuali personalizzazioni string sErr ; if ( bPostApply && ! PostApply( sErr)) { diff --git a/Processor.cpp b/Processor.cpp index 719e639..e504302 100644 --- a/Processor.cpp +++ b/Processor.cpp @@ -325,14 +325,17 @@ Processor::ProcessMachining( int nOpId, int nOpInd) if ( ! m_pMchMgr->GetMachiningParam( MPA_SPEED, dSpeed)) return false ; - // Recupero punti di minimo e massimo ingombro + // Recupero punti di minimo e massimo di ingombro e degli assi int nClId = m_pGeomDB->GetFirstNameInGroup( nOpId, MCH_CL) ; Point3d ptMin, ptMax ; m_pGeomDB->GetInfo( nClId, KEY_MMIN, ptMin) ; m_pGeomDB->GetInfo( nClId, KEY_MMAX, ptMax) ; + DBLVECTOR vAxMin, vAxMax ; + m_pGeomDB->GetInfo( nClId, KEY_MAXMIN, vAxMin) ; + m_pGeomDB->GetInfo( nClId, KEY_MAXMAX, vAxMax) ; // Emetto inizio lavorazione - if ( ! OnMachiningStart( nOpId, nOpInd, dSpeed, ptMin, ptMax)) + if ( ! OnMachiningStart( nOpId, nOpInd, dSpeed, ptMin, ptMax, vAxMin, vAxMax)) return false ; // Ciclo su tutti i percorsi CL della lavorazione @@ -370,6 +373,10 @@ Processor::ProcessClPath( int nClPathId, int nClPathInd, int nOpId, int nOpInd) Point3d ptMin, ptMax ; m_pGeomDB->GetInfo( nClPathId, KEY_PMIN, ptMin) ; m_pGeomDB->GetInfo( nClPathId, KEY_PMAX, ptMax) ; + // Recupero valori degli assi di minimo e massimo ingombro + DBLVECTOR vAxMin, vAxMax ; + m_pGeomDB->GetInfo( nClPathId, KEY_PAXMIN, vAxMin) ; + m_pGeomDB->GetInfo( nClPathId, KEY_PAXMAX, vAxMax) ; // Recupero massima elevazione double dElev = 0 ; m_pGeomDB->GetInfo( nClPathId, KEY_ELEV, dElev) ; @@ -377,7 +384,7 @@ Processor::ProcessClPath( int nClPathId, int nClPathInd, int nOpId, int nOpInd) int nAS = 0 ; m_pGeomDB->GetInfo( nClPathId, KEY_AS_TOT, nAS) ; // Emetto inizio percorso di lavoro - if ( ! OnPathStart( nClPathId, nClPathInd, nAS, ptStart, ptEnd, vtExtr, ptMin, ptMax, dElev)) + if ( ! OnPathStart( nClPathId, nClPathInd, nAS, ptStart, ptEnd, vtExtr, ptMin, ptMax, vAxMin, vAxMax, dElev)) return false ; // Emissione eventuali dati ausiliari di inizio @@ -852,7 +859,8 @@ Processor::OnToolDeselect( const string& sNextTool, const string& sNextHead, int //---------------------------------------------------------------------------- bool -Processor::OnMachiningStart( int nOpId, int nOpInd, double dSpeed, const Point3d& ptMin, const Point3d& ptMax) +Processor::OnMachiningStart( int nOpId, int nOpInd, double dSpeed, const Point3d& ptMin, const Point3d& ptMax, + const DBLVECTOR& vAxMin, const DBLVECTOR& vAxMax) { // assegno identificativo e indice lavorazione bool bOk = m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MCHID, nOpId) ; @@ -862,6 +870,9 @@ Processor::OnMachiningStart( int nOpId, int nOpInd, double dSpeed, const Point3d // assegno punti estremi dell'ingombro della lavorazione bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MMIN, ptMin) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MMAX, ptMax) ; + // assegno punti estremi dell'ingombro degli assi della lavorazione + bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MAXMIN, vAxMin) ; + bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MAXMAX, vAxMax) ; // chiamo la funzione di inizio lavorazione bOk = bOk && CallOnMachiningStart() ; return bOk ; @@ -879,7 +890,8 @@ Processor::OnMachiningEnd( void) //---------------------------------------------------------------------------- bool Processor::OnPathStart( int nClPathId, int nClPathInd, int nAS, const Point3d& ptStart, const Point3d& ptEnd, - const Vector3d& vtExtr, const Point3d& ptMin, const Point3d& ptMax, double dElev) + const Vector3d& vtExtr, const Point3d& ptMin, const Point3d& ptMax, + const DBLVECTOR& vAxMin, const DBLVECTOR& vAxMax, double dElev) { // assegno identificativo e indice percorso di lavorazione bool bOk = m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_PATHID, nClPathId) ; @@ -893,6 +905,9 @@ Processor::OnPathStart( int nClPathId, int nClPathInd, int nAS, const Point3d& p // assegno punti estremi dell'ingombro del percorso di lavorazione bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_PMIN, ptMin) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_PMAX, ptMax) ; + // assegno punti estremi dell'ingombro degli assi della lavorazione + bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_PAXMIN, vAxMin) ; + bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_PAXMAX, vAxMax) ; // assegno la massima elevazione bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_ELEV, dElev) ; // chiamo la funzione di inizio percorso di lavorazione diff --git a/Processor.h b/Processor.h index 8bfee61..3841735 100644 --- a/Processor.h +++ b/Processor.h @@ -50,10 +50,12 @@ class Processor bool OnFixtureData( int nFixId, int nFixInd, const std::string& sName, const Point3d& ptPos, double dAngDeg, double dMov) ; bool OnRawMoveData( int nRawId, int RawMoveInd, int nType, const Point3d& ptPos, int nFlag) ; - bool OnMachiningStart( int nOpId, int nOpInd, double dSpeed, const Point3d& ptMin, const Point3d& ptMax) ; + bool OnMachiningStart( int nOpId, int nOpInd, double dSpeed, const Point3d& ptMin, const Point3d& ptMax, + const DBLVECTOR& vAxMin, const DBLVECTOR& vAxMax) ; bool OnMachiningEnd( void) ; bool OnPathStart( int nClPathId, int nClPathInd, int nAS, const Point3d& ptStart, const Point3d& ptEnd, - const Vector3d& vtExtr, const Point3d& ptMin, const Point3d& ptMax, double dElev) ; + const Vector3d& vtExtr, const Point3d& ptMin, const Point3d& ptMax, + const DBLVECTOR& vAxMin, const DBLVECTOR& vAxMax, double dElev) ; bool OnPathEnd( int nAE) ; bool OnPathStartAux( int nInd, const std::string& sAS) ; bool OnPathEndAux( int nInd, const std::string& sAE) ; diff --git a/SawFinishing.cpp b/SawFinishing.cpp index 729fbc7..ad603ef 100644 --- a/SawFinishing.cpp +++ b/SawFinishing.cpp @@ -632,6 +632,9 @@ SawFinishing::Update( bool bPostApply) return false ; } + // assegno estremi degli assi dei vari percorsi di lavorazione e della lavorazione nel suo complesso + CalcAndSetAxesBBox() ; + // esecuzione eventuali personalizzazioni string sErr ; if ( bPostApply && ! PostApply( sErr)) { diff --git a/SawRoughing.cpp b/SawRoughing.cpp index c1d128c..a3f5d3c 100644 --- a/SawRoughing.cpp +++ b/SawRoughing.cpp @@ -596,6 +596,9 @@ SawRoughing::Update( bool bPostApply) return false ; } + // assegno estremi degli assi dei vari percorsi di lavorazione e della lavorazione nel suo complesso + CalcAndSetAxesBBox() ; + // esecuzione eventuali personalizzazioni string sErr ; if ( bPostApply && ! PostApply( sErr)) { diff --git a/Sawing.cpp b/Sawing.cpp index 1cb0685..cdf22c2 100644 --- a/Sawing.cpp +++ b/Sawing.cpp @@ -760,6 +760,9 @@ Sawing::Update( bool bPostApply) // aggiustamento feed per movimenti 4 assi AdjustFeeds() ; + // assegno estremi degli assi dei vari percorsi di lavorazione e della lavorazione nel suo complesso + CalcAndSetAxesBBox() ; + // gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione if ( ! AdjustStartEndMovements()) { string sInfo = m_pMchMgr->GetOutstrokeInfo() ; diff --git a/SurfFinishing.cpp b/SurfFinishing.cpp index bc9e6ea..f2dbbce 100644 --- a/SurfFinishing.cpp +++ b/SurfFinishing.cpp @@ -625,6 +625,9 @@ SurfFinishing::Update( bool bPostApply) return false ; } + // assegno estremi degli assi dei vari percorsi di lavorazione e della lavorazione nel suo complesso + CalcAndSetAxesBBox() ; + // esecuzione eventuali personalizzazioni string sErr ; if ( bPostApply && ! PostApply( sErr)) { diff --git a/WaterJetting.cpp b/WaterJetting.cpp index e86d81f..ef789ae 100644 --- a/WaterJetting.cpp +++ b/WaterJetting.cpp @@ -756,6 +756,9 @@ WaterJetting::Update( bool bPostApply) return false ; } + // assegno estremi degli assi dei vari percorsi di lavorazione e della lavorazione nel suo complesso + CalcAndSetAxesBBox() ; + // esecuzione eventuali personalizzazioni string sErr ; if ( bPostApply && ! PostApply( sErr)) { @@ -1277,13 +1280,7 @@ WaterJetting::VerifySideAngle( void) bool WaterJetting::AdjustEndPointForAxesCalc( const CamData* pCamData, Point3d& ptP) const { - // se utensile lama - if ( ( m_TParams.m_nType & TF_SAWBLADE) != 0) { - // traslazione opposta a quanto fatto in AdjustPathDrawForSaw - double dOffset = 0.5 * m_TParams.m_dTDiam - 10 * EPS_SMALL ; - ptP.Translate( dOffset * pCamData->GetCorrDir()) ; - } - // negli altri casi, non devo fare alcunché + // non devo fare alcunché return true ; } @@ -1356,10 +1353,20 @@ WaterJetting::ProcessPath( int nPathId, int nPvId, int nClId) // se percorso chiuso con lavorazione all'interno, porto la partenza a metà del lato abbastanza lungo a Xmin if ( pCompo->IsClosed()) { - double dArea ; - if ( pCompo->GetAreaXY( dArea) && - ( ( dArea < 0 && m_Params.m_nWorkSide == WJET_WS_RIGHT) || - ( dArea > 0 && m_Params.m_nWorkSide == WJET_WS_LEFT))) { + // recupero indicazione lato di inizio + int nStart = 0 ; + string sMyNotes = m_Params.m_sUserNotes ; + ToUpper( sMyNotes) ; + if ( sMyNotes.find( "START=XP") != string::npos) + nStart = 1 ; + else if ( sMyNotes.find( "START=XM") != string::npos) + nStart = -1 ; + else if ( sMyNotes.find( "START=YP") != string::npos) + nStart = 2 ; + else if ( sMyNotes.find( "START=YM") != string::npos) + nStart = -2 ; + // se richiesta sistemazione punto di inizio + if ( nStart != 0) { const double DIST_SIC_WJ_LIO = 2 ; double dMinLen = m_Params.m_dOverlap + 2 * DIST_SIC_WJ_LIO ; if ( m_Params.m_nLeadInType != WJET_LI_NONE) @@ -1368,14 +1375,18 @@ WaterJetting::ProcessPath( int nPathId, int nPvId, int nClId) dMinLen += ( m_Params.m_nLeadOutType == WJET_LO_AS_LI ? m_Params.m_dLiTang : m_Params.m_dLoTang) ; int i = 0 ; int nMin = - 1 ; - double dXmin = INFINITO ; + double dValEstr = ( nStart > 0 ? -INFINITO : INFINITO) ; const ICurve* pCrv = pCompo->GetFirstCurve() ; while ( pCrv != nullptr) { double dLen ; Point3d ptMid ; if ( pCrv->GetLength( dLen) && dLen > dMinLen && - pCrv->GetMidPoint( ptMid) && ptMid.x < dXmin) { - dXmin = ptMid.x ; + pCrv->GetMidPoint( ptMid) && + (( nStart == 1 && ptMid.x > dValEstr) || + ( nStart == -1 && ptMid.x < dValEstr) || + ( nStart == 2 && ptMid.y > dValEstr) || + ( nStart == -2 && ptMid.y < dValEstr))) { + dValEstr = ( abs( nStart) == 1 ? ptMid.x : ptMid.y) ; nMin = i ; } ++ i ;