-- -- EEEEEEEEEE GGGGGG TTTTTTTTTTTTTT -- EEEEEEEEEE GGGGGGGGGG TTTTTTTTTTTTTT -- EEEE GGGG GGGG TTTT -- EEEE GGGG TTTT -- EEEEEEE GGGG GGGGGGG TTTT -- EEEEEEE GGGG GGGGGGG TTTT -- EEEE GGGG GGGG TTTT -- EEEE GGGG GGGG TTTT -- EEEEEEEEEE GGGGGGGGGG TTTT -- EEEEEEEEEE GGGGGG TTTT -- -- BeamWallPipeLib by Egalware s.r.l. 2023/05/09 -- Questo script fa da libreria delle funzioni di calcolo e verifica delle travi e pareti -- Tabella per definizione modulo local BeamWallPipeLib = {} require( 'EgtBase') --_ENV = EgtProtectGlobal() --EgtEnableDebug( true) local sIniFilePath = EgtGetIniFile() local sBaseDir = EgtGetStringFromIni( 'Beam', 'BaseDir', '', sIniFilePath) EgtAddToPackagePath( sBaseDir .. '\\?.lua') -- modalita' di chiamata QUESTION_MODES = { NULL = 0, PREVIEW = 1, BOM = 2, HARDWARE = 3, CONFIG = 4, ORDER = 5, VERIFY = 6, } -- Tipo di progetto PROJECT_TYPES = { NULL = 0, PROJ = 1, PROD = 2, } -- Tipo di progetto (Beam o Wall) BWTYPES = { NULL = 0, BEAM = 1, WALL = 2, } CALCSTATES = { NOTCALCULATED = -1, OK = 0, INFO = 1, WARNING = 2, ERROR_ = 3, COLLISION = 4, } CMDTYPES = { GENERATE = 0, MODIFY = 1, SIMULATE = 2, CHECK = 3, CHECKGEN = 4, POINT_CLOUD = 5, RAWPART = 6, EDIT = 7, CHECKNOSIM = 8, TOPOLOGY = 9, OPENTOOLDB = 11, -- Non utilizzato OPENMACHINIGDB = 12, -- Non utilizzato } local CUTID = 'CUTID' local BTL_PRT_PDN = 'PDN' local OUTLINE = 'Outline' local BTL_FTR_GRP = 'GRP' local BTL_FTR_MAINID = 'MAINID' local BTL_FTR_AUXID = 'AUXID' local PROCESSINGS = 'Processings' local TASKID = 'TASKID' _G.package.loaded.JSON = nil local JSON = require( 'JSON') -- Canali local QuestionChannel = "EgwVerifyQuestion" local AnswerChannel = "EgwVerifyAnswer" local nAnswerChannel_Count = 0 local nAnswerChannel_LastSecond = 0 local nRedisConnectionId = 0 --------------------------------------------------------------------- -- funzione che verifica la connessione a Redis local function VerifyRedisConnection( sConnectionString) local bRedisConnect = false if LUX and LUX.REDISID and LUX.REDISID > 0 then -- connessione già creata dall'esterno nRedisConnectionId = LUX.REDISID elseif nRedisConnectionId == 0 then -- se nessuna connessione la creo bRedisConnect, nRedisConnectionId = EgtRedisAsyncConnect( sConnectionString) if not bRedisConnect then EgtOutLog( 'Errore! Impossibile connettersi con il server Redis dal Lua!') end end return bRedisConnect end --------------------------------------------------------------------- -- funzione che aggiorna CutId e TaskId local function UpdateCutIdAndTaskId( nPartId) -- Assegno Id a CutId per calcoli EgtSetInfo( nPartId, CUTID, nPartId, true) -- Assegno TASKID agli outline per calcoli local nOutLayerId = EgtGetFirstNameInGroup( nPartId, OUTLINE) local nOutlineId = EgtGetFirstInGroup( nOutLayerId) while nOutlineId do -- verifico che sia una feature local nGRP = EgtGetInfo( nOutlineId, BTL_FTR_GRP, 'i') if nGRP then -- verifico se ha un principale local nMainOffsId = EgtGetInfo( nOutlineId, BTL_FTR_MAINID, 'i') local nTaskId = nOutlineId if nMainOffsId then nTaskId = nOutlineId + nMainOffsId end -- assegno TASKID alla feature per calcoli EgtSetInfo( nOutlineId, TASKID, nTaskId) -- recupero eventuali AuxId local sAuxIds = EgtGetInfo( nOutlineId, BTL_FTR_AUXID) if sAuxIds then local AuxIdArray = EgtSplitString( sAuxIds, ",") if AuxIdArray.Count > 0 then for AuxIdIndex = 1, #AuxIdArray do local AuxId = AuxIdArray[AuxIdIndex] AuxId = EgtTrim( AuxId) AuxId = AuxId:gsub("^%+", "") local nAuxId = tonumber( AuxId) if nAuxId then EgtSetInfo( nOutlineId + nAuxId, TASKID, nTaskId) end end end end end nOutlineId = EgtGetNext( nOutlineId) end -- Assegno TASKID alle feature per calcoli local nProcessingId = EgtGetFirstNameInGroup( nPartId, PROCESSINGS) local nFeatureId = EgtGetFirstInGroup( nProcessingId) while nFeatureId do -- verifico che sia una feature local nGRP = EgtGetInfo( nFeatureId, BTL_FTR_GRP, 'i') if nGRP then -- verifico se ha un principale local nMainOffsId = EgtGetInfo( nFeatureId, BTL_FTR_MAINID, 'i') local nTaskId = nFeatureId if nMainOffsId then nTaskId = nFeatureId + nMainOffsId end -- assegno TASKID alla feature per calcoli EgtSetInfo( nFeatureId, TASKID, nTaskId) -- recupero eventuali AuxId local sAuxIds = EgtGetInfo( nFeatureId, BTL_FTR_AUXID) if sAuxIds then local AuxIdArray = EgtSplitString( sAuxIds, ",") for AuxIdIndex = 1, #AuxIdArray do local AuxId = AuxIdArray[AuxIdIndex] AuxId = EgtTrim( AuxId) AuxId = AuxId:gsub("^%+", "") local nAuxId = tonumber( AuxId) if nAuxId then EgtSetInfo( nFeatureId + nAuxId, TASKID, nTaskId) end end end end nFeatureId = EgtGetNext( nFeatureId) end return true end --------------------------------------------------------------------- -- funzione che crea un Bwe da un pezzo Btl local function CreateBWEFromPart( nPartId, sProjDirPath) -- Aggiorno identificativi per segnalazione errori UpdateCutIdAndTaskId( nPartId) -- Disabilito segnalazione modificato local bOldEnMod = EgtGetEnableModified() if bOldEnMod then EgtDisableModified() end -- Recupero visibilita' pezzo e lo imposto a visibile local nOldPartMode = 0 EgtGetMode( nPartId, nOldPartMode) EgtSetMode( nPartId, GDB_MD.STD) -- Salvo pezzo nel suo progetto local bOk = false local nPDN = EgtGetInfo( nPartId, BTL_PRT_PDN, 'i') --EgtSaveFile( 'c:\\Temp\\TestPDN.nge') local sPartFilePath = sProjDirPath .. '\\' .. tostring(nPDN) .. '.bwe' bOk = EgtSaveObjToFile({ nPartId, EgtGetFirstNameInGroup( GDB_ID.ROOT, BTLINFO), EgtGetFirstNameInGroup( GDB_ID.ROOT, PROJECTINFO)}, sPartFilePath, GDB_NT.CMPTXT) -- Ripristino visibilita' pezzo EgtSetMode( nPartId, nOldPartMode) -- Ripristino stato segnalazione modifica if bOldEnMod then EgtEnableModified() end return EgtIf( bOk, sPartFilePath, '') end --------------------------------------------------------------------- -- funzione che crea un Bwe da un MachGroup local function CreateBWEFromMachGroup( nMachGroupId, sProjDirPath) -- Aggiorno identificativi per segnalazione errori EgtSetCurrMachGroup( nMachGroupId) local nRawId = EgtGetFirstRawPart() while nRawId do if EgtVerifyRawPartPhase( nRawId, 1) then local nPartId = EgtGetFirstPartInRawPart( nRawId) while nPartId do UpdateCutIdAndTaskId(nPartId) nPartId = EgtGetNextPartInRawPart( nPartId) end end nRawId = EgtGetNextRawPart( nRawId) end -- Salvo gruppo di lavorazione nel suo progetto local sMachGroupName = EgtGetMachGroupName( nMachGroupId) local sMachGroupFilePath = sProjDirPath .. '\\' .. sMachGroupName .. '.bwe' if EgtSaveMachGroupToFile( nMachGroupId, { EgtGetFirstNameInGroup( GDB_ID.ROOT, BTLINFO), EgtGetFirstNameInGroup( GDB_ID.ROOT, PROJECTINFO)}, sMachGroupFilePath, GDB_NT.CMPTEXT) then return sMachGroupFilePath end return '' end --------------------------------------------------------------------- -- funzione che verifica un pezzo Btl function BeamWallPipeLib.VerifyBtlPart( nPartId, BarPath, ProjType, sMachineName, GlobState) -- verifico connessione a Redis local bRedisConnect = VerifyRedisConnection( 'redis.ufficio:26379, serviceName=devel, DefaultDatabase=6, keepAlive=180, connectTimeout=15000, syncTimeout=15000, asyncTimeout=15000, abortConnect=false, ssl=false, allowAdmin=true') BarPath = CreateBWEFromPart( nPartId, BarPath) local CurrAnswerChannel = AnswerChannel .. os.time() local Args = { BarId = nPartId, --ProgramPage = PROJECT_TYPES.PROJ, BarPath = BarPath, --ProjType = BWTYPES.BEAM, MachineName = sMachineName, --GlobState = CALCSTATES.NOTCALCULATED, CmdType = CMDTYPES.CHECKNOSIM, OutputChannel = CurrAnswerChannel, Mode = QUESTION_MODES.VERIFY, UID = 1} local Question = { nThreadIndex = 0, nId = 1, ExecEnvironment = 2, Args = Args} local JsonQuestion = JSON:encode( Question) local bOk = EgtRedisAsyncPublish( nRedisConnectionId, QuestionChannel, JsonQuestion) local AnswerArgs if bOk then EgtOutLog('Messaggio Redis pubblicato:' .. QuestionChannel .. ' ' .. JsonQuestion) local bOk, Answer = EgtRedisAsyncSubscribeOneMessage( nRedisConnectionId, CurrAnswerChannel, 60000) -- se la connessione è stata creata in questa funzione la chiudo if bRedisConnect then EgtRedisAsyncDisconnect( nRedisConnectionId) nRedisConnectionId = 0 end if bOk then EgtOutLog('Risposta Redis ricevuta:' .. Answer) local JsonAnswer = JSON:decode( Answer) AnswerArgs = JsonAnswer['Args'] AnswerArgs.OutputChannel = nil return 1, AnswerArgs else local sErrorMsg = 'Errore! Risposta dal canale di verifica non arrivata!' EgtOutLog(sErrorMsg) return 0, { Error = sErrorMsg} end else local sErrorMsg = 'Errore! Pubblicazione sul canale di verifica fallita!' EgtOutLog(sErrorMsg) return 0, { Error = sErrorMsg} end end local function GetAnswerChannelCode() local nCurrTime = os.time() if nCurrTime == nAnswerChannel_LastSecond then nAnswerChannel_Count = nAnswerChannel_Count + 1 return nCurrTime .. nAnswerChannel_Count else nAnswerChannel_LastSecond = nCurrTime nAnswerChannel_Count = 0 return nCurrTime end end function BeamWallPipeLib.AsyncVerifyPartCalc( nPartId, BarPath, ProjType, sMachineName, GlobState, bIsMachGroup) -- verifico connessione a Redis local bRedisConnect = VerifyRedisConnection( 'redis.ufficio:26379, serviceName=devel, DefaultDatabase=6, keepAlive=180, connectTimeout=15000, syncTimeout=15000, asyncTimeout=15000, abortConnect=false, ssl=false, allowAdmin=true') EgtResetCurrMachGroup() if bIsMachGroup then BarPath = CreateBWEFromMachGroup( nPartId, BarPath) else BarPath = CreateBWEFromPart( nPartId, BarPath) end local CurrAnswerChannel = AnswerChannel .. GetAnswerChannelCode() local Args = { BarId = nPartId, --ProgramPage = PROJECT_TYPES.PROJ, BarPath = BarPath, --ProjType = BWTYPES.BEAM, MachineName = sMachineName, --GlobState = CALCSTATES.NOTCALCULATED, CmdType = CMDTYPES.CHECKNOSIM, OutputChannel = CurrAnswerChannel, Mode = QUESTION_MODES.VERIFY, UID = 1} local Question = { nThreadIndex = 0, nId = 1, ExecEnvironment = 2, Args = Args} local JsonQuestion = JSON:encode( Question) EgtRedisAsyncSubscribe( nRedisConnectionId, CurrAnswerChannel) local bOk = EgtRedisAsyncPublish( nRedisConnectionId, QuestionChannel, JsonQuestion) if not bOk then EgtOutLog( 'Error! Verify Redis publish failed on PartId ' .. nPartId .. ' and channel ' .. CurrAnswerChannel .. '!') EgtRedisAsyncUnsubscribe( nRedisConnectionId, CurrAnswerChannel) EgtOutLog( 'EgtRedisAsyncUnsubscribe ' .. nRedisConnectionId .. ' ' .. CurrAnswerChannel) end return bOk, CurrAnswerChannel end function BeamWallPipeLib.AsyncVerifyPartResult( CurrAnswerChannel) -- verifico connessione a Redis local bRedisConnect = VerifyRedisConnection( 'redis.ufficio:26379, serviceName=devel, DefaultDatabase=6, keepAlive=180, connectTimeout=15000, syncTimeout=15000, asyncTimeout=15000, abortConnect=false, ssl=false, allowAdmin=true') local bOk, nCount, Answer = EgtRedisAsyncGetMessage( nRedisConnectionId, CurrAnswerChannel) if bRedisConnect then EgtRedisAsyncDisconnect( nRedisConnectionId) nRedisConnectionId = 0 end if bOk then if nCount > 0 then EgtOutLog('Risposta Redis ricevuta:' .. Answer) EgtRedisAsyncUnsubscribe( nRedisConnectionId, CurrAnswerChannel) EgtOutLog( 'EgtRedisAsyncUnsubscribe ' .. nRedisConnectionId .. ' ' .. CurrAnswerChannel) local JsonAnswer = JSON:decode( Answer) if JsonAnswer then AnswerArgs = JsonAnswer['Args'] AnswerArgs.OutputChannel = nil return true, true, AnswerArgs else return true, true end else return true, false end else return false end end --------------------------------------------------------------------- -- funzione che analizza i risultati della verifica local function AnalyzeResult( RESULT) local bMachiningOk = true local dTime = 0 for nElementIndex = 1, #RESULT do local CurrElement = RESULT[nElementIndex] if CurrElement.sType == 'Part' then if tonumber( CurrElement.nErr) > 0 then bMachiningOk = false end elseif CurrElement.sType == 'Feature' then if not CurrElement.ChosenStrategy or not CurrElement.ChosenStrategy.sStatus or ( CurrElement.ChosenStrategy.sStatus ~= 'Completed' and CurrElement.ChosenStrategy.sStatus ~= 'Not-Completed') then bMachiningOk = false end elseif CurrElement.sType == 'Time' then dTime = CurrElement.dTime end end return bMachiningOk, dTime end --------------------------------------------------------------------- -- funzione che verifica una trave function BeamWallPipeLib.VerifyBeam( QuestionArgs) if QuestionArgs and QuestionArgs.BarPath and QuestionArgs.MachineName and QuestionArgs.CmdType then local BarId = tonumber( QuestionArgs["BarId"]) local BarPath = QuestionArgs["BarPath"] local MachineName = QuestionArgs["MachineName"] local CmdType = tonumber( QuestionArgs["CmdType"]) --local ProgramPage = tonumber( QuestionArgs["ProgramPage"]) _G.BEAM = { BASEDIR = sBaseDir, FILE = BarPath, MACHINE = MachineName, FLAG = CmdType, BW = true } local bOk, sErr = pcall( dofile, BEAM.BASEDIR .. "\\BatchProcessNew.lua") if not bOk then local sErrorMsg = 'Errore! Chiamata alla funzione BatchProcessNew.lua fallita! (' .. ( sErr or '') .. ')' EgtOutLog( sErrorMsg) return 0, { Error = sErrorMsg} end local bMachiningOk ,dTime = AnalyzeResult( RESULT) --local nResult = EgtIf( bMachiningOk, 1, 0) local AnswerArgs = {} AnswerArgs.ERR = BEAM.ERR AnswerArgs.BarId = BarId AnswerArgs.BarPath = BarPath AnswerArgs.Time = dTime AnswerArgs.MachiningOk = EgtIf( bMachiningOk, 1, 0) _G.BEAM = {} return 1, AnswerArgs else local sErrorMsg = 'Errore! Domanda senza argomenti che sono obbligatori!' EgtOutLog( sErrorMsg) return 0, { Error = sErrorMsg} end end --------------------------------------------------------------------- -- funzione che esegue il nesting sui pezzi passati function BeamWallPipeLib.NestBeam( PartIdList, RawList, MachineNameList, StartOffset, Offset, LogFile) --if QuestionArgs and QuestionArgs.BarPath and QuestionArgs.MachineName and QuestionArgs.CmdType then --local BarId = tonumber( QuestionArgs["BarId"]) --local BarPath = QuestionArgs["BarPath"] --local MachineName = QuestionArgs["MachineName"] --local CmdType = tonumber( QuestionArgs["CmdType"]) --local ProgramPage = tonumber( QuestionArgs["ProgramPage"]) _G.NEST = { BASEDIR = sBaseDir, FILE = LogFile, MACHINELIST = MachineNameList, STARTOFFSET = 20, OFFSET = 7 } _G.PARTLIST = PartIdList _G.RAWLIST = RawList local sFileName = EgtGetStringFromIni( 'Nest', 'NestExec', '', sIniFilePath) --local bOk, sErr = pcall( dofile, sBaseDir .. '\\' .. sFileName .. 'New.lua') local bOk, sErr = pcall( dofile, sBaseDir .. '\\' .. 'NestProcessNew.lua') if not bOk then local sErrorMsg = 'Errore! Chiamata alla funzione NestProcessNew.lua fallita! (' .. ( sErr or '') .. ')' EgtOutLog( sErrorMsg) return false, sErrorMsg end --EgtSaveFile() --local bMachiningOk ,dTime = AnalyzeResult( RESULT) ----local nResult = EgtIf( bMachiningOk, 1, 0) --local AnswerArgs = {} --AnswerArgs.ERR = BEAM.ERR --AnswerArgs.BarId = BarId --AnswerArgs.BarPath = BarPath --AnswerArgs.Time = dTime --AnswerArgs.MachiningOk = EgtIf( bMachiningOk, 1, 0) --_G.BEAM = {} return true --else -- local sErrorMsg = 'Errore! Domanda senza argomenti che sono obbligatori!' -- EgtOutLog( sErrorMsg) -- return 0, { Error = sErrorMsg} --end end --------------------------------------------------------------------- return BeamWallPipeLib