From e7ed795ed84d9ecfc57d0271157fd62c12a12ef2 Mon Sep 17 00:00:00 2001 From: DarioS Date: Wed, 22 Jun 2022 14:29:34 +0200 Subject: [PATCH] DataGunstock : - modifiche per nuova macchina CMS di Beretta. --- LuaLibs/EgtGunstockBase.lua | 2 +- Main.lua | 235 +++++++++++++++++++++++++++++++++--- 2 files changed, 220 insertions(+), 17 deletions(-) diff --git a/LuaLibs/EgtGunstockBase.lua b/LuaLibs/EgtGunstockBase.lua index d0c1ae9..821d768 100644 --- a/LuaLibs/EgtGunstockBase.lua +++ b/LuaLibs/EgtGunstockBase.lua @@ -1,4 +1,4 @@ --- EgtGunstockBase.lua by EgalTech s.r.l. 2016/09/29 +-- EgtGunstockBase.lua by EgalTech s.r.l. 2022/06/20 -- Gunstock Base library require( 'EgtBase') diff --git a/Main.lua b/Main.lua index 40a5e9d..99816fb 100644 --- a/Main.lua +++ b/Main.lua @@ -1,4 +1,4 @@ --- Main.lua by Egaltech s.r.l. 2020/09/30 +-- Main.lua by Egaltech s.r.l. 2022/06/20 -- Main gestione lavorazioni Gunstock -- Intestazioni @@ -268,7 +268,7 @@ local function GetGunRef() end ----------------------------------------------------------------- -local function GetMachining() +local function GetMachining( bBeretta) -- inizio lavorazione local sLine = EGB.GetLine() if not sLine then return false end @@ -302,17 +302,19 @@ local function GetMachining() elseif sLine:find( '#TESTA_USCITA', 1, true) then -- elseif sLine:find( '#PREP_ROT', 1, true) then - local sParam = EgtTrim( sLine:gsub( '#PREP_ROT', '')) - local vsTok = EgtSplitString( sParam, ' ') - if #vsTok < 2 then return false end - local PrepRot = {} - PrepRot.sR1Expr = vsTok[1] - PrepRot.dR1 = 0 - PrepRot.sR2Expr = vsTok[2] - PrepRot.dR2 = 0 - PrepRot.sFeedExpr = vsTok[3] - PrepRot.dFeed = 0 - vMach.PrepRot = PrepRot + if not bBeretta then + local sParam = EgtTrim( sLine:gsub( '#PREP_ROT', '')) + local vsTok = EgtSplitString( sParam, ' ') + if #vsTok < 2 then return false end + local PrepRot = {} + PrepRot.sR1Expr = vsTok[1] + PrepRot.dR1 = 0 + PrepRot.sR2Expr = vsTok[2] + PrepRot.dR2 = 0 + PrepRot.sFeedExpr = vsTok[3] + PrepRot.dFeed = 0 + vMach.PrepRot = PrepRot + end else return false end @@ -379,8 +381,11 @@ local function EvaluateExpr( sExpr) sTmp = AdjustFunction( sTmp, ')Q', 'pow(', ',2)') sTmp = AdjustFunction( sTmp, ')R', 'sqrt(', ')') sTmp = AdjustFunction( sTmp, ')S', 'sin(', ')') + sTmp = AdjustFunction( sTmp, 'S)', 'sin(', ')') sTmp = AdjustFunction( sTmp, ')C', 'cos(', ')') + sTmp = AdjustFunction( sTmp, 'C)', 'cos(', ')') sTmp = AdjustFunction( sTmp, ')T', 'tan(', ')') + sTmp = AdjustFunction( sTmp, 'T)', 'tan(', ')') sTmp = AdjustFunction( sTmp, ')AS', 'asin(', ')') sTmp = AdjustFunction( sTmp, ')AC', 'acos(', ')') sTmp = AdjustFunction( sTmp, ')AT', 'atan(', ')') @@ -435,6 +440,45 @@ local function WriteOutLineFromIni( sSec, sKey, sDef, sIniFile) EGB.WriteOutLine( sLine:gsub( '
', '\n')) end +----------------------------------------------------------------- +local function CncSplit( sCncFile, sSubDir) + + local CncFh = io.open( sCncFile, 'r') + if not CncFh then + EgtOutLog( 'Errore nell\'apertura del file di input ' .. sCncFile) + return false + end + + local SubFh + local sLine = CncFh:read( '*l') + while sLine do + if not string.find( sLine, '%', 1, true) then + if string.find( sLine, '(DIS,"CODICE=SUB', 1, true) then + if SubFh then + SubFh:close() + SubFh = nil + end + local sSubName = string.sub( sLine, 14, -3) + local sSubFile = sSubDir..sSubName + SubFh = io.open( sSubFile, 'w') + if not SubFh then + EgtOutLog( 'Errore nell\'apertura del file di output ' .. sSubFile) + CncFh:close() + return false + end + end + if SubFh then + SubFh:write( sLine .. '\n') + end + end + sLine = CncFh:read( '*l') + end + + if SubFh then SubFh:close() end + CncFh:close() + + return true +end ----------------------------------------------------------------- -- *** Read MOD params *** @@ -688,7 +732,25 @@ function GGD.CreateGunstock() local sMachIni = EgtGetCurrMachineDir() .. '\\' .. m_sMachName .. '.ini' local bTwoHeads = ( EgtGetStringFromIni( 'Gunstock', 'TwoHeads', '0', sMachIni) == '1') local bAddM6ToT3x = ( EgtGetStringFromIni( 'Gunstock', 'AddM6ToT3x', '1', sMachIni) == '1') - local bMazak = ( EgtGetStringFromIni( 'Gunstock', 'Type', 'Cms', sMachIni) == 'Mazak') + local sType = EgtGetStringFromIni( 'Gunstock', 'Type', 'Cms', sMachIni) + local bBeretta = false + local bMazak = false + if sType == 'Beretta' then + bBeretta = true + elseif sType == 'Mazak' then + bMazak = true + end + + -- In modalità Beretta recupero SUB dal file CNC omonimo di MOD + if bBeretta then + EgtEmptyDirectory( sSubDir) + local sCncFile = EgtChangePathExtension( sModFile, 'CNC') + if not CncSplit( sCncFile, sSubDir) then + EGB.WriteErrLine( 'ERR=120\nErrore in CNC file split') + GGD.ERR = 120 + return + end + end -- Recupero parametri (opzionali) if not GetParams() then @@ -814,7 +876,7 @@ function GGD.CreateGunstock() -- Recupero dati di lavorazione while not GetEndStdMachining() do - if not GetMachining() then + if not GetMachining( bBeretta) then EGB.WriteErrLine( 'ERR=114\nErrore in lettura Lavorazione (linea ' .. tostring( EGB.GetLineNumber()) ..')') GGD.ERR = 114 return @@ -998,7 +1060,9 @@ function GGD.CreateGunstock() local tabOri = EgtGetTableRef( 1) -- Posizionamento delle morse per calcio local nFix - if bMazak then + if bBeretta then + nFix = EgtAddFixture( 'ViseH75', Vector3d( 600, 339.1, 0), 0, m_vRaw.dAlt * m_dCoeffAlt) + elseif bMazak then nFix = EgtAddFixture( 'ViseNew', Vector3d( 350, 250, 0), 0, m_vRaw.dAlt * m_dCoeffAlt) else if m_vRaw.dLen < LEN_MIN_RIFLE then @@ -1007,6 +1071,8 @@ function GGD.CreateGunstock() nFix = EgtAddFixture( 'ViseRifle', Vector3d( 600, 350-1.49, 0), 0, m_vRaw.dAlt * m_dCoeffAlt) end end + -- Allargo area utile per movimenti grezzo per non avere problemi nelle fasi intermedie del movimento + EgtSetTableAreaOffset( 500, 500, 500, 500) -- Posizionamento del grezzo in macchina local ColA = Color3d( 255, 165, 0, 30) local nRaw = EgtAddRawPartWithPart( Pz, Sol, 0, ColA) or GDB_ID.NULL @@ -1234,6 +1300,143 @@ function GGD.CreateGunstock() -- terminazione file EGB.WriteOutLine( 'M30') + -- altrimenti macchina CMS in Beretta + elseif bBeretta then + -- posizione Origine1 rispetto Zero Macchina (punto intersezione assi rotanti) + local OffsX = -1598.00 + local OffsY = -2126.10 + local OffsZ = -670.65 + -- emissione intestazione + EGB.WriteOutLine( '(DIS,"CODICE=PRG1")') + EGB.WriteOutLine( '; ' .. EgtGetCurrMachineName():upper()) + EGB.WriteOutLine( '; ' .. sPezName:upper() .. sPezExt:upper() .. '-' .. sModName:upper() .. sModExt:upper()) + EGB.WriteOutLine( '; ' .. GGD.DESCR:upper()) + EGB.WriteOutLine( '; ' .. m_sAttr:upper()) + local sStart1Def = 'M70
"CICLI"' + if m_vRaw.dLen < LEN_MIN_RIFLE then + WriteOutLineFromIni( 'Gunstock', 'Start1', sStart1Def, sMachIni) + else + WriteOutLineFromIni( 'Gunstock', 'Start1_R', sStart1Def, sMachIni) + end + for i = 1, #m_vParams do + EGB.WriteOutLine( m_vParams[i].sVar .. '=' .. EgtNumToString( m_vParams[i].dVal, 3)) + end + local sStart2Def = 'G79G0Z0
G79X0Y0C0B0' + if m_vRaw.dLen < LEN_MIN_RIFLE then + WriteOutLineFromIni( 'Gunstock', 'Start2', sStart2Def, sMachIni) + else + WriteOutLineFromIni( 'Gunstock', 'Start2_R', sStart2Def, sMachIni) + end + EGB.WriteOutLine( '(UAO,0)') + EGB.WriteOutLine( '(UTO,0,X0,Y0,Z0)') + EGB.WriteOutLine( '(TCP)') + EGB.WriteOutLine( '(UPR)') + -- emissione dei posizionamenti e dei richiami delle lavorazioni + if not EgtSetCalcTool( 'Calc', 'H1', 1) then + EGB.WriteErrLine( 'ERR=204\nErrore nell\'impostazione dell\'utensile di calcolo') + GGD.ERR = 204 + return + end + local dCalcLen = EgtTdbGetCurrToolParam( MCH_TP.LEN) + local nNum = 0 + local dPrevR1, dPrevR2 = 9999, 9999 + for i = 1, #m_vMachs do + -- lavorazione i-esima + local vMach = m_vMachs[i] + local frMach = EgtFR( vMach.nLay, GDB_ID.ROOT) + -- emissione info di lavorazione + nNum = nNum + 10 + if vMach.sInfo then + EGB.WriteOutLine( 'N'..EgtNumToString(nNum,0)..' ; ' .. vMach.sInfo:upper()) + else + EGB.WriteOutLine( 'N'..EgtNumToString(nNum,0)..' ; ***') + end + -- emissione info utensile + local sToolInfo = '' + local sTcPos = EgtGetInfo( vMach.nLay, 'TCPOS') + if sTcPos == 'T00' then + sToolInfo = sToolInfo .. 'T=PRECEDENTE' + elseif sTcPos then + sToolInfo = sToolInfo .. sTcPos:upper() + end + local sTcomp = EgtGetInfo( vMach.nLay, 'TCOMP') + if sTcomp then sToolInfo = sToolInfo .. ' H' .. sTcomp:upper() end + local sTname = EgtGetInfo( vMach.nLay, 'TNAME') + if sTname then sToolInfo = sToolInfo .. ' ' .. sTname:upper() end + EGB.WriteOutLine( '; ' .. sToolInfo) + -- calcolo angoli + local dNearR1, dNearR2 = 0, 0 + if vMach.Ang then + dNearR1 = vMach.Ang.dR1 + dNearR2 = vMach.Ang.dR2 + end + local bRaOk, dR1, dR2 = EGB.GetAngMach( frMach:getVersZ(), dNearR1, dNearR2) + if not bRaOk then + EGB.WriteOutLine( '; ERRORE CALC ROTAX DI ' .. vMach.sName:upper()) + EGB.WriteErrLine( 'ERR=205\nErrore nel calcolo assi rotanti di ' .. vMach.sName) + GGD.ERR = 205 + return + else + vMach.Ang.dR1N = dR1 + vMach.Ang.dR2N = dR2 + if vMach.PrepRot and + ( abs( dR1 - dPrevR1) > GEO.EPS_ANG_SMALL or abs( dR2 - dPrevR2) > GEO.EPS_ANG_SMALL) then + local sOut = 'G90G0'..'B'..EgtNumToString( dR1 - vMach.PrepRot.dR1, 3).. + 'C'..EgtNumToString( dR2 - vMach.PrepRot.dR2, 3) + EGB.WriteOutLine( sOut) + sOut = 'G90G1'..'B'..EgtNumToString( dR1, 3)..'C'..EgtNumToString( dR2, 3).. + 'F'..EgtNumToString( vMach.PrepRot.dFeed, 0) + EGB.WriteOutLine( sOut) + else + local sOut = 'G90G0'..'B'..EgtNumToString( dR1, 3)..'C'..EgtNumToString( dR2, 3) + EGB.WriteOutLine( sOut) + end + dPrevR1 = dR1 + dPrevR2 = dR2 + EGB.WriteOutLine( '(UAO,1)') + -- calcolo posizione + local bLa1Ok, _, dX1, dY1, dZ1 = EgtGetCalcPositions( frMach:getOrigin(), dR1, dR2) + if not bLa1Ok then + EGB.WriteOutLine( '; ERRORE CALC UTO DI ' .. vMach.sName:upper()) + EGB.WriteErrLine( 'ERR=206\nErrore nel calcolo UTO di ' .. vMach.sName) + GGD.Err = 206 + return + end + local dX = dX1 + local dY = dY1 + local dZ = dZ1 - dCalcLen + EGB.WriteOutLine( '(UTO,1,X' .. EgtNumToString( dX - OffsX, 3) .. + ',Y' .. EgtNumToString( dY - OffsY, 3) .. + ',Z' .. EgtNumToString( dZ - OffsZ, 3) .. ')') + -- calcolo rotazione + local bLa2Ok, _, dX2, dY2, dZ2 = EgtGetCalcPositions( frMach:getOrigin() + 100*frMach:getVersX(), dR1, dR2) + if not bLa2Ok then + EGB.WriteOutLine( '; ERRORE CALC ROT DI ' .. vMach.sName:upper()) + EGB.WriteErrLine( 'ERR=207\nErrore nel calcolo ROT di ' .. vMach.sName) + GGD.Err = 207 + return + end + local dAng = atan2( dY2 - dY1, dX2 - dX1) + if abs( dZ2 - dZ1) > GEO.EPS_SMALL then + EgtOutLog( 'Differenza sensibile in Z per ROT :'..EgtNumToString( dZ1, 6)..'/'..EgtNumToString( dZ2, 6)) + end + EGB.WriteOutLine( 'G17') + EGB.WriteOutLine( '(AXO,-Z)') + EGB.WriteOutLine( '(ROT,' .. EgtNumToString( dAng, 3) .. ')') + EGB.WriteOutLine( '(CLS,SUB' .. vMach.sName .. ')') + EGB.WriteOutLine( '(UAO,0)') + EGB.WriteOutLine( '(ROT,0)') + end + end + -- emissione terminazione + local sEndDef = 'G79G0Z0
G79X0Y0C0B0' + if m_vRaw.dLen < LEN_MIN_RIFLE then + WriteOutLineFromIni( 'Gunstock', 'End', sEndDef, sMachIni) + else + WriteOutLineFromIni( 'Gunstock', 'End_R', sEndDef, sMachIni) + end + EGB.WriteOutLine( 'M30') + -- altrimenti macchine CMS else -- emissione intestazione