|
|
|
@@ -1,4 +1,4 @@
|
|
|
|
|
-- FacesBySaw.lua by Egaltech s.r.l. 2023/05/18
|
|
|
|
|
-- FacesBySaw.lua by Egaltech s.r.l. 2023/06/14
|
|
|
|
|
-- Gestione taglio con lama di feature con una o due facce
|
|
|
|
|
-- 2021/01/06 Cambiato limite per attacco Tg con lama e CalcLeadInOutGeom rinominata in CalcLeadInOutPerpGeom.
|
|
|
|
|
-- 2021/02/03 In taglio lama si accettano anche due lati con deviazione minore di 20deg.
|
|
|
|
@@ -16,6 +16,7 @@
|
|
|
|
|
-- 2023/02/13 Migliorata la direzione di lavoro della lama in modo da essere tendenzialmente opposta all'avanzamento.
|
|
|
|
|
-- 2023/04/20 Alcune modifiche per gestire tagli con faceuse parallelo.
|
|
|
|
|
-- 2023/05/18 Imposto in ogni caso dVzLimDwnUp prima anche di bDownHead.
|
|
|
|
|
-- 2023/06/14 Aggiunta MakeParallelOne e tolti parametri nForceWorkSide, nForceSCC da MakeOne.
|
|
|
|
|
|
|
|
|
|
-- Tabella per definizione modulo
|
|
|
|
|
local FacesBySaw = {}
|
|
|
|
@@ -32,7 +33,124 @@ local BD = require( 'BeamData')
|
|
|
|
|
local ML = require( 'MachiningLib')
|
|
|
|
|
|
|
|
|
|
---------------------------------------------------------------------
|
|
|
|
|
function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDwnUp, dCutExtra, dCutSic, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw, bForceInvert, nForceWorkSide, nForceSCC)
|
|
|
|
|
function MakeParallelOne( nSurfId, nFacet, sCutting, dSawDiam, nFaceUse, dVzLimDwnUp, dCutExtra, dCutSic, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw, bForceInvert)
|
|
|
|
|
-- dati della faccia
|
|
|
|
|
local ptC, vtN = EgtSurfTmFacetCenter( nSurfId, nFacet, GDB_ID.ROOT)
|
|
|
|
|
-- accetto solo facce perpendicolari all'asse X della trave
|
|
|
|
|
if not AreSameOrOppositeVectorApprox( vtN, X_AX()) then
|
|
|
|
|
EgtOutLog( 'Error : MakeParallelOne only for faces perpendicular to XAxis')
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
-- l'uso della faccia deve consentire una scelta robusta del percorso
|
|
|
|
|
if nFaceUse == MCH_MILL_FU.PARAL_LEFT or
|
|
|
|
|
nFaceUse == MCH_MILL_FU.PARAL_RIGHT then
|
|
|
|
|
EgtOutLog( 'Error : MakeParallelOne impossible with PARAL_LEFT or PARAL_RIGHT FaceUse')
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
-- distanza della faccia dall'estremo trave verso cui è rivolta
|
|
|
|
|
local dDistX = EgtIf( vtN:getX() > 0, b3Raw:getMax():getX() - ptC:getX(), ptC:getX() - b3Raw:getMin():getX())
|
|
|
|
|
-- lunghezza attacco/uscita perpendicolari
|
|
|
|
|
local dLiTang = 0
|
|
|
|
|
local dLiPerp = dDistX + dCutExtra + dCutSic
|
|
|
|
|
local dLoTang = dLiTang
|
|
|
|
|
local dLoPerp = dLiPerp
|
|
|
|
|
-- lunghezza attacco/uscita tangenti
|
|
|
|
|
local dLi2Tang = dSawDiam / 2 + dCutSic
|
|
|
|
|
local dLi2Perp = 0
|
|
|
|
|
local dLo2Tang = dLi2Tang
|
|
|
|
|
local dLo2Perp = dLi2Perp
|
|
|
|
|
-- scelgo l'attacco più conveniente
|
|
|
|
|
local bLioTang
|
|
|
|
|
local Ktp = 1.1
|
|
|
|
|
if BD.KIOTP then Ktp = BD.KIOTP end
|
|
|
|
|
if Ktp * dLi2Tang < dLiPerp then
|
|
|
|
|
bLioTang = true
|
|
|
|
|
dLiTang, dLiPerp, dLoTang, dLoPerp = dLi2Tang, dLi2Perp, dLo2Tang, dLo2Perp
|
|
|
|
|
if BD.TURN then
|
|
|
|
|
local dMove = EgtIf( nFaceUse == MCH_MILL_FU.PARAL_DOWN or nFaceUse == MCH_MILL_FU.PARAL_TOP, b3Raw:getDimY(), b3Raw:getDimZ())
|
|
|
|
|
dLoTang = -( dLiTang - dAccStart - dAccEnd + dMove)
|
|
|
|
|
dLoPerp = BD.COLL_SIC
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
-- verifico se la lama ruota in senso antiorario
|
|
|
|
|
if not EgtMdbSetCurrMachining( sCutting) then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
local bIsSawCCW = ( EgtMdbGetCurrMachiningParam( MCH_MP.SPEED) < 0)
|
|
|
|
|
local bInvert = bForceInvert
|
|
|
|
|
-- se la lama ruota in senso antiorario inverto la direzione di lavorazione, per avere rotazione lama opposta a avanzamento
|
|
|
|
|
if bInvert == nil then
|
|
|
|
|
bInvert = ( not bIsSawCCW)
|
|
|
|
|
if not BD.TURN then
|
|
|
|
|
if bIsSawCCW then
|
|
|
|
|
bInvert = (( nFaceUse == MCH_MILL_FU.PARAL_FRONT and vtN:getX() > 0) or ( nFaceUse == MCH_MILL_FU.PARAL_BACK and vtN:getX() < 0))
|
|
|
|
|
else
|
|
|
|
|
bInvert = (( nFaceUse == MCH_MILL_FU.PARAL_FRONT and vtN:getX() < 0) or ( nFaceUse == MCH_MILL_FU.PARAL_BACK and vtN:getX() > 0))
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
local nWorkSide = EgtIf( bInvert, MCH_MILL_WS.LEFT, MCH_MILL_WS.RIGHT)
|
|
|
|
|
-- posizione braccio
|
|
|
|
|
local nSCC = MCH_SCC.NONE
|
|
|
|
|
if BD.TURN then
|
|
|
|
|
nSCC = EgtIf( nFaceUse == MCH_MILL_FU.PARAL_DOWN or nFaceUse == MCH_MILL_FU.PARAL_TOP, MCH_SCC.ADIR_YP, MCH_SCC.ADIR_ZP)
|
|
|
|
|
else
|
|
|
|
|
nSCC = EgtIf( vtN:getX() > 0, MCH_SCC.ADIR_XP, MCH_SCC.ADIR_XM)
|
|
|
|
|
end
|
|
|
|
|
-- inserisco la lavorazione di taglio
|
|
|
|
|
local sName = 'Cut_' .. ( EgtGetName( nSurfId) or tostring( nSurfId)) .. '_' .. tostring( nFacet + 1)
|
|
|
|
|
local nMchFId = EgtAddMachining( sName, sCutting)
|
|
|
|
|
if not nMchFId then
|
|
|
|
|
local sErr = 'Error adding machining ' .. sName .. '-' .. sCutting
|
|
|
|
|
EgtOutLog( sErr)
|
|
|
|
|
return false, sErr
|
|
|
|
|
end
|
|
|
|
|
sName = EgtGetOperationName( nMchFId)
|
|
|
|
|
-- aggiungo geometria
|
|
|
|
|
EgtSetMachiningGeometry( {{ nSurfId, nFacet}})
|
|
|
|
|
-- imposto uso faccia
|
|
|
|
|
EgtSetMachiningParam( MCH_MP.FACEUSE, nFaceUse)
|
|
|
|
|
-- imposto posizione braccio porta testa
|
|
|
|
|
EgtSetMachiningParam( MCH_MP.SCC, nSCC)
|
|
|
|
|
-- imposto inversione e lato correzione
|
|
|
|
|
EgtSetMachiningParam( MCH_MP.INVERT, bInvert)
|
|
|
|
|
EgtSetMachiningParam( MCH_MP.WORKSIDE, nWorkSide)
|
|
|
|
|
-- affondamento aggiuntivo
|
|
|
|
|
EgtSetMachiningParam( MCH_MP.OFFSR, -dCutExtra)
|
|
|
|
|
-- offset longitudinale
|
|
|
|
|
EgtSetMachiningParam( MCH_MP.OFFSL, EgtIf( bDownUp, -dCutOffset, dCutOffset))
|
|
|
|
|
-- imposto attacco/uscita
|
|
|
|
|
EgtSetMachiningParam( MCH_MP.LITANG, dLiTang)
|
|
|
|
|
EgtSetMachiningParam( MCH_MP.LIPERP, dLiPerp)
|
|
|
|
|
if BD.TURN and bLioTang then EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, MCH_MILL_LO.PERP_TG) end
|
|
|
|
|
EgtSetMachiningParam( MCH_MP.LOTANG, dLoTang)
|
|
|
|
|
EgtSetMachiningParam( MCH_MP.LOPERP, dLoPerp)
|
|
|
|
|
-- imposto allungamenti iniziale e finale
|
|
|
|
|
EgtSetMachiningParam( MCH_MP.STARTADDLEN, -dAccStart)
|
|
|
|
|
EgtSetMachiningParam( MCH_MP.ENDADDLEN, -dAccEnd)
|
|
|
|
|
-- eventuali note
|
|
|
|
|
if sNotes and #sNotes > 0 then EgtSetMachiningParam( MCH_MP.USERNOTES, sNotes) end
|
|
|
|
|
-- eseguo
|
|
|
|
|
if not ML.ApplyMachining( true, false) then
|
|
|
|
|
local _, sErr = EgtGetLastMachMgrError()
|
|
|
|
|
EgtSetOperationMode( nMchFId, false)
|
|
|
|
|
return false, sErr
|
|
|
|
|
end
|
|
|
|
|
return true, sName, nMchFId
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
---------------------------------------------------------------------
|
|
|
|
|
function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDwnUp, dCutExtra, dCutSic, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw, bForceInvert)
|
|
|
|
|
-- se lama con asse parallelo alla faccia, passo alla apposita funzione
|
|
|
|
|
if ( Par5 == MCH_MILL_FU.PARAL_DOWN or
|
|
|
|
|
Par5 == MCH_MILL_FU.PARAL_TOP or
|
|
|
|
|
Par5 == MCH_MILL_FU.PARAL_FRONT or
|
|
|
|
|
Par5 == MCH_MILL_FU.PARAL_BACK or
|
|
|
|
|
Par5 == MCH_MILL_FU.PARAL_LEFT or
|
|
|
|
|
Par5 == MCH_MILL_FU.PARAL_RIGHT) then
|
|
|
|
|
return MakeParallelOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDwnUp, dCutExtra, dCutSic, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw, bForceInvert)
|
|
|
|
|
end
|
|
|
|
|
-- la lama ha asse perpendicolare alla faccia
|
|
|
|
|
-- dati della faccia
|
|
|
|
|
local ptC, vtN = EgtSurfTmFacetCenter( nSurfId, nFacet, GDB_ID.ROOT)
|
|
|
|
|
-- risolvo parametro ambiguo
|
|
|
|
@@ -113,17 +231,7 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw
|
|
|
|
|
local nFaceUse = nOrthoOpposite
|
|
|
|
|
if bDownUp then nFaceUse = BL.GetOrtupOpposite( nOrthoOpposite) end
|
|
|
|
|
local bWsRight = ( bInvert ~= bDownUp)
|
|
|
|
|
local nWorkSide = nForceWorkSide
|
|
|
|
|
if nWorkSide then
|
|
|
|
|
-- se il workside viene forzato, setto bWsRight di conseguenza
|
|
|
|
|
if nWorkSide == MCH_MILL_WS.LEFT then
|
|
|
|
|
bWsRight = false
|
|
|
|
|
else
|
|
|
|
|
bWsRight = true
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
nWorkSide = EgtIf( bWsRight, MCH_MILL_WS.RIGHT, MCH_MILL_WS.LEFT)
|
|
|
|
|
end
|
|
|
|
|
local nWorkSide = EgtIf( bWsRight, MCH_MILL_WS.RIGHT, MCH_MILL_WS.LEFT)
|
|
|
|
|
-- Versore di riferimento
|
|
|
|
|
local vtRef = Vector3d( vtTg)
|
|
|
|
|
vtRef:rotate( vtN, EgtIf( bInvert, -90, 90))
|
|
|
|
@@ -150,24 +258,12 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw
|
|
|
|
|
-- parametri di attacco/uscita
|
|
|
|
|
local b3Box = BBox3d( b3Raw)
|
|
|
|
|
b3Box:expand( dCutSic)
|
|
|
|
|
local dCutDeltaN, dCutDeltaX = dCutOffset, dCutExtra
|
|
|
|
|
-- per lavorazioni parallele, nel calcolo dei Lead-In e Out gli offset vanno invertiti
|
|
|
|
|
if ( nFaceUse == MCH_MILL_FU.PARAL_DOWN or
|
|
|
|
|
nFaceUse == MCH_MILL_FU.PARAL_TOP or
|
|
|
|
|
nFaceUse == MCH_MILL_FU.PARAL_FRONT or
|
|
|
|
|
nFaceUse == MCH_MILL_FU.PARAL_BACK or
|
|
|
|
|
nFaceUse == MCH_MILL_FU.PARAL_LEFT or
|
|
|
|
|
nFaceUse == MCH_MILL_FU.PARAL_RIGHT) then
|
|
|
|
|
dCutDeltaN, dCutDeltaX = dCutDeltaX, dCutDeltaN
|
|
|
|
|
end
|
|
|
|
|
local ptP1act = ptP1 + vtN * dCutDeltaN
|
|
|
|
|
local ptP2act = ptP2 + vtN * dCutDeltaN
|
|
|
|
|
-- attacco perpendicolare
|
|
|
|
|
local dLiTang, dLiPerp, dLoTang, dLoPerp, vtLio = FacesBySaw.CalcLeadInOutPerpGeom( ptP1act, ptP2act, vtV1, vtV2, vtN, dSawDiam/2, vtRef, dCutDeltaX, b3Box)
|
|
|
|
|
local dLiTang, dLiPerp, dLoTang, dLoPerp, vtLio = FacesBySaw.CalcLeadInOutPerpGeom( ptP1, ptP2, vtV1, vtV2, vtN, dSawDiam/2, vtRef, dCutExtra, b3Box)
|
|
|
|
|
local dLenLi = sqrt( dLiTang * dLiTang + dLiPerp * dLiPerp)
|
|
|
|
|
local dLenLo = sqrt( dLoTang * dLoTang + dLoPerp * dLoPerp)
|
|
|
|
|
-- attacco tangente
|
|
|
|
|
local dLi2Tang, dLi2Perp, dLo2Tang, dLo2Perp = FacesBySaw.CalcLeadInOutTangGeom( ptP1act, ptP2act, vtN, dSawDiam/2, vtRef, dCutDeltaX, b3Box)
|
|
|
|
|
local dLi2Tang, dLi2Perp, dLo2Tang, dLo2Perp = FacesBySaw.CalcLeadInOutTangGeom( ptP1, ptP2, vtN, dSawDiam/2, vtRef, dCutExtra, b3Box)
|
|
|
|
|
local dLenLi2 = abs( dLi2Tang)
|
|
|
|
|
local dLenLo2 = abs( dLo2Tang)
|
|
|
|
|
-- scelgo l'attacco più conveniente (se non taglio praticamente longitudinale)
|
|
|
|
@@ -190,37 +286,34 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw
|
|
|
|
|
end
|
|
|
|
|
-- posizione braccio
|
|
|
|
|
EgtOutLog( 'vtN=' .. tostring( vtN) .. ' vtRef=' .. tostring( vtRef) .. ' vtOut=' .. tostring( vtOut) .. ' vtAux=' .. tostring( vtAux), 3)
|
|
|
|
|
local nSCC = nForceSCC
|
|
|
|
|
if nSCC == nil then
|
|
|
|
|
nSCC = MCH_SCC.NONE
|
|
|
|
|
if not BD.TURN then
|
|
|
|
|
if abs( vtAux:getX()) > abs( vtAux:getY()) - GEO.EPS_SMALL then
|
|
|
|
|
nSCC = EgtIf( ( vtAux:getX() > -GEO.EPS_SMALL), MCH_SCC.ADIR_XP, MCH_SCC.ADIR_XM)
|
|
|
|
|
local nSCC = MCH_SCC.NONE
|
|
|
|
|
if not BD.TURN then
|
|
|
|
|
if abs( vtAux:getX()) > abs( vtAux:getY()) - GEO.EPS_SMALL then
|
|
|
|
|
nSCC = EgtIf( ( vtAux:getX() > -GEO.EPS_SMALL), MCH_SCC.ADIR_XP, MCH_SCC.ADIR_XM)
|
|
|
|
|
else
|
|
|
|
|
nSCC = EgtIf( ( vtAux:getY() > -GEO.EPS_SMALL), MCH_SCC.ADIR_YP, MCH_SCC.ADIR_YM)
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
if bLioTang then
|
|
|
|
|
--local vtTest = EgtIf( bInvert, vtTg, -vtTg)
|
|
|
|
|
local vtTest = -vtTg
|
|
|
|
|
if abs( vtTest:getY()) > abs( vtTest:getZ()) then
|
|
|
|
|
nSCC = EgtIf( vtTest:getY() > 0, MCH_SCC.ADIR_YP, MCH_SCC.ADIR_YM)
|
|
|
|
|
else
|
|
|
|
|
nSCC = EgtIf( ( vtAux:getY() > -GEO.EPS_SMALL), MCH_SCC.ADIR_YP, MCH_SCC.ADIR_YM)
|
|
|
|
|
nSCC = EgtIf( vtTest:getZ() > 0, MCH_SCC.ADIR_ZP, MCH_SCC.ADIR_ZM)
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
if bLioTang then
|
|
|
|
|
--local vtTest = EgtIf( bInvert, vtTg, -vtTg)
|
|
|
|
|
local vtTest = -vtTg
|
|
|
|
|
local vtTest = vtOut -- vtLio
|
|
|
|
|
if abs( vtN:getY()) < 0.174 and abs( vtN:getZ()) < 0.174 then
|
|
|
|
|
if abs( vtTest:getY()) > abs( vtTest:getZ()) then
|
|
|
|
|
nSCC = EgtIf( vtTest:getY() > 0, MCH_SCC.ADIR_YP, MCH_SCC.ADIR_YM)
|
|
|
|
|
else
|
|
|
|
|
nSCC = EgtIf( vtTest:getZ() > 0, MCH_SCC.ADIR_ZP, MCH_SCC.ADIR_ZM)
|
|
|
|
|
end
|
|
|
|
|
elseif abs( vtN:getZ()) < 0.174 then
|
|
|
|
|
nSCC = EgtIf( vtTest:getZ() > -0.017, MCH_SCC.ADIR_ZP, MCH_SCC.ADIR_ZM)
|
|
|
|
|
else
|
|
|
|
|
local vtTest = vtOut -- vtLio
|
|
|
|
|
if abs( vtN:getY()) < 0.174 and abs( vtN:getZ()) < 0.174 then
|
|
|
|
|
if abs( vtTest:getY()) > abs( vtTest:getZ()) then
|
|
|
|
|
nSCC = EgtIf( vtTest:getY() > 0, MCH_SCC.ADIR_YP, MCH_SCC.ADIR_YM)
|
|
|
|
|
else
|
|
|
|
|
nSCC = EgtIf( vtTest:getZ() > 0, MCH_SCC.ADIR_ZP, MCH_SCC.ADIR_ZM)
|
|
|
|
|
end
|
|
|
|
|
elseif abs( vtN:getZ()) < 0.174 then
|
|
|
|
|
nSCC = EgtIf( vtTest:getZ() > -0.017, MCH_SCC.ADIR_ZP, MCH_SCC.ADIR_ZM)
|
|
|
|
|
else
|
|
|
|
|
nSCC = EgtIf( vtTest:getY() > 0, MCH_SCC.ADIR_YP, MCH_SCC.ADIR_YM)
|
|
|
|
|
end
|
|
|
|
|
nSCC = EgtIf( vtTest:getY() > 0, MCH_SCC.ADIR_YP, MCH_SCC.ADIR_YM)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
@@ -299,7 +392,7 @@ function FacesBySaw.MakeTwo( Proc, nPhase, nRawId, nPartId, dOvmHead, sCutType,
|
|
|
|
|
return false, sErr
|
|
|
|
|
end
|
|
|
|
|
local ptM = ( ptT1 + ptT2) / 2
|
|
|
|
|
local vtTg = ptT2 - ptT1 ;
|
|
|
|
|
local vtTg = ptT2 - ptT1 ; vtTg:normalize()
|
|
|
|
|
local bConvex = ( dAngT > 0)
|
|
|
|
|
-- verifico non siano orientate troppo verso il basso e molto sbandate (oltre 10 deg)
|
|
|
|
|
local bFaceOk = {}
|
|
|
|
@@ -315,14 +408,14 @@ function FacesBySaw.MakeTwo( Proc, nPhase, nRawId, nPartId, dOvmHead, sCutType,
|
|
|
|
|
vtRef[1] = vtN[1] ^ vtTg
|
|
|
|
|
if vtRef[1] * vtN[2] < 0 then vtRef[1] = - vtRef[1] end
|
|
|
|
|
vtRef[1]:normalize()
|
|
|
|
|
if abs( vtRef[1]:getZ()) < 0.577 and abs( abs( vtRef[1]:getX()) - abs( vtRef[1]:getY())) < 0.1 then
|
|
|
|
|
if abs( vtTg:getZ()) < 0.708 and abs( vtRef[1]:getZ()) < 0.577 and abs( abs( vtRef[1]:getX()) - abs( vtRef[1]:getY())) < 0.1 then
|
|
|
|
|
vtRef[1] = ptC[1] - ptM
|
|
|
|
|
vtRef[1]:normalize()
|
|
|
|
|
end
|
|
|
|
|
vtRef[2] = vtN[2] ^ vtTg
|
|
|
|
|
if vtRef[2] * vtN[1] < 0 then vtRef[2] = - vtRef[2] end
|
|
|
|
|
vtRef[2]:normalize()
|
|
|
|
|
if abs( vtRef[2]:getZ()) < 0.577 and abs( abs( vtRef[2]:getX()) - abs( vtRef[2]:getY())) < 0.1 then
|
|
|
|
|
if abs( vtTg:getZ()) < 0.708 and abs( vtRef[2]:getZ()) < 0.577 and abs( abs( vtRef[2]:getX()) - abs( vtRef[2]:getY())) < 0.1 then
|
|
|
|
|
vtRef[2] = ptC[2] - ptM
|
|
|
|
|
vtRef[2]:normalize()
|
|
|
|
|
end
|
|
|
|
|