Files
databeamnew/LuaLibs/MachiningLib.lua
T
andrea.villa 69f97362b9 - MachiningLib scrittura parametri di sistema
- Piccola correzione STR0002 per uniformare a nuovi nomi parametri
2024-05-22 09:26:33 +02:00

338 lines
13 KiB
Lua

-- MachiningLib.lua by Egalware s.r.l. 2024/04/02
-- Libreria ricerca lavorazioni per Travi
-- 2024/04/02 PRIMA VERSIONE CALCOLO LAVORAZIONI CON STRATEGIE
-- Tabella per definizione modulo
local MachiningLib = {}
-- Include
require( 'EgtBase')
-- Carico i dati globali
local BeamData = require( 'BeamData')
EgtOutLog( ' MachiningLib started', 1)
---------------------------------------------------------------------
---
---@param Proc table la feature
---@param vtTool Vector3d il vettore direzione utensile
---@return number dAngle angolo tra la faccia d'ingresso e la direzione utensile
local function GetToolEntryAngle( Proc, vtTool)
local dSinAngle = -10 * GEO.EPS_SMALL
local vtNorm
if Proc.AffectedFaces.bTop then
vtNorm = Z_AX()
dSinAngle = max( dSinAngle, vtTool * vtNorm)
end
if Proc.AffectedFaces.bBottom then
vtNorm = -Z_AX()
dSinAngle = max( dSinAngle, vtTool * vtNorm)
end
if Proc.AffectedFaces.bFront then
vtNorm = -Y_AX()
dSinAngle = max( dSinAngle, vtTool * vtNorm)
end
if Proc.AffectedFaces.bBack then
vtNorm = Y_AX()
dSinAngle = max( dSinAngle, vtTool * vtNorm)
end
if Proc.AffectedFaces.bLeft then
vtNorm = -X_AX()
dSinAngle = max( dSinAngle, vtTool * vtNorm)
end
if Proc.AffectedFaces.bRight then
vtNorm = X_AX()
dSinAngle = max( dSinAngle, vtTool * vtNorm)
end
local dCosAngle = sqrt( 1 - sqr( dSinAngle))
local dAngle = acos( dCosAngle)
return dAngle
end
-------------------------------------------------------------------------------------------------------------
-- funzione per cercare utensile tipo FRESA con certe caratteristiche
function MachiningLib.FindMill( Proc, ToolSearchParameters)
local ToolInfo = {}
for nCurrIndex=1, #TOOLS do
-- prima verifico che utensile sia compatibile
local bCompatibleTool = true
if TOOLS[nCurrIndex].sType ~= ToolSearchParameters.sType then
bCompatibleTool = false
elseif TOOLS[nCurrIndex].dDiameter > ToolSearchParameters.dMaxToolDiameter then
bCompatibleTool = false
elseif ToolSearchParameters.sMillShape == 'STANDARD' and ( TOOLS[nCurrIndex].dSideAngle ~= 0 or TOOLS[nCurrIndex].bIsPen) then
bCompatibleTool = false
elseif ToolSearchParameters.sMillShape == 'DOVETAIL' and not TOOLS[nCurrIndex].bIsDoveTail then
bCompatibleTool = false
elseif ToolSearchParameters.sMillShape == 'TSHAPEMILL' and not TOOLS[nCurrIndex].bIsTMill then
bCompatibleTool = false
elseif ToolSearchParameters.sMillShape == 'PEN' and not TOOLS[nCurrIndex].bIsPen then
bCompatibleTool = false
-- TODO controllare montaggio e verificare se direzione utensile raggiungibile. Serve funzione in BeamData
end
-- scelgo il migliore
if bCompatibleTool then
-- calcolo riduzione del massimo materiale utilizzabile
local dToolEntryAngle = GetToolEntryAngle( Proc, ToolSearchParameters.vtToolDir)
-- se ToolHolder più grande dell'utensile, il primo oggetto in collisione è il ToolHolder. Altrimenti il motore.
-- TODO Per il momento il motore ha un valore fisso: diametro di 180. Vedere se scrivere il diametro corretto in BeamData
local dDimObjToCheck = EgtIf( TOOLS[nCurrIndex].ToolHolder.dDiameter > TOOLS[nCurrIndex].dDiameter, TOOLS[nCurrIndex].ToolHolder.dDiameter, 180)
local dCurrMaxMatReduction = BeamData.COLL_SIC or 5
-- calcolo riduzione per non toccare con ToolHolder / Motore
if dToolEntryAngle > 0 and dToolEntryAngle < 90 then
dCurrMaxMatReduction = dCurrMaxMatReduction / cos( 90 - dToolEntryAngle) + ( ( dDimObjToCheck - TOOLS[nCurrIndex].dDiameter) / 2) / tan( dToolEntryAngle)
end
-- dCurrMachReduction = negativo -> limitare, positivo -> mm extra disponibili
local dCurrMachReduction = TOOLS[nCurrIndex].dMaxDepth - ToolSearchParameters.dElevation - dCurrMaxMatReduction
-- se non ancora trovato, oppure se completo e il migliore fino ad ora non è completo: corrente è il migliore
if not ToolInfo.nToolIndex or ( ToolInfo.dMaxMatReduction <= 0 and dCurrMachReduction > 0) then
ToolInfo.nToolIndex = nCurrIndex
ToolInfo.dMaxMatReduction = dCurrMachReduction
-- altrimenti scelgo il migliore
else
-- se entrambi completi
if ToolInfo.dMaxMatReduction > 0 and dCurrMachReduction > 0 then
-- scelgo utensile con rapporto lunghezza / diametro minore
if ( TOOLS[nCurrIndex].dLength / pow( TOOLS[nCurrIndex].dDiameter, 1.5)) < ( TOOLS[ToolInfo.nToolIndex].dLength / pow( TOOLS[ToolInfo.nToolIndex].dDiameter, 1.5)) then
ToolInfo.nToolIndex = nCurrIndex
ToolInfo.dMaxMatReduction = dCurrMachReduction
end
-- se entrambi incompleti
elseif ToolInfo.dMaxMatReduction < 0 and dCurrMachReduction < 0 then
--scelgo quello che lavora di più
if dCurrMachReduction > ToolInfo.dMaxMatReduction then
ToolInfo.nToolIndex = nCurrIndex
ToolInfo.dMaxMatReduction = dCurrMachReduction
end
end
end
end
end
return ToolInfo
end
-------------------------------------------------------------------------------------------------------------
-- funzione per cercare utensile tipo LAMA con certe caratteristiche
-- TODO da fare
function MachiningLib.FindBlade()
end
-------------------------------------------------------------------------------------------------------------
-- funzione per cercare utensile tipo PUNTA A FORARE con certe caratteristiche
-- TODO da fare
function MachiningLib.FindDrill()
end
-------------------------------------------------------------------------------------------------------------
-- funzione per cercare utensile tipo PUNTA A FORARE con certe caratteristiche
-- TODO da fare
function MachiningLib.FindChainSaw()
end
-------------------------------------------------------------------------------------------------------------
-- funzione per aggiungere una nuova lavorazione
-- TODO da fare
function MachiningLib.AddNewMachining( Machining)
local nErr
local sErr
-- Controllo parametri obbligatori
if not Machining.nType or not Machining.nToolIndex or not Machining.idProc or not Machining.idFaceToMachine then
return false
end
-- Drilling
if Machining.nType == MCH_MY.DRILLING then
Machining.sTypeName = 'Drill_'
-- Milling
elseif Machining.nType == MCH_MY.MILLING then
-- se utensile lama
if TOOLS[Machining.nToolIndex].sFamily == 'SAWBLADE' then
Machining.sTypeName = 'Cut'
else
Machining.sTypeName = 'Milling'
end
-- Pocketing
elseif Machining.nType == MCH_MY.POCKETING then
Machining.sTypeName = 'Pocketing'
-- Mortising
elseif Machining.nType == MCH_MY.MORTISING then
Machining.sTypeName = 'Mortising'
end
-- se nome non definito, assegno alla lavorazioen un nome standard
if not Machining.sOperationName then
Machining.sOperationName = Machining.sTypeName .. ( EgtGetName( Machining.idProc) or tostring( Machining.idProc)) .. '_' .. tostring( Machining.idFaceToMachine)
end
if not Machining.sToolName then
Machining.sToolName = TOOLS[Machining.nToolIndex].sName
end
-- creazione lavorazione
local nOperationId = EgtCreateMachining( Machining.sOperationName, Machining.nType, Machining.sToolName)
if nOperationId then
-- impostazione geometria
EgtSetMachiningGeometry( {{ Machining.idProc, Machining.idFaceToMachine}})
-- impostazione parametri lavorazione
if Machining.dDepth then
EgtSetMachiningParam( MCH_MP.DEPTH, Machining.dDepth)
end
if Machining.bInvert then
EgtSetMachiningParam( MCH_MP.INVERT, Machining.bInvert)
end
if Machining.nWorkside then
EgtSetMachiningParam( MCH_MP.WORKSIDE, Machining.nWorkside)
end
if Machining.nFaceuse then
EgtSetMachiningParam( MCH_MP.FACEUSE, Machining.nFaceuse)
end
if Machining.nSCC then
EgtSetMachiningParam( MCH_MP.SCC, Machining.nSCC)
end
if Machining.bToolInvert then
EgtSetMachiningParam( MCH_MP.TOOLINVERT, Machining.bToolInvert)
end
if Machining.sBlockedAxis then
EgtSetMachiningParam( MCH_MP.BLOCKEDAXIS, Machining.sBlockedAxis)
end
if Machining.sInitialAngles then
EgtSetMachiningParam( MCH_MP.INITANGS, Machining.sInitialAngles)
end
if Machining.nHeadSide then
EgtSetMachiningParam( MCH_MP.HEADSIDE, Machining.nHeadSide)
end
if Machining.nSubType then
EgtSetMachiningParam( MCH_MP.SUBTYPE, Machining.nSubType)
end
if Machining.dOverlap then
EgtSetMachiningParam( MCH_MP.OVERL, Machining.dOverlap)
end
-- step
if Machining.Steps then
if Machining.Steps.dStepType then
EgtSetMachiningParam( MCH_MP.STEPTYPE, Machining.Steps.dStepType)
end
if Machining.Steps.dStep then
EgtSetMachiningParam( MCH_MP.STEP, Machining.Steps.dStep)
end
if Machining.Steps.dSideStep then
EgtSetMachiningParam( MCH_MP.SIDESTEP, Machining.Steps.dSideStep)
end
end
if Machining.dStartPos then
EgtSetMachiningParam( MCH_MP.STARTPOS, Machining.dStartPos)
end
if Machining.dReturnPos then
EgtSetMachiningParam( MCH_MP.RETURNPOS, Machining.dReturnPos)
end
if Machining.dRadialOffset then
EgtSetMachiningParam( MCH_MP.OFFSR, Machining.dRadialOffset)
end
if Machining.dLongitudinalOffset then
EgtSetMachiningParam( MCH_MP.OFFSL, Machining.dLongitudinalOffset)
end
-- paraemtri attacco
if Machining.LeadIn then
if Machining.LeadIn.nType then
EgtSetMachiningParam( MCH_MP.LEADINTYPE, Machining.LeadIn.nType)
end
if Machining.LeadIn.dStartAddLength then
EgtSetMachiningParam( MCH_MP.STARTADDLEN, Machining.LeadIn.dStartAddLength)
end
if Machining.LeadIn.dTangentDistance then
EgtSetMachiningParam( MCH_MP.LITANG, Machining.LeadIn.dTangentDistance)
end
if Machining.LeadIn.dPerpDistance then
EgtSetMachiningParam( MCH_MP.LIPERP, Machining.LeadIn.dPerpDistance)
end
if Machining.LeadIn.dElevation then
EgtSetMachiningParam( MCH_MP.LIELEV, Machining.LeadIn.dElevation)
end
if Machining.LeadIn.dCompLength then
EgtSetMachiningParam( MCH_MP.LICOMPLEN, Machining.LeadIn.dCompLength)
end
end
-- parametri uscita
if Machining.LeadOut then
if Machining.LeadOut.nType then
EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, Machining.LeadOut.nType)
end
if Machining.LeadOut.dEndAddLength then
EgtSetMachiningParam( MCH_MP.ENDADDLEN, Machining.LeadOut.dEndAddLength)
end
if Machining.LeadOut.dTangentDistance then
EgtSetMachiningParam( MCH_MP.LOTANG, Machining.LeadOut.dTangentDistance)
end
if Machining.LeadOut.dPerpDistance then
EgtSetMachiningParam( MCH_MP.LOPERP, Machining.LeadOut.dPerpDistance)
end
if Machining.LeadOut.dElevation then
EgtSetMachiningParam( MCH_MP.LOELEV, Machining.LeadOut.dElevation)
end
if Machining.LeadOut.dCompLength then
EgtSetMachiningParam( MCH_MP.LOCOMPLEN, Machining.LeadOut.dCompLength)
end
end
if Machining.dStartSlowLen then
EgtSetMachiningParam( MCH_MP.STARTSLOWLEN, Machining.dStartSlowLen)
end
if Machining.dEndSlowLen then
EgtSetMachiningParam( MCH_MP.ENDSLOWLEN, Machining.dEndSlowLen)
end
if Machining.dThrouAddLen then
EgtSetMachiningParam( MCH_MP.THROUADDLEN, Machining.dThrouAddLen)
end
-- parametri da settare nelle note di sistema
-- TODO da decidere quali sono le note da salvare qui. Probabilmente tutte quelle relative all'ordine delle lavorazioni
local sSystemNotes = EgtGetMachiningParam( MCH_MP.SYSNOTES)
--if Machining.nMachiningOrder then
-- sSystemNotes = EgtSetValInNotes( sSystemNotes, 'MachiningOrder', Machining.nMachiningOrder)
--end
EgtSetMachiningParam( MCH_MP.SYSNOTES, sSystemNotes)
-- parametri da settare nelle note utente
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES)
if Machining.dMaxElev then
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', Machining.dMaxElev)
end
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
local bIsApplyOk = MachiningLib.ApplyMachining( true, false)
if not bIsApplyOk then
nErr, sErr = EgtGetLastMachMgrError()
EgtSetOperationMode( nOperationId, false)
return false
end
else
return false
end
return true, sErr
end
-------------------------------------------------------------------------------------------------------------
function MachiningLib.ApplyMachining( bRecalc, bApplyPost)
local bResult = EgtApplyMachining( bRecalc, bApplyPost)
return bResult
end
-------------------------------------------------------------------------------------------------------------
return MachiningLib