- per lama implementata verifica finecorsa (PreSimulationLib, MachiningLib) con funzione Machine Calc
- nei timer si logga il tempo di apertura Json
This commit is contained in:
+104
-118
@@ -79,18 +79,114 @@ local function GetPointsToCheck( Edge, dDepthToMachine)
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
local function CheckOutOfStrokePoint( ptToolExitToCheck, vtC, vtHead, PreCollisionData)
|
||||
local function CheckOutOfStrokePoint( ptOnFace, vtHead, vtNFace, vtNEdge, nSCC, Tool)
|
||||
|
||||
local bOutOfStroke = false
|
||||
local ptPivot = GetGlobalPivot( ptToolExitToCheck, vtC, vtHead, PreCollisionData.vtMovePivot)
|
||||
local bIsDownUp = AreOppositeVectorApprox( vtNFace, vtHead)
|
||||
|
||||
local ptOnToolTipCenter = ptOnFace + vtNEdge * Tool.dDiameter / 2 + vtNFace * EgtIf( bIsDownUp, Tool.dThickness, 0)
|
||||
|
||||
return bOutOfStroke
|
||||
-- TODO come gestire EXIT?????
|
||||
-- impostazione utensile
|
||||
EgtSetCalcTool( Tool.sName, Tool.sHead, 1)
|
||||
EgtLoadTool( Tool.sHead, 1, Tool.sName)
|
||||
|
||||
-- settaggio SCC per discriminare soluzioni multiple
|
||||
EgtSetCalcSolCh( nSCC)
|
||||
|
||||
-- si recuperano tutti gli assi, lineari e rotativi
|
||||
local AxesNames = EgtGetAllCurrAxesNames()
|
||||
local LinearAxes = {}
|
||||
local RotativeAxes = {}
|
||||
for i = 1, #AxesNames do
|
||||
-- EgtGetAxisType restituisce vero se asse lineare, false se asse rotativo
|
||||
if EgtGetAxisType( AxesNames[i]) then
|
||||
LinearAxes[#LinearAxes + 1] = {}
|
||||
LinearAxes[#LinearAxes].sName = AxesNames[i]
|
||||
else
|
||||
RotativeAxes[#RotativeAxes + 1] = {}
|
||||
RotativeAxes[#RotativeAxes].sName = AxesNames[i]
|
||||
end
|
||||
end
|
||||
|
||||
-- se più di 3 assi lineari e 2 assi rotativi, macchina non supportata
|
||||
if #LinearAxes > 3 or #RotativeAxes > 2 then
|
||||
|
||||
error(' CheckOutOfStrokePoint : too many axes')
|
||||
end
|
||||
|
||||
-- calcolo assi rotativi
|
||||
local bOkAngles, nSolutionsAngles, dRot1, dRot2 = EgtGetCalcAngles( vtHead)
|
||||
RotativeAxes[1].dValue = dRot1
|
||||
RotativeAxes[2].dValue = dRot2
|
||||
|
||||
if not bOkAngles then
|
||||
error( ' CheckOutOfStrokePoint : error')
|
||||
end
|
||||
|
||||
-- se nessuna soluzione dagli assi rotativi, è in extracorsa
|
||||
if nSolutionsAngles == 0 then
|
||||
|
||||
local idTempGroup = BeamLib.GetTempGroup()
|
||||
local idVector = EgtVector( idTempGroup, vtHead, ptOnToolTipCenter, GDB_RT.GLOB)
|
||||
EgtSetColor( idVector, RED())
|
||||
EgtOutLog( ' Presimulation : OutStroke Rotative axis, vtHead = ' .. tostring( vtHead) .. ', id = ' .. idVector)
|
||||
EgtOutLog( ' ' .. RotativeAxes[1].sName .. ' = ' .. tostring( RotativeAxes[1].dValue) .. ', ' .. RotativeAxes[2].sName .. ' = ' .. tostring( RotativeAxes[2].dValue))
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
-- calcolo assi lineari
|
||||
local bOkPositions, _, dLinear1, dLinear2, dLinear3 = EgtGetCalcPositions( ptOnToolTipCenter, RotativeAxes[1].dValue, RotativeAxes[2].dValue)
|
||||
LinearAxes[1].dValue = dLinear1
|
||||
LinearAxes[2].dValue = dLinear2
|
||||
LinearAxes[3].dValue = dLinear3
|
||||
|
||||
if not bOkPositions then
|
||||
|
||||
error( ' CheckOutOfStrokePoint : error')
|
||||
end
|
||||
|
||||
-- verifica finecorsa per tutti gli assi
|
||||
-- siccome non si sa a priori il numero di assi lineari e rotativi, si aggiungono tutti a Args in ordine
|
||||
-- Args viene poi esplosa in modo da passare a EgtVerifyOutstroke i valori separati
|
||||
local Args = {}
|
||||
|
||||
for i = 1, #LinearAxes do
|
||||
Args[#Args+1] = LinearAxes[i].dValue
|
||||
end
|
||||
|
||||
for i = 1, #RotativeAxes do
|
||||
Args[#Args+1] = RotativeAxes[i].dValue
|
||||
end
|
||||
|
||||
local bAllAxesInStroke = EgtVerifyOutstroke( table.unpack( Args))
|
||||
|
||||
if not bAllAxesInStroke then
|
||||
|
||||
local idTempGroup = BeamLib.GetTempGroup()
|
||||
local idPoint = EgtPoint( idTempGroup, ptOnToolTipCenter, GDB_RT.GLOB)
|
||||
local idVector = EgtVector( idTempGroup, vtHead, ptOnToolTipCenter, GDB_RT.GLOB)
|
||||
EgtSetColor( idPoint, RED())
|
||||
EgtSetColor( idVector, RED())
|
||||
EgtOutLog( ' Presimulation : OutStroke Axes, Tip Point = ' .. tostring( ptOnToolTipCenter) .. ', id = ' .. idPoint .. ', vtHead = ' .. tostring( vtHead) .. ', id = ' .. idVector)
|
||||
EgtOutLog( ' ' .. LinearAxes[1].sName .. ' = ' .. LinearAxes[1].dValue .. ', ' .. LinearAxes[2].sName .. ' = ' .. LinearAxes[2].dValue .. ', ' .. LinearAxes[3].sName .. ' = ' .. LinearAxes[3].dValue)
|
||||
EgtOutLog( ' ' .. RotativeAxes[1].sName .. ' = ' .. tostring( RotativeAxes[1].dValue) .. ', ' .. RotativeAxes[2].sName .. ' = ' .. tostring( RotativeAxes[2].dValue))
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
-- EgtSetAxisPos( 'T', dT)
|
||||
-- EgtSetAxisPos( 'Y', dY)
|
||||
-- EgtSetAxisPos( 'Z', dZ)
|
||||
-- EgtSetAxisPos( 'C', dC1)
|
||||
-- EgtSetAxisPos( 'A', dA1)
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
-- check extracorsa: se non vengono passati punti si controllano inizio e fine del lato
|
||||
function PreSimulationLib.CheckOutOfStroke( Parameters, OptionalParameters )
|
||||
function PreSimulationLib.CheckOutOfStroke( PointsToCheck, Parameters)
|
||||
|
||||
-- parametri obbligatori
|
||||
local Edge = Parameters.Edge
|
||||
@@ -98,22 +194,13 @@ function PreSimulationLib.CheckOutOfStroke( Parameters, OptionalParameters )
|
||||
local vtHead = Parameters.vtHead
|
||||
local Tool = Parameters.Tool
|
||||
|
||||
-- parametri opzionali
|
||||
OptionalParameters = OptionalParameters or {}
|
||||
local PointsToCheck = OptionalParameters.PointsToCheck or { Edge.ptStart, Edge.ptEnd}
|
||||
|
||||
local bIsDownUp = AreOppositeVectorApprox( vtNFace, vtHead)
|
||||
|
||||
-- punti curva collisione e direzioni check da macchina
|
||||
-- TODO serve pivot???
|
||||
local vtMovePivot = nil
|
||||
-- SCC
|
||||
local nSCC = Tool.SetupInfo.GetSCC( Edge.vtN, Edge.vtEdge, vtNFace)
|
||||
|
||||
-- check collisione sui punti in centro lama su naso mandrino o aggregato. In base a direzione e punto
|
||||
for i = 1, #PointsToCheck do
|
||||
|
||||
local ToolExitPoint = GetToolExitPoint( PointsToCheck[i], Edge.vtN, vtHead, Tool, bIsDownUp)
|
||||
|
||||
--local bOutOfStroke = CheckOutOfStrokePoint( ptToolExitToCheck, vtC, vtHead, vtMovePivot)
|
||||
local bOutOfStroke = CheckOutOfStrokePoint( PointsToCheck[i], vtHead, vtNFace, Edge.vtN, nSCC, Tool)
|
||||
|
||||
-- se trovato extracorsa inutile procedere con gli altri punti
|
||||
if bOutOfStroke then
|
||||
@@ -238,43 +325,6 @@ local function CheckCollisionWithAxis( sAxis, MachiningParameters, OptionalParam
|
||||
vtC = -vtC
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
-- TEST
|
||||
-- for i = 1, #ToolExitPoints do
|
||||
-- EgtSetCalcTool( Tool.sName, Tool.sHead, 1)
|
||||
-- EgtLoadTool( Tool.sHead, 1, Tool.sName)
|
||||
|
||||
-- EgtSetCalcSolCh( nSCC)
|
||||
-- local bOkAngles, nSolutionsAngles, dC1, dA1, dC2, dA2 = EgtGetCalcAngles( vtHead, vtSCC)
|
||||
-- local bOkPositions, _, dT, dY, dZ = EgtGetCalcPositions( ToolExitPoints[i] - vtHead * ( Tool.dLength - Tool.dThickness), dC1, dA1) -- ATTENZIONE qui il punto è sul Tip
|
||||
|
||||
-- EgtSetAxisPos( 'T', dT)
|
||||
-- EgtSetAxisPos( 'Y', dY)
|
||||
-- EgtSetAxisPos( 'Z', dZ)
|
||||
-- EgtSetAxisPos( 'C', dC1)
|
||||
-- EgtSetAxisPos( 'A', dA1)
|
||||
|
||||
-- local idPoint = EgtPoint( 0, PointsToCheck[i], 0)
|
||||
-- EgtOutLog( 'Point id ' .. idPoint)
|
||||
-- EgtOutLog( 'SCC = ' .. tostring(nSCC) .. ', vtHead = ' .. tostring( vtHead) .. ', vtAux = ' .. tostring(vtSCC))
|
||||
-- EgtOutLog( 'Solutions found = ' .. tostring( nSolutionsAngles) .. ', T = ' .. dT .. ', Y = ' .. dY .. ', Z = ' .. dZ .. ', C1 = ' .. dC1 .. ', A1 = ' .. dA1 .. ' (C2 = ' .. dC2 .. ', A2 = ' .. dA2 ..')')
|
||||
-- end
|
||||
|
||||
-- FINE TEST
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
-- punti curva collisione e direzioni check da macchina
|
||||
local PreCollisionData = Tool.SetupInfo.GetPreCollisionData( sAxis, vtC, vtHead)
|
||||
|
||||
@@ -337,68 +387,4 @@ function PreSimulationLib.CheckCollision( sBladeEngagement, Parameters, Optional
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
-- nel piano perpendicolare alla direzione di taglio, se c'è intersezione tra motore e trave c'è collisione
|
||||
-- ATTENZIONE NON PIU' USATA, verificare ed eliminare
|
||||
function PreSimulationLib.CheckCollisionAxisAB( Edge, vtNFace, vtHead, Part, Tool, dDepthToMachine)
|
||||
|
||||
-- se direzione utensile parallela ad uno degli assi principali non serve alcuna verifica
|
||||
if AreSameOrOppositeVectorApprox( Edge.vtN, X_AX())
|
||||
or AreSameOrOppositeVectorApprox( Edge.vtN, Y_AX())
|
||||
or AreSameOrOppositeVectorApprox( Edge.vtN, Z_AX()) then
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
-- riferimento perpendicolare al taglio, X nel verso della normale al lato e Y verso il motore
|
||||
local ptMachining = Point3d( ( Edge.ptStart + Edge.ptEnd) / 2) + Edge.vtN * ( Edge.dElevation - dDepthToMachine)
|
||||
|
||||
-- costruzione flat region del pezzo e del grezzo restante nel piano perpendicolare al taglio
|
||||
local idPartSurfFr = GetPartSurfFrInPlane( Part, Edge.vtEdge)
|
||||
local idRestlengthSurfFr = GetRestlengthSurfFrInPlane( Part, Edge.vtEdge)
|
||||
|
||||
-- costruzione flat region approssimata del motore nel piano perpendicolare al taglio
|
||||
-- punto di congiunzione tra motore e lama
|
||||
local ptMaxElev = ptMachining + Edge.vtN * Tool.dMaxMaterial
|
||||
-- se taglio standard (no DownUp) il punto va spostato dello spessore lama
|
||||
if AreSameVectorApprox( vtNFace, vtHead) then
|
||||
ptMaxElev = ptMaxElev + vtNFace * Tool.dThickness
|
||||
end
|
||||
-- TODO qui sostituire con il valore reale letto dal SetupInfo
|
||||
-- per Fast si dovrà aggiungere la lunghezza del massimo utensile utilizzabile con lama
|
||||
local dHeadDepth = 480
|
||||
local dHeadWidth = 480
|
||||
local ptOpposite = ptMaxElev + Edge.vtN * dHeadWidth
|
||||
local ptCross = ptOpposite + vtHead * dHeadDepth
|
||||
local idHeadRectangle = EgtRectangle3P( Part.idTempGroup, ptMaxElev, ptCross, ptOpposite, GDB_RT.GLOB)
|
||||
-- flat region dal rettangolo
|
||||
local idHeadSurfFr = EgtSurfFlatRegion( Part.idTempGroup, idHeadRectangle)
|
||||
|
||||
-- intersezione tra pezzo e motore
|
||||
local bCollisionFoundPiece = not EgtSurfFrTestExternal( idPartSurfFr, idHeadSurfFr)
|
||||
|
||||
-- intersezione tra grezzo restante e motore, se con il pezzo non c'è collisione
|
||||
local bCollisionFoundRestLength
|
||||
if not bCollisionFoundPiece then
|
||||
bCollisionFoundRestLength = not EgtSurfFrTestExternal( idRestlengthSurfFr, idHeadSurfFr)
|
||||
end
|
||||
|
||||
return bCollisionFoundPiece, bCollisionFoundRestLength
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
return PreSimulationLib
|
||||
Reference in New Issue
Block a user