cc24b3b3ae
- corretta la chiamata della FindMilling tramite UUID (MachiningLib)
412 lines
19 KiB
Lua
412 lines
19 KiB
Lua
-- MachiningLib.lua by Egaltech s.r.l. 2022/05/07
|
|
-- Libreria ricerca lavorazioni per Travi
|
|
-- 2022/05/07 ES Profonde modifiche per scelta ottimale lavorazioni in macchine con più teste.
|
|
-- 2022/07/27 Aggiunta la gestione del tipo di foratura "AngleDrill" per fori molto inclinati
|
|
-- 2022/11/02 Modificata scelta utensile ottimizzata. Ora se c'è un utensile più grande disponibile si dà preferenza a quello.
|
|
-- 2022/11/25 Per FindMilling implementata la possibilità di escludere la testa H3 dalla ricerca utensile.
|
|
|
|
-- Tabella per definizione modulo
|
|
local MachiningLib = {}
|
|
|
|
-- Include
|
|
require( 'EgtBase')
|
|
|
|
EgtOutLog( ' MachiningLib started', 1)
|
|
|
|
-- Dati
|
|
local BD = require( 'BeamData')
|
|
local Cuttings = require( 'CutData')
|
|
local Millings = require( 'MillingData')
|
|
local Pocketings = require( 'PocketingData')
|
|
local Sawings = require( 'SawingData')
|
|
local Drillings = require( 'DrillData')
|
|
|
|
-- tipo di teste macchina
|
|
local ONE_HEAD = 1 -- una testa (Fast, One, Turn1T)
|
|
local TWO_EQUAL_HEADS = 2 -- due teste uguali (PF, Turn)
|
|
local TWO_UP_DOWN_HEADS = 3 -- due teste una sopra l'altra sotto (PF1250)
|
|
local MachineHeadType = 0
|
|
|
|
-- testa correntementa attiva, e utensili correnti per ogni testa
|
|
local nActiveHead = 0
|
|
local H1_TOOL = ''
|
|
local H2_TOOL = ''
|
|
|
|
-- testa e utensile della lavorazione restituita ma non ancora confermata
|
|
local nNextMachHead = 0
|
|
local H1_NEXT_TOOL = ''
|
|
local H2_NEXT_TOOL = ''
|
|
|
|
-- teste con utensili fissi
|
|
local vFixedHeads = {}
|
|
|
|
---------------------------------------------------------------------
|
|
-- funzione che imposta il tipo di macchina corrente
|
|
local function SetCurrMachineHeadType()
|
|
-- se già inizializzato, esco
|
|
if MachineHeadType and MachineHeadType >= 1 and MachineHeadType <= 3 then return end
|
|
-- altrimenti, lo imposto
|
|
if BD.DOWN_HEAD then
|
|
MachineHeadType = TWO_UP_DOWN_HEADS
|
|
elseif BD.TWO_EQUAL_HEADS then
|
|
MachineHeadType = TWO_EQUAL_HEADS
|
|
else
|
|
MachineHeadType = ONE_HEAD
|
|
end
|
|
-- imposto eventuali teste con utensili fissi
|
|
if BD.C_SIMM then
|
|
vFixedHeads = { [31] = true}
|
|
elseif BD.TURN then
|
|
vFixedHeads = { [12] = true, [22] = true}
|
|
else -- FAST
|
|
vFixedHeads = { [2] = true}
|
|
end
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
-- funzione che conferma e rende attivi testa e utensile ipotizzati
|
|
local function ConfirmNextMachining()
|
|
-- se non definita testa successiva, esco
|
|
if not nNextMachHead or nNextMachHead < 1 or nNextMachHead > 2 then return end
|
|
-- altrimenti, la confermo come attiva
|
|
nActiveHead = nNextMachHead
|
|
if nNextMachHead == 1 then
|
|
H1_TOOL = H1_NEXT_TOOL
|
|
elseif nNextMachHead == 2 then
|
|
H2_TOOL = H2_NEXT_TOOL
|
|
end
|
|
-- reset prossima testa
|
|
nNextMachHead = 0
|
|
H1_NEXT_TOOL = ''
|
|
H2_NEXT_TOOL = ''
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
-- funzione che traccia testa e utensile ipotizzati
|
|
local function SetNextMachining( sToolName, nHead, bFixed)
|
|
if nHead < 1 or nHead > 2 then return end
|
|
if bFixed then
|
|
nNextMachHead = 0
|
|
H1_NEXT_TOOL = ''
|
|
H2_NEXT_TOOL = ''
|
|
end
|
|
nNextMachHead = nHead
|
|
if nHead == 1 then
|
|
H1_NEXT_TOOL = sToolName
|
|
elseif nHead == 2 then
|
|
H2_NEXT_TOOL = sToolName
|
|
end
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
local function SetCurrMachiningAndTool( sMachName)
|
|
if not EgtMdbSetCurrMachining( sMachName) then return false end
|
|
local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID)
|
|
local sTool = EgtTdbGetToolFromUUID( sTuuid)
|
|
if not sTool then return false end
|
|
if not EgtTdbSetCurrTool( sTool) then return false end
|
|
local bActive = EgtTdbGetCurrToolParam( MCH_TP.ACTIVE)
|
|
local sHead = EgtTdbGetCurrToolParam( MCH_TP.HEAD)
|
|
local nHead = tonumber( sHead:sub( 2, #sHead))
|
|
local bH2 = ( nHead >= 21 and nHead <= 29)
|
|
local bH3 = ( nHead >= 31 and nHead <= 39)
|
|
local bFixed = ( vFixedHeads[nHead])
|
|
return bActive, sTool, bH2, bFixed, bH3
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
function VerifyDrill( dDiam, dDepth, bH2)
|
|
local dTDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM)
|
|
local dTMaxMat = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT)
|
|
local dMaxToolLength = EgtTdbGetCurrToolParam( MCH_TP.TOTLEN)
|
|
local dToolDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM)
|
|
local dDiamTh = EgtTdbGetCurrToolThDiam()
|
|
local dLenTh = 72
|
|
if EgtTdbGetCurrToolThLength then dLenTh = EgtTdbGetCurrToolThLength() end
|
|
local dFreeLen = EgtTdbGetCurrToolParam( MCH_TP.LEN) - dLenTh - EgtMdbGetGeneralParam( MCH_GP.MAXDEPTHSAFE)
|
|
if dTDiam < dDiam + 10 * GEO.EPS_SMALL and
|
|
dTDiam > dDiam - BD.DRILL_TOL - 10 * GEO.EPS_SMALL and
|
|
( not dDepth or dTMaxMat > dDepth - GEO.EPS_SMALL) then
|
|
return true, { TMaxMat = dTMaxMat, MaxToolLength = dMaxToolLength, ToolDiam = dToolDiam, DiamTh = dDiamTh, FreeLen = dFreeLen, H2 = bH2}
|
|
end
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
function VerifyDrillPocket( dDiam, dDepth, bH2)
|
|
local dTDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM)
|
|
local dTMaxDepth = EgtTdbGetCurrToolMaxDepth()
|
|
local dMaxToolLength = EgtTdbGetCurrToolParam( MCH_TP.TOTLEN)
|
|
local dToolDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM)
|
|
local dDiamTh = EgtTdbGetCurrToolThDiam()
|
|
local dFreeLen = dTMaxDepth
|
|
if dTDiam < dDiam - 10 * GEO.EPS_SMALL and
|
|
( not dDepth or dTMaxDepth > dDepth - GEO.EPS_SMALL) then
|
|
return true, { TMaxDepth = dTMaxDepth, MaxToolLength = dMaxToolLength, ToolDiam = dToolDiam, DiamTh = dDiamTh, FreeLen = dFreeLen, H2 = bH2}
|
|
end
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
function VerifyMill( dDepth, sTuuidMstr, dMaxDiam, dMaxTotLen, bH2)
|
|
local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID)
|
|
local dTMaxDepth = EgtTdbGetCurrToolMaxDepth()
|
|
local dTDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM)
|
|
local dTTotLen = EgtTdbGetCurrToolParam( MCH_TP.TOTLEN)
|
|
if ( not dDepth or dTMaxDepth > dDepth - GEO.EPS_SMALL) and
|
|
( not sTuuidMstr or sTuuidMstr == sTuuid) and
|
|
( not dMaxDiam or dTDiam < dMaxDiam + GEO.EPS_SMALL) and
|
|
( not dMaxTotLen or dTTotLen < dMaxTotLen + GEO.EPS_SMALL) then
|
|
return true, { TMaxDepth = dTMaxDepth, TDiam = dTDiam, H2 = bH2}
|
|
end
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
function VerifyPocket( dMaxDiam, dDepth, dMaxTotLen, bH2)
|
|
local dTDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM)
|
|
local dTMaxDepth = EgtTdbGetCurrToolMaxDepth()
|
|
local dTTotLen = EgtTdbGetCurrToolParam( MCH_TP.TOTLEN)
|
|
if ( not dMaxDiam or dTDiam < dMaxDiam + GEO.EPS_SMALL) and
|
|
( not dDepth or dTMaxDepth > dDepth - GEO.EPS_SMALL) and
|
|
( not dMaxTotLen or dTTotLen < dMaxTotLen + GEO.EPS_SMALL) then
|
|
return true, { TDiam = dTDiam, TMaxDepth = dTMaxDepth, H2 = bH2}
|
|
end
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
function VerifyTool( MachiningType, sType, Params, bH2)
|
|
if MachiningType == MCH_MY.DRILLING then
|
|
if EgtStartsWith( sType, 'Drill') or EgtStartsWith( sType, 'AngleDrill') then
|
|
return VerifyDrill( Params.Diam, Params.Depth, bH2)
|
|
elseif EgtStartsWith( sType, 'Pocket') then
|
|
return VerifyDrillPocket( Params.Diam, Params.Depth, bH2)
|
|
end
|
|
elseif MachiningType == MCH_MY.SAWING then
|
|
return true, { H2 = bH2}
|
|
elseif MachiningType == MCH_MY.MILLING then
|
|
return VerifyMill( Params.Depth, Params.TuuidMstr, Params.MaxDiam, Params.MaxTotLen, bH2)
|
|
elseif MachiningType == MCH_MY.POCKETING then
|
|
return VerifyPocket( Params.MaxDiam, Params.Depth, Params.MaxTotLen, bH2)
|
|
elseif MachiningType == MCH_MY.MORTISING then
|
|
return true, { H2 = bH2}
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
function GetMachinings( MachiningType)
|
|
if MachiningType == MCH_MY.DRILLING then
|
|
return Drillings
|
|
elseif MachiningType == MCH_MY.SAWING then
|
|
return Cuttings
|
|
elseif MachiningType == MCH_MY.MILLING then
|
|
return Millings
|
|
elseif MachiningType == MCH_MY.POCKETING then
|
|
return Pocketings
|
|
elseif MachiningType == MCH_MY.MORTISING then
|
|
return Sawings
|
|
end
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
function ReturnParams( MachiningType, MachiningName, sType, ToolParams)
|
|
if MachiningType == MCH_MY.DRILLING then
|
|
local _, sOrigType = EgtEndsWith( sType, '_H2')
|
|
return MachiningName, sType, EgtIf( sOrigType == 'Drill' or sOrigType == 'AngleDrill' , ToolParams.TMaxMat, ToolParams.TMaxDepth), ToolParams.MaxToolLength, ToolParams.ToolDiam, ToolParams.DiamTh, ToolParams.FreeLen
|
|
elseif MachiningType == MCH_MY.SAWING then
|
|
return MachiningName, ToolParams.H2
|
|
elseif MachiningType == MCH_MY.MILLING then
|
|
return MachiningName, ToolParams.TMaxDepth, ToolParams.TDiam, ToolParams.H2
|
|
elseif MachiningType == MCH_MY.POCKETING then
|
|
return MachiningName, ToolParams.TDiam, ToolParams.TMaxDepth, ToolParams.H2
|
|
elseif MachiningType == MCH_MY.MORTISING then
|
|
return MachiningName
|
|
end
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
local function FindMachining( MachiningType, sType, Params, bTopHead, bDownHead, bExcludeH3)
|
|
if bTopHead == nil and bDownHead == nil then
|
|
bTopHead = true
|
|
bDownHead = false
|
|
elseif bTopHead == nil then
|
|
bTopHead = not bDownHead
|
|
elseif bDownHead == nil then
|
|
bDownHead = not bTopHead
|
|
end
|
|
SetCurrMachineHeadType()
|
|
-- verifico se testa attiva va bene
|
|
local sH1Mach = ''
|
|
local sH1Tool = ''
|
|
local sH1Param
|
|
local sH2Mach = ''
|
|
local sH2Tool = ''
|
|
local sH2Param
|
|
-- ricerca sulle forature, dal diametro maggiore al minore
|
|
local Machinings = GetMachinings( MachiningType)
|
|
local ForStart = 1
|
|
local ForEnd = #Machinings
|
|
local ForStep = 1
|
|
if MachiningType == MCH_MY.DRILLING then
|
|
ForStart = #Machinings
|
|
ForEnd = 1
|
|
ForStep = -1
|
|
end
|
|
if ( BEAM and BEAM.BW) or MachineHeadType == ONE_HEAD or MachineHeadType == TWO_EQUAL_HEADS or ( MachineHeadType == TWO_UP_DOWN_HEADS and not bDownHead) then
|
|
_, sType = EgtEndsWith( sType, '_H2')
|
|
elseif ( not BEAM or not BEAM.BW) and MachineHeadType == TWO_UP_DOWN_HEADS and bDownHead then
|
|
if not EgtEndsWith( sType, '_H2') then
|
|
sType = sType .. '_H2'
|
|
end
|
|
end
|
|
local MachineHeadUse = MachineHeadType
|
|
if not BEAM or not BEAM.BW then
|
|
MachineHeadUse = ONE_HEAD
|
|
end
|
|
if BEAM and BEAM.BW and MachineHeadUse == TWO_UP_DOWN_HEADS and bTopHead and bDownHead then
|
|
-- se posso usare entrambe le teste, la gestisco come una macchina a due teste da sopra
|
|
MachineHeadUse = TWO_EQUAL_HEADS
|
|
end
|
|
-- variabile che definisce quando un utensile ha un diametro sostanzialmente più grande di un altro
|
|
local dBiggerToolTolerance = 1.25
|
|
for i = ForStart, ForEnd, ForStep do
|
|
local Machining = Machinings[i]
|
|
local sMachiningType = Machining.Type
|
|
if BEAM and BEAM.BW then
|
|
_, sMachiningType = EgtEndsWith( Machining.Type, '_H2')
|
|
end
|
|
-- recupero dati utensile
|
|
local bToolActive, sToolName, bH2, bFixed, bH3 = SetCurrMachiningAndTool( Machining.Name)
|
|
if Machining.On and sMachiningType == sType and bToolActive and ( not bH3 or bH3 == not bExcludeH3) then
|
|
local bOk, ToolParams = VerifyTool( MachiningType, sType, Params, bH2)
|
|
if bOk then
|
|
if MachineHeadUse == ONE_HEAD then
|
|
SetNextMachining( sToolName, 1, bFixed)
|
|
return ReturnParams(MachiningType, Machining.Name, Machining.Type, ToolParams)
|
|
elseif MachineHeadUse == TWO_EQUAL_HEADS then
|
|
-- se nessuna testa attiva, prendo la prima lavorazione disponibile
|
|
if nActiveHead == 0 then
|
|
SetNextMachining( sToolName, EgtIf( bH2, 2, 1), bFixed)
|
|
return ReturnParams( MachiningType, Machining.Name, Machining.Type, ToolParams)
|
|
-- verifico se posso usare lo stesso utensile della testa attiva
|
|
elseif ( nActiveHead == 1 and not bH2 and sToolName == H1_TOOL) or ( nActiveHead == 2 and bH2 and sToolName == H2_TOOL) then
|
|
-- se l'utensile sulla testa attiva è molto più piccolo rispetto a quelli salvati non lo scelgo
|
|
if ( not sH1Param or not sH1Param.TDiam or sH1Param.TDiam < dBiggerToolTolerance * ToolParams.TDiam) and ( not sH2Param or not sH2Param.TDiam or sH2Param.TDiam < 1.25 * ToolParams.TDiam) then
|
|
SetNextMachining( sToolName, nActiveHead, bFixed)
|
|
return ReturnParams( MachiningType, Machining.Name, Machining.Type, ToolParams)
|
|
end
|
|
end
|
|
-- segno le lavorazioni disponibili per entrambe le teste
|
|
if bH2 then
|
|
if not sH2Mach or sH2Mach == '' then
|
|
sH2Mach = Machining.Name
|
|
sH2Tool = sToolName
|
|
sH2Param = ToolParams
|
|
end
|
|
else
|
|
if not sH1Mach or sH1Mach == '' then
|
|
sH1Mach = Machining.Name
|
|
sH1Tool = sToolName
|
|
sH1Param = ToolParams
|
|
end
|
|
end
|
|
elseif MachineHeadUse == TWO_UP_DOWN_HEADS then
|
|
if bTopHead and not bH2 then
|
|
SetNextMachining( sToolName, 1, bFixed)
|
|
return ReturnParams( MachiningType, Machining.Name, Machining.Type, ToolParams)
|
|
elseif bDownHead and bH2 then
|
|
SetNextMachining( sToolName, 2, bFixed)
|
|
return ReturnParams( MachiningType, Machining.Name, Machining.Type, ToolParams)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
if MachineHeadUse == TWO_EQUAL_HEADS then
|
|
-- se uno dei due utensili è molto più grande dell'altro scelgo quello senza fare altre analisi
|
|
if sH1Mach ~= "" and sH1Param.TDiam and sH2Mach ~= "" and sH2Param.TDiam then
|
|
if sH1Param.TDiam > dBiggerToolTolerance * sH2Param.TDiam then
|
|
SetNextMachining( sH1Tool, 1, bFixed)
|
|
return ReturnParams( MachiningType, sH1Mach, sType, sH1Param)
|
|
elseif sH2Param.TDiam > dBiggerToolTolerance * sH1Param.TDiam then
|
|
SetNextMachining( sH2Tool, 2, bFixed)
|
|
return ReturnParams( MachiningType, sH2Mach, sType, sH2Param)
|
|
end
|
|
end
|
|
-- verifico se cambiare testa o cambiare utensile su quella corrente
|
|
if nActiveHead == 1 then
|
|
if sH2Mach ~= "" then
|
|
SetNextMachining( sH2Tool, 2, bFixed)
|
|
return ReturnParams( MachiningType, sH2Mach, sType, sH2Param)
|
|
--return sH2Mach, sH2Param.Type, sH2Param.TMaxMat, sH2Param.MaxToolLength, sH2Param.ToolDiam, sH2Param.DiamTh, sH2Param.FreeLen
|
|
elseif sH1Mach ~= "" then
|
|
SetNextMachining( sH1Tool, 1, bFixed)
|
|
return ReturnParams( MachiningType, sH1Mach, sType, sH1Param)
|
|
--return sH1Mach, sH1Param.Type, sH1Param.TMaxMat, sH1Param.MaxToolLength, sH1Param.ToolDiam, sH1Param.DiamTh, sH1Param.FreeLen
|
|
end
|
|
elseif nActiveHead == 2 then
|
|
if sH1Mach ~= "" then
|
|
SetNextMachining( sH1Tool, 1, bFixed)
|
|
return ReturnParams( MachiningType, sH1Mach, sType, sH1Param)
|
|
--return sH1Mach, sH1Param.Type, sH1Param.TMaxMat, sH1Param.MaxToolLength, sH1Param.ToolDiam, sH1Param.DiamTh, sH1Param.FreeLen
|
|
elseif sH2Mach ~= "" then
|
|
SetNextMachining( sH2Tool, 2, bFixed)
|
|
return ReturnParams( MachiningType, sH2Mach, sType, sH2Param)
|
|
--return sH2Mach, sH2Param.Type, sH2Param.TMaxMat, sH2Param.MaxToolLength, sH2Param.ToolDiam, sH2Param.DiamTh, sH2Param.FreeLen
|
|
end
|
|
end
|
|
end
|
|
local bH2, sOrigType = EgtEndsWith( sType, '_H2')
|
|
if ( not BEAM or not BEAM.BW) and MachineHeadType == TWO_UP_DOWN_HEADS and bH2 and bTopHead then
|
|
return FindMachining( MachiningType, sOrigType, Params, true, false)
|
|
end
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
function MachiningLib.FindCutting( sType, bTopHead, bDownHead)
|
|
return FindMachining( MCH_MY.SAWING, sType, nil, bTopHead, bDownHead)
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
function MachiningLib.FindDrilling( dDiam, dDepth, bTopHead, bDownHead)
|
|
local MachiningName, MachiningType, Param1, Param2, Param3, Param4, Param5 = FindMachining( MCH_MY.DRILLING, 'Drill', { Diam = dDiam, Depth = dDepth}, bTopHead, bDownHead)
|
|
if not MachiningName or MachiningName == '' then
|
|
MachiningName, MachiningType, Param1, Param2, Param3, Param4, Param5 = FindMachining( MCH_MY.DRILLING, 'Pocket', { Diam = dDiam, Depth = dDepth}, bTopHead, bDownHead)
|
|
end
|
|
if MachiningName and MachiningName ~= '' then
|
|
return MachiningName, MachiningType, Param1, Param2, Param3, Param4, Param5
|
|
end
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
function MachiningLib.FindAngleDrilling( dDiam, dDepth, bTopHead, bDownHead)
|
|
local MachiningName, MachiningType, Param1, Param2, Param3, Param4, Param5 = FindMachining( MCH_MY.DRILLING, 'AngleDrill', { Diam = dDiam, Depth = dDepth}, bTopHead, bDownHead)
|
|
if MachiningName and MachiningName ~= '' then
|
|
return MachiningName, MachiningType, Param1, Param2, Param3, Param4, Param5
|
|
end
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
function MachiningLib.FindMilling( sType, dDepth, sTuuidMstr, dMaxDiam, dMaxTotLen, bTopHead, bDownHead, bExcludeH3)
|
|
return FindMachining( MCH_MY.MILLING, sType, { Depth = dDepth, TuuidMstr = sTuuidMstr, MaxDiam = dMaxDiam, MaxTotLen = dMaxTotLen}, bTopHead, bDownHead, bExcludeH3)
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
function MachiningLib.FindPocketing( sType, dMaxDiam, dDepth, dMaxTotLen, bTopHead, bDownHead)
|
|
return FindMachining( MCH_MY.POCKETING, sType, { MaxDiam = dMaxDiam, Depth = dDepth, MaxTotLen = dMaxTotLen}, bTopHead, bDownHead)
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
function MachiningLib.FindSawing( sType)
|
|
return FindMachining( MCH_MY.MORTISING, sType)
|
|
end
|
|
|
|
-------------------------------------------------------------------------------------------------------------
|
|
function MachiningLib.ApplyMachining( bRecalc, bApplyPost)
|
|
local bResult = EgtApplyMachining( bRecalc, bApplyPost)
|
|
if bResult then ConfirmNextMachining() end
|
|
return bResult
|
|
end
|
|
|
|
-------------------------------------------------------------------------------------------------------------
|
|
return MachiningLib
|