|
|
|
@@ -163,6 +163,29 @@ function OnSimulStart()
|
|
|
|
|
end
|
|
|
|
|
-- Preparo lista collisioni vuota
|
|
|
|
|
EMT.COLLIDE = {}
|
|
|
|
|
|
|
|
|
|
-- si crea gruppo temporaneo appoggio controllo clamping
|
|
|
|
|
CLAMP_CHECK_GROUP = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'CLAMP_CHECK')
|
|
|
|
|
CLAMP_CHECK_INTERS = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'CLAMP_INTERS')
|
|
|
|
|
|
|
|
|
|
if CLAMP_CHECK_GROUP then
|
|
|
|
|
EgtEmptyGroup( CLAMP_CHECK_GROUP)
|
|
|
|
|
else
|
|
|
|
|
local frClampCheckGroup = Frame3d( ORIG(), GDB_FR.FRONT)
|
|
|
|
|
CLAMP_CHECK_GROUP = EgtGroup( GDB_ID.ROOT, frClampCheckGroup)
|
|
|
|
|
EgtSetName( CLAMP_CHECK_GROUP, 'CLAMP_CHECK')
|
|
|
|
|
EgtSetLevel( CLAMP_CHECK_GROUP, GDB_LV.TEMP)
|
|
|
|
|
EgtSetStatus( CLAMP_CHECK_GROUP, GDB_ST.OFF)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if CLAMP_CHECK_INTERS then
|
|
|
|
|
EgtEmptyGroup( CLAMP_CHECK_INTERS)
|
|
|
|
|
else
|
|
|
|
|
CLAMP_CHECK_INTERS = EgtGroup( GDB_ID.ROOT)
|
|
|
|
|
EgtSetName( CLAMP_CHECK_INTERS, 'CLAMP_INTERS')
|
|
|
|
|
EgtSetLevel( CLAMP_CHECK_INTERS, GDB_LV.TEMP)
|
|
|
|
|
EgtSetStatus( CLAMP_CHECK_INTERS, GDB_ST.OFF)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
---------------------------------------------------------------------
|
|
|
|
@@ -1058,6 +1081,12 @@ function OnSimulMoveStart()
|
|
|
|
|
EMT.A6n = 'Z2'
|
|
|
|
|
local Z2 = -Head2Z + MillOffs + Mill2Offs + EMT.L3
|
|
|
|
|
EMT.A6 = EgtClamp( Z2, MinZ2, MaxZ2)
|
|
|
|
|
-- dato che la testa 2 è slave, bisogna controllare eventuale extra-corsa da post
|
|
|
|
|
if not( EMT.MOVE == 0 and EMT.FLAG == 2) and Z2 > MaxZ2 then
|
|
|
|
|
local sErr = EMT.MCHNAME..' ==> Out of Stroke: Z2 : '.. EgtNumToString( dZ2-MaxZ2, 2)
|
|
|
|
|
EmtSetLastError( 1220, sErr, true)
|
|
|
|
|
EgtOutBox( sErr, 'ERROR')
|
|
|
|
|
end
|
|
|
|
|
EMT.A6m = EgtIf( ( EMT.MOVE == 2 or EMT.MOVE == 3), 'Z1', nil)
|
|
|
|
|
EMT.A7n = 'C2'
|
|
|
|
|
EMT.A7 = EMT.R1
|
|
|
|
@@ -1088,6 +1117,12 @@ function OnSimulMoveStart()
|
|
|
|
|
EMT.DOU_DRILL_END = EMT.L3p - EMT.L3
|
|
|
|
|
Z2 = Z2 - 2 * EMT.DOU_DRILL_END
|
|
|
|
|
end
|
|
|
|
|
-- dato che la testa 2 è slave, bisogna controllare eventuale extra-corsa da post
|
|
|
|
|
if not( EMT.MOVE == 0 and EMT.FLAG == 2) and Z2 < MinZ2 then
|
|
|
|
|
local sErr = EMT.MCHNAME..' ==> Out of Stroke: Z2 : '.. EgtNumToString( MinZ2-Z2, 2)
|
|
|
|
|
EmtSetLastError( 1220, sErr, true)
|
|
|
|
|
EgtOutBox( sErr, 'ERROR')
|
|
|
|
|
end
|
|
|
|
|
EMT.A6 = EgtClamp( Z2, MinZ2, MaxZ2)
|
|
|
|
|
EMT.A6m = nil
|
|
|
|
|
EMT.A7n = 'C2'
|
|
|
|
@@ -1584,16 +1619,162 @@ function ExecUnloading()
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
---------------------------------------------------------------------
|
|
|
|
|
function CheckClamping( sClampName)
|
|
|
|
|
nIndexClamp = EgtGetAxisId( sClampName)
|
|
|
|
|
local idClampPath = EgtGetFirstInGroup( EgtGetFirstNameInGroup( nIndexClamp, 'CLAMP_CHECK') or GDB_ID.NULL)
|
|
|
|
|
local b3ClampingArea = EgtGetBBoxGlob( idClampPath or GDB_ID.NULL, GDB_BB.STANDARD)
|
|
|
|
|
-- se non trovo percorso area di clamping, esco subito
|
|
|
|
|
if not idClampPath or not EMT.VMILL or not ClampingCoeffMin then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function GetCurveListFromIntersection( sPosIntersPlane, sIntersPlane, vtOffset)
|
|
|
|
|
local idCurveList = {}
|
|
|
|
|
local vtIntersPlane
|
|
|
|
|
-- piano di interpolazione
|
|
|
|
|
if sIntersPlane == 'Y' then
|
|
|
|
|
vtIntersPlane = Y_AX()
|
|
|
|
|
elseif sIntersPlane == 'Z' then
|
|
|
|
|
vtIntersPlane = Z_AX()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for i = 1, #EMT.VMILL do
|
|
|
|
|
local b3VMill = EgtGetBBoxGlob( EMT.VMILL[i], GDB_BB.STANDARD)
|
|
|
|
|
local ptPosIntersPlane
|
|
|
|
|
if sPosIntersPlane == 'MIN' then
|
|
|
|
|
ptPosIntersPlane = b3VMill:getMin() + vtOffset
|
|
|
|
|
elseif sPosIntersPlane == 'MAX' then
|
|
|
|
|
ptPosIntersPlane = b3VMill:getMax() + vtOffset
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local idLoop, nLoopCnt = EgtPlaneVolZmapInters( ptPosIntersPlane, vtIntersPlane, EMT.VMILL[i], CLAMP_CHECK_INTERS, GDB_RT.GLOB)
|
|
|
|
|
-- se c'è almeno una curva
|
|
|
|
|
if idLoop then
|
|
|
|
|
for j = 1, nLoopCnt do
|
|
|
|
|
local idLoopTemp = idLoop + j - 1
|
|
|
|
|
table.insert( idCurveList, idLoopTemp)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return idCurveList
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function CalculateIntersectionArea( sPosIntersPlane, sIntersPlane, vtOffset)
|
|
|
|
|
-- test piano frontale
|
|
|
|
|
local idCurveList = GetCurveListFromIntersection( sPosIntersPlane, sIntersPlane, vtOffset)
|
|
|
|
|
|
|
|
|
|
-- si copia curva intersezione e curva pinza in gruppo di confronto
|
|
|
|
|
local idFlatSurf, nFlatSurfCnt = EgtSurfFlatRegion( CLAMP_CHECK_GROUP, idCurveList)
|
|
|
|
|
local idClampSurf = EgtSurfFlatRegion( CLAMP_CHECK_GROUP, idClampPath)
|
|
|
|
|
|
|
|
|
|
if idFlatSurf then
|
|
|
|
|
local dTotalArea = 0
|
|
|
|
|
for k = 1, nFlatSurfCnt do
|
|
|
|
|
local idTempSurf = idFlatSurf + k - 1
|
|
|
|
|
EgtSurfFrIntersect( idTempSurf, idClampSurf)
|
|
|
|
|
if idTempSurf then
|
|
|
|
|
dTotalArea = dTotalArea + ceil( EgtSurfArea( idTempSurf) or 0)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return dTotalArea
|
|
|
|
|
end
|
|
|
|
|
return 0
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- minima area considerata per un corretto pinzaggio
|
|
|
|
|
DistZClampToTable = DistZClampToTable or 0
|
|
|
|
|
local MinJoin = BD.GetMinJoin( EMT.SB, EMT.HB, EgtIf( EMT.SPLIT, EMT.LT, EMT.LB))
|
|
|
|
|
local MinZClamping = min( b3ClampingArea:getDimZ() + DistZClampToTable, EMT.SB) - DistZClampToTable
|
|
|
|
|
-- si moltiplica per un coefficiente minimo sotto al quale si da l'errore di pinzaggio
|
|
|
|
|
ClampingCoeffMin = EgtClamp( ClampingCoeffMin, 0.01, 1)
|
|
|
|
|
local dMinClampingAreaWarn = ( MinJoin * MinZClamping) * ClampingCoeffMin
|
|
|
|
|
local dMinClampingAreaErr = ( MinJoin * MinZClamping) * ( ClampingCoeffMin / 3)
|
|
|
|
|
|
|
|
|
|
local bError = true
|
|
|
|
|
local sWrn, sErr
|
|
|
|
|
local bWriteWarnMessage = false
|
|
|
|
|
local bWriteErrMessage = false
|
|
|
|
|
-- controllo faccia frontale
|
|
|
|
|
local dArea = CalculateIntersectionArea( 'MIN', 'Y', Vector3d( 0, 1, 0))
|
|
|
|
|
-- ERRORE: pinza troppo poco (meno di 1/3 del minimo richiesto)
|
|
|
|
|
if dArea and dArea < dMinClampingAreaErr then
|
|
|
|
|
-- solo se pinza almeno 1cm2, si prova un altro slice 5mm più all'interno, se aumenta al doppio non c'è errore (probabilmente siamo in presenza di un displuvio)
|
|
|
|
|
if dArea > 1000 then
|
|
|
|
|
local dNewArea = CalculateIntersectionArea( 'MIN', 'Y', Vector3d( 0, 5, 0))
|
|
|
|
|
if dNewArea > dArea * 2 then
|
|
|
|
|
bError = false
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
-- pinzaggio non fattibile, errore
|
|
|
|
|
if bError then
|
|
|
|
|
sErr = 'ERROR CLAMPING ' .. sClampName .. ' : '..tostring( ceil( ( dArea / dMinClampingAreaWarn) * 100))..'% ( '.. tostring( dArea/1000)..'cm2)'
|
|
|
|
|
bWriteErrMessage = true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
-- WARNING: pinza meno del minimo richiesto
|
|
|
|
|
if dArea and dArea < dMinClampingAreaWarn and not bWriteErrMessage then
|
|
|
|
|
sWrn = 'WARNING CLAMPING ' .. sClampName .. ' : '..tostring( ceil( ( dArea / dMinClampingAreaWarn) * 100))..'% ( '.. tostring( dArea/1000)..'cm2)'
|
|
|
|
|
bWriteWarnMessage = true
|
|
|
|
|
end
|
|
|
|
|
EgtEmptyGroup( CLAMP_CHECK_GROUP)
|
|
|
|
|
EgtEmptyGroup( CLAMP_CHECK_INTERS)
|
|
|
|
|
|
|
|
|
|
-- controllo altro lato solo se non sono già in errore
|
|
|
|
|
if not bWriteErrMessage then
|
|
|
|
|
-- controllo faccia posteriore
|
|
|
|
|
dArea = CalculateIntersectionArea( 'MAX', 'Y', Vector3d( 0, -1, 0))
|
|
|
|
|
-- ERRORE: pinza troppo poco (meno di 1/3 del minimo richiesto)
|
|
|
|
|
if dArea and dArea < dMinClampingAreaErr then
|
|
|
|
|
-- solo se pinza almeno 1cm2, si prova un altro slice 5mm più all'interno, se aumenta al doppio non c'è errore (probabilmente siamo in presenza di un displuvio)
|
|
|
|
|
if dArea > 1000 then
|
|
|
|
|
local dNewArea = CalculateIntersectionArea( 'MAX', 'Y', Vector3d( 0, -5, 0))
|
|
|
|
|
if dNewArea > dArea * 2 then
|
|
|
|
|
bError = false
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
-- pinzaggio non fattibile, errore
|
|
|
|
|
if bError then
|
|
|
|
|
sErr = 'ERROR CLAMPING ' .. sClampName .. ' : '..tostring( ceil( ( dArea / dMinClampingAreaWarn) * 100))..'% ( '.. tostring( dArea/1000)..'cm2)'
|
|
|
|
|
bWriteErrMessage = true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
-- WARNING: pinza meno del minimo richiesto
|
|
|
|
|
if dArea and dArea < dMinClampingAreaWarn and not bWriteWarnMessage and not bWriteErrMessage then
|
|
|
|
|
sWrn = 'WARNING CLAMPING ' .. sClampName .. ' : '..tostring( ceil( ( dArea / dMinClampingAreaWarn) * 100))..'% ( '.. tostring( dArea/1000)..'cm2)'
|
|
|
|
|
bWriteWarnMessage = true
|
|
|
|
|
end
|
|
|
|
|
EgtEmptyGroup( CLAMP_CHECK_GROUP)
|
|
|
|
|
EgtEmptyGroup( CLAMP_CHECK_INTERS)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if bWriteErrMessage then
|
|
|
|
|
EmtSetLastError( 1213, sErr, EgtGetEnableUI())
|
|
|
|
|
EgtOutBox( sErr, 'CLAMPING', 'ERROR', 'OK')
|
|
|
|
|
EmtSetSimulPause()
|
|
|
|
|
elseif bWriteWarnMessage then
|
|
|
|
|
EgtOutLog( sWrn)
|
|
|
|
|
EgtOutBox( sWrn, 'CLAMPING', 'WARNING', 'OK')
|
|
|
|
|
EmtSetSimulPause()
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
---------------------------------------------------------------------
|
|
|
|
|
function ExecMovePY1( bClose)
|
|
|
|
|
SimulMoveAxes( 'PY1', EgtIf( not bClose, MaxHoOpen, EMT.HB), MCH_SIM_STEP.RAPID)
|
|
|
|
|
SetPY1Light( bClose)
|
|
|
|
|
if bClose then
|
|
|
|
|
CheckClamping( 'PY1')
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
---------------------------------------------------------------------
|
|
|
|
|
function ExecMovePY2( bClose)
|
|
|
|
|
SimulMoveAxes( 'PY2', EgtIf( not bClose, MaxHoOpen, EMT.HB), MCH_SIM_STEP.RAPID)
|
|
|
|
|
SetPY2Light( bClose)
|
|
|
|
|
if bClose then
|
|
|
|
|
CheckClamping( 'PY2')
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
---------------------------------------------------------------------
|
|
|
|
@@ -2627,9 +2808,9 @@ end
|
|
|
|
|
---------------------------------------------------------------------
|
|
|
|
|
function RollerParkingNeeded( sHead, dAng1p, dAng2p, dAng1, dAng2)
|
|
|
|
|
if sHead == 'H11' or sHead == 'H12' or sHead == 'H13' or sHead == 'H16' then
|
|
|
|
|
return ( abs( dAng1 - dAng1p) > 1 or ( abs( dAng2 - dAng2p) > 1 and abs( dAng1 % 180.0) > 1))
|
|
|
|
|
return ( abs( dAng1 - dAng1p) > 1 or ( abs( dAng2 - dAng2p) > 1 and abs( dAng1) % 180.0 > 1))
|
|
|
|
|
elseif sHead == 'H21' or sHead == 'H22' then
|
|
|
|
|
return ( abs( dAng1 - dAng1p) > 1 or ( abs( dAng2 - dAng2p) > 1 and abs( dAng1 % 180.0) > 1))
|
|
|
|
|
return ( abs( dAng1 - dAng1p) > 1 or ( abs( dAng2 - dAng2p) > 1 and abs( dAng1) % 180.0 > 1))
|
|
|
|
|
elseif sHead == 'H38' then
|
|
|
|
|
return ( abs( dAng1 - dAng1p) > 1 or abs( dAng2 - dAng2p) > 1)
|
|
|
|
|
end
|
|
|
|
|