-- 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