195 lines
8.6 KiB
Lua
195 lines
8.6 KiB
Lua
-- RunMachParamFromSWCalc.lua by Egaltech s.r.l. 2022/09/15
|
|
-- Calcolo dei parametri di stampa
|
|
|
|
-- Tabella per definizione modulo
|
|
local RunMachParamFromSWCalc = {}
|
|
|
|
-- Intestazioni
|
|
require( 'EgtBase')
|
|
|
|
EgtOutLog( ' RunMachParamFromSWCalc started', 1)
|
|
|
|
-- Costanti generali
|
|
local AMD = require( 'AddManData')
|
|
|
|
--local MATERIAL = {}
|
|
--MATERIAL.Name = 'AKROMID® B3 ICF 40'
|
|
--MATERIAL.K = 110
|
|
--MATERIAL.C1 = 0.8742
|
|
--MATERIAL.C2 = 0.8964
|
|
--MATERIAL.Density = 1.31
|
|
--MATERIAL.AMax = 48.33
|
|
--MATERIAL.ATrg = 49.9
|
|
--MATERIAL.AMin = 116.4
|
|
--MATERIAL.BMax = 1.667
|
|
--MATERIAL.BTrg = 2.2
|
|
--MATERIAL.BMin = 7.273
|
|
--MATERIAL.KW = 0.4
|
|
--MATERIAL.KZ = 0.9
|
|
--MATERIAL.KN = 0.3
|
|
|
|
---------------------------------------------------------------------
|
|
function RunMachParamFromSWCalc.Exec()
|
|
|
|
-- layer dei risultati
|
|
local nResultLayerId = EgtGetFirstNameInGroup( GDB_ID.ROOT, LAY_TFSCALC)
|
|
if not nResultLayerId then
|
|
nResultLayerId = EgtGroup( GDB_ID.ROOT)
|
|
EgtSetName( nResultLayerId, LAY_TFSCALC)
|
|
EgtSetLevel( nResultLayerId, GDB_LV.SYSTEM)
|
|
end
|
|
-- recupero Speed minima e massima dalla macchina
|
|
local sMachIni = EgtGetCurrMachineDir() .. '\\' .. EgtGetCurrMachineName() .. '.ini'
|
|
local dSMin = tonumber( EgtGetStringFromIni( SEC_3DPRINTING, KEY_SPEED_MIN, 0, sMachIni))
|
|
local dSMax = tonumber( EgtGetStringFromIni( SEC_3DPRINTING, KEY_SPEED_MAX, 50000, sMachIni))
|
|
-- massa materiale utilizzato
|
|
local dPrintMass = 0
|
|
-- massimo indice di layer calcolato
|
|
local nMaxIndex = 0
|
|
-- ciclo sui pezzi
|
|
local nPartId = EgtGetFirstPart()
|
|
while nPartId do
|
|
if not EgtGetInfo( nPartId, KEY_PART_ON_TABLE, 'b') then
|
|
nPartId = EgtGetNextPart( nPartId)
|
|
goto continue
|
|
end
|
|
-- recupero i parametri di lavorazione del pezzo
|
|
local dSliceStep = EgtGetInfo( nPartId, KEY_SLICE_STEP, 'd')
|
|
local dStrand = EgtGetInfo( nPartId, KEY_STRAND, 'd')
|
|
local dStrandCount = EgtGetInfo( nPartId, KEY_SHELLS_NBR, 'd')
|
|
-- recupero numero di strati per progress
|
|
local nLastLayerId = EgtGetLastNameInGroup( nPartId, SLICE_LAYER .. '*')
|
|
local nLayerQty = EgtGetInfo( nLastLayerId, KEY_SLICE_NBR, 'i')
|
|
-- ciclo sui layer
|
|
local nLayerIndex = 1
|
|
local nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) or EgtGetFirstNameInGroup( nPartId, "__" .. SLICE_LAYER .. nLayerIndex)
|
|
while nLayerId do
|
|
-- rimuovo eventuale info precedente del tempo di attesa
|
|
EgtRemoveInfo( nLayerId, KEY_WAITING_TIME)
|
|
-- calcolo lunghezza totale del layer
|
|
local dTotLayerLength = 0
|
|
local dTotLayerArea = 0
|
|
local nCrvId = EgtGetFirstNameInGroup( nLayerId, CONTOUR_GRP .. '*')
|
|
while nCrvId do
|
|
local nToolPathId = EgtGetFirstNameInGroup( nCrvId, TOOLPATH_GRP)
|
|
-- sommo lunghezze percorsi
|
|
local dTotCrvLength = 0
|
|
nShellId = EgtGetFirstInGroup( nToolPathId)
|
|
while nShellId do
|
|
dTotCrvLength = dTotCrvLength + EgtCurveLength( nShellId)
|
|
nShellId = EgtGetNext( nShellId)
|
|
end
|
|
dTotLayerLength = dTotLayerLength + dTotCrvLength
|
|
-- recupero area
|
|
local nOuterCrvId = EgtGetFirstNameInGroup( nCrvId, OUTER_CRV)
|
|
local _, _, dTotCrvArea = EgtCurveArea( nOuterCrvId)
|
|
local dOuterLength = EgtCurveLength( nOuterCrvId)
|
|
-- recupero offset del part per aggiungerlo all'area interna
|
|
local dOffset = EgtGetInfo( nPartId, KEY_OFFSET_SLICE, 'd')
|
|
dTotCrvArea = dTotCrvArea + ( dOffset * dOuterLength)
|
|
dTotLayerArea = dTotLayerArea + dTotCrvArea
|
|
nCrvId = EgtGetNextName( nCrvId, CONTOUR_GRP .. '*')
|
|
end
|
|
-- recupero feed del layer
|
|
local dLayerFeed = 0
|
|
local dLayerWait = 0
|
|
local nLayerResultId = EgtGetFirstNameInGroup( nResultLayerId, nLayerIndex)
|
|
if nLayerResultId then
|
|
dLayerFeed = EgtGetInfo( nLayerResultId, KEY_FCUR, 'd') or 0
|
|
dLayerWait = EgtGetInfo( nLayerResultId, KEY_WAITING_TIME, 'd') or 0
|
|
else
|
|
nLayerResultId = EgtGroup( nResultLayerId)
|
|
EgtSetName( nLayerResultId, nLayerIndex)
|
|
end
|
|
-- riporto riferimento a layer del solido in layer del calcolo
|
|
local nOrigLayers = EgtGetInfo( nLayerResultId, KEY_SLICEID, 'vi') or {}
|
|
local bFound = false
|
|
for nIndex = 1, #nOrigLayers do
|
|
if nOrigLayers[nIndex] == nLayerId then
|
|
bFound = true
|
|
end
|
|
end
|
|
if not bFound then
|
|
table.insert( nOrigLayers, nLayerId)
|
|
end
|
|
EgtSetInfo( nLayerResultId, KEY_SLICEID, nOrigLayers)
|
|
-- calcolo costante MF
|
|
local dMF = dTotLayerLength * dStrand / dTotLayerArea * 100
|
|
-- calcolo tempi stimati del layer
|
|
local dTMin = ( dMF + MATERIAL.AMin) / MATERIAL.BMin * pow( 0.25 * dStrand, MATERIAL.KW) * pow( dSliceStep, MATERIAL.KZ) * pow( dStrandCount, MATERIAL.KN)
|
|
local dTTrg = ( dMF + MATERIAL.ATrg) / MATERIAL.BTrg * pow( 0.25 * dStrand, MATERIAL.KW) * pow( dSliceStep, MATERIAL.KZ) * pow( dStrandCount, MATERIAL.KN)
|
|
local dTMax = ( dMF + MATERIAL.AMax) / MATERIAL.BMax * pow( 0.25 * dStrand, MATERIAL.KW) * pow( dSliceStep, MATERIAL.KZ) * pow( dStrandCount, MATERIAL.KN)
|
|
local dFMin = dTotLayerLength / dTMax * 60
|
|
local dFTrg = dTotLayerLength / dTTrg * 60
|
|
local dFMax = dTotLayerLength / dTMin * 60
|
|
local dLayerTime = dTTrg
|
|
if dLayerFeed == 0 then
|
|
dLayerFeed = dFTrg
|
|
dLayerWait = dTMin - dLayerTime
|
|
else
|
|
dLayerTime = dTotLayerLength / dLayerFeed * 60
|
|
end
|
|
-- calcolo la portata
|
|
local Vf = dLayerFeed * ( ( dStrand - dSliceStep) * dSliceStep + pi * pow( dSliceStep / 2, 2)) / 1000
|
|
-- calcolo speed
|
|
local dSpeed = ( MATERIAL.K / 100.0) * pow( Vf / MATERIAL.C1, 1 / MATERIAL.C2)
|
|
-- verifico se speed esce da minimo e massimo della macchina
|
|
local bSpeedOk = true
|
|
if dSpeed < dSMin then
|
|
bSpeedOk = false
|
|
dSpeed = dSMin
|
|
end
|
|
if dSpeed > dSMax then
|
|
bSpeedOk = false
|
|
dSpeed = dSMax
|
|
end
|
|
if not bSpeedOk then
|
|
dLayerFeed = ( MATERIAL.C1 * pow( ( dSpeed / ( MATERIAL.K / 100.0)), MATERIAL.C2)) * 1000 / ( ( dStrand - dSliceStep) * dSliceStep + pi * pow( dSliceStep / 2, 2))
|
|
dLayerTime = dTotLayerLength / dLayerFeed * 60
|
|
end
|
|
-- calcolo massa dello strato
|
|
local dLayerMass = dTotLayerLength * dSliceStep * dStrand * MATERIAL.Density * 1e-6
|
|
if dLayerMass and dLayerMass > 0 then
|
|
dPrintMass = dPrintMass + dLayerMass
|
|
end
|
|
-- scrivo info feed e speed in group toolpath
|
|
nCrvId = EgtGetFirstNameInGroup( nLayerId, CONTOUR_GRP .. '*')
|
|
while nCrvId do
|
|
local nToolPathId = EgtGetFirstNameInGroup( nCrvId, TOOLPATH_GRP) or GDB_ID.NULL
|
|
EgtSetInfo( nToolPathId, KEY_FEED, dLayerFeed)
|
|
EgtSetInfo( nToolPathId, KEY_SPEED, dSpeed)
|
|
nCrvId = EgtGetNextName( nCrvId, CONTOUR_GRP .. '*')
|
|
end
|
|
-- scrivo info attesa
|
|
if dLayerWait > 0 then
|
|
EgtSetInfo( nLayerId, KEY_WAITING_TIME, dLayerWait)
|
|
EgtSetInfo( nLayerResultId, KEY_WAITING_TIME, dLayerWait)
|
|
end
|
|
-- scrivo valori in struttura dati
|
|
--local nLayerResultId = EgtGetFirstNameInGroup( nResultLayerId, nLayerIndex)
|
|
EgtSetInfo( nLayerResultId, KEY_TMIN, dTMin)
|
|
EgtSetInfo( nLayerResultId, KEY_TTRG, dTTrg)
|
|
EgtSetInfo( nLayerResultId, KEY_TMAX, dTMax)
|
|
EgtSetInfo( nLayerResultId, KEY_FMIN, dFMin)
|
|
EgtSetInfo( nLayerResultId, KEY_FTRG, dFTrg)
|
|
EgtSetInfo( nLayerResultId, KEY_FMAX, dFMax)
|
|
EgtSetInfo( nLayerResultId, KEY_TCUR, dLayerTime)
|
|
EgtSetInfo( nLayerResultId, KEY_FCUR, dLayerFeed)
|
|
EgtSetInfo( nLayerResultId, KEY_LENGTH, dTotLayerLength)
|
|
EgtSetInfo( nLayerResultId, KEY_SPEED, dSpeed)
|
|
-- aggiorno interfaccia
|
|
EgtProcessEvents( 500 + ( nLayerIndex / nLayerQty * 100), 0)
|
|
nLayerIndex = nLayerIndex + 1
|
|
nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) or EgtGetFirstNameInGroup( nPartId, "__" .. SLICE_LAYER .. nLayerIndex)
|
|
end
|
|
if nMaxIndex < nLayerIndex then nMaxIndex = nLayerIndex end
|
|
nPartId = EgtGetNextPart( nPartId)
|
|
::continue::
|
|
end
|
|
-- imposto massa totale
|
|
EgtSetInfo( nResultLayerId, KEY_MASS, dPrintMass)
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
return RunMachParamFromSWCalc
|