diff --git a/LuaLibs/BeamLib.lua b/LuaLibs/BeamLib.lua index 7ebf422..de70a72 100644 --- a/LuaLibs/BeamLib.lua +++ b/LuaLibs/BeamLib.lua @@ -678,7 +678,7 @@ function BeamLib.MakeOneFaceBySaw( nSurfId, nFacet, sCutting, dSawDiam, nOrthoOp -- affondamento aggiuntivo EgtSetMachiningParam( MCH_MP.OFFSR, -dCutExtra) -- offset longitudinale - EgtSetMachiningParam( MCH_MP.OFFSL, dCutOffset) + EgtSetMachiningParam( MCH_MP.OFFSL, EgtIf( bDownUp, -dCutOffset, dCutOffset)) -- imposto attacco/uscita EgtSetMachiningParam( MCH_MP.LITANG, dLiTang) EgtSetMachiningParam( MCH_MP.LIPERP, dLiPerp) diff --git a/LuaLibs/ProcessLapJoint.lua b/LuaLibs/ProcessLapJoint.lua index 4cf01c9..568e8aa 100644 --- a/LuaLibs/ProcessLapJoint.lua +++ b/LuaLibs/ProcessLapJoint.lua @@ -271,7 +271,7 @@ local function MakePreCuts( Proc, nPhase, nRawId, nPartId, b3Raw) end --------------------------------------------------------------------- -local function MakeByChainSaw( Proc, nPhase, nRawId, nPartId, nFacInd, rfFac, dH, dV) +local function MakeByChainOrSaw( Proc, nPhase, nRawId, nPartId, nFacInd, rfFac, dH, dV, dElev) -- Recupero le facce adiacenti alla principale local vAdj = EgtSurfTmFacetAdjacencies( Proc.Id, nFacInd)[1] if not vAdj or #vAdj == 0 then @@ -301,73 +301,119 @@ local function MakeByChainSaw( Proc, nPhase, nRawId, nPartId, nFacInd, rfFac, dH local bOpenStart = false local bOpenEnd = false local vAdj2 = EgtSurfTmFacetAdjacencies( Proc.Id, nFacAdj)[1] + EgtOutLog( 'Adj2=' .. table.concat( vAdj2, ' ,')) for j = 1, #vAdj2 do if vAdj2[j] == nFacInd then -- Se non esiste faccia adiacente a lato precedente -> inizio aperto local i = EgtIf( j > 1, j - 1, #vAdj2) + while vAdj2[i] == nFacInd do + i = EgtIf( i > 1, i - 1, #vAdj2) + end bOpenStart = ( vAdj2[i] < 0) -- Se non esiste faccia adiacente a lato successivo -> fine aperto local k = EgtIf( j < #vAdj2, j + 1, 1) + while vAdj2[k] == nFacInd do + k = EgtIf( k < #vAdj2, k + 1, 1) + end bOpenEnd = ( vAdj2[k] < 0) end end - -- Calcolo uso faccia - local nFaceUse = BL.GetNearestParalOpposite( rfFac:getVersZ()) - -- Calcolo angolo 3° asse rot (da direz. utensile) - local vtN = EgtSurfTmFacetNormVersor( Proc.Id, nFacAdj, GDB_ID.ROOT) - local ptP1, ptP2 = EgtSurfTmFacetOppositeSide( Proc.Id, nFacAdj, rfFac:getVersZ(), GDB_ID.ROOT) - local vtT = vtN ^ (ptP2 - ptP1) - local d3RotAng = EgtIf( abs( vtT:getZ()) < GEO.EPS_SMALL, 0, 90) - -- Recupero la lavorazione - local sSawing = ML.FindSawing( 'Sawing') - if not sSawing then - local sErr = 'Error on process ' .. tostring( Proc.Id) .. ' chainsawing not found in library' - EgtOutLog( sErr) - return false, sErr - end - -- Recupero i dati dell'utensile - local dSawWidth = 75 - local dSawThick = 8 - if EgtMdbSetCurrMachining( sSawing) then - local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) - if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then - dSawWidth = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dSawWidth - dSawThick = EgtTdbGetCurrToolParam( MCH_TP.THICK) or dSawThick - end - end - -- Verifico se necessarie più passate - local nStep = ceil( ( dV - 0.5) / dSawThick) - local dStep = 0 - if nStep > 1 then - dStep = ( dV - dSawThick) / ( nStep - 1) - end - for i = 1, nStep do - -- Applico la lavorazione con sega a catena a questa faccia - local sName = 'Csaw_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) .. '_' .. tostring( i) - local nMchFId = EgtAddMachining( sName, sSawing) - if not nMchFId then - local sErr = 'Error adding machining ' .. sName .. '-' .. sSawing + -- Se entrambi gli estremi sono aperti e fattibile con lama + if bOpenStart and bOpenEnd and dElev <= BD.MAX_DIM_DICE then + -- Recupero la lavorazione di lama + local sCutting = ML.FindCutting( 'HeadSide') + if not sCutting then + local sErr = 'Error on process ' .. tostring( Proc.Id) .. ' cutting not found in library' EgtOutLog( sErr) return false, sErr end - -- aggiungo geometria - EgtSetMachiningGeometry( {{ Proc.Id, nFacAdj}}) - -- imposto uso faccia - EgtSetMachiningParam( MCH_MP.FACEUSE, nFaceUse) - -- imposto accorciamento iniziale/finale per estremi aperti/chiusi - EgtSetMachiningParam( MCH_MP.STARTADDLEN, EgtIf( bOpenStart, 0, - dSawWidth / 2)) - EgtSetMachiningParam( MCH_MP.ENDADDLEN, EgtIf( bOpenEnd, 0, - dSawWidth / 2)) - -- imposto angolo 3° asse rot - EgtSetMachiningParam( MCH_MP.BLOCKEDAXIS, 'A=' .. EgtNumToString( d3RotAng)) - -- imposto offset radiale - local dOffs = ( i - 1) * dStep - EgtSetMachiningParam( MCH_MP.OFFSR, dOffs) - -- eseguo - if not EgtApplyMachining( true, false) then - local _, sErr = EgtGetLastMachMgrError() - EgtSetOperationMode( nMchFId, false) + -- recupero i dati dell'utensile + local dSawDiam = 400 + local dSawThick = 4 + if EgtMdbSetCurrMachining( sCutting) then + local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) + if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then + dSawDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dSawDiam + dSawThick = EgtTdbGetCurrToolParam( MCH_TP.THICK) or dSawThick + end + end + -- Calcolo uso faccia + local nFaceUse = BL.GetNearestOrthoOpposite( rfFac:getVersZ()) + -- ingombro del grezzo + local b3Raw = EgtGetRawPartBBox( nRawId) + -- Eseguo i tagli + local nStep = ceil( ( dV - 0.5) / dSawThick) + local dStep = 0 + if nStep > 1 then + dStep = ( dV - dSawThick) / ( nStep - 1) + end + for i = 1, nStep do + local dOffs = ( i - 1) * dStep + local bOk, sErr = BL.MakeOneFaceBySaw( Proc.Id, nFacAdj, sCutting, dSawDiam, nFaceUse, 0, BD.CUT_SIC, dOffs, nil, b3Raw) + if not bOk then + return bOk, sErr + end + end + -- altrimenti con sega a catena + else + -- Calcolo uso faccia + local nFaceUse = BL.GetNearestParalOpposite( rfFac:getVersZ()) + -- Calcolo angolo 3° asse rot (da direz. utensile) + local vtN = EgtSurfTmFacetNormVersor( Proc.Id, nFacAdj, GDB_ID.ROOT) + local ptP1, ptP2 = EgtSurfTmFacetOppositeSide( Proc.Id, nFacAdj, rfFac:getVersZ(), GDB_ID.ROOT) + local vtT = vtN ^ (ptP2 - ptP1) + local d3RotAng = EgtIf( abs( vtT:getZ()) < GEO.EPS_SMALL, 0, 90) + -- Recupero la lavorazione + local sSawing = ML.FindSawing( 'Sawing') + if not sSawing then + local sErr = 'Error on process ' .. tostring( Proc.Id) .. ' chainsawing not found in library' + EgtOutLog( sErr) return false, sErr end + -- Recupero i dati dell'utensile + local dSawWidth = 75 + local dSawThick = 8 + if EgtMdbSetCurrMachining( sSawing) then + local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) + if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then + dSawWidth = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dSawWidth + dSawThick = EgtTdbGetCurrToolParam( MCH_TP.THICK) or dSawThick + end + end + -- Verifico se necessarie più passate + local nStep = ceil( ( dV - 0.5) / dSawThick) + local dStep = 0 + if nStep > 1 then + dStep = ( dV - dSawThick) / ( nStep - 1) + end + for i = 1, nStep do + -- Applico la lavorazione con sega a catena a questa faccia + local sName = 'Csaw_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) .. '_' .. tostring( i) + local nMchFId = EgtAddMachining( sName, sSawing) + if not nMchFId then + local sErr = 'Error adding machining ' .. sName .. '-' .. sSawing + EgtOutLog( sErr) + return false, sErr + end + -- aggiungo geometria + EgtSetMachiningGeometry( {{ Proc.Id, nFacAdj}}) + -- imposto uso faccia + EgtSetMachiningParam( MCH_MP.FACEUSE, nFaceUse) + -- imposto accorciamento iniziale/finale per estremi aperti/chiusi + EgtSetMachiningParam( MCH_MP.STARTADDLEN, EgtIf( bOpenStart, 0, - dSawWidth / 2)) + EgtSetMachiningParam( MCH_MP.ENDADDLEN, EgtIf( bOpenEnd, 0, - dSawWidth / 2)) + -- imposto angolo 3° asse rot + EgtSetMachiningParam( MCH_MP.BLOCKEDAXIS, 'A=' .. EgtNumToString( d3RotAng)) + -- imposto offset radiale + local dOffs = ( i - 1) * dStep + EgtSetMachiningParam( MCH_MP.OFFSR, dOffs) + -- eseguo + if not EgtApplyMachining( true, false) then + local _, sErr = EgtGetLastMachMgrError() + EgtSetOperationMode( nMchFId, false) + return false, sErr + end + end end return true end @@ -417,7 +463,7 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId) end -- se una dimensione della faccia è più piccola del diametro utensile, va usata la sega a catena o la lama if dH < dMillDiam or dV < dMillDiam then - return MakeByChainSaw( Proc, nPhase, nRawId, nPartId, nFacInd, rfFac, dH, dV) + return MakeByChainOrSaw( Proc, nPhase, nRawId, nPartId, nFacInd, rfFac, dH, dV, dFacElev) end -- inserisco la lavorazione di svuotatura local sName = 'Pock_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id))