Files
Carlo Baronchelli 741791a0e4 Copia locale Iniziale
2022-05-19 16:04:07 +02:00

340 lines
9.7 KiB
Plaintext

-- EgtMachine.lua by EgalTech s.r.l. 11/05/2015
-- Tavola per definizione modulo (serve ma non usata)
local EgtMachine = {}
print( 'EgtMachine started')
-- Include
require( 'EgtBase')
-- Funzioni ausiliarie
local function CalcSqrDiff( Ax, Vx, Vxpre)
local Diff = Vx - Vxpre
if Ax == 'C' or Ax == 'B' then
Diff = Diff * 10
end
return Diff * Diff
end
-- Movimento degli assi (da 1 a 5)
function MoveAxes( A1, V1, A2, V2, A3, V3, A4, V4, A5, V5)
local Len = 0
local V1pre = 0
if A1 and V1 then
V1pre = EgtGetAxisPos(A1)
Len = Len + CalcSqrDiff( A1, V1, V1pre)
end
local V2pre = 0
if A2 and V2 then
V2pre = EgtGetAxisPos(A2)
Len = Len + CalcSqrDiff( A2, V2, V2pre)
end
local V3pre = 0
if A3 and V3 then
V3pre = EgtGetAxisPos(A3)
Len = Len + CalcSqrDiff( A3, V3, V3pre)
end
if A4 and V4 then
V4pre = EgtGetAxisPos(A4)
Len = Len + CalcSqrDiff( A4, V4, V4pre)
end
if A5 and V5 then
V5pre = EgtGetAxisPos(A5)
Len = Len + CalcSqrDiff( A5, V5, V5pre)
end
Len = sqrt( Len)
local Steps = max( ceil( Len / 50), 1)
for i = 0, Steps do
local sOut = ''
local dFraz = i / Steps
if A1 and V1 then
local dPos1 = V1pre * ( 1 - dFraz) + V1 * dFraz
EgtSetAxisPos( A1, dPos1)
sOut = sOut .. ' ' .. A1 .. string.format('%10.3f',dPos1)
end
if A2 and V2 then
local dPos2 = V2pre * ( 1 - dFraz) + V2 * dFraz
EgtSetAxisPos( A2, dPos2)
sOut = sOut .. ' ' .. A2 .. string.format('%10.3f',dPos2)
end
if A3 and V3 then
local dPos3 = V3pre * ( 1 - dFraz) + V3 * dFraz
EgtSetAxisPos( A3, dPos3)
sOut = sOut .. ' ' .. A3 .. string.format('%10.3f',dPos3)
end
if A4 and V4 then
local dPos4 = V4pre * ( 1 - dFraz) + V4 * dFraz
EgtSetAxisPos( A4, dPos4)
sOut = sOut .. ' ' .. A4 .. string.format('%10.3f',dPos4)
end
if A5 and V5 then
local dPos5 = V5pre * ( 1 - dFraz) + V5 * dFraz
EgtSetAxisPos( A5, dPos5)
sOut = sOut .. ' ' .. A5 .. string.format('%10.3f',dPos5)
end
EgtDraw()
EgtTestBreak(0,0)
EgtOutText(sOut)
end
end
-- Riporta gli assi alla posizione home istantaneamente
function ResetAllAxes()
EgtResetAxisPos( 'X')
EgtResetAxisPos( 'Y')
EgtResetAxisPos( 'Z')
EgtResetAxisPos( 'C')
EgtResetAxisPos( 'B')
EgtDraw()
end
-- Salgo a Zmax
function MoveToZHome()
-- posizione home della Z
local Zhome = EgtGetAxisHomePos( 'Z')
-- risalita in Z
MoveAxes( 'Z', Zhome)
end
-- Vado al cambio utensili
function MoveToToolChange()
-- posizioni home degli assi (tranne X)
local Yhome = EgtGetAxisHomePos( 'Y')
local Zhome = EgtGetAxisHomePos( 'Z')
local Chome = EgtGetAxisHomePos( 'C')
local Bhome = EgtGetAxisHomePos( 'B')
-- risalita in Z
MoveAxes( 'Z', Zhome)
-- altri assi
MoveAxes( 'Y', Yhome, 'C', Chome, 'B', Bhome)
end
-- Riporta gli assi alla posizione home con movimento prima Z poi XYCB
function MoveToHome()
-- posizioni home degli assi
local Xhome = EgtGetAxisHomePos( 'X')
local Yhome = EgtGetAxisHomePos( 'Y')
local Zhome = EgtGetAxisHomePos( 'Z')
local Chome = EgtGetAxisHomePos( 'C')
local Bhome = EgtGetAxisHomePos( 'B')
-- risalita in Z
MoveAxes( 'Z', Zhome)
-- altri assi
MoveAxes( 'X', Xhome, 'Y', Yhome, 'C', Chome, 'B', Bhome)
end
function SimuDrill( nId, dMaxMat)
local bOkR, nStatR, dA1, dB1, dA2, dB2
local bOkL, nStatL, dX, dY, dZ
local bOkS, nStatS
local vtV, vtIn
local ptP, ptOut, ptIn
-- Recupero versore estrusione, versore profondità e punto foro
vtV = EgtCurveExtrusion( nId, GDB_ID.ROOT)
vtIn = EgtET( nId, GDB_ID.ROOT)
ptP = EgtCP( nId, GDB_ID.ROOT)
-- calcolo angoli macchina
bOkR, nStatR, dA1, dB1, dA2, dB2 = EgtGetCalcAngles( vtV)
-- punto fuori
ptOut = ptP + vtV * 80
bOkL, nStatL, dX, dY, dZ = EgtGetCalcPositions( ptOut, dA1, dB1)
bOkS, nStatS = EgtVerifyOutstroke( dX, dY, dZ, dA1, dB1)
if not bOkS or nStatS ~= 0 then
if not EgtOutBox( "Out Of Stroke", '', 'Error') then
return false
end
end
MoveAxes( 'X', dX, 'Y', dY, 'C', dA1, 'B', dB1)
MoveAxes( 'Z', dZ)
EgtTestBreak(0,100)
-- se previsto massimo materiale, limito il punto dentro
if dMaxMat and vtIn:len() > dMaxMat then
vtIn = vtIn / vtIn:len() * dMaxMat
end
-- punto dentro
ptIn = ptP + vtIn
bOkL, nStatL, dX, dY, dZ = EgtGetCalcPositions( ptIn, dA1, dB1)
bOkS, nStatS = EgtVerifyOutstroke( dX, dY, dZ, dA1, dB1)
if not bOkS or nStatS ~= 0 then
if not EgtOutBox( "Out Of Stroke", '', 'Error') then
return false
end
end
MoveAxes( 'X', dX, 'Y', dY, 'Z', dZ)
EgtTestBreak(0,200)
-- ritorno fuori
bOkL, nStatL, dX, dY, dZ = EgtGetCalcPositions( ptOut, dA1, dB1)
MoveAxes( 'X', dX, 'Y', dY, 'Z', dZ)
EgtTestBreak(0,100)
return true
end
function SimuUnderDrill( nId, dMaxMat, angOut, dLen)
local bOkR, nStatR, dA1, dB1, dA2, dB2
local bOkL, nStatL, dX, dY, dZ
local bOkS, nStatS
local vtV, vtIn
local ptP, ptOut, ptIn
-- Recupero versore estrusione, versore profondità e punto foro
vtV = EgtCurveExtrusion( nId, GDB_ID.ROOT)
vtIn = EgtET( nId, GDB_ID.ROOT)
ptP = EgtCP( nId, GDB_ID.ROOT)
-- Verifico versore foro come Z-
if not AreSameVectorApprox( vtV, - Z_AX()) then
EgtOutBox( "Hole not from bottom", '', 'Error')
return false
end
-- calcolo angoli macchina
bOkR, nStatR, dA1, dB1, dA2, dB2 = EgtGetCalcAngles( vtV, VectorFromPolar( 1, angOut))
-- punto di approccio
ptOut = ptP + vtV * 20
ptAppr = ptOut + VectorFromPolar( dLen, angOut)
bOkL, nStatL, dX, dY, dZ = EgtGetCalcPositions( ptAppr, dA1, dB1)
bOkS, nStatS = EgtVerifyOutstroke( dX, dY, dZ, dA1, dB1)
if not bOkS or nStatS ~= 0 then
if not EgtOutBox( "Out Of Stroke", '', 'Error') then
return false
end
end
MoveAxes( 'X', dX, 'Y', dY, 'C', dA1, 'B', dB1)
MoveAxes( 'Z', dZ)
EgtTestBreak(0,100)
-- punto fuori
bOkL, nStatL, dX, dY, dZ = EgtGetCalcPositions( ptOut, dA1, dB1)
bOkS, nStatS = EgtVerifyOutstroke( dX, dY, dZ, dA1, dB1)
if not bOkS or nStatS ~= 0 then
if not EgtOutBox( "Out Of Stroke", '', 'Error') then
return false
end
end
MoveAxes( 'X', dX, 'Y', dY, 'Z', dZ)
EgtTestBreak(0,100)
-- se previsto massimo materiale, limito il punto dentro
if dMaxMat and vtIn:len() > dMaxMat then
vtIn = vtIn / vtIn:len() * dMaxMat
end
-- punto dentro
ptIn = ptP + vtIn
bOkL, nStatL, dX, dY, dZ = EgtGetCalcPositions( ptIn, dA1, dB1)
bOkS, nStatS = EgtVerifyOutstroke( dX, dY, dZ, dA1, dB1)
if not bOkS or nStatS ~= 0 then
if not EgtOutBox( "Out Of Stroke", '', 'Error') then
return false
end
end
MoveAxes( 'X', dX, 'Y', dY, 'Z', dZ)
EgtTestBreak(0,200)
-- ritorno fuori
bOkL, nStatL, dX, dY, dZ = EgtGetCalcPositions( ptOut, dA1, dB1)
MoveAxes( 'X', dX, 'Y', dY, 'Z', dZ)
EgtTestBreak(0,100)
-- ritorno approccio
bOkL, nStatL, dX, dY, dZ = EgtGetCalcPositions( ptAppr, dA1, dB1)
MoveAxes( 'X', dX, 'Y', dY, 'Z', dZ)
EgtTestBreak(0,100)
return true
end
function SimuCut( nId, nCrv, dUnder, bHeadRight, bNotInvert, bOut, dAgg)
-- verifico sia una retta
--if EgtGetType( nId) ~= GDB_TY.CRV_LINE then
-- return
--end
-- estremi retta, versore tg, affondamento
local ptP1 = EgtUP( nId, ( nCrv - 1), GDB_ID.ROOT)
local ptP2 = EgtUP( nId, nCrv, GDB_ID.ROOT)
local vtTg = EgtUV( nId, nCrv, - 1, GDB_ID.ROOT)
local dAff = EgtCurveThickness( nId, GDB_ID.ROOT)
if dAff then
dAff = abs(dAff)
else
dAff = 0
end
-- versore perpendicolare
local vtPerp = Vector3d( vtTg)
if bHeadRight then
vtPerp:rotate( Z_AX(), -90)
else
vtPerp:rotate( Z_AX(), 90)
end
-- se da invertire
if not bNotInvert then
local ptT = ptP1
ptP1 = ptP2
ptP2 = ptT
vtTg = - vtTg
end
-- dati utensile
local Tool = EgtGetCalcTool()
EgtTdbSetCurrTool(Tool)
local dRad = EgtTdbGetCurrToolParam(MCH_TP.DIAM) / 2
local dTh = EgtTdbGetCurrToolParam(MCH_TP.THICK)
-- angoli macchina
local bOkR, nStatR, dA1, dB1, dA2, dB2 = EgtGetCalcAngles( vtPerp)
local bOkL, nStatL, dX, dY, dZ
local bOkS, nStatS
-- punto iniziale
local dSu = dRad - dAff - dUnder
local ptIni = ptP1 + Z_AX() * dSu
if not bHeadRight then
ptIni = ptIni - vtPerp * dTh
end
if bOut then
local dOut = sqrt( dRad * dRad - dSu * dSu)
ptIni = ptIni - vtTg * dOut
end
bOkL, nStatL, dX, dY, dZ = EgtGetCalcPositions( ptIni, dA1, dB1)
bOkS, nStatS = EgtVerifyOutstroke( dX, dY, dZ, dA1, dB1)
if not bOkS or nStatS ~= 0 then
if not EgtOutBox( "Out Of Stroke", '', 'Error') then
return false
end
end
-- verifico se mi muovo anche in Z
local bPause = false
local dOldZ = EgtGetAxisPos('Z')
if dOldZ then
if abs( dZ - dOldZ) > 100 * GEO.EPS_SMALL then
bPause = true
end
end
MoveAxes( 'X', dX, 'Y', dY, 'C', dA1, 'B', dB1)
if bPause then
EgtTestBreak(0,50)
end
MoveAxes( 'Z', dZ)
if bPause then
EgtTestBreak(0,50)
end
-- punto finale
local ptFin = ptP2 + Z_AX() * dSu
if dAgg then
ptFin = ptFin + vtTg * dAgg
end
if not bHeadRight then
ptFin = ptFin - vtPerp * dTh
end
bOkL, nStatL, dX, dY, dZ = EgtGetCalcPositions( ptFin, dA1, dB1)
bOkS, nStatS = EgtVerifyOutstroke( dX, dY, dZ, dA1, dB1)
if not bOkS or nStatS ~= 0 then
if not EgtOutBox( "Out Of Stroke", '', 'Error') then
return false
end
end
MoveAxes( 'X', dX, 'Y', dY)
EgtTestBreak(0,5)
return true
end
return EgtMachine