Compare commits
101 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| eb8c78b7b1 | |||
| 4eefdf0842 | |||
| b536c30a88 | |||
| 9a0ea2e431 | |||
| d61a47755c | |||
| c6b8b74f26 | |||
| 53cd49bed1 | |||
| 2f4a77c73e | |||
| 64a3f75b31 | |||
| 000358b6a6 | |||
| 6c16e7b70a | |||
| 1ae32451e5 | |||
| 4c68955ba2 | |||
| dd80929ae1 | |||
| af80170976 | |||
| bf2742c6c7 | |||
| ec09b3f70c | |||
| 952d40cb2b | |||
| 0a767d1afd | |||
| d5be638099 | |||
| b6c5514f9e | |||
| 4fd18d377f | |||
| 9dff37f1f4 | |||
| b71ad963f1 | |||
| 3aefca4613 | |||
| cc5117aa11 | |||
| c5a8b852d9 | |||
| 69514074a9 | |||
| 6ecd613f12 | |||
| 6e4dee29af | |||
| da7ebc6b97 | |||
| 4685b6bde6 | |||
| 3a063bd2cf | |||
| 710a1fe070 | |||
| d818492d67 | |||
| e55e33c40a | |||
| 8cadb25261 | |||
| 2622b58cad | |||
| b5be932955 | |||
| 44ac2f8c2a | |||
| 0b928e987f | |||
| c213c3f059 | |||
| 330698b6aa | |||
| eb1ef693c4 | |||
| 862751c84a | |||
| e5a30c38d3 | |||
| e83d8db1cc | |||
| 9de88ffe84 | |||
| ffaf33c62e | |||
| 8c0389582b | |||
| ebe3d79c11 | |||
| f8c40739da | |||
| fa5aac926e | |||
| 749cd1e2bb | |||
| 587aaaafce | |||
| 2cfa7caba7 | |||
| fc0fba5bd3 | |||
| 94159f88f3 | |||
| 4961d2d528 | |||
| 7b22f5cc47 | |||
| 5047d5b652 | |||
| 7f9b880ff7 | |||
| 7e457a22b0 | |||
| 3c080e2b1a | |||
| 9d3edbfb54 | |||
| adf465c5e2 | |||
| 23f695fd56 | |||
| 52f347def1 | |||
| 028688b88a | |||
| cde5b137ae | |||
| d0cf5887d3 | |||
| afc4c6aaff | |||
| caa1875309 | |||
| 2e2c2188ce | |||
| 0acd75bece | |||
| db691cefe4 | |||
| d0ecd175c2 | |||
| 7e6d4189ef | |||
| abbc200504 | |||
| 9e4597b739 | |||
| d84d146701 | |||
| 00ff8818da | |||
| d5c582f890 | |||
| bc8b0490b7 | |||
| 5aad9dcbf2 | |||
| 8a582f512f | |||
| 1fde2e5fec | |||
| 7a89501cc9 | |||
| 89acdcc8f8 | |||
| f7c082e5b1 | |||
| 938c46b9d8 | |||
| 917bf5ec4b | |||
| 27d4ab3309 | |||
| 0ece2d91f4 | |||
| e08b53d5cf | |||
| a330b2fd7f | |||
| acdd4e10fb | |||
| ee6afb65c1 | |||
| ea9db1631b | |||
| 6513e75408 | |||
| 0e7d878f10 |
+19
-4
@@ -59,9 +59,23 @@ end
|
|||||||
local sLog = 'BatchProcess : ' .. BEAM.FILE .. ', ' .. BEAM.MACHINE .. ', ' .. sFlag
|
local sLog = 'BatchProcess : ' .. BEAM.FILE .. ', ' .. BEAM.MACHINE .. ', ' .. sFlag
|
||||||
EgtOutLog( sLog)
|
EgtOutLog( sLog)
|
||||||
|
|
||||||
-- Cancello file di log specifico
|
|
||||||
local sLogFile = EgtChangePathExtension( BEAM.FILE, '.txt')
|
local sLogFile = EgtChangePathExtension( BEAM.FILE, '.txt')
|
||||||
EgtEraseFile( sLogFile)
|
-- in caso sia richiesta generazione senza check, verifico prima che il file log specifico non contenga errori: se sì, forzo il check
|
||||||
|
if BEAM.FLAG == 0 then
|
||||||
|
local hLogFile = io.open( sLogFile, 'r')
|
||||||
|
if hLogFile then
|
||||||
|
for line in hLogFile:lines() do
|
||||||
|
if EgtStartsWith( line, 'ERR') and tonumber( EgtSplitString( line, '=')[2] or 0) > 0 then
|
||||||
|
BEAM.FLAG = 4
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
hLogFile:close()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Cancello file di log specifico
|
||||||
|
EgtEraseFile( sLogFile)
|
||||||
|
|
||||||
-- Funzioni per scrittura su file di log specifico
|
-- Funzioni per scrittura su file di log specifico
|
||||||
local function WriteErrToLogFile( nErr, sMsg, nRot, nCutId, nTaskId)
|
local function WriteErrToLogFile( nErr, sMsg, nRot, nCutId, nTaskId)
|
||||||
@@ -461,7 +475,7 @@ else
|
|||||||
-- Passo in modalità lavora
|
-- Passo in modalità lavora
|
||||||
EgtSetCurrMachGroup( EgtGetLastMachGroup())
|
EgtSetCurrMachGroup( EgtGetLastMachGroup())
|
||||||
-- Se necessario eseguo aggiornamento con setup corrente e ricalcolo delle lavorazioni
|
-- Se necessario eseguo aggiornamento con setup corrente e ricalcolo delle lavorazioni
|
||||||
if bToRecalc then
|
if bToRecalc or BEAM.FLAG == 3 or BEAM.FLAG == 4 then
|
||||||
EgtOutLog( ' +++ Recalculating all dispositions and machinings >>>')
|
EgtOutLog( ' +++ Recalculating all dispositions and machinings >>>')
|
||||||
EgtImportSetup()
|
EgtImportSetup()
|
||||||
EgtApplyAllMachinings()
|
EgtApplyAllMachinings()
|
||||||
@@ -525,7 +539,8 @@ if ( BEAM.FLAG == 0 and ( bToProcess or bToRecalc)) or BEAM.FLAG == 3 or BEAM.F
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- *** Genero programma CN *** ( se richiesto)
|
-- *** Genero programma CN *** ( se richiesto)
|
||||||
if BEAM.FLAG == 0 or BEAM.FLAG == 4 then
|
local bIsGenerationEnabled = ( EgtVerifyKeyOption( 110) == false)
|
||||||
|
if bIsGenerationEnabled and ( BEAM.FLAG == 0 or BEAM.FLAG == 4) then
|
||||||
EgtOutLog( ' +++ Generating NC part program >>>')
|
EgtOutLog( ' +++ Generating NC part program >>>')
|
||||||
local sInfo = 'EgtCAM5' .. EgtIf( EgtIs64bit(), ' 64bit', '')
|
local sInfo = 'EgtCAM5' .. EgtIf( EgtIs64bit(), ' 64bit', '')
|
||||||
if EgtGetExeVersion then
|
if EgtGetExeVersion then
|
||||||
|
|||||||
+19
-4
@@ -45,9 +45,23 @@ end
|
|||||||
local sLog = 'BatchProcess : ' .. BEAM.FILE .. ', ' .. BEAM.MACHINE .. ', ' .. sFlag
|
local sLog = 'BatchProcess : ' .. BEAM.FILE .. ', ' .. BEAM.MACHINE .. ', ' .. sFlag
|
||||||
EgtOutLog( sLog)
|
EgtOutLog( sLog)
|
||||||
|
|
||||||
-- Cancello file di log specifico
|
|
||||||
local sLogFile = EgtChangePathExtension( BEAM.FILE, '.txt')
|
local sLogFile = EgtChangePathExtension( BEAM.FILE, '.txt')
|
||||||
EgtEraseFile( sLogFile)
|
-- in caso sia richiesta generazione senza check, verifico prima che il file log specifico non contenga errori: se sì, forzo il check
|
||||||
|
if BEAM.FLAG == 0 then
|
||||||
|
local hLogFile = io.open( sLogFile, 'r')
|
||||||
|
if hLogFile then
|
||||||
|
for line in hLogFile:lines() do
|
||||||
|
if EgtStartsWith( line, 'ERR') and tonumber( EgtSplitString( line, '=')[2] or 0) > 0 then
|
||||||
|
BEAM.FLAG = 4
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
hLogFile:close()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Cancello file di log specifico
|
||||||
|
EgtEraseFile( sLogFile)
|
||||||
|
|
||||||
-- Funzioni per scrittura su file di log specifico
|
-- Funzioni per scrittura su file di log specifico
|
||||||
local function WriteErrToLogFile( nErr, sMsg, nRot, nCutId, nTaskId)
|
local function WriteErrToLogFile( nErr, sMsg, nRot, nCutId, nTaskId)
|
||||||
@@ -562,7 +576,7 @@ else
|
|||||||
-- Passo in modalità lavora
|
-- Passo in modalità lavora
|
||||||
EgtSetCurrMachGroup( EgtGetLastMachGroup())
|
EgtSetCurrMachGroup( EgtGetLastMachGroup())
|
||||||
-- Se necessario eseguo aggiornamento con setup corrente e ricalcolo delle lavorazioni
|
-- Se necessario eseguo aggiornamento con setup corrente e ricalcolo delle lavorazioni
|
||||||
if bToRecalc then
|
if bToRecalc or BEAM.FLAG == 3 or BEAM.FLAG == 4 then
|
||||||
EgtOutLog( ' +++ Recalculating all dispositions and machinings >>>')
|
EgtOutLog( ' +++ Recalculating all dispositions and machinings >>>')
|
||||||
EgtImportSetup()
|
EgtImportSetup()
|
||||||
EgtApplyAllMachinings()
|
EgtApplyAllMachinings()
|
||||||
@@ -626,7 +640,8 @@ if ( BEAM.FLAG == 0 and ( bToProcess or bToRecalc)) or BEAM.FLAG == 3 or BEAM.F
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- *** Genero programma CN *** ( se richiesto)
|
-- *** Genero programma CN *** ( se richiesto)
|
||||||
if BEAM.FLAG == 0 or BEAM.FLAG == 4 then
|
local bIsGenerationEnabled = ( EgtVerifyKeyOption( 110) == false)
|
||||||
|
if bIsGenerationEnabled and ( BEAM.FLAG == 0 or BEAM.FLAG == 4) then
|
||||||
EgtOutLog( ' +++ Generating NC part program >>>')
|
EgtOutLog( ' +++ Generating NC part program >>>')
|
||||||
local sInfo = 'EgtCAM5' .. EgtIf( EgtIs64bit(), ' 64bit', '')
|
local sInfo = 'EgtCAM5' .. EgtIf( EgtIs64bit(), ' 64bit', '')
|
||||||
if EgtGetExeVersion then
|
if EgtGetExeVersion then
|
||||||
|
|||||||
+65
-9
@@ -63,6 +63,7 @@
|
|||||||
-- 2024/03/13 In CollectFeatures si scrive lunghezza foro su Proc e si controla se serve Predrill
|
-- 2024/03/13 In CollectFeatures si scrive lunghezza foro su Proc e si controla se serve Predrill
|
||||||
-- In OrderFeature, preforo sempre prima del foro
|
-- In OrderFeature, preforo sempre prima del foro
|
||||||
-- 2024/04/11 In CollectFeatures aggiunta lettura info PRID, scritta in Proc.FeatureId
|
-- 2024/04/11 In CollectFeatures aggiunta lettura info PRID, scritta in Proc.FeatureId
|
||||||
|
-- 2024/09/04 Gestione dipendenza foro-tasca in caso di fase con pezzo ribaltato
|
||||||
|
|
||||||
-- Tabella per definizione modulo
|
-- Tabella per definizione modulo
|
||||||
local BeamExec = {}
|
local BeamExec = {}
|
||||||
@@ -844,6 +845,16 @@ local function OrderFeatures( vProc, b3Raw)
|
|||||||
B2.Box:getCenter():getX() > B1.Box:getMin():getX() and B2.Box:getCenter():getX() < B1.Box:getMax():getX() then
|
B2.Box:getCenter():getX() > B1.Box:getMin():getX() and B2.Box:getCenter():getX() < B1.Box:getMax():getX() then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
-- se primo è ribasso e secondo è una mortasa a coda di rondine, il ribasso va sempre prima a meno che la mortasa a coda di rondine non sia di testa
|
||||||
|
if LapJoint.Identify(B1) and B1.PassedByDtMortise and DtMortise.SideIdentify(B2) and
|
||||||
|
B2.Box:getCenter():getX() > B1.Box:getMin():getX() and B2.Box:getCenter():getX() < B1.Box:getMax():getX() then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
-- se primo è mortasa a coda di rondine e secondo è ribasso, la mortasa a coda di rondine va sempre dopo a meno che la mortasa a coda di rondine non sia di testa
|
||||||
|
if DtMortise.SideIdentify(B1) and LapJoint.Identify(B2) and B2.PassedByDtMortise and
|
||||||
|
B1.Box:getCenter():getX() > B2.Box:getMin():getX() and B1.Box:getCenter():getX() < B2.Box:getMax():getX() then
|
||||||
|
return false
|
||||||
|
end
|
||||||
-- se primo è feature di coda e l'altro è separazione o non è feature di coda
|
-- se primo è feature di coda e l'altro è separazione o non è feature di coda
|
||||||
if B1.Tail and ( Split.Identify( B2) or not B2.Tail) then
|
if B1.Tail and ( Split.Identify( B2) or not B2.Tail) then
|
||||||
return false
|
return false
|
||||||
@@ -1267,6 +1278,20 @@ local function ClassifyFeatures( vProc, b3Raw, Stats)
|
|||||||
vProc[nSplitting].Down = true
|
vProc[nSplitting].Down = true
|
||||||
bSomeDown = true
|
bSomeDown = true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- si cerca di riclassificare le feature che dipendono da altre (in caso siano su rotazioni diverse)
|
||||||
|
for i = 1, #vProc do
|
||||||
|
local Proc = vProc[i]
|
||||||
|
-- FORATURA
|
||||||
|
if Drill.Identify( Proc) and Proc.Dependency then
|
||||||
|
if Proc.Dependency.ExecBefore then
|
||||||
|
if Proc.Dependency.ExecBefore.Down then
|
||||||
|
local bMachiningSideChanged = Drill.Classify( Proc, b3Raw, 'DOWN')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
return bAllOk, bSomeDown, bSomeSide, bSplitRot
|
return bAllOk, bSomeDown, bSomeSide, bSplitRot
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1275,6 +1300,7 @@ local function AddFeatureMachining( Proc, nPhase, nRawId, nPartId, dCurrOvmH, bN
|
|||||||
local bOk = true
|
local bOk = true
|
||||||
local sErr = ''
|
local sErr = ''
|
||||||
local nNewPhase = -1
|
local nNewPhase = -1
|
||||||
|
local AddedIds
|
||||||
EgtOutLog( ' * Process ' .. tostring( Proc.Id) .. ' *', 1)
|
EgtOutLog( ' * Process ' .. tostring( Proc.Id) .. ' *', 1)
|
||||||
-- se intestatura ( 1-340-X )
|
-- se intestatura ( 1-340-X )
|
||||||
if Hcut.Identify( Proc) then
|
if Hcut.Identify( Proc) then
|
||||||
@@ -1300,7 +1326,7 @@ local function AddFeatureMachining( Proc, nPhase, nRawId, nPartId, dCurrOvmH, bN
|
|||||||
elseif Long2Cut.Identify( Proc) then
|
elseif Long2Cut.Identify( Proc) then
|
||||||
-- se due facce longitudinali, eseguo doppio taglio longitudinale
|
-- se due facce longitudinali, eseguo doppio taglio longitudinale
|
||||||
if Long2Cut.GetLongFacesCount( Proc) == 2 then
|
if Long2Cut.GetLongFacesCount( Proc) == 2 then
|
||||||
bOk, sErr = Long2Cut.Make( Proc, nPhase, nRawId, nPartId)
|
bOk, sErr, _, AddedIds = Long2Cut.Make( Proc, nPhase, nRawId, nPartId)
|
||||||
-- altrimenti eseguo singolo taglio longitudinale
|
-- altrimenti eseguo singolo taglio longitudinale
|
||||||
else
|
else
|
||||||
bOk, sErr = LongCut.Make( Proc, nPhase, nRawId, nPartId)
|
bOk, sErr = LongCut.Make( Proc, nPhase, nRawId, nPartId)
|
||||||
@@ -1318,7 +1344,7 @@ local function AddFeatureMachining( Proc, nPhase, nRawId, nPartId, dCurrOvmH, bN
|
|||||||
-- o se rivestimento ( 3/4-034-X) o se mezzolegno chalet ( 4-037-X) o se tasca ( 4-039-X) o se taglio triangolato ( 4-120-X)
|
-- o se rivestimento ( 3/4-034-X) o se mezzolegno chalet ( 4-037-X) o se tasca ( 4-039-X) o se taglio triangolato ( 4-120-X)
|
||||||
elseif LapJoint.Identify( Proc) then
|
elseif LapJoint.Identify( Proc) then
|
||||||
-- esecuzione mezzo-legno o scanalatura
|
-- esecuzione mezzo-legno o scanalatura
|
||||||
bOk, sErr = LapJoint.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
bOk, sErr, _, AddedIds = LapJoint.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||||
-- se smusso ( 3/4-036-X)
|
-- se smusso ( 3/4-036-X)
|
||||||
elseif Chamfer.Identify( Proc) then
|
elseif Chamfer.Identify( Proc) then
|
||||||
-- esecuzione smusso
|
-- esecuzione smusso
|
||||||
@@ -1423,7 +1449,7 @@ local function AddFeatureMachining( Proc, nPhase, nRawId, nPartId, dCurrOvmH, bN
|
|||||||
EgtOutLog( sErr)
|
EgtOutLog( sErr)
|
||||||
bOk = false
|
bOk = false
|
||||||
end
|
end
|
||||||
return bOk, sErr, ( nNewPhase or -1)
|
return bOk, sErr, ( nNewPhase or -1), AddedIds
|
||||||
end
|
end
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------
|
||||||
@@ -2001,6 +2027,12 @@ function GetFeatureInfoAndDependency( vProc, b3Raw)
|
|||||||
-- verifico se feature tipo LapJoint è attraversata da almeno un foro
|
-- verifico se feature tipo LapJoint è attraversata da almeno un foro
|
||||||
if ( Proc.Topology == 'Pocket' or Proc.Topology == 'Tunnel' or Proc.Topology == 'Groove' or Mortise.Identify( Proc)) and Drill.Identify( ProcB) and Overlaps( Proc.Box, ProcB.Box) then
|
if ( Proc.Topology == 'Pocket' or Proc.Topology == 'Tunnel' or Proc.Topology == 'Groove' or Mortise.Identify( Proc)) and Drill.Identify( ProcB) and Overlaps( Proc.Box, ProcB.Box) then
|
||||||
Proc.PassedByHole = true
|
Proc.PassedByHole = true
|
||||||
|
ProcB.Dependency = {}
|
||||||
|
ProcB.Dependency.ExecBefore = Proc
|
||||||
|
end
|
||||||
|
-- verifico se feature tipo LapJoint è attraversata da almeno una mortasa a coda di rondine
|
||||||
|
if ( Proc.Topology == 'Pocket' or Proc.Topology == 'Tunnel' or Proc.Topology == 'Groove') and DtMortise.SideIdentify( ProcB) and Overlaps( Proc.Box, ProcB.Box) then
|
||||||
|
Proc.PassedByDtMortise = true
|
||||||
end
|
end
|
||||||
-- verifiche per specchiature
|
-- verifiche per specchiature
|
||||||
if BD.DOWN_HEAD or BD.TWO_EQUAL_HEADS then
|
if BD.DOWN_HEAD or BD.TWO_EQUAL_HEADS then
|
||||||
@@ -2096,7 +2128,8 @@ function BeamExec.ProcessFeatures()
|
|||||||
-- flag feature precedente in doppio
|
-- flag feature precedente in doppio
|
||||||
local nPrevDouble = 0
|
local nPrevDouble = 0
|
||||||
-- inserisco le lavorazioni da lavorare ribaltate
|
-- inserisco le lavorazioni da lavorare ribaltate
|
||||||
for i = 1, #vProc do
|
local i = 1
|
||||||
|
while i <= #vProc do
|
||||||
-- creo la lavorazione
|
-- creo la lavorazione
|
||||||
local Proc = vProc[i]
|
local Proc = vProc[i]
|
||||||
if Proc.Flg ~= 0 and Proc.Down then
|
if Proc.Flg ~= 0 and Proc.Down then
|
||||||
@@ -2107,7 +2140,13 @@ function BeamExec.ProcessFeatures()
|
|||||||
Proc.DistanceToNextPart = BL.GetDistanceToNextPart( nRawId, nPhase)
|
Proc.DistanceToNextPart = BL.GetDistanceToNextPart( nRawId, nPhase)
|
||||||
Proc.PrevDouble = nPrevDouble
|
Proc.PrevDouble = nPrevDouble
|
||||||
nPrevDouble = Proc.Double
|
nPrevDouble = Proc.Double
|
||||||
local bOk, sMsg, nNewPhase = AddFeatureMachining( Proc, nPhase, nRawId, nPartId, dCurrOvmH, bNeedHCut, b3Raw, nOrd, sDownOrSideOrStd, nil, nil, dCurrOvmT)
|
local bOk, sMsg, nNewPhase, AddedIds = AddFeatureMachining( Proc, nPhase, nRawId, nPartId, dCurrOvmH, bNeedHCut, b3Raw, nOrd, sDownOrSideOrStd, nil, nil, dCurrOvmT)
|
||||||
|
-- lavorazioni da fare dopo separazione
|
||||||
|
if AddedIds and #AddedIds > 0 then
|
||||||
|
for j = 1, #AddedIds do
|
||||||
|
table.insert( vProc, AddedIds[j])
|
||||||
|
end
|
||||||
|
end
|
||||||
if not bOk then
|
if not bOk then
|
||||||
nTotErr = nTotErr + 1
|
nTotErr = nTotErr + 1
|
||||||
table.insert( Stats, {Err=1, Msg=sMsg, Rot=-2, CutId=Proc.CutId, TaskId=Proc.TaskId})
|
table.insert( Stats, {Err=1, Msg=sMsg, Rot=-2, CutId=Proc.CutId, TaskId=Proc.TaskId})
|
||||||
@@ -2137,6 +2176,7 @@ function BeamExec.ProcessFeatures()
|
|||||||
EgtSetInfo( nDispId, 'ROT', -2)
|
EgtSetInfo( nDispId, 'ROT', -2)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
i = i + 1
|
||||||
end
|
end
|
||||||
-- se separazione non ancora effettuata, aggiungo nuova fase con le travi in posizione standard
|
-- se separazione non ancora effettuata, aggiungo nuova fase con le travi in posizione standard
|
||||||
if not bSplitRot then
|
if not bSplitRot then
|
||||||
@@ -2178,7 +2218,8 @@ function BeamExec.ProcessFeatures()
|
|||||||
local nPrevDouble = 0
|
local nPrevDouble = 0
|
||||||
-- inserisco le lavorazioni da lavorare ruotate
|
-- inserisco le lavorazioni da lavorare ruotate
|
||||||
local nSideMchOk = 0
|
local nSideMchOk = 0
|
||||||
for i = 1, #vProc do
|
local i = 1
|
||||||
|
while i <= #vProc do
|
||||||
-- creo la lavorazione
|
-- creo la lavorazione
|
||||||
local Proc = vProc[i]
|
local Proc = vProc[i]
|
||||||
if Proc.Flg ~= 0 and Proc.Side then
|
if Proc.Flg ~= 0 and Proc.Side then
|
||||||
@@ -2189,7 +2230,13 @@ function BeamExec.ProcessFeatures()
|
|||||||
Proc.DistanceToNextPart = BL.GetDistanceToNextPart( nRawId, nPhase)
|
Proc.DistanceToNextPart = BL.GetDistanceToNextPart( nRawId, nPhase)
|
||||||
Proc.PrevDouble = nPrevDouble
|
Proc.PrevDouble = nPrevDouble
|
||||||
nPrevDouble = Proc.Double
|
nPrevDouble = Proc.Double
|
||||||
local bOk, sMsg, nNewPhase = AddFeatureMachining( Proc, nPhase, nRawId, nPartId, dCurrOvmH, false, b3Raw, nOrd, sDownOrSideOrStd, bPreMove, vtMove, dCurrOvmT)
|
local bOk, sMsg, nNewPhase, AddedIds = AddFeatureMachining( Proc, nPhase, nRawId, nPartId, dCurrOvmH, false, b3Raw, nOrd, sDownOrSideOrStd, bPreMove, vtMove, dCurrOvmT)
|
||||||
|
-- lavorazioni da fare dopo separazione
|
||||||
|
if AddedIds and #AddedIds > 0 then
|
||||||
|
for j = 1, #AddedIds do
|
||||||
|
table.insert( vProc, AddedIds[j])
|
||||||
|
end
|
||||||
|
end
|
||||||
if not bOk then
|
if not bOk then
|
||||||
nTotErr = nTotErr + 1
|
nTotErr = nTotErr + 1
|
||||||
table.insert( Stats, {Err=1, Msg=sMsg, Rot=-1, CutId=Proc.CutId, TaskId=Proc.TaskId})
|
table.insert( Stats, {Err=1, Msg=sMsg, Rot=-1, CutId=Proc.CutId, TaskId=Proc.TaskId})
|
||||||
@@ -2222,6 +2269,7 @@ function BeamExec.ProcessFeatures()
|
|||||||
EgtSetInfo( nDispId, 'ROT', -1)
|
EgtSetInfo( nDispId, 'ROT', -1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
i = i + 1
|
||||||
end
|
end
|
||||||
-- se non sono state inserite lavorazioni di fianco, elimino la fase perchè inutile e dannosa
|
-- se non sono state inserite lavorazioni di fianco, elimino la fase perchè inutile e dannosa
|
||||||
if nSideMchOk == 0 then
|
if nSideMchOk == 0 then
|
||||||
@@ -2248,7 +2296,8 @@ function BeamExec.ProcessFeatures()
|
|||||||
-- flag feature precedente in doppio
|
-- flag feature precedente in doppio
|
||||||
local nPrevDouble = 0
|
local nPrevDouble = 0
|
||||||
-- inserisco le lavorazioni non ribaltate della trave
|
-- inserisco le lavorazioni non ribaltate della trave
|
||||||
for i = 1, #vProc do
|
local i = 1
|
||||||
|
while i <= #vProc do
|
||||||
-- creo la lavorazione
|
-- creo la lavorazione
|
||||||
local Proc = vProc[i]
|
local Proc = vProc[i]
|
||||||
if Proc.Flg ~= 0 and ( not ( Proc.Down or Proc.Side) or BD.DOWN_HEAD or BD.TURN) then
|
if Proc.Flg ~= 0 and ( not ( Proc.Down or Proc.Side) or BD.DOWN_HEAD or BD.TURN) then
|
||||||
@@ -2259,7 +2308,13 @@ function BeamExec.ProcessFeatures()
|
|||||||
Proc.DistanceToNextPart = BL.GetDistanceToNextPart( nRawId, nPhase)
|
Proc.DistanceToNextPart = BL.GetDistanceToNextPart( nRawId, nPhase)
|
||||||
Proc.PrevDouble = nPrevDouble
|
Proc.PrevDouble = nPrevDouble
|
||||||
nPrevDouble = Proc.Double
|
nPrevDouble = Proc.Double
|
||||||
local bOk, sMsg, nNewPhase = AddFeatureMachining( Proc, nPhase, nRawId, nPartId, dCurrOvmH, false, b3Raw, nOrd, sDownOrSideOrStd, nil, nil, dCurrOvmT)
|
local bOk, sMsg, nNewPhase, AddedIds = AddFeatureMachining( Proc, nPhase, nRawId, nPartId, dCurrOvmH, false, b3Raw, nOrd, sDownOrSideOrStd, nil, nil, dCurrOvmT)
|
||||||
|
-- lavorazioni da fare dopo separazione
|
||||||
|
if AddedIds and #AddedIds > 0 then
|
||||||
|
for j = 1, #AddedIds do
|
||||||
|
table.insert( vProc, AddedIds[j])
|
||||||
|
end
|
||||||
|
end
|
||||||
if not bOk then
|
if not bOk then
|
||||||
nTotErr = nTotErr + 1
|
nTotErr = nTotErr + 1
|
||||||
table.insert( Stats, {Err=1, Msg=sMsg, Rot=0, CutId=Proc.CutId, TaskId=Proc.TaskId})
|
table.insert( Stats, {Err=1, Msg=sMsg, Rot=0, CutId=Proc.CutId, TaskId=Proc.TaskId})
|
||||||
@@ -2287,6 +2342,7 @@ function BeamExec.ProcessFeatures()
|
|||||||
EgtSetInfo( nDispId, 'ORD', nOrd)
|
EgtSetInfo( nDispId, 'ORD', nOrd)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
i = i + 1
|
||||||
end
|
end
|
||||||
EgtOutLog( ' *** End AddMachinings ***', 1)
|
EgtOutLog( ' *** End AddMachinings ***', 1)
|
||||||
-- passo al grezzo successivo
|
-- passo al grezzo successivo
|
||||||
|
|||||||
+8
-1
@@ -734,7 +734,9 @@ end
|
|||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------
|
||||||
function BeamLib.GetNzLimDownUp( b3Raw, vtN, vtOrtho)
|
function BeamLib.GetNzLimDownUp( b3Raw, vtN, vtOrtho)
|
||||||
if BD.C_SIMM then
|
if BD.GetNzLimDownUp then
|
||||||
|
return BD.GetNzLimDownUp( b3Raw, vtN, vtOrtho)
|
||||||
|
elseif BD.C_SIMM then
|
||||||
return -0.484
|
return -0.484
|
||||||
elseif BD.TURN then
|
elseif BD.TURN then
|
||||||
return -2
|
return -2
|
||||||
@@ -1186,6 +1188,11 @@ end
|
|||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------
|
||||||
function BeamLib.GetFacetsInfo( Proc, b3Raw)
|
function BeamLib.GetFacetsInfo( Proc, b3Raw)
|
||||||
|
|
||||||
|
if Proc.Fct > 20 then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
local Face = {}
|
local Face = {}
|
||||||
local b3Solid = EgtGetBBoxGlob( EgtGetFirstNameInGroup( Proc.PartId, 'Box') or GDB_ID.NULL, GDB_BB.STANDARD)
|
local b3Solid = EgtGetBBoxGlob( EgtGetFirstNameInGroup( Proc.PartId, 'Box') or GDB_ID.NULL, GDB_BB.STANDARD)
|
||||||
local vAdj
|
local vAdj
|
||||||
|
|||||||
+99
-37
@@ -28,6 +28,8 @@
|
|||||||
-- Implementata GetBlockedAxis che gestisce gli assi bloccati per tutti i tipi di utensile.
|
-- Implementata GetBlockedAxis che gestisce gli assi bloccati per tutti i tipi di utensile.
|
||||||
-- 2024/02/22 Migliorato calcolo area non pinzabile in testa HCING e coda TCING
|
-- 2024/02/22 Migliorato calcolo area non pinzabile in testa HCING e coda TCING
|
||||||
-- 2024/03/27 In MakeTwo rimossa gestione calcolo differente su ultima passata in caso di macchina FAST
|
-- 2024/03/27 In MakeTwo rimossa gestione calcolo differente su ultima passata in caso di macchina FAST
|
||||||
|
-- 2024/06/18 In MakeOne in caso di inversione del percorso, si scambia anche accorciamento start con end
|
||||||
|
-- 2024/09/12 In MakeOne per settare il FaceUse si usa il versore nelle UserNotes
|
||||||
|
|
||||||
-- Tabella per definizione modulo
|
-- Tabella per definizione modulo
|
||||||
local FacesBySaw = {}
|
local FacesBySaw = {}
|
||||||
@@ -44,7 +46,7 @@ local BD = require( 'BeamData')
|
|||||||
local ML = require( 'MachiningLib')
|
local ML = require( 'MachiningLib')
|
||||||
|
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
function MakeParallelOne( nSurfId, nFacet, sCutting, dSawDiam, nFaceUse, dVzLimDwnUp, dCutExtra, dCutSic, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw, bForceInvert)
|
function MakeParallelOne( nSurfId, nFacet, sCutting, dSawDiam, nFaceUse, dVzLimDwnUp, dCutExtra, dCutSic, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw, bForceInvert, bForceTangentLeadInOut)
|
||||||
EgtOutLog( 'FacesBySaw.MakeParallelOne', 3)
|
EgtOutLog( 'FacesBySaw.MakeParallelOne', 3)
|
||||||
-- dati della faccia
|
-- dati della faccia
|
||||||
local ptC, vtN = EgtSurfTmFacetCenter( nSurfId, nFacet, GDB_ID.ROOT)
|
local ptC, vtN = EgtSurfTmFacetCenter( nSurfId, nFacet, GDB_ID.ROOT)
|
||||||
@@ -75,7 +77,7 @@ function MakeParallelOne( nSurfId, nFacet, sCutting, dSawDiam, nFaceUse, dVzLimD
|
|||||||
local bLioTang
|
local bLioTang
|
||||||
local Ktp = 1.1
|
local Ktp = 1.1
|
||||||
if BD.KIOTP then Ktp = BD.KIOTP end
|
if BD.KIOTP then Ktp = BD.KIOTP end
|
||||||
if Ktp * dLi2Tang < dLiPerp then
|
if bForceTangentLeadInOut or ( Ktp * dLi2Tang < dLiPerp) then
|
||||||
bLioTang = true
|
bLioTang = true
|
||||||
dLiTang, dLiPerp, dLoTang, dLoPerp = dLi2Tang, dLi2Perp, dLo2Tang, dLo2Perp
|
dLiTang, dLiPerp, dLoTang, dLoPerp = dLi2Tang, dLi2Perp, dLo2Tang, dLo2Perp
|
||||||
if BD.TURN then
|
if BD.TURN then
|
||||||
@@ -191,7 +193,7 @@ local function GetNameSolidFaceIncludingLine( b3Solid, ptP1Comp, ptP2Comp)
|
|||||||
end
|
end
|
||||||
|
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDwnUp, dCutExtra, dCutSic, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw, bForceInvert, bMaximizeVerticalDepth)
|
function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDwnUp, dCutExtra, dCutSic, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw, bForceInvert, bMaximizeVerticalDepth, bSpecialTangentLeadInOut, bForceTangentLeadInOut, Par5Alternative)
|
||||||
-- se lama con asse parallelo alla faccia, passo alla apposita funzione
|
-- se lama con asse parallelo alla faccia, passo alla apposita funzione
|
||||||
if ( Par5 == MCH_MILL_FU.PARAL_DOWN or
|
if ( Par5 == MCH_MILL_FU.PARAL_DOWN or
|
||||||
Par5 == MCH_MILL_FU.PARAL_TOP or
|
Par5 == MCH_MILL_FU.PARAL_TOP or
|
||||||
@@ -199,7 +201,7 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw
|
|||||||
Par5 == MCH_MILL_FU.PARAL_BACK or
|
Par5 == MCH_MILL_FU.PARAL_BACK or
|
||||||
Par5 == MCH_MILL_FU.PARAL_LEFT or
|
Par5 == MCH_MILL_FU.PARAL_LEFT or
|
||||||
Par5 == MCH_MILL_FU.PARAL_RIGHT) then
|
Par5 == MCH_MILL_FU.PARAL_RIGHT) then
|
||||||
return MakeParallelOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDwnUp, dCutExtra, dCutSic, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw, bForceInvert)
|
return MakeParallelOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDwnUp, dCutExtra, dCutSic, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw, bForceInvert, bForceTangentLeadInOut)
|
||||||
end
|
end
|
||||||
-- la lama ha asse perpendicolare alla faccia
|
-- la lama ha asse perpendicolare alla faccia
|
||||||
EgtOutLog( 'FacesBySaw.MakeOne', 3)
|
EgtOutLog( 'FacesBySaw.MakeOne', 3)
|
||||||
@@ -208,6 +210,8 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw
|
|||||||
-- risolvo parametro ambiguo
|
-- risolvo parametro ambiguo
|
||||||
local nOrthoOpposite
|
local nOrthoOpposite
|
||||||
local vtOrthO
|
local vtOrthO
|
||||||
|
local nOrthoOppositeAlternative
|
||||||
|
local vtOrthOAlternative
|
||||||
if isVector3d( Par5) then
|
if isVector3d( Par5) then
|
||||||
nOrthoOpposite = BL.GetNearestOrthoOpposite( Par5, vtN)
|
nOrthoOpposite = BL.GetNearestOrthoOpposite( Par5, vtN)
|
||||||
vtOrthO = Vector3d( Par5)
|
vtOrthO = Vector3d( Par5)
|
||||||
@@ -215,13 +219,22 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw
|
|||||||
nOrthoOpposite = Par5
|
nOrthoOpposite = Par5
|
||||||
vtOrthO = BL.GetVersRef( Par5)
|
vtOrthO = BL.GetVersRef( Par5)
|
||||||
end
|
end
|
||||||
|
if Par5Alternative then
|
||||||
|
if isVector3d( Par5Alternative) then
|
||||||
|
nOrthoOppositeAlternative = BL.GetNearestOrthoOpposite( Par5Alternative, vtN)
|
||||||
|
vtOrthOAlternative = Vector3d( Par5Alternative)
|
||||||
|
else
|
||||||
|
nOrthoOppositeAlternative = Par5Alternative
|
||||||
|
vtOrthOAlternative = BL.GetVersRef( Par5Alternative)
|
||||||
|
end
|
||||||
|
end
|
||||||
EgtOutLog( 'VtOrthO='..tostring( vtOrthO)..' FaceUse='..tostring( nOrthoOpposite), 3)
|
EgtOutLog( 'VtOrthO='..tostring( vtOrthO)..' FaceUse='..tostring( nOrthoOpposite), 3)
|
||||||
-- verifico se testa da sotto oppure se lavorazione sotto con testa da sopra
|
-- verifico se testa da sotto oppure se lavorazione sotto con testa da sopra
|
||||||
if not dVzLimDwnUp then dVzLimDwnUp = BL.GetNzLimDownUp( b3Raw, vtN, vtOrthO) end
|
if not dVzLimDwnUp then dVzLimDwnUp = BL.GetNzLimDownUp( b3Raw, vtN, vtOrthO) end
|
||||||
local bDownHead = ( dVzLimDwnUp and dVzLimDwnUp < - 1.5)
|
local bDownHead = ( dVzLimDwnUp and dVzLimDwnUp < - 1.5)
|
||||||
local bDownUp = ( vtN:getZ() < dVzLimDwnUp)
|
local bDownUp = ( vtN:getZ() < dVzLimDwnUp)
|
||||||
-- linea o bilinea di lavorazione (qui uso nOrthoOpposite per ripetere esattamente il calcolo del Mach)
|
-- linea o bilinea di lavorazione
|
||||||
local ptP1, ptPm, ptP2, vtV1, vtV2, dLen, dWidth = EgtSurfTmFacetOppositeSide( nSurfId, nFacet, BL.GetVersRef( nOrthoOpposite), GDB_ID.ROOT)
|
local ptP1, ptPm, ptP2, vtV1, vtV2, dLen, dWidth = EgtSurfTmFacetOppositeSide( nSurfId, nFacet, vtOrthO, GDB_ID.ROOT)
|
||||||
if not dLen or dLen < 1.1 or not dWidth or dWidth < 1.1 then
|
if not dLen or dLen < 1.1 or not dWidth or dWidth < 1.1 then
|
||||||
local sWarn = 'Face ' .. string.format( '%d,%d', nSurfId, nFacet) .. ' skipped : too small'
|
local sWarn = 'Face ' .. string.format( '%d,%d', nSurfId, nFacet) .. ' skipped : too small'
|
||||||
EgtOutLog( sWarn, 1)
|
EgtOutLog( sWarn, 1)
|
||||||
@@ -234,13 +247,34 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw
|
|||||||
end
|
end
|
||||||
local bIsSawCCW = ( EgtMdbGetCurrMachiningParam( MCH_MP.SPEED) < 0)
|
local bIsSawCCW = ( EgtMdbGetCurrMachiningParam( MCH_MP.SPEED) < 0)
|
||||||
local bInvert = bForceInvert
|
local bInvert = bForceInvert
|
||||||
-- se la lama ruota in senso antiorario inverto la direzione di lavorazione, per avere rotazione lama opposta a avanzamento
|
-- l'inversione può essere comandata da rotazione lama (direzione concorde, legata anche a DownUp) oppure da direzione Z del percorso (si preferisce lavorare dal basso verso l'alto per limitare le corse)
|
||||||
|
-- se c'è disaccordo tra rotazione e direzione si cambia il lato di lavoro, se possibile. Se ciò non è possbile comanda la direzione. Se percorso orizzontale comanda la rotazione.
|
||||||
if bInvert == nil then
|
if bInvert == nil then
|
||||||
if not BD.TURN or abs( ptP2:getY() - ptP1:getY()) < 250 then
|
if not BD.TURN or abs( ptP2:getY() - ptP1:getY()) < 250 then
|
||||||
if bIsSawCCW ~= bDownUp then
|
local bIsMachiningDownwards = ( ptP2:getZ() < ptP1:getZ() - 100 * GEO.EPS_SMALL)
|
||||||
bInvert = ( ptP2:getZ() < ptP1:getZ() + 100 * GEO.EPS_SMALL)
|
local bIsMachiningUpwards = ( ptP2:getZ() > ptP1:getZ() + 100 * GEO.EPS_SMALL)
|
||||||
|
if ( bIsSawCCW ~= bDownUp) and ( bIsMachiningDownwards or not ( bIsMachiningDownwards or bIsMachiningUpwards)) then
|
||||||
|
bInvert = true
|
||||||
|
elseif ( ( bIsSawCCW ~= bDownUp) ~= bIsMachiningDownwards) then
|
||||||
|
if Par5Alternative then
|
||||||
|
bInvert = true
|
||||||
|
nOrthoOpposite = nOrthoOppositeAlternative
|
||||||
|
vtOrthO = vtOrthOAlternative
|
||||||
|
-- avendo riassegnato la direzione di lavoro, i dati della linea vanno ricalcolati
|
||||||
|
ptP1, ptPm, ptP2, vtV1, vtV2, dLen, dWidth = EgtSurfTmFacetOppositeSide( nSurfId, nFacet, vtOrthO, GDB_ID.ROOT)
|
||||||
|
if not dLen or dLen < 1.1 or not dWidth or dWidth < 1.1 then
|
||||||
|
local sWarn = 'Face ' .. string.format( '%d,%d', nSurfId, nFacet) .. ' skipped : too small'
|
||||||
|
EgtOutLog( sWarn, 1)
|
||||||
|
return true, ''
|
||||||
|
end
|
||||||
|
vtV1 = - vtV1
|
||||||
|
elseif bIsMachiningDownwards or not bIsMachiningUpwards then
|
||||||
|
bInvert = true
|
||||||
|
else
|
||||||
|
bInvert = false
|
||||||
|
end
|
||||||
else
|
else
|
||||||
bInvert = ( ptP2:getZ() < ptP1:getZ() - 100 * GEO.EPS_SMALL)
|
bInvert = false
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
local vtTmp = ptP2 - ptP1 ; vtTmp:normalize()
|
local vtTmp = ptP2 - ptP1 ; vtTmp:normalize()
|
||||||
@@ -250,6 +284,10 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw
|
|||||||
if bInvert then
|
if bInvert then
|
||||||
ptP1, ptP2 = ptP2, ptP1
|
ptP1, ptP2 = ptP2, ptP1
|
||||||
vtV1, vtV2 = vtV2, vtV1
|
vtV1, vtV2 = vtV2, vtV1
|
||||||
|
-- se l'inversione è forzata dall'esterno, anche gli accorciamenti che arrivano dall'esterno si prendono per buoni
|
||||||
|
if bForceInvert == nil then
|
||||||
|
dAccStart, dAccEnd = dAccEnd, dAccStart
|
||||||
|
end
|
||||||
end
|
end
|
||||||
local vtTg = ptP2 - ptP1 ; vtTg:normalize()
|
local vtTg = ptP2 - ptP1 ; vtTg:normalize()
|
||||||
local dAllStart = 0
|
local dAllStart = 0
|
||||||
@@ -328,8 +366,26 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw
|
|||||||
local dLiTang, dLiPerp, dLoTang, dLoPerp, vtLio = FacesBySaw.CalcLeadInOutPerpGeom( ptPa1, ptPa2, vtV1, vtV2, vtN, dSawDiam / 2, vtRef, dCutExtra, b3Box)
|
local dLiTang, dLiPerp, dLoTang, dLoPerp, vtLio = FacesBySaw.CalcLeadInOutPerpGeom( ptPa1, ptPa2, vtV1, vtV2, vtN, dSawDiam / 2, vtRef, dCutExtra, b3Box)
|
||||||
local dLenLi = sqrt( dLiTang * dLiTang + dLiPerp * dLiPerp)
|
local dLenLi = sqrt( dLiTang * dLiTang + dLiPerp * dLiPerp)
|
||||||
local dLenLo = sqrt( dLoTang * dLoTang + dLoPerp * dLoPerp)
|
local dLenLo = sqrt( dLoTang * dLoTang + dLoPerp * dLoPerp)
|
||||||
|
local dLiCompLength = 0
|
||||||
-- attacco tangente
|
-- attacco tangente
|
||||||
local dLi2Tang, dLi2Perp, dLo2Tang, dLo2Perp = FacesBySaw.CalcLeadInOutTangGeom( ptPa1, ptPa2, vtN, dSawDiam / 2, vtRef, dCutExtra, b3Box)
|
local dLi2Tang = 0
|
||||||
|
local dLi2Perp = 0
|
||||||
|
local dLo2Tang = 0
|
||||||
|
local dLo2Perp = 0
|
||||||
|
local dLi2CompLength = 0
|
||||||
|
|
||||||
|
-- si predilige un attacco tangenziale (con calcolo automatico di quanto uscire) se faccia che guarda in giù, non troppo orientata verso X e linea non troppo inclinata in X
|
||||||
|
-- non si fa se macchina tipo PF e pezzo alto perchè la lama, uscendo da sopra, toccherebbe la traversa
|
||||||
|
-- TODO si potranno togliere i limiti sulle normali quando si implementerà un modo per calcolare Lead In / Out correttamente in tutti i casi
|
||||||
|
--
|
||||||
|
if bSpecialTangentLeadInOut and not bIsBiLinea and ( vtN:getZ() < - 0.087) and ( abs( vtN:getX()) < 0.258) and ( abs( vtTg:getX()) < 0.1736) and ( abs( vtN:getY()) < 0.5 or ( BD.MAX_DIM_HTCUT_HBEAM > 0 or ( b3Raw:getDimZ() < 420))) then
|
||||||
|
dLi2Tang = 0
|
||||||
|
dLi2Perp = BD.CUT_EXTRA
|
||||||
|
dLi2CompLength = dLen + dSawDiam / 2 + BD.COLL_SIC
|
||||||
|
dLo2Tang = dSawDiam / 2
|
||||||
|
else
|
||||||
|
dLi2Tang, dLi2Perp, dLo2Tang, dLo2Perp = FacesBySaw.CalcLeadInOutTangGeom( ptPa1, ptPa2, vtN, dSawDiam / 2, vtRef, dCutExtra, b3Box)
|
||||||
|
end
|
||||||
local dLenLi2 = abs( dLi2Tang)
|
local dLenLi2 = abs( dLi2Tang)
|
||||||
local dLenLo2 = abs( dLo2Tang)
|
local dLenLo2 = abs( dLo2Tang)
|
||||||
|
|
||||||
@@ -400,7 +456,7 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw
|
|||||||
dLoPerp = BD.COLL_SIC
|
dLoPerp = BD.COLL_SIC
|
||||||
else
|
else
|
||||||
bLioTang = true
|
bLioTang = true
|
||||||
dLiTang, dLiPerp, dLoTang, dLoPerp = dLi2Tang, dLi2Perp, dLo2Tang, dLo2Perp
|
dLiTang, dLiPerp, dLoTang, dLoPerp, dLiCompLength = dLi2Tang, dLi2Perp, dLo2Tang, dLo2Perp, dLi2CompLength
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- posizione braccio
|
-- posizione braccio
|
||||||
@@ -460,6 +516,8 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw
|
|||||||
EgtSetMachiningGeometry( {{ nSurfId, nFacet}})
|
EgtSetMachiningGeometry( {{ nSurfId, nFacet}})
|
||||||
-- imposto uso faccia
|
-- imposto uso faccia
|
||||||
EgtSetMachiningParam( MCH_MP.FACEUSE, nFaceUse)
|
EgtSetMachiningParam( MCH_MP.FACEUSE, nFaceUse)
|
||||||
|
local sNoteVtFaceUse = 'VtFaceUse=' .. EgtNumToString( vtOrthO:getX(),3) .. ',' .. EgtNumToString( vtOrthO:getY(),3) .. ',' .. EgtNumToString( vtOrthO:getZ(),3) .. ';'
|
||||||
|
EgtSetMachiningParam( MCH_MP.USERNOTES, sNoteVtFaceUse)
|
||||||
-- imposto posizione braccio porta testa
|
-- imposto posizione braccio porta testa
|
||||||
EgtSetMachiningParam( MCH_MP.SCC, nSCC)
|
EgtSetMachiningParam( MCH_MP.SCC, nSCC)
|
||||||
-- imposto inversione e lato correzione
|
-- imposto inversione e lato correzione
|
||||||
@@ -473,6 +531,7 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw
|
|||||||
if BD.TURN and bLioTang == 1 then EgtSetMachiningParam( MCH_MP.LEADINTYPE, MCH_MILL_LI.TG_PERP) end
|
if BD.TURN and bLioTang == 1 then EgtSetMachiningParam( MCH_MP.LEADINTYPE, MCH_MILL_LI.TG_PERP) end
|
||||||
EgtSetMachiningParam( MCH_MP.LITANG, dLiTang)
|
EgtSetMachiningParam( MCH_MP.LITANG, dLiTang)
|
||||||
EgtSetMachiningParam( MCH_MP.LIPERP, dLiPerp)
|
EgtSetMachiningParam( MCH_MP.LIPERP, dLiPerp)
|
||||||
|
EgtSetMachiningParam( MCH_MP.LICOMPLEN, dLiCompLength)
|
||||||
if BD.TURN and bLioTang == 2 then EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, MCH_MILL_LO.PERP_TG) end
|
if BD.TURN and bLioTang == 2 then EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, MCH_MILL_LO.PERP_TG) end
|
||||||
EgtSetMachiningParam( MCH_MP.LOTANG, dLoTang)
|
EgtSetMachiningParam( MCH_MP.LOTANG, dLoTang)
|
||||||
EgtSetMachiningParam( MCH_MP.LOPERP, dLoPerp)
|
EgtSetMachiningParam( MCH_MP.LOPERP, dLoPerp)
|
||||||
@@ -514,6 +573,25 @@ function FacesBySaw.MakeTwo( Proc, nPhase, nRawId, nPartId, dOvmHead, sCutType,
|
|||||||
EgtOutLog( sErr)
|
EgtOutLog( sErr)
|
||||||
return false, sErr
|
return false, sErr
|
||||||
end
|
end
|
||||||
|
-- recupero la lavorazione
|
||||||
|
local sCutting = ML.FindCutting( sCutType, nil, bDownHead)
|
||||||
|
if not sCutting then
|
||||||
|
local sErr = 'Error : cutting not found in library'
|
||||||
|
EgtOutLog( sErr)
|
||||||
|
return false, sErr
|
||||||
|
end
|
||||||
|
-- recupero i dati dell'utensile
|
||||||
|
local dSawDiam = 400
|
||||||
|
local dSawThick = 5
|
||||||
|
local dMaxDepth = 0
|
||||||
|
if EgtMdbSetCurrMachining( sCutting) then
|
||||||
|
local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID)
|
||||||
|
if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then
|
||||||
|
dSawDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dSawDiam
|
||||||
|
dSawThick = EgtTdbGetCurrToolParam( MCH_TP.THICK) or dSawThick
|
||||||
|
dMaxDepth = EgtTdbGetCurrToolMaxDepth() or dMaxDepth
|
||||||
|
end
|
||||||
|
end
|
||||||
-- dati delle facce
|
-- dati delle facce
|
||||||
local ptC = {}
|
local ptC = {}
|
||||||
local vtN = {}
|
local vtN = {}
|
||||||
@@ -529,10 +607,10 @@ function FacesBySaw.MakeTwo( Proc, nPhase, nRawId, nPartId, dOvmHead, sCutType,
|
|||||||
local ptM = ( ptT1 + ptT2) / 2
|
local ptM = ( ptT1 + ptT2) / 2
|
||||||
local vtTg = ptT2 - ptT1 ; vtTg:normalize()
|
local vtTg = ptT2 - ptT1 ; vtTg:normalize()
|
||||||
local bConvex = ( dAngT > 0)
|
local bConvex = ( dAngT > 0)
|
||||||
-- verifico non siano orientate troppo verso il basso e molto sbandate (oltre 10 deg)
|
-- verifico non siano orientate troppo verso il basso e molto sbandate (oltre 10 deg), oppure in testa o in coda e non troppo distanti dal grezzo esterno
|
||||||
local bFaceOk = {}
|
local bFaceOk = {}
|
||||||
bFaceOk[1] = ( vtN[1]:getZ() >= BD.NZ_MINB or abs( vtN[1]:getY()) < 0.174)
|
bFaceOk[1] = ( vtN[1]:getZ() >= BD.NZ_MINB or abs( vtN[1]:getY()) < 0.174 or ( Proc.AffectedFaces.Left ~= Proc.AffectedFaces.Right and Proc.Face[1].Elevation < dMaxDepth - 10 * GEO.EPS_SMALL))
|
||||||
bFaceOk[2] = ( vtN[2]:getZ() >= BD.NZ_MINB or abs( vtN[2]:getY()) < 0.174)
|
bFaceOk[2] = ( vtN[2]:getZ() >= BD.NZ_MINB or abs( vtN[2]:getY()) < 0.174 or ( Proc.AffectedFaces.Left ~= Proc.AffectedFaces.Right and Proc.Face[2].Elevation < dMaxDepth - 10 * GEO.EPS_SMALL))
|
||||||
if not bDownHead and ( not bFaceOk[1] or not bFaceOk[2]) then
|
if not bDownHead and ( not bFaceOk[1] or not bFaceOk[2]) then
|
||||||
local sErr = 'Error : TwoFacesBySaw from bottom impossible'
|
local sErr = 'Error : TwoFacesBySaw from bottom impossible'
|
||||||
EgtOutLog( sErr)
|
EgtOutLog( sErr)
|
||||||
@@ -567,25 +645,6 @@ function FacesBySaw.MakeTwo( Proc, nPhase, nRawId, nPartId, dOvmHead, sCutType,
|
|||||||
nUpInd = nBigInd
|
nUpInd = nBigInd
|
||||||
nOtInd = nSmaInd
|
nOtInd = nSmaInd
|
||||||
end
|
end
|
||||||
-- recupero la lavorazione
|
|
||||||
local sCutting = ML.FindCutting( sCutType, nil, bDownHead)
|
|
||||||
if not sCutting then
|
|
||||||
local sErr = 'Error : cutting not found in library'
|
|
||||||
EgtOutLog( sErr)
|
|
||||||
return false, sErr
|
|
||||||
end
|
|
||||||
-- recupero i dati dell'utensile
|
|
||||||
local dSawDiam = 400
|
|
||||||
local dSawThick = 5
|
|
||||||
local dMaxDepth = 0
|
|
||||||
if EgtMdbSetCurrMachining( sCutting) then
|
|
||||||
local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID)
|
|
||||||
if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then
|
|
||||||
dSawDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dSawDiam
|
|
||||||
dSawThick = EgtTdbGetCurrToolParam( MCH_TP.THICK) or dSawThick
|
|
||||||
dMaxDepth = EgtTdbGetCurrToolMaxDepth() or dMaxDepth
|
|
||||||
end
|
|
||||||
end
|
|
||||||
-- calcolo extra taglio
|
-- calcolo extra taglio
|
||||||
local dCutExtra = 0
|
local dCutExtra = 0
|
||||||
if dAngT < -91 and dAngT > -179 then
|
if dAngT < -91 and dAngT > -179 then
|
||||||
@@ -622,7 +681,8 @@ function FacesBySaw.MakeTwo( Proc, nPhase, nRawId, nPartId, dOvmHead, sCutType,
|
|||||||
local vtOrthO = EgtIf( ( i % 2) == 1, vtRef[nOtInd], vtRef[nUpInd])
|
local vtOrthO = EgtIf( ( i % 2) == 1, vtRef[nOtInd], vtRef[nUpInd])
|
||||||
-- lavoro la faccia
|
-- lavoro la faccia
|
||||||
for j = 1, #vCuts[i] do
|
for j = 1, #vCuts[i] do
|
||||||
local bOk, sErr = FacesBySaw.MakeOne( vCuts[i][j], 0, sCutting, dSawDiam, vtOrthO, dNzLimDwnUp, dCutExtra, BD.CUT_SIC, 0, 0, 0, nil, b3Raw)
|
local bSpecialTangentLeadInOut = ( i % 2 == 0) and ( Proc.AffectedFaces.Left or Proc.AffectedFaces.Right)
|
||||||
|
local bOk, sErr = FacesBySaw.MakeOne( vCuts[i][j], 0, sCutting, dSawDiam, vtOrthO, dNzLimDwnUp, dCutExtra, BD.CUT_SIC, 0, 0, 0, nil, b3Raw, nil, nil, bSpecialTangentLeadInOut)
|
||||||
if not bOk then
|
if not bOk then
|
||||||
return bOk, sErr
|
return bOk, sErr
|
||||||
end
|
end
|
||||||
@@ -682,14 +742,16 @@ function FacesBySaw.MakeTwo( Proc, nPhase, nRawId, nPartId, dOvmHead, sCutType,
|
|||||||
end
|
end
|
||||||
-- taglio perpendicolare (limite Vz Down Up messo a -2 per non farlo mai intervenire)
|
-- taglio perpendicolare (limite Vz Down Up messo a -2 per non farlo mai intervenire)
|
||||||
if vCuts[i][j] then
|
if vCuts[i][j] then
|
||||||
local bOk, sErr = FacesBySaw.MakeOne( vCuts[i][j], 0, sCutting, dSawDiam, vtOrthoO_1, -2, dExtraCut_1, BD.CUT_SIC, 0, 0, 0, nil, b3Raw)
|
local bSpecialTangentLeadInOut = ( i % 2 == 0) and ( Proc.AffectedFaces.Left or Proc.AffectedFaces.Right)
|
||||||
|
local bOk, sErr = FacesBySaw.MakeOne( vCuts[i][j], 0, sCutting, dSawDiam, vtOrthoO_1, -2, dExtraCut_1, BD.CUT_SIC, 0, 0, 0, nil, b3Raw, nil, nil, bSpecialTangentLeadInOut)
|
||||||
if not bOk then
|
if not bOk then
|
||||||
return bOk, sErr
|
return bOk, sErr
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- taglio parallelo (limite Vz Down Up messo a -2 per non farlo mai intervenire)
|
-- taglio parallelo (limite Vz Down Up messo a -2 per non farlo mai intervenire)
|
||||||
if vCuts[i+1][j] then
|
if vCuts[i+1][j] then
|
||||||
local bOk, sErr = FacesBySaw.MakeOne( vCuts[i+1][j], 0, sCutting, dSawDiam, vtOrthoO_2, -2, dExtraCut_2, BD.CUT_SIC, 0, 0, 0, nil, b3Raw)
|
local bSpecialTangentLeadInOut = ( ( i + 1) % 2 == 0) and ( Proc.AffectedFaces.Left or Proc.AffectedFaces.Right)
|
||||||
|
local bOk, sErr = FacesBySaw.MakeOne( vCuts[i+1][j], 0, sCutting, dSawDiam, vtOrthoO_2, -2, dExtraCut_2, BD.CUT_SIC, 0, 0, 0, nil, b3Raw, nil, nil, bSpecialTangentLeadInOut)
|
||||||
if not bOk then
|
if not bOk then
|
||||||
return bOk, sErr
|
return bOk, sErr
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -384,8 +384,8 @@ local function FindMachining( MachiningType, sType, Params, bTopHead, bDownHead,
|
|||||||
return ReturnParams( MachiningType, Machining.Name, Machining.Type, ToolParams)
|
return ReturnParams( MachiningType, Machining.Name, Machining.Type, ToolParams)
|
||||||
-- verifico se posso usare lo stesso utensile della testa attiva
|
-- 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
|
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
|
-- se l'utensile sulla testa attiva è molto più piccolo rispetto a quelli salvati non lo scelgo, a meno che non siano entrambi grandi (truciolatori)
|
||||||
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
|
if ( not sH1Param or not sH1Param.TDiam or ( sH1Param.TDiam < 75 and ToolParams.TDiam < 75 and sH1Param.TDiam < dBiggerToolTolerance * ToolParams.TDiam)) and ( not sH2Param or not sH2Param.TDiam or ( sH2Param.TDiam < 75 and ToolParams.TDiam < 75 and sH2Param.TDiam < 1.25 * ToolParams.TDiam)) then
|
||||||
return ReturnParams( MachiningType, Machining.Name, Machining.Type, ToolParams)
|
return ReturnParams( MachiningType, Machining.Name, Machining.Type, ToolParams)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -414,12 +414,14 @@ local function FindMachining( MachiningType, sType, Params, bTopHead, bDownHead,
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
if MachineHeadUse == TWO_EQUAL_HEADS then
|
if MachineHeadUse == TWO_EQUAL_HEADS then
|
||||||
-- se uno dei due utensili è molto più grande dell'altro scelgo quello senza fare altre analisi
|
-- se entrambi gli utensili sono piccoli (no truciolatori) e uno dei due è molto più grande dell'altro scelgo quello senza fare altre analisi
|
||||||
if sH1Mach ~= "" and sH1Param.TDiam and sH2Mach ~= "" and sH2Param.TDiam then
|
if sH1Mach ~= "" and sH1Param.TDiam and sH2Mach ~= "" and sH2Param.TDiam then
|
||||||
if sH1Param.TDiam > dBiggerToolTolerance * sH2Param.TDiam then
|
if sH1Param.TDiam < 75 or sH2Param.TDiam < 75 then
|
||||||
return ReturnParams( MachiningType, sH1Mach, sType, sH1Param)
|
if sH1Param.TDiam > dBiggerToolTolerance * sH2Param.TDiam then
|
||||||
elseif sH2Param.TDiam > dBiggerToolTolerance * sH1Param.TDiam then
|
return ReturnParams( MachiningType, sH1Mach, sType, sH1Param)
|
||||||
return ReturnParams( MachiningType, sH2Mach, sType, sH2Param)
|
elseif sH2Param.TDiam > dBiggerToolTolerance * sH1Param.TDiam then
|
||||||
|
return ReturnParams( MachiningType, sH2Mach, sType, sH2Param)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- verifico se cambiare testa o cambiare utensile su quella corrente
|
-- verifico se cambiare testa o cambiare utensile su quella corrente
|
||||||
|
|||||||
@@ -151,7 +151,8 @@ function ProcessBlockHausFront.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, dO
|
|||||||
-- se va fatto, inserisco la lavorazione
|
-- se va fatto, inserisco la lavorazione
|
||||||
if bCut then
|
if bCut then
|
||||||
local CutProc = { Id = AuxId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
local CutProc = { Id = AuxId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
||||||
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId}
|
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId, PartId = Proc.PartId}
|
||||||
|
CutProc.AffectedFaces = BL.GetProcessAffectedFaces( CutProc)
|
||||||
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead)
|
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead)
|
||||||
-- se taglio applicato setto la nota al gruppo Mach per non doverla lavorare una seconda volta
|
-- se taglio applicato setto la nota al gruppo Mach per non doverla lavorare una seconda volta
|
||||||
if bOk then
|
if bOk then
|
||||||
@@ -242,7 +243,8 @@ function ProcessBlockHausFront.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, dO
|
|||||||
-- se va fatto, inserisco la lavorazione
|
-- se va fatto, inserisco la lavorazione
|
||||||
if bCut then
|
if bCut then
|
||||||
local CutProc = { Id = AuxId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
local CutProc = { Id = AuxId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
||||||
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId}
|
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId, PartId = Proc.PartId}
|
||||||
|
CutProc.AffectedFaces = BL.GetProcessAffectedFaces( CutProc)
|
||||||
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead)
|
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead)
|
||||||
-- se taglio applicato setto la nota al gruppo Mach per non doverla lavorare una seconda volta
|
-- se taglio applicato setto la nota al gruppo Mach per non doverla lavorare una seconda volta
|
||||||
if bOk then
|
if bOk then
|
||||||
|
|||||||
+22
-6
@@ -542,9 +542,14 @@ local function MakeFromTop( sCutting, Proc, nPhase, nRawId, nPartId, dOvmHead, b
|
|||||||
local dVzLimDwnUp = dNzLimDwnUp
|
local dVzLimDwnUp = dNzLimDwnUp
|
||||||
if j ~= 1 then
|
if j ~= 1 then
|
||||||
vtNewOrthoO = -vtOrthoO
|
vtNewOrthoO = -vtOrthoO
|
||||||
if not BD.C_SIMM and not BD.TURN and abs( vtN:getY()) > 0.05 then dVzLimDwnUp = -0.708 end
|
if BD.GetNzLimDownUp then
|
||||||
|
dVzLimDwnUp = BD.GetNzLimDownUp( b3Raw, vtN, V_NULL(), true)
|
||||||
|
elseif not BD.C_SIMM and not BD.TURN and abs( vtN:getY()) > 0.05 then
|
||||||
|
dVzLimDwnUp = -0.708
|
||||||
|
end
|
||||||
end
|
end
|
||||||
local bOk, sErr = Fbs.MakeOne( vCuts[i][j], 0, sCutting, dSawDiam, vtNewOrthoO, dVzLimDwnUp, BD.CUT_EXTRA, BD.CUT_SIC, 0, 0, 0, nil, b3Raw)
|
local bSpecialTangentLeadInOut = ( i % 2 == 0) and ( Proc.AffectedFaces.Left or Proc.AffectedFaces.Right)
|
||||||
|
local bOk, sErr = Fbs.MakeOne( vCuts[i][j], 0, sCutting, dSawDiam, vtNewOrthoO, dVzLimDwnUp, BD.CUT_EXTRA, BD.CUT_SIC, 0, 0, 0, nil, b3Raw, nil, nil, bSpecialTangentLeadInOut)
|
||||||
if not bOk then return bOk, sErr end
|
if not bOk then return bOk, sErr end
|
||||||
end
|
end
|
||||||
-- tutti gli altri casi vengono saltati
|
-- tutti gli altri casi vengono saltati
|
||||||
@@ -566,8 +571,17 @@ local function MakeFromTop( sCutting, Proc, nPhase, nRawId, nPartId, dOvmHead, b
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
local dVzLimDwnUp = dNzLimDwnUp
|
local dVzLimDwnUp = dNzLimDwnUp
|
||||||
if not BD.C_SIMM and not BD.TURN and vtN:getZ() > 0.707 then dVzLimDwnUp = -0.708 end
|
if BD.GetNzLimDownUp then
|
||||||
local bOk, sErr = Fbs.MakeOne( vCuts[i][j], 0, sCutting, dSawDiam, vtOrthoO, dVzLimDwnUp, dExtraCut, BD.CUT_SIC, 0, 0, 0, sNotes, b3Raw)
|
dVzLimDwnUp = BD.GetNzLimDownUp( b3Raw, vtN, V_NULL(), true)
|
||||||
|
elseif not BD.C_SIMM and not BD.TURN and vtN:getZ() > 0.707 then
|
||||||
|
dVzLimDwnUp = -0.708
|
||||||
|
end
|
||||||
|
local bSpecialTangentLeadInOut = ( i % 2 == 0) and ( Proc.AffectedFaces.Left or Proc.AffectedFaces.Right)
|
||||||
|
local vtOrthoOAlternative
|
||||||
|
if ( i % 2 == 0) and ( Proc.Fct == 1) and bNoPerpCuts then
|
||||||
|
vtOrthoOAlternative = - vtOrthoO
|
||||||
|
end
|
||||||
|
local bOk, sErr = Fbs.MakeOne( vCuts[i][j], 0, sCutting, dSawDiam, vtOrthoO, dVzLimDwnUp, dExtraCut, BD.CUT_SIC, 0, 0, 0, sNotes, b3Raw, nil, nil, bSpecialTangentLeadInOut, nil, vtOrthoOAlternative)
|
||||||
if not bOk then return bOk, sErr end
|
if not bOk then return bOk, sErr end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -749,14 +763,16 @@ local function MakeFromDown( sCutting, Proc, nPhase, nRawId, nPartId, dOvmHead)
|
|||||||
end
|
end
|
||||||
-- taglio perpendicolare (limite Vz Down Up messo a -2 per non farlo mai intervenire)
|
-- taglio perpendicolare (limite Vz Down Up messo a -2 per non farlo mai intervenire)
|
||||||
if vCuts[i][j] then
|
if vCuts[i][j] then
|
||||||
local bOk, sErr = Fbs.MakeOne( vCuts[i][j], 0, sCutting, dSawDiam, vtOrthoO_1, -2, dExtraCut_1, BD.CUT_SIC, 0, 0, 0, nil, b3Raw)
|
local bSpecialTangentLeadInOut = ( i % 2 == 0) and ( Proc.AffectedFaces.Left or Proc.AffectedFaces.Right)
|
||||||
|
local bOk, sErr = Fbs.MakeOne( vCuts[i][j], 0, sCutting, dSawDiam, vtOrthoO_1, -2, dExtraCut_1, BD.CUT_SIC, 0, 0, 0, nil, b3Raw, nil, nil, bSpecialTangentLeadInOut)
|
||||||
if not bOk then
|
if not bOk then
|
||||||
return bOk, sErr
|
return bOk, sErr
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- taglio parallelo (limite Vz Down Up messo a -2 per non farlo mai intervenire)
|
-- taglio parallelo (limite Vz Down Up messo a -2 per non farlo mai intervenire)
|
||||||
if vCuts[i+1][j] then
|
if vCuts[i+1][j] then
|
||||||
local bOk, sErr = Fbs.MakeOne( vCuts[i+1][j], 0, sCutting, dSawDiam, vtOrthoO_2, -2, dExtraCut_2, BD.CUT_SIC, 0, 0, 0, nil, b3Raw)
|
local bSpecialTangentLeadInOut = ( i % 2 == 0) and ( Proc.AffectedFaces.Left or Proc.AffectedFaces.Right)
|
||||||
|
local bOk, sErr = Fbs.MakeOne( vCuts[i+1][j], 0, sCutting, dSawDiam, vtOrthoO_2, -2, dExtraCut_2, BD.CUT_SIC, 0, 0, 0, nil, b3Raw, nil, nil, bSpecialTangentLeadInOut)
|
||||||
if not bOk then return bOk, sErr end
|
if not bOk then return bOk, sErr end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -521,7 +521,8 @@ function ProcessDoubleCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
|||||||
local b3Add = EgtGetBBoxGlob( AddId, GDB_BB.STANDARD)
|
local b3Add = EgtGetBBoxGlob( AddId, GDB_BB.STANDARD)
|
||||||
-- applico lavorazione
|
-- applico lavorazione
|
||||||
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = b3Add, Fct = 1, Flg = Proc.Flg,
|
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = b3Add, Fct = 1, Flg = Proc.Flg,
|
||||||
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId}
|
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId, PartId = Proc.PartId}
|
||||||
|
CutProc.AffectedFaces = BL.GetProcessAffectedFaces( CutProc)
|
||||||
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead, nil, nil, bForced, b3Raw, sNotes, dOvmTail, true)
|
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead, nil, nil, bForced, b3Raw, sNotes, dOvmTail, true)
|
||||||
if not bOk then return bOk, sErr end
|
if not bOk then return bOk, sErr end
|
||||||
end
|
end
|
||||||
@@ -533,7 +534,8 @@ function ProcessDoubleCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
|||||||
local b3Add = EgtGetBBoxGlob( AddId, GDB_BB.STANDARD)
|
local b3Add = EgtGetBBoxGlob( AddId, GDB_BB.STANDARD)
|
||||||
-- applico lavorazione
|
-- applico lavorazione
|
||||||
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = b3Add, Fct = 1, Flg = Proc.Flg,
|
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = b3Add, Fct = 1, Flg = Proc.Flg,
|
||||||
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId}
|
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId, PartId = Proc.PartId}
|
||||||
|
CutProc.AffectedFaces = BL.GetProcessAffectedFaces( CutProc)
|
||||||
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead, nil, nil, bForced, b3Raw, sNotes, dOvmTail, true)
|
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead, nil, nil, bForced, b3Raw, sNotes, dOvmTail, true)
|
||||||
if not bOk then return bOk, sErr end
|
if not bOk then return bOk, sErr end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1433,7 +1433,8 @@ local function MakeAuxCut( Proc, nPhase, nRawId, nPartId, dOvmHead, b3Raw, b3Sol
|
|||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
-- inserisco la lavorazione
|
-- inserisco la lavorazione
|
||||||
local CutProc = { Id = AuxId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg, Head = Proc.Head, Tail = Proc.Tail}
|
local CutProc = { Id = AuxId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg, Head = Proc.Head, Tail = Proc.Tail, PartId = Proc.PartId}
|
||||||
|
CutProc.AffectedFaces = BL.GetProcessAffectedFaces( CutProc)
|
||||||
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead)
|
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead)
|
||||||
if not bOk then return bOk, sErr end
|
if not bOk then return bOk, sErr end
|
||||||
-- imposto la nota nel gruppo aggiuntivo di lavorazione per evitare di tagliare una seconda volta
|
-- imposto la nota nel gruppo aggiuntivo di lavorazione per evitare di tagliare una seconda volta
|
||||||
|
|||||||
@@ -22,6 +22,8 @@
|
|||||||
-- 2023/11/06 Migliorata gestione dei fori con AngularTransmission.
|
-- 2023/11/06 Migliorata gestione dei fori con AngularTransmission.
|
||||||
-- 2024/03/13 Aggiunta gestione Predrill
|
-- 2024/03/13 Aggiunta gestione Predrill
|
||||||
-- 2024/03/18 Per Predrill corretta direzione estrusione per fori con direzione verso il basso
|
-- 2024/03/18 Per Predrill corretta direzione estrusione per fori con direzione verso il basso
|
||||||
|
-- 2024/09/04 Gestione dipendenza foro-tasca in caso di fase con pezzo ribaltato
|
||||||
|
-- 2024/09/10 In GetData corretta gestione modifica diametro foro
|
||||||
|
|
||||||
-- Tabella per definizione modulo
|
-- Tabella per definizione modulo
|
||||||
local ProcessDrill = {}
|
local ProcessDrill = {}
|
||||||
@@ -101,9 +103,10 @@ function ProcessDrill.GetData( Proc, b3Raw)
|
|||||||
local AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i')
|
local AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i')
|
||||||
-- verifico se foro da adattare
|
-- verifico se foro da adattare
|
||||||
if EgtExistsInfo( Proc.Id, 'DiamUser') then
|
if EgtExistsInfo( Proc.Id, 'DiamUser') then
|
||||||
if AuxId then AuxId = AuxId + Proc.Id end
|
local nNewAuxId
|
||||||
if AuxId and EgtGetType( AuxId) == GDB_TY.CRV_ARC and BD.USER_HOLE_DIAM and BD.USER_HOLE_DIAM > 1 then
|
if AuxId then nNewAuxId = AuxId + Proc.Id end
|
||||||
EgtModifyArcRadius( AuxId, BD.USER_HOLE_DIAM / 2)
|
if AuxId and EgtGetType( nNewAuxId) == GDB_TY.CRV_ARC and BD.USER_HOLE_DIAM and BD.USER_HOLE_DIAM > 1 then
|
||||||
|
EgtModifyArcRadius( nNewAuxId, BD.USER_HOLE_DIAM / 2)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- recupero diametro e lunghezza
|
-- recupero diametro e lunghezza
|
||||||
@@ -213,7 +216,7 @@ end
|
|||||||
|
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
-- Classificazione della feature
|
-- Classificazione della feature
|
||||||
function ProcessDrill.Classify( Proc, b3Raw)
|
function ProcessDrill.Classify( Proc, b3Raw, sDownOrSideOrStd)
|
||||||
-- recupero e verifico l'entità foro
|
-- recupero e verifico l'entità foro
|
||||||
local AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i') or 0
|
local AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i') or 0
|
||||||
if AuxId then AuxId = AuxId + Proc.Id end
|
if AuxId then AuxId = AuxId + Proc.Id end
|
||||||
@@ -243,6 +246,18 @@ function ProcessDrill.Classify( Proc, b3Raw)
|
|||||||
local bOpen = ( Proc.Fce ~= 0)
|
local bOpen = ( Proc.Fce ~= 0)
|
||||||
local bFaceDown = ( ptCen:getZ() < b3Raw:getMin():getZ() + 2 and (( not Proc.Head and not Proc.Tail) or (( BD.ROT90 or BD.DOWN_HEAD or BD.TURN) and abs( Proc.Flg) == 2)))
|
local bFaceDown = ( ptCen:getZ() < b3Raw:getMin():getZ() + 2 and (( not Proc.Head and not Proc.Tail) or (( BD.ROT90 or BD.DOWN_HEAD or BD.TURN) and abs( Proc.Flg) == 2)))
|
||||||
local bAngTransm = ( BD.ANG_TRASM and ML.FindDrilling( dDiam, nil, nil, nil, nil, true) and AreSameOrOppositeVectorApprox( vtExtr, Z_AX()))
|
local bAngTransm = ( BD.ANG_TRASM and ML.FindDrilling( dDiam, nil, nil, nil, nil, true) and AreSameOrOppositeVectorApprox( vtExtr, Z_AX()))
|
||||||
|
|
||||||
|
-- se ci sono delle dipendenze da altre feature da rispettare
|
||||||
|
if sDownOrSideOrStd then
|
||||||
|
if sDownOrSideOrStd == 'DOWN' then
|
||||||
|
if vtExtr:getZ() < - BD.DRILL_VZ_MIN then
|
||||||
|
Proc.Down = true
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
-- verifico se il foro è sotto e quindi va spostato o sopra o sul fianco
|
-- verifico se il foro è sotto e quindi va spostato o sopra o sul fianco
|
||||||
if (( vtExtr:getZ() < BD.DRILL_VZ_MIN or bFaceDown) and ( not bOpen or Proc.Flg ~= 1)) then
|
if (( vtExtr:getZ() < BD.DRILL_VZ_MIN or bFaceDown) and ( not bOpen or Proc.Flg ~= 1)) then
|
||||||
if not bOpen then
|
if not bOpen then
|
||||||
|
|||||||
@@ -210,7 +210,8 @@ function ProcessDtMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
|||||||
local AddId = EgtSurfTmPlaneInBBox( nAddGrpId, ptCutC, vtCutN, b3Solid, GDB_RT.GLOB)
|
local AddId = EgtSurfTmPlaneInBBox( nAddGrpId, ptCutC, vtCutN, b3Solid, GDB_RT.GLOB)
|
||||||
local b3Cut = EgtGetBBoxGlob( AddId or GDB_ID.NULL, GDB_BB.STANDARD)
|
local b3Cut = EgtGetBBoxGlob( AddId or GDB_ID.NULL, GDB_BB.STANDARD)
|
||||||
local CutProc = { Id = AddId, Grp = Proc.Grp - 2, Prc = 10, Box = b3Cut, Fct = 1, Flg = Proc.Flg,
|
local CutProc = { Id = AddId, Grp = Proc.Grp - 2, Prc = 10, Box = b3Cut, Fct = 1, Flg = Proc.Flg,
|
||||||
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId}
|
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId, PartId = Proc.PartId}
|
||||||
|
CutProc.AffectedFaces = BL.GetProcessAffectedFaces( CutProc)
|
||||||
local bFromBottom = ( b3Solid:getDimX() < BD.LEN_SHORT_PART and vtExtr:getZ() > 0.25)
|
local bFromBottom = ( b3Solid:getDimX() < BD.LEN_SHORT_PART and vtExtr:getZ() > 0.25)
|
||||||
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dCurrOvmH, bFromBottom)
|
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dCurrOvmH, bFromBottom)
|
||||||
if not bOk then return bOk, sErr end
|
if not bOk then return bOk, sErr end
|
||||||
|
|||||||
@@ -207,7 +207,8 @@ function ProcessDtTenon.Make( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
|||||||
-- altrimenti applico taglio di lama
|
-- altrimenti applico taglio di lama
|
||||||
else
|
else
|
||||||
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
||||||
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId}
|
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId, PartId = Proc.PartId}
|
||||||
|
CutProc.AffectedFaces = BL.GetProcessAffectedFaces( CutProc)
|
||||||
local bFromBottom = ( b3Solid:getDimX() < BD.LEN_SHORT_PART and vtExtr:getZ() > 0.25)
|
local bFromBottom = ( b3Solid:getDimX() < BD.LEN_SHORT_PART and vtExtr:getZ() > 0.25)
|
||||||
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead, bFromBottom)
|
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead, bFromBottom)
|
||||||
if not bOk then return bOk, sErr end
|
if not bOk then return bOk, sErr end
|
||||||
@@ -216,7 +217,7 @@ function ProcessDtTenon.Make( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
|||||||
end
|
end
|
||||||
-- recupero la lavorazione
|
-- recupero la lavorazione
|
||||||
local sMillType = 'DtTenon'
|
local sMillType = 'DtTenon'
|
||||||
local sMilling = ML.FindMilling( sMillType .. EgtIf( bMillDown, '_H2', ''), nil, nil, nil, nil, bMillUp, bMillDown)
|
local sMilling = ML.FindMilling( sMillType .. EgtIf( bMillDown and not bMillUp, '_H2', ''), nil, nil, nil, nil, bMillUp, bMillDown)
|
||||||
if not sMilling then
|
if not sMilling then
|
||||||
local sErr = 'Error : milling not found in library'
|
local sErr = 'Error : milling not found in library'
|
||||||
EgtOutLog( sErr)
|
EgtOutLog( sErr)
|
||||||
|
|||||||
+217
-134
@@ -22,6 +22,7 @@ local Fbs = require( 'FacesBySaw')
|
|||||||
local Cut = require( 'ProcessCut')
|
local Cut = require( 'ProcessCut')
|
||||||
local Pocket = require( 'FaceByPocket')
|
local Pocket = require( 'FaceByPocket')
|
||||||
local Topology = require( 'FeatureTopology')
|
local Topology = require( 'FeatureTopology')
|
||||||
|
local Split = require( 'ProcessSplit')
|
||||||
|
|
||||||
EgtOutLog( ' ProcessHeadCut started', 1)
|
EgtOutLog( ' ProcessHeadCut started', 1)
|
||||||
|
|
||||||
@@ -29,6 +30,10 @@ EgtOutLog( ' ProcessHeadCut started', 1)
|
|||||||
local BD = require( 'BeamData')
|
local BD = require( 'BeamData')
|
||||||
local ML = require( 'MachiningLib')
|
local ML = require( 'MachiningLib')
|
||||||
|
|
||||||
|
if BD.PRECUT_HEAD == nil then
|
||||||
|
BD.PRECUT_HEAD = true
|
||||||
|
end
|
||||||
|
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
-- Riconoscimento della feature
|
-- Riconoscimento della feature
|
||||||
function ProcessHeadCut.Identify( Proc)
|
function ProcessHeadCut.Identify( Proc)
|
||||||
@@ -156,10 +161,9 @@ end
|
|||||||
|
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
-- tagli verticali aggiuntivi
|
-- tagli verticali aggiuntivi
|
||||||
local function AddVerticalPreCuts( Proc, sCutting, dCutXOffset, b3Raw )
|
local function AddVerticalPreCuts( Proc, sCutting, dCutXOffset, b3Raw)
|
||||||
local _, dimH = BL.GetFaceHvRefDim( Proc.Id, 0, b3Raw)
|
local nVerticalCuts = ceil( Proc.Face[1].WidthTrimmed / ( BD.MAX_LEN_DICE)) - 1
|
||||||
local nVerticalCuts = ceil( dimH / ( BD.MAX_LEN_DICE)) - 1
|
local dVerticalSliceHeight = Proc.Face[1].WidthTrimmed / ( nVerticalCuts + 1)
|
||||||
local dVerticalSliceHeight = dimH / ( nVerticalCuts + 1)
|
|
||||||
-- recupero il diametro dell'utensile
|
-- recupero il diametro dell'utensile
|
||||||
local dSawDiam = 400
|
local dSawDiam = 400
|
||||||
if EgtMdbSetCurrMachining( sCutting) then
|
if EgtMdbSetCurrMachining( sCutting) then
|
||||||
@@ -173,12 +177,180 @@ local function AddVerticalPreCuts( Proc, sCutting, dCutXOffset, b3Raw )
|
|||||||
for j = nVerticalCuts, 1, -1 do
|
for j = nVerticalCuts, 1, -1 do
|
||||||
local nFaceUse = MCH_MILL_FU.PARAL_FRONT
|
local nFaceUse = MCH_MILL_FU.PARAL_FRONT
|
||||||
local dVerticalCutOffset = dVerticalSliceHeight * -j
|
local dVerticalCutOffset = dVerticalSliceHeight * -j
|
||||||
bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, nFaceUse, nil, -0.1 -dCutXOffset, BD.CUT_SIC, dVerticalCutOffset, 0, 0, '', b3Raw)
|
local bForceTangentLeadInOut = BD.PRESS_ROLLER
|
||||||
|
bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, nFaceUse, nil, -0.1 -dCutXOffset, BD.CUT_SIC, dVerticalCutOffset, 0, 0, '', b3Raw, nil, nil, nil, bForceTangentLeadInOut)
|
||||||
if not bOk then return bOk, sErr end
|
if not bOk then return bOk, sErr end
|
||||||
end
|
end
|
||||||
|
|
||||||
return bOk, sErr
|
return bOk, sErr
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
-- tagli standard
|
||||||
|
local function MakeStandardCuts( Proc, b3Raw, nCuts, dOffsetBetweenCuts, HeadCutType, Cutting1Data, Cutting2Data, dStartOffset, dOvmHead)
|
||||||
|
local PrecutType = { bBigSectionCut = HeadCutType.bBigSectionCut, bHorizCut = HeadCutType.bHorizCut, bDoubleHorizCut = HeadCutType.bDoubleHorizCut, bDoubleCut = HeadCutType.bDoubleCut, sType = 'Precut', bNeedVerticalAddedCuts = false, bNeedHorizontalAddedCuts = false}
|
||||||
|
if not HeadCutType.bDoubleHorizCut then
|
||||||
|
-- flag di lavorazione faccia
|
||||||
|
local nOrthoOpposite = EgtIf( HeadCutType.bHorizCut, MCH_MILL_FU.ORTHO_DOWN, MCH_MILL_FU.ORTHO_FRONT)
|
||||||
|
-- calcolo extra taglio ed accorciamento
|
||||||
|
local dCutExtra = 0
|
||||||
|
local dAccStart = 0
|
||||||
|
local dAccEnd = 0
|
||||||
|
|
||||||
|
if b3Raw:getDimZ() < BD.MIN_DIM_HBEAM + 10 * GEO.EPS_SMALL or b3Raw:getDimY() < 2 * BD.MAX_DIM_HTCUT_HBEAM + 10 * GEO.EPS_SMALL then
|
||||||
|
dCutExtra = EgtIf( HeadCutType.bDoubleCut, - 0.5 * b3Raw:getDimY() + BD.CUT_EXTRA_MIN, BD.CUT_EXTRA)
|
||||||
|
else
|
||||||
|
dCutExtra = - ( b3Raw:getDimY() - Cutting1Data.dMaxDepth)
|
||||||
|
local dSawRad = Cutting1Data.dSawDiam / 2
|
||||||
|
-- distanza in Y tra il centro della lama e l'intersezione tra la lama stessa e la massima Z della trave, + extra
|
||||||
|
-- se taglio doppio l'intersezione sarà in mezzeria, se taglio singolo sarà all'estremo opposto della trave
|
||||||
|
local dKL = dSawRad - Cutting1Data.dMaxDepth + EgtIf( HeadCutType.bDoubleCut, b3Raw:getDimY() / 2 + BD.CUT_EXTRA_MIN, b3Raw:getDimY() + BD.CUT_EXTRA)
|
||||||
|
-- lunghezza minima del percorso di lavorazione, in caso accorciamento porti a lunghezza negativa
|
||||||
|
local dMinSawingLength = 5
|
||||||
|
if BD.C_SIMM then
|
||||||
|
dAccEnd = sqrt( max( dSawRad * dSawRad - dKL * dKL, 0))
|
||||||
|
-- non posso comunque accorciare più della dimensione della geometria, quindi in caso allungo entrata
|
||||||
|
if dAccEnd > b3Raw:getDimZ() - 100 * GEO.EPS_SMALL then
|
||||||
|
dAccStart = b3Raw:getDimZ() - dAccEnd - dMinSawingLength
|
||||||
|
end
|
||||||
|
else
|
||||||
|
dAccStart = sqrt( max( dSawRad * dSawRad - dKL * dKL, 0))
|
||||||
|
-- non posso comunque accorciare più della dimensione della geometria, quindi in caso allungo uscita
|
||||||
|
if dAccStart > b3Raw:getDimZ() - 100 * GEO.EPS_SMALL then
|
||||||
|
dAccEnd = b3Raw:getDimZ() - dAccStart - dMinSawingLength
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- per travi alte faccio dei tagli orizzontali aggiuntivi
|
||||||
|
if HeadCutType.bNeedHorizontalAddedCuts then
|
||||||
|
-- taglio a zero (con lama) per evitare problemi con grezzo più lungo del previsto. Se BigSection il pretaglio è già stato fatto.
|
||||||
|
if not ( HeadCutType.bBigSectionCut) and BD.PRECUT_HEAD then
|
||||||
|
dStartOffset = dOvmHead
|
||||||
|
local bOkPrecut, sErrPrecut = MakeStandardCuts( Proc, b3Raw, 1, 0, PrecutType, Cutting1Data, Cutting2Data, dStartOffset)
|
||||||
|
if not bOkPrecut then
|
||||||
|
return false, sErrPrecut
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local nHorizontalCuts = ceil( Proc.Face[1].HeightTrimmed / BD.MAX_DIM_DICE) - 1
|
||||||
|
local dHorizontalSliceHeight = Proc.Face[1].HeightTrimmed / ( nHorizontalCuts + 1)
|
||||||
|
for i = nCuts, 1, -1 do
|
||||||
|
local dCutXOffset = ( i - 1) * dOffsetBetweenCuts
|
||||||
|
-- tagli orizzontali
|
||||||
|
for j = nHorizontalCuts, 1, -1 do
|
||||||
|
local nFaceUse = MCH_MILL_FU.PARAL_DOWN
|
||||||
|
local dHorizontalCutOffset = dHorizontalSliceHeight * -j
|
||||||
|
local bForceTangentLeadInOut = BD.PRESS_ROLLER
|
||||||
|
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, Cutting1Data.sCutting, Cutting1Data.dSawDiam, nFaceUse, nil, -0.1 -dCutXOffset, BD.CUT_SIC, dHorizontalCutOffset, 0, 0, '', b3Raw, nil, nil, nil, bForceTangentLeadInOut)
|
||||||
|
if not bOk then return bOk, sErr end
|
||||||
|
end
|
||||||
|
-- se necessario taglio verticale doppio, eseguo l'opposto
|
||||||
|
if HeadCutType.bDoubleCut then
|
||||||
|
-- gli accorciamenti vanno invertiti per il taglio opposto
|
||||||
|
local dAccStartDoubleCut, dAccEndDoubleCut = dAccEnd, dAccStart
|
||||||
|
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, Cutting1Data.sCutting, Cutting1Data.dSawDiam, MCH_MILL_FU.ORTHO_BACK, nil, dCutExtra, BD.CUT_SIC, dCutXOffset, dAccStartDoubleCut, dAccEndDoubleCut, '', b3Raw, true)
|
||||||
|
if not bOk then return false, sErr end
|
||||||
|
end
|
||||||
|
-- taglio verticale
|
||||||
|
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, Cutting1Data.sCutting, Cutting1Data.dSawDiam, nOrthoOpposite, nil, dCutExtra, BD.CUT_SIC, dCutXOffset, dAccStart, dAccEnd, '', b3Raw, true)
|
||||||
|
if not bOk then return bOk, sErr end
|
||||||
|
end
|
||||||
|
return true, sWarn
|
||||||
|
end
|
||||||
|
|
||||||
|
-- taglio a zero (con lama) per evitare problemi con grezzo più lungo del previsto. Se BigSection il pretaglio è già stato fatto.
|
||||||
|
if not ( HeadCutType.bBigSectionCut) and BD.PRECUT_HEAD and HeadCutType.bNeedVerticalAddedCuts then
|
||||||
|
dStartOffset = dOvmHead
|
||||||
|
local bOkPrecut, sErrPrecut = MakeStandardCuts( Proc, b3Raw, 1, 0, PrecutType, Cutting1Data, Cutting2Data, dStartOffset)
|
||||||
|
if not bOkPrecut then
|
||||||
|
return false, sErrPrecut
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- se necessari tagli in doppio, eseguo gli opposti
|
||||||
|
if HeadCutType.bDoubleCut then
|
||||||
|
-- gli accorciamenti vanno invertiti per il taglio opposto
|
||||||
|
local dAccStartDoubleCut, dAccEndDoubleCut = dAccEnd, dAccStart
|
||||||
|
for i = nCuts, 1, -1 do
|
||||||
|
local dCutOffset = ( i - 1) * dOffsetBetweenCuts
|
||||||
|
if i == 1 and HeadCutType.sType =='Precut' then
|
||||||
|
dCutOffset = dStartOffset
|
||||||
|
end
|
||||||
|
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, Cutting1Data.sCutting, Cutting1Data.dSawDiam, MCH_MILL_FU.ORTHO_BACK, nil, dCutExtra, BD.CUT_SIC, dCutOffset, dAccStartDoubleCut, dAccEndDoubleCut, '', b3Raw, true)
|
||||||
|
if not bOk then return false, sErr end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- eseguo i tagli necessari
|
||||||
|
for i = nCuts, 1, -1 do
|
||||||
|
local dCutOffset = ( i - 1) * dOffsetBetweenCuts
|
||||||
|
-- se trave larga effettuo tagli verticali aggiuntivi
|
||||||
|
if HeadCutType.bNeedVerticalAddedCuts then
|
||||||
|
local bOk, sErr = AddVerticalPreCuts( Proc, Cutting1Data.sCutting, dCutOffset, b3Raw)
|
||||||
|
if not bOk then return bOk, sErr end
|
||||||
|
end
|
||||||
|
if i == 1 and HeadCutType.sType =='Precut' then
|
||||||
|
dCutOffset = dStartOffset
|
||||||
|
end
|
||||||
|
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, Cutting1Data.sCutting, Cutting1Data.dSawDiam, nOrthoOpposite, nil, dCutExtra, BD.CUT_SIC, dCutOffset, dAccStart, dAccEnd, '', b3Raw, true)
|
||||||
|
if not bOk then return false, sErr end
|
||||||
|
end
|
||||||
|
-- altrimenti necessari tagli da sopra e sotto con testa opportuna
|
||||||
|
else
|
||||||
|
-- verifico esistenza della lavorazione con lama da sotto
|
||||||
|
if not Cutting2Data.sCutting then
|
||||||
|
local sErr = 'Error : cutting H2 not found in library'
|
||||||
|
EgtOutLog( sErr)
|
||||||
|
return false, sErr
|
||||||
|
end
|
||||||
|
-- verifico che le due lame riescano a lavorare la sezione
|
||||||
|
local dDimZ = b3Raw:getDimZ()
|
||||||
|
local dExtra = Cutting1Data.dMaxVertDepth + Cutting2Data.dMaxDepth - dDimZ
|
||||||
|
if ( dExtra - 2 * BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL < 0) and not HeadCutType.bBigSectionCut then
|
||||||
|
local sErr = 'Error : section too big for head cut'
|
||||||
|
EgtOutLog( sErr)
|
||||||
|
return false, sErr
|
||||||
|
end
|
||||||
|
-- calcolo extra taglio ed accorciamento
|
||||||
|
local dCutExtra = -Cutting2Data.dMaxDepth + dExtra / 2 + BD.CUT_EXTRA_MIN
|
||||||
|
local dCutExtra2 = -Cutting1Data.dMaxVertDepth + dExtra / 2 + BD.CUT_EXTRA_MIN
|
||||||
|
local dAccStart = 0
|
||||||
|
local dVzLimDwnUp
|
||||||
|
if BD.TURN then dVzLimDwnUp = -2 end
|
||||||
|
-- taglio a zero (con lama) per evitare problemi con grezzo più lungo del previsto. Se BigSection il pretaglio è già stato fatto.
|
||||||
|
if not ( HeadCutType.bBigSectionCut) and BD.PRECUT_HEAD and HeadCutType.bNeedVerticalAddedCuts then
|
||||||
|
dStartOffset = dOvmHead
|
||||||
|
local bOkPrecut, sErrPrecut = MakeStandardCuts( Proc, b3Raw, 1, 0, PrecutType, Cutting1Data, Cutting2Data, dStartOffset)
|
||||||
|
if not bOkPrecut then
|
||||||
|
return false, sErrPrecut
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- eseguo i tagli da sotto necessari
|
||||||
|
for i = nCuts, 1, -1 do
|
||||||
|
local dCutOffset = ( i - 1) * dOffsetBetweenCuts
|
||||||
|
if i == 1 and HeadCutType.sType =='Precut' then
|
||||||
|
dCutOffset = dStartOffset
|
||||||
|
end
|
||||||
|
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, Cutting2Data.sCutting, Cutting2Data.dSawDiam, MCH_MILL_FU.ORTHO_TOP, dVzLimDwnUp, dCutExtra2, BD.CUT_SIC, dCutOffset, dAccStart, 0, '', b3Raw, nil, true)
|
||||||
|
if not bOk then return false, sErr end
|
||||||
|
end
|
||||||
|
-- eseguo i tagli da sopra necessari
|
||||||
|
for i = nCuts, 1, -1 do
|
||||||
|
local dCutOffset = ( i - 1) * dOffsetBetweenCuts
|
||||||
|
if i == 1 and HeadCutType.sType =='Precut' then
|
||||||
|
dCutOffset = dStartOffset
|
||||||
|
end
|
||||||
|
-- se trave larga effettuo tagli verticali aggiuntivi
|
||||||
|
if HeadCutType.bNeedVerticalAddedCuts then
|
||||||
|
local bOk, sErr = AddVerticalPreCuts( Proc, Cutting1Data.sCutting, dCutOffset, b3Raw)
|
||||||
|
if not bOk then return bOk, sErr end
|
||||||
|
end
|
||||||
|
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, Cutting1Data.sCutting, Cutting1Data.dSawDiam, MCH_MILL_FU.ORTHO_DOWN, dVzLimDwnUp, dCutExtra, BD.CUT_SIC, dCutOffset, dAccStart, 0, '', b3Raw)
|
||||||
|
if not bOk then return false, sErr end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
-- Applicazione della lavorazione
|
-- Applicazione della lavorazione
|
||||||
function ProcessHeadCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bNeedHCut)
|
function ProcessHeadCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bNeedHCut)
|
||||||
@@ -223,7 +395,7 @@ function ProcessHeadCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bNeedHCut
|
|||||||
if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid2) or '') then
|
if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid2) or '') then
|
||||||
dSawDiam2 = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dSawDiam2
|
dSawDiam2 = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dSawDiam2
|
||||||
dMaxDepth2 = EgtTdbGetCurrToolMaxDepth() or dMaxDepth2
|
dMaxDepth2 = EgtTdbGetCurrToolMaxDepth() or dMaxDepth2
|
||||||
dSawThick2 = EgtTdbGetCurrToolParam(MCH_TP.THICK) or dSawThick2
|
dSawThick2 = EgtTdbGetCurrToolParam( MCH_TP.THICK) or dSawThick2
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- caratteristiche taglio
|
-- caratteristiche taglio
|
||||||
@@ -233,6 +405,15 @@ function ProcessHeadCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bNeedHCut
|
|||||||
local bHorizCut = ( ( b3Raw:getDimY() > b3Raw:getDimZ() + 10 * GEO.EPS_SMALL or BD.TURN) and b3Raw:getDimZ() < dMaxVertDepth - BD.CUT_EXTRA)
|
local bHorizCut = ( ( b3Raw:getDimY() > b3Raw:getDimZ() + 10 * GEO.EPS_SMALL or BD.TURN) and b3Raw:getDimZ() < dMaxVertDepth - BD.CUT_EXTRA)
|
||||||
local bDoubleHorizCut = ( ( BD.DOWN_HEAD or BD.TURN) and not bHorizCut and b3Raw:getDimY() > 2 * dDimYRef - BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL)
|
local bDoubleHorizCut = ( ( BD.DOWN_HEAD or BD.TURN) and not bHorizCut and b3Raw:getDimY() > 2 * dDimYRef - BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL)
|
||||||
local bDoubleCut = ( not bHorizCut and not bDoubleHorizCut and b3Raw:getDimY() > dDimYRef - BD.CUT_EXTRA + 10 * GEO.EPS_SMALL)
|
local bDoubleCut = ( not bHorizCut and not bDoubleHorizCut and b3Raw:getDimY() > dDimYRef - BD.CUT_EXTRA + 10 * GEO.EPS_SMALL)
|
||||||
|
-- verifico necessità di tagli aggiuntivi orizzontali o verticali
|
||||||
|
local dMinOvmHeadForAddeddCuts = 10.123
|
||||||
|
local bNeedVerticalAddedCuts = ( Proc.Face[1].WidthTrimmed > BD.MAX_LEN_DICE) and ( dOvmHead > dMinOvmHeadForAddeddCuts - 10 * GEO.EPS_SMALL)
|
||||||
|
local bNeedHorizontalAddedCuts = ( Proc.Face[1].HeightTrimmed > ( BD.MIN_HEIGHT_ADDED_CUTS or BD.MAX_LEN_DICE)) and not bBigSectionCut and ( dOvmHead > dMinOvmHeadForAddeddCuts - 10 * GEO.EPS_SMALL)
|
||||||
|
-- dati lavorazioni sopra e sotto
|
||||||
|
local Cutting1Data = { sCutting = sCutting, dSawDiam = dSawDiam, dMaxDepth = dMaxDepth, dSawThick = dSawThick, dMaxVertDepth = dMaxVertDepth}
|
||||||
|
local Cutting2Data = { sCutting = sCutting2, dSawDiam = dSawDiam2, dMaxDepth = dMaxDepth2, dSawThick = dSawThick2}
|
||||||
|
-- dati sul taglio di testa da effettuare
|
||||||
|
local HeadCutType = { bBigSectionCut = bBigSectionCut, bHorizCut = bHorizCut, bDoubleHorizCut = bDoubleHorizCut, bDoubleCut = bDoubleCut, bNeedVerticalAddedCuts = bNeedVerticalAddedCuts, bNeedHorizontalAddedCuts = bNeedHorizontalAddedCuts}
|
||||||
-- dati geometrici del taglio
|
-- dati geometrici del taglio
|
||||||
local ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, 0, GDB_ID.ROOT)
|
local ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, 0, GDB_ID.ROOT)
|
||||||
-- se non obbligatorio e coincide con inizio grezzo, non va fatto
|
-- se non obbligatorio e coincide con inizio grezzo, non va fatto
|
||||||
@@ -242,8 +423,6 @@ function ProcessHeadCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bNeedHCut
|
|||||||
-- determino se lo spessore del materiale da rimuovere è eccessivo e quindi vanno fatti più tagli con offset
|
-- determino se lo spessore del materiale da rimuovere è eccessivo e quindi vanno fatti più tagli con offset
|
||||||
local nCuts = max( ceil( dOvmHead / (( BD.MAX_LEN_SCRAP_START or BD.MAX_LEN_SCRAP) + 0.5)), 1)
|
local nCuts = max( ceil( dOvmHead / (( BD.MAX_LEN_SCRAP_START or BD.MAX_LEN_SCRAP) + 0.5)), 1)
|
||||||
local dOffsL = dOvmHead / nCuts
|
local dOffsL = dOvmHead / nCuts
|
||||||
local _, dimH, dimV = BL.GetFaceHvRefDim( Proc.Id, 0, b3Raw)
|
|
||||||
local dMinOvmHeadForAddeddCuts = 10.123
|
|
||||||
-- se taglio per sezioni alte e larghe
|
-- se taglio per sezioni alte e larghe
|
||||||
if bBigSectionCut then
|
if bBigSectionCut then
|
||||||
if dOvmHead > 0 then
|
if dOvmHead > 0 then
|
||||||
@@ -259,11 +438,34 @@ function ProcessHeadCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bNeedHCut
|
|||||||
else
|
else
|
||||||
dMaxElev = Proc.Box:getMax():getX() - b3Raw:getMin():getX()
|
dMaxElev = Proc.Box:getMax():getX() - b3Raw:getMin():getX()
|
||||||
end
|
end
|
||||||
|
-- taglio a zero (con sega a catena o mix catena + lama) per evitare problemi con grezzo più lungo del previsto
|
||||||
|
if BD.PRECUT_HEAD then
|
||||||
|
-- recupero dati utensile della sega a catena più lunga a disposizione
|
||||||
|
local sSawing = ML.FindSawing( 'SawingForSplitting', nil, nil, 'Longest')
|
||||||
|
if not sSawing then
|
||||||
|
sSawing = ML.FindSawing( 'Sawing', nil, nil, 'Longest')
|
||||||
|
end
|
||||||
|
local dChainSawMaxMat = 0
|
||||||
|
local dChainSawLen = 0
|
||||||
|
if EgtMdbSetCurrMachining( sSawing or '') then
|
||||||
|
local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID)
|
||||||
|
if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then
|
||||||
|
dChainSawMaxMat = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT) or dChainSawMaxMat
|
||||||
|
dChainSawLen = EgtTdbGetCurrToolParam( MCH_TP.LEN) or dChainSawLen
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local SawingData = { sSawing = sSawing, dChainSawMaxMat = dChainSawMaxMat, dChainSawLen = dChainSawLen, bInvert = true}
|
||||||
|
local dOffset = dOvmHead
|
||||||
|
local bOkPrecut, sErrPrecut = Split.MakeBigSectionSplitting( Proc, b3Raw, dOffset, SawingData, Cutting2Data)
|
||||||
|
if not bOkPrecut then
|
||||||
|
return false, sErrPrecut
|
||||||
|
end
|
||||||
|
end
|
||||||
-- controllo se è necessario un taglio con dicing o si deve proseguire ai casi standard
|
-- controllo se è necessario un taglio con dicing o si deve proseguire ai casi standard
|
||||||
if dMaxElev > dSawThickCheck then
|
if dMaxElev > dSawThickCheck then
|
||||||
local bOk, sErr
|
local bOk, sErr
|
||||||
-- se trave larga effettuo tagli verticali aggiuntivi
|
-- se trave larga effettuo tagli verticali aggiuntivi
|
||||||
if ( dimH > BD.MAX_LEN_DICE) and ( dOvmHead > dMinOvmHeadForAddeddCuts - 10 * GEO.EPS_SMALL) then
|
if bNeedVerticalAddedCuts then
|
||||||
-- ad ogni offset di taglio dovrò fare prima i tagli verticali e poi i cubetti
|
-- ad ogni offset di taglio dovrò fare prima i tagli verticali e poi i cubetti
|
||||||
for i = nCuts, 1, -1 do
|
for i = nCuts, 1, -1 do
|
||||||
local nAddGrpId = BL.GetAddGroup( Proc.PartId)
|
local nAddGrpId = BL.GetAddGroup( Proc.PartId)
|
||||||
@@ -288,11 +490,11 @@ function ProcessHeadCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bNeedHCut
|
|||||||
bOk, sErr = AddVerticalPreCuts( AddProc, sCutting, 0, b3Raw)
|
bOk, sErr = AddVerticalPreCuts( AddProc, sCutting, 0, b3Raw)
|
||||||
if not bOk then return bOk, sErr end
|
if not bOk then return bOk, sErr end
|
||||||
-- tagli a cubetti con eventuale superficie limitante
|
-- tagli a cubetti con eventuale superficie limitante
|
||||||
bOk, sErr = Cut.Make( AddProc, nPhase, nRawId, nPartId, dOvmHead, nil, false, true, nil, nil, dCurrOvmT, nil, nLimitingSurf)
|
bOk, sErr = Cut.Make( AddProc, nPhase, nRawId, nPartId, dOvmHead, nil, false, true, nil, nil, nil, nil, nLimitingSurf)
|
||||||
end
|
end
|
||||||
-- tagli aggiuntivi non necessari
|
-- tagli aggiuntivi non necessari
|
||||||
else
|
else
|
||||||
bOk, sErr = Cut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, nil, false, true, nil, nil, dCurrOvmT)
|
bOk, sErr = Cut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, nil, false, true)
|
||||||
end
|
end
|
||||||
return bOk, sErr
|
return bOk, sErr
|
||||||
end
|
end
|
||||||
@@ -315,130 +517,11 @@ function ProcessHeadCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bNeedHCut
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- se tagli standard
|
|
||||||
if not bDoubleHorizCut then
|
local bOk, sErr = MakeStandardCuts( Proc, b3Raw, nCuts, dOffsL, HeadCutType, Cutting1Data, Cutting2Data, nil, dOvmHead)
|
||||||
-- flag di lavorazione faccia
|
|
||||||
local nOrthoOpposite = EgtIf( bHorizCut, MCH_MILL_FU.ORTHO_DOWN, MCH_MILL_FU.ORTHO_FRONT)
|
|
||||||
-- calcolo extra taglio ed accorciamento
|
|
||||||
local dCutExtra = 0
|
|
||||||
local dAccStart = 0
|
|
||||||
local dAccEnd = 0
|
|
||||||
if b3Raw:getDimZ() < BD.MIN_DIM_HBEAM + 10 * GEO.EPS_SMALL or b3Raw:getDimY() < 2 * BD.MAX_DIM_HTCUT_HBEAM + 10 * GEO.EPS_SMALL then
|
|
||||||
dCutExtra = EgtIf( bDoubleCut, - 0.5 * b3Raw:getDimY() + BD.CUT_EXTRA_MIN, BD.CUT_EXTRA)
|
|
||||||
else
|
|
||||||
dCutExtra = - ( b3Raw:getDimY() - dMaxDepth)
|
|
||||||
local dSawRad = dSawDiam / 2
|
|
||||||
-- distanza in Y tra il centro della lama e l'intersezione tra la lama stessa e la massima Z della trave, + extra
|
|
||||||
-- se taglio doppio l'intersezione sarà in mezzeria, se taglio singolo sarà all'estremo opposto della trave
|
|
||||||
local dKL = dSawRad - dMaxDepth + EgtIf( bDoubleCut, b3Raw:getDimY() / 2 + BD.CUT_EXTRA_MIN, b3Raw:getDimY() + BD.CUT_EXTRA)
|
|
||||||
-- lunghezza minima del percorso di lavorazione, in caso accorciamento porti a lunghezza negativa
|
|
||||||
local dMinSawingLength = 5
|
|
||||||
if BD.C_SIMM then
|
|
||||||
dAccEnd = sqrt( max( dSawRad * dSawRad - dKL * dKL, 0))
|
|
||||||
-- non posso comunque accorciare più della dimensione della geometria, quindi in caso allungo entrata
|
|
||||||
if dAccEnd > b3Raw:getDimZ() - 100 * GEO.EPS_SMALL then
|
|
||||||
dAccStart = b3Raw:getDimZ() - dAccEnd - dMinSawingLength
|
|
||||||
end
|
|
||||||
else
|
|
||||||
dAccStart = sqrt( max( dSawRad * dSawRad - dKL * dKL, 0))
|
|
||||||
-- non posso comunque accorciare più della dimensione della geometria, quindi in caso allungo uscita
|
|
||||||
if dAccStart > b3Raw:getDimZ() - 100 * GEO.EPS_SMALL then
|
|
||||||
dAccEnd = b3Raw:getDimZ() - dAccStart - dMinSawingLength
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- per travi alte faccio dei tagli orizzontali aggiuntivi
|
return bOk, sErr
|
||||||
local bAreHorizontalCutsNeeded = ( dimV > BD.MAX_LEN_DICE) and not bBigSectionCut and ( dOvmHead > dMinOvmHeadForAddeddCuts - 10 * GEO.EPS_SMALL)
|
end
|
||||||
if bAreHorizontalCutsNeeded then
|
|
||||||
local nHorizontalCuts = ceil( dimV / BD.MAX_DIM_DICE) - 1
|
|
||||||
local dHorizontalSliceHeight = dimV / ( nHorizontalCuts + 1)
|
|
||||||
for i = nCuts, 1, -1 do
|
|
||||||
local dCutXOffset = ( i - 1) * dOffsL
|
|
||||||
-- tagli orizzontali
|
|
||||||
for j = nHorizontalCuts, 1, -1 do
|
|
||||||
local nFaceUse = MCH_MILL_FU.PARAL_DOWN
|
|
||||||
local dHorizontalCutOffset = dHorizontalSliceHeight * -j
|
|
||||||
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, nFaceUse, nil, -0.1 -dCutXOffset, BD.CUT_SIC, dHorizontalCutOffset, 0, 0, '', b3Raw)
|
|
||||||
if not bOk then return bOk, sErr end
|
|
||||||
end
|
|
||||||
-- se necessario taglio verticale doppio, eseguo l'opposto
|
|
||||||
if bDoubleCut then
|
|
||||||
-- gli accorciamenti vanno invertiti per il taglio opposto
|
|
||||||
local dAccStartDoubleCut, dAccEndDoubleCut = dAccEnd, dAccStart
|
|
||||||
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, MCH_MILL_FU.ORTHO_BACK, nil, dCutExtra, BD.CUT_SIC, dCutXOffset, dAccStartDoubleCut, dAccEndDoubleCut, '', b3Raw, true)
|
|
||||||
if not bOk then return false, sErr end
|
|
||||||
end
|
|
||||||
-- taglio verticale
|
|
||||||
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, nOrthoOpposite, nil, dCutExtra, BD.CUT_SIC, dCutXOffset, dAccStart, dAccEnd, '', b3Raw)
|
|
||||||
if not bOk then return bOk, sErr end
|
|
||||||
end
|
|
||||||
return true, sWarn
|
|
||||||
end
|
|
||||||
|
|
||||||
-- se necessari tagli in doppio, eseguo gli opposti
|
|
||||||
if bDoubleCut then
|
|
||||||
-- gli accorciamenti vanno invertiti per il taglio opposto
|
|
||||||
local dAccStartDoubleCut, dAccEndDoubleCut = dAccEnd, dAccStart
|
|
||||||
for i = nCuts, 1, -1 do
|
|
||||||
local dCutOffset = ( i - 1) * dOffsL
|
|
||||||
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, MCH_MILL_FU.ORTHO_BACK, nil, dCutExtra, BD.CUT_SIC, dCutOffset, dAccStartDoubleCut, dAccEndDoubleCut, '', b3Raw, true)
|
|
||||||
if not bOk then return false, sErr end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
-- eseguo i tagli necessari
|
|
||||||
for i = nCuts, 1, -1 do
|
|
||||||
local dCutOffset = ( i - 1) * dOffsL
|
|
||||||
-- se trave larga effettuo tagli verticali aggiuntivi
|
|
||||||
if ( dimH > BD.MAX_LEN_DICE) and ( dOvmHead > dMinOvmHeadForAddeddCuts - 10 * GEO.EPS_SMALL) then
|
|
||||||
local bOk, sErr = AddVerticalPreCuts( Proc, sCutting, dCutOffset, b3Raw)
|
|
||||||
if not bOk then return bOk, sErr end
|
|
||||||
end
|
|
||||||
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, nOrthoOpposite, nil, dCutExtra, BD.CUT_SIC, dCutOffset, dAccStart, dAccEnd, '', b3Raw)
|
|
||||||
if not bOk then return false, sErr end
|
|
||||||
end
|
|
||||||
-- altrimenti necessari tagli da sopra e sotto con testa opportuna
|
|
||||||
else
|
|
||||||
-- verifico esistenza della lavorazione con lama da sotto
|
|
||||||
if not sCutting2 then
|
|
||||||
local sErr = 'Error : cutting H2 not found in library'
|
|
||||||
EgtOutLog( sErr)
|
|
||||||
return false, sErr
|
|
||||||
end
|
|
||||||
-- verifico che le due lame riescano a lavorare la sezione
|
|
||||||
local dDimZ = b3Raw:getDimZ()
|
|
||||||
local dExtra = dMaxVertDepth + dMaxDepth2 - dDimZ
|
|
||||||
if ( dExtra - 2 * BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL < 0) and not bBigSectionCut then
|
|
||||||
local sErr = 'Error : section too big for head cut'
|
|
||||||
EgtOutLog( sErr)
|
|
||||||
return false, sErr
|
|
||||||
end
|
|
||||||
-- calcolo extra taglio ed accorciamento
|
|
||||||
local dCutExtra = -dMaxDepth2 + dExtra / 2 + BD.CUT_EXTRA_MIN
|
|
||||||
local dCutExtra2 = -dMaxVertDepth + dExtra / 2 + BD.CUT_EXTRA_MIN
|
|
||||||
local dAccStart = 0
|
|
||||||
local dVzLimDwnUp
|
|
||||||
if BD.TURN then dVzLimDwnUp = -2 end
|
|
||||||
-- eseguo i tagli da sotto necessari
|
|
||||||
for i = nCuts, 1, -1 do
|
|
||||||
local dCutOffset = ( i - 1) * dOffsL
|
|
||||||
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting2, dSawDiam2, MCH_MILL_FU.ORTHO_TOP, dVzLimDwnUp, dCutExtra2, BD.CUT_SIC, dCutOffset, dAccStart, 0, '', b3Raw, nil, true)
|
|
||||||
if not bOk then return false, sErr end
|
|
||||||
end
|
|
||||||
-- eseguo i tagli da sopra necessari
|
|
||||||
for i = nCuts, 1, -1 do
|
|
||||||
local dCutOffset = ( i - 1) * dOffsL
|
|
||||||
-- se trave larga effettuo tagli verticali aggiuntivi
|
|
||||||
if ( dimH > BD.MAX_LEN_DICE) and ( dOvmHead > dMinOvmHeadForAddeddCuts - 10 * GEO.EPS_SMALL) then
|
|
||||||
local bOk, sErr = AddVerticalPreCuts( Proc, sCutting, dCutOffset, b3Raw)
|
|
||||||
if not bOk then return bOk, sErr end
|
|
||||||
end
|
|
||||||
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, MCH_MILL_FU.ORTHO_DOWN, dVzLimDwnUp, dCutExtra, BD.CUT_SIC, dCutOffset, dAccStart, 0, '', b3Raw)
|
|
||||||
if not bOk then return false, sErr end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
return ProcessHeadCut
|
return ProcessHeadCut
|
||||||
|
|||||||
+190
-71
@@ -105,6 +105,10 @@
|
|||||||
-- 2024/04/15 In SideMillAsSaw gestito anche rabbet
|
-- 2024/04/15 In SideMillAsSaw gestito anche rabbet
|
||||||
-- 2024/04/17 In MakeMoreLongFaces corretto calcolo divisione in parti per evitare problemi di ceil con interi perfetti (ceil(3) = 3 o 4??)
|
-- 2024/04/17 In MakeMoreLongFaces corretto calcolo divisione in parti per evitare problemi di ceil con interi perfetti (ceil(3) = 3 o 4??)
|
||||||
-- 2024/04/22 In IsTailFeature se LapJoint a 2 facce che taglia intera sezione, deve essere fatto dopo taglio di coda
|
-- 2024/04/22 In IsTailFeature se LapJoint a 2 facce che taglia intera sezione, deve essere fatto dopo taglio di coda
|
||||||
|
-- 2024/06/18 In MakeByMillAsSaw si cerca di orientare il motore verso il lato più vicino (rispetto a dove è la feature)
|
||||||
|
-- 2024/06/28 In VerifySideMillAsSaw modificato criterio ricerca utensile in base a normale della faccia
|
||||||
|
-- 2024/07/04 In IsTailFeature controllo per spostare lapjoint dopo taglio di separazione per lavorazioni tipo BH
|
||||||
|
-- 2024/09/03 In MakeLongMoreFaces si aggiunge faccia di fondo anche per topologia Groove passante a 3 facce
|
||||||
|
|
||||||
-- Tabella per definizione modulo
|
-- Tabella per definizione modulo
|
||||||
local ProcessLapJoint = {}
|
local ProcessLapJoint = {}
|
||||||
@@ -138,6 +142,9 @@ local Q_SIDE_ROUGH_TOOL = '' -- i
|
|||||||
local Q_ANTISPLINT_TYPE = '' -- i
|
local Q_ANTISPLINT_TYPE = '' -- i
|
||||||
local Q_BLADE_ON_ALONG_FACE = '' -- i
|
local Q_BLADE_ON_ALONG_FACE = '' -- i
|
||||||
local Q_MAX_ELEVATION = '' -- d
|
local Q_MAX_ELEVATION = '' -- d
|
||||||
|
local Q_SAW_PLUS_CHAIN = '' -- i
|
||||||
|
local Q_FORCE_CHAINSAW = '' -- i
|
||||||
|
|
||||||
|
|
||||||
-- variabile smussi
|
-- variabile smussi
|
||||||
local bMadeChamfer
|
local bMadeChamfer
|
||||||
@@ -179,6 +186,7 @@ local function AssignQIdent( Proc)
|
|||||||
Q_MAX_ELEVATION = 'Q10'
|
Q_MAX_ELEVATION = 'Q10'
|
||||||
Q_STAIRCASE = ''
|
Q_STAIRCASE = ''
|
||||||
Q_SAW_PLUS_CHAIN = 'Q11'
|
Q_SAW_PLUS_CHAIN = 'Q11'
|
||||||
|
Q_FORCE_CHAINSAW = 'Q12'
|
||||||
|
|
||||||
if ( Proc.Grp == 3 or Proc.Grp == 4) and Proc.Prc == 16 then
|
if ( Proc.Grp == 3 or Proc.Grp == 4) and Proc.Prc == 16 then
|
||||||
Q_FORCE_BLADE = 'Q01' -- i
|
Q_FORCE_BLADE = 'Q01' -- i
|
||||||
@@ -564,8 +572,19 @@ local function VerifySideMillAsSaw( Proc, nAddGrpId, vtN, dDiam, dFacElev)
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
-- Recupero la lavorazione
|
-- Recupero la lavorazione
|
||||||
local bDownHead = ( BD.DOWN_HEAD and vtN:getZ() < BD.NZ_MINA)
|
local bDownHead
|
||||||
local sMillingOnSide = ML.FindMilling( 'SideMillAsBlade', nil, nil, nil, nil, not bDownHead, bDownHead)
|
local sMillingOnSide
|
||||||
|
-- se ho testa da sotto e lap-joint diretto verso il basso, cerco prima testa sotto
|
||||||
|
if BD.DOWN_HEAD and vtN:getZ() < BD.NZ_MINA then
|
||||||
|
bDownHead = true
|
||||||
|
sMillingOnSide = ML.FindMilling( 'SideMillAsBlade_H2', nil, nil, nil, nil, not bDownHead, bDownHead)
|
||||||
|
end
|
||||||
|
-- se non ha trovato su testa sotto, cerco su testa sopra
|
||||||
|
if not sMillingOnSide then
|
||||||
|
bDownHead = false
|
||||||
|
sMillingOnSide = ML.FindMilling( 'SideMillAsBlade', nil, nil, nil, nil, not bDownHead, bDownHead)
|
||||||
|
end
|
||||||
|
|
||||||
if not sMillingOnSide then
|
if not sMillingOnSide then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
@@ -762,7 +781,11 @@ function ProcessLapJoint.IsTailFeature( Proc, b3Raw)
|
|||||||
-- verifico se è in coda
|
-- verifico se è in coda
|
||||||
local dEndDist = Proc.Box:getMin():getX() - b3Solid:getMin():getX()
|
local dEndDist = Proc.Box:getMin():getX() - b3Solid:getMin():getX()
|
||||||
if dEndDist > BD.MAX_DIST_HTFEA then
|
if dEndDist > BD.MAX_DIST_HTFEA then
|
||||||
return false
|
if bUseBHSideMill and ( Proc.Box:getMax():getX() - b3Solid:getMin():getX()) < 400 then
|
||||||
|
return true
|
||||||
|
else
|
||||||
|
return false
|
||||||
|
end
|
||||||
end
|
end
|
||||||
-- se lunga come trave, oppure non è trave corta e la sua lunghezza supera il massimo o il 80% della lunghezza della trave
|
-- se lunga come trave, oppure non è trave corta e la sua lunghezza supera il massimo o il 80% della lunghezza della trave
|
||||||
if Proc.Box:getDimX() > b3Solid:getDimX() - 1 or
|
if Proc.Box:getDimX() > b3Solid:getDimX() - 1 or
|
||||||
@@ -1169,7 +1192,8 @@ local function MakePreCuts( Proc, nPhase, nRawId, nPartId, dOvmHead, b3Raw, nCha
|
|||||||
EgtSetName( AddId, 'AddCut_' .. tostring( Proc.Id))
|
EgtSetName( AddId, 'AddCut_' .. tostring( Proc.Id))
|
||||||
-- applico lavorazione
|
-- applico lavorazione
|
||||||
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
||||||
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId}
|
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId, PartId = Proc.PartId}
|
||||||
|
CutProc.AffectedFaces = BL.GetProcessAffectedFaces( CutProc)
|
||||||
local nCutFacet = EgtSurfTmFacetCount( AddId)
|
local nCutFacet = EgtSurfTmFacetCount( AddId)
|
||||||
if nCutFacet == 1 then
|
if nCutFacet == 1 then
|
||||||
return Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead)
|
return Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead)
|
||||||
@@ -2529,7 +2553,7 @@ end
|
|||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
local function MakeChamfer( Proc, bIs3Faces, nAddGrpId, vtOrtho, b3Solid, nSurfInt, dDepthCham)
|
local function MakeChamfer( Proc, bIs3Faces, nAddGrpId, vtOrtho, b3Solid, nSurfInt, dDepthCham)
|
||||||
|
|
||||||
-- Se variabile globale indica che lo smusso è gi stato fatto, esco
|
-- Se variabile globale indica che lo smusso è già stato fatto, esco
|
||||||
if bMadeChamfer then
|
if bMadeChamfer then
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
@@ -2543,6 +2567,7 @@ local function MakeChamfer( Proc, bIs3Faces, nAddGrpId, vtOrtho, b3Solid, nSurfI
|
|||||||
end
|
end
|
||||||
-- ottengo le curve di contorno libero
|
-- ottengo le curve di contorno libero
|
||||||
local nAuxId1, nAuxId2, nNumIdAux
|
local nAuxId1, nAuxId2, nNumIdAux
|
||||||
|
local bIsOpenPath = false
|
||||||
if bIs3Faces then
|
if bIs3Faces then
|
||||||
-- estraggo i percorsi
|
-- estraggo i percorsi
|
||||||
nAuxId1, nNumIdAux = EgtExtractSurfTmLoops( Proc.Id, nAddGrpId)
|
nAuxId1, nNumIdAux = EgtExtractSurfTmLoops( Proc.Id, nAddGrpId)
|
||||||
@@ -2553,6 +2578,36 @@ local function MakeChamfer( Proc, bIs3Faces, nAddGrpId, vtOrtho, b3Solid, nSurfI
|
|||||||
else
|
else
|
||||||
nAuxId1, nNumIdAux = EgtExtractSurfTmLoops( Proc.Id, nAddGrpId)
|
nAuxId1, nNumIdAux = EgtExtractSurfTmLoops( Proc.Id, nAddGrpId)
|
||||||
if not nNumIdAux then nNumIdAux = 0 end
|
if not nNumIdAux then nNumIdAux = 0 end
|
||||||
|
-- se non è una curva chiusa bisogna estrarre le sole curve da lavorare
|
||||||
|
if Proc.TopologyLongName == 'Groove-Blind-RightAngles-Parallel-4' then
|
||||||
|
local IdsToMachine = {}
|
||||||
|
bIsOpenPath = true
|
||||||
|
local nFirstId, nIdCount = EgtExplodeCurveCompo( nAuxId1)
|
||||||
|
for i = nFirstId, nFirstId + nIdCount - 1, 1 do
|
||||||
|
-- se segmento di retta
|
||||||
|
if EgtGetType( i) == GDB_TY.CRV_LINE then
|
||||||
|
local _, nEntitiesCount = EgtCurveDomain(i)
|
||||||
|
for j = 0, nEntitiesCount - 1 do
|
||||||
|
local ptStart = EgtUP( i, j, GDB_RT.GLOB)
|
||||||
|
local ptEnd = EgtUP( i, j + 1, GDB_RT.GLOB)
|
||||||
|
if ( AreSameVectorApprox( vtOrtho, X_AX()) and ( abs( ptStart:getX() - b3Solid:getMax():getX()) < 100 * GEO.EPS_SMALL and abs( ptEnd:getX() - b3Solid:getMax():getX()) < 100 * GEO.EPS_SMALL) or
|
||||||
|
AreSameVectorApprox( vtOrtho, -X_AX()) and ( abs( ptStart:getX() - b3Solid:getMin():getX()) < 100 * GEO.EPS_SMALL and abs( ptEnd:getX() - b3Solid:getMin():getX()) < 100 * GEO.EPS_SMALL) or
|
||||||
|
AreSameVectorApprox( vtOrtho, Y_AX()) and ( abs( ptStart:getY() - b3Solid:getMax():getY()) < 100 * GEO.EPS_SMALL and abs( ptEnd:getY() - b3Solid:getMax():getY()) < 100 * GEO.EPS_SMALL) or
|
||||||
|
AreSameVectorApprox( vtOrtho, -Y_AX()) and ( abs( ptStart:getY() - b3Solid:getMin():getY()) < 100 * GEO.EPS_SMALL and abs( ptEnd:getY() - b3Solid:getMin():getY()) < 100 * GEO.EPS_SMALL) or
|
||||||
|
AreSameVectorApprox( vtOrtho, Z_AX()) and ( abs( ptStart:getZ() - b3Solid:getMax():getZ()) < 100 * GEO.EPS_SMALL and abs( ptEnd:getZ() - b3Solid:getMax():getZ()) < 100 * GEO.EPS_SMALL) or
|
||||||
|
AreSameVectorApprox( vtOrtho, -Z_AX()) and ( abs( ptStart:getZ() - b3Solid:getMin():getZ()) < 100 * GEO.EPS_SMALL and abs( ptEnd:getZ() - b3Solid:getMin():getZ()) < 100 * GEO.EPS_SMALL)
|
||||||
|
) then
|
||||||
|
table.insert( IdsToMachine, i)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local ptNear = EgtSurfTmFacetCenter(Proc.Id, 0, GDB_ID.ROOT)
|
||||||
|
nAuxId1 = EgtCurveCompoByReorder( nAddGrpId, IdsToMachine, ptNear, true, GDB_ID.ROOT)
|
||||||
|
nNumIdAux = 1
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local dExtra = 2
|
local dExtra = 2
|
||||||
@@ -2572,13 +2627,20 @@ local function MakeChamfer( Proc, bIs3Faces, nAddGrpId, vtOrtho, b3Solid, nSurfI
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
AuxId = nAuxId1 + i - 1
|
AuxId = nAuxId1 + i - 1
|
||||||
vtExtr, _, _ = EgtCurveArea( AuxId)
|
if bIsOpenPath then
|
||||||
end
|
_, vtExtr = EgtCurveIsFlat( AuxId)
|
||||||
if vtExtr then
|
else
|
||||||
if not bIs3Faces then
|
vtExtr, _, _ = EgtCurveArea( AuxId)
|
||||||
|
end
|
||||||
|
if vtExtr then
|
||||||
local fFrCurve = EgtGetGlobFrame( AuxId)
|
local fFrCurve = EgtGetGlobFrame( AuxId)
|
||||||
vtExtr:toGlob( fFrCurve)
|
vtExtr:toGlob( fFrCurve)
|
||||||
|
if bIsOpenPath and vtExtr * vtOrtho < GEO.EPS_SMALL then
|
||||||
|
vtExtr = -vtExtr
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
if vtExtr then
|
||||||
-- if bIs3Faces and i == nNumIdAux then
|
-- if bIs3Faces and i == nNumIdAux then
|
||||||
-- vtExtr = -vtExtr
|
-- vtExtr = -vtExtr
|
||||||
-- end
|
-- end
|
||||||
@@ -2666,7 +2728,8 @@ local function MakeByMillAsSaw( Proc, nPhase, nRawId, nPartId, nFacInd,
|
|||||||
local dLen = dist( ptP1, ptP2)
|
local dLen = dist( ptP1, ptP2)
|
||||||
if abs( dLen - dMaxLen) < 5 then
|
if abs( dLen - dMaxLen) < 5 then
|
||||||
local vtN = EgtSurfTmFacetNormVersor( Proc.Id, vAdj[i], GDB_ID.ROOT)
|
local vtN = EgtSurfTmFacetNormVersor( Proc.Id, vAdj[i], GDB_ID.ROOT)
|
||||||
if vtN:getY() > 0.5 or vtN:getZ() > 0.5 then
|
local bPositionedToYm = Proc.Box:getMax():getY() < ( b3Raw:getMin():getY() + b3Raw:getMax():getY()) / 2
|
||||||
|
if ( bPositionedToYm and vtN:getY() < 0.5) or ( not bPositionedToYm and vtN:getY() > 0.5) or vtN:getZ() > 0.5 then
|
||||||
nFacAdj = vAdj[i]
|
nFacAdj = vAdj[i]
|
||||||
dMaxLen = dLen
|
dMaxLen = dLen
|
||||||
end
|
end
|
||||||
@@ -2821,6 +2884,12 @@ local function MakeByChainOrSaw( Proc, nPhase, nRawId, nPartId, nFacInd,
|
|||||||
local nOk, sErr = MakeChamfer( Proc, bIs3Faces, nAddGrpId, vtOrtho, b3Solid, nSurfInt, dDepthCham)
|
local nOk, sErr = MakeChamfer( Proc, bIs3Faces, nAddGrpId, vtOrtho, b3Solid, nSurfInt, dDepthCham)
|
||||||
if nOk < 0 then return false, sErr end
|
if nOk < 0 then return false, sErr end
|
||||||
end
|
end
|
||||||
|
-- slot aperta su due lati
|
||||||
|
elseif Proc.TopologyLongName == 'Groove-Blind-RightAngles-Parallel-4' then
|
||||||
|
if nChamfer > 0 then
|
||||||
|
local nOk, sErr = MakeChamfer( Proc, false, nAddGrpId, rfFac:getVersZ(), b3Solid, nil, dDepthCham)
|
||||||
|
if nOk < 0 then return false, sErr end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
if not dDepth then dDepth = dElev end
|
if not dDepth then dDepth = dElev end
|
||||||
-- Recupero le facce adiacenti alla principale
|
-- Recupero le facce adiacenti alla principale
|
||||||
@@ -3176,6 +3245,11 @@ local function MakeAntiSplintBySaw( Proc, nFacet, vtN, b3Raw, nFacInd, bReduceDe
|
|||||||
end
|
end
|
||||||
-- valuto l'angolo tra le due facce
|
-- valuto l'angolo tra le due facce
|
||||||
local bAdj, ptP1, ptP2, dAng = EgtSurfTmFacetsContact( Proc.Id, nFacInd, nFacet, GDB_ID.ROOT)
|
local bAdj, ptP1, ptP2, dAng = EgtSurfTmFacetsContact( Proc.Id, nFacInd, nFacet, GDB_ID.ROOT)
|
||||||
|
if not bAdj then
|
||||||
|
local sErr = 'Error : Faces not adjacent'
|
||||||
|
EgtOutLog( sErr)
|
||||||
|
return false, sErr
|
||||||
|
end
|
||||||
local ptPm = (ptP1+ptP2)/2
|
local ptPm = (ptP1+ptP2)/2
|
||||||
-- ottengo il boundingBox e prendo le dimensioni lungo la normale (Z locale) che rappresenta l'elevazione della faccia
|
-- ottengo il boundingBox e prendo le dimensioni lungo la normale (Z locale) che rappresenta l'elevazione della faccia
|
||||||
-- laterale sul punto medio della linea in comune
|
-- laterale sul punto medio della linea in comune
|
||||||
@@ -3297,6 +3371,11 @@ local function MakePocket( Proc, nPartId, b3Solid, ptPs, tvtN, nFaceRef, sMchFin
|
|||||||
EgtSetMachiningParam( MCH_MP.FACEUSE, MCH_MILL_FU.ORTHO_CONT)
|
EgtSetMachiningParam( MCH_MP.FACEUSE, MCH_MILL_FU.ORTHO_CONT)
|
||||||
-- imposto posizione braccio porta testa
|
-- imposto posizione braccio porta testa
|
||||||
local nSCC = MCH_SCC.NONE
|
local nSCC = MCH_SCC.NONE
|
||||||
|
-- se si lavora una faccia orizzontale e la dimensione X della feature è sufficiente, blocco l'asse B per evitare sollecitazioni inutili
|
||||||
|
local b3Face = EgtGetBBoxGlob( Proc.Id, GDB_BB.STANDARD)
|
||||||
|
if BD.C_SIMM and AreSameOrOppositeVectorApprox( tvtN[2], Z_AX()) and b3Face:getDimX() > BD.LONGCUT_ENDLEN then
|
||||||
|
nSCC = MCH_SCC.ADIR_YM
|
||||||
|
end
|
||||||
if bLapJointAngTrasm then
|
if bLapJointAngTrasm then
|
||||||
nSCC = MCH_SCC.ADIR_NEAR
|
nSCC = MCH_SCC.ADIR_NEAR
|
||||||
elseif not BD.C_SIMM and not BD.TURN then
|
elseif not BD.C_SIMM and not BD.TURN then
|
||||||
@@ -3330,7 +3409,11 @@ local function MakePocket( Proc, nPartId, b3Solid, ptPs, tvtN, nFaceRef, sMchFin
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
-- eventuale massima elevazione imposta dall'utente
|
||||||
|
local dMaxElev = EgtGetInfo( Proc.Id, Q_MAX_ELEVATION, 'd')
|
||||||
|
if dMaxElev and dMaxElev < 1 then dMaxElev = nil end
|
||||||
-- se elevazione superiore a massimo affondamento della fresa, riduco opportunamente
|
-- se elevazione superiore a massimo affondamento della fresa, riduco opportunamente
|
||||||
|
dElev = dMaxElev or dElev
|
||||||
local sWarn
|
local sWarn
|
||||||
local dDepth = dElev
|
local dDepth = dElev
|
||||||
if dElev > dMaxDepth + 10 * GEO.EPS_SMALL then
|
if dElev > dMaxDepth + 10 * GEO.EPS_SMALL then
|
||||||
@@ -3341,11 +3424,7 @@ local function MakePocket( Proc, nPartId, b3Solid, ptPs, tvtN, nFaceRef, sMchFin
|
|||||||
EgtOutLog( sWarn)
|
EgtOutLog( sWarn)
|
||||||
end
|
end
|
||||||
-- imposto elevazione e dichiaro non si generano sfridi per VMill
|
-- imposto elevazione e dichiaro non si generano sfridi per VMill
|
||||||
-- eventuale massima elevazione imposta dall'utente
|
local sNotes = 'MaxElev=' .. EgtNumToString( dElev, 1) .. ';'
|
||||||
local dMaxElev = EgtGetInfo( Proc.Id, Q_MAX_ELEVATION, 'd')
|
|
||||||
if dMaxElev and dMaxElev < 1 then dMaxElev = nil end
|
|
||||||
dMaxElev = dMaxElev or dElev
|
|
||||||
local sNotes = 'MaxElev=' .. EgtNumToString( dMaxElev, 1) .. ';'
|
|
||||||
sNotes = sNotes .. 'VMRS=0;'
|
sNotes = sNotes .. 'VMRS=0;'
|
||||||
if bOpenOutRaw then
|
if bOpenOutRaw then
|
||||||
sNotes = sNotes .. 'OpenOutRaw=1;'
|
sNotes = sNotes .. 'OpenOutRaw=1;'
|
||||||
@@ -5077,22 +5156,29 @@ function SawPlusChain.ApplyMachining( Machining, b3Raw)
|
|||||||
local nErr
|
local nErr
|
||||||
nErr, sErr = EgtGetLastMachMgrError()
|
nErr, sErr = EgtGetLastMachMgrError()
|
||||||
-- se mortasatura e l'errore è compatibile (Axes values not calculable) si prova con l'altra configurazione dell'asse bloccato
|
-- se mortasatura e l'errore è compatibile (Axes values not calculable) si prova con l'altra configurazione dell'asse bloccato
|
||||||
-- TODO valutare se c'è modo di capire preventivamente la configurazione dell'asse bloccato e quindi rimuovere questa parte di codice
|
if Machining.Type == MCH_OY.MORTISING then
|
||||||
if Machining.Type == MCH_OY.MORTISING and nErr == 2507 then
|
-- se errore "Axes values not calculable" si prova con l'altra configurazione dell'asse bloccato
|
||||||
if Machining.BlockedAxis.Orientation == 'perpendicular' then
|
if nErr == 2507 then
|
||||||
Machining.BlockedAxis.Orientation = 'parallel'
|
if Machining.BlockedAxis.Orientation == 'perpendicular' then
|
||||||
else
|
Machining.BlockedAxis.Orientation = 'parallel'
|
||||||
Machining.BlockedAxis.Orientation = 'perpendicular'
|
else
|
||||||
|
Machining.BlockedAxis.Orientation = 'perpendicular'
|
||||||
|
end
|
||||||
|
EgtSetMachiningParam( MCH_MP.BLOCKEDAXIS, BL.GetBlockedAxis( Machining.Name, Machining.BlockedAxis.Orientation, b3Raw, Machining.BlockedAxis.VtN, Machining.BlockedAxis.VtOut))
|
||||||
|
if Machining.SuggestedAngles.Index == 1 then
|
||||||
|
Machining.SuggestedAngles.Index = 2
|
||||||
|
else
|
||||||
|
Machining.SuggestedAngles.Index = 1
|
||||||
|
end
|
||||||
|
EgtSetMachiningParam( MCH_MP.INITANGS, BL.GetChainSawInitAngs( Machining.SuggestedAngles.VtN, Machining.SuggestedAngles.VtOrtho, Machining.SuggestedAngles.Index))
|
||||||
|
sErr = ''
|
||||||
|
bIsApplyOk = ML.ApplyMachining( true, false)
|
||||||
|
-- se errore "Outstroke" e permesso ToolInvert provo ad invertire il lato di lavorazione
|
||||||
|
elseif Machining.AllowToolInvert and nErr == 2508 then
|
||||||
|
EgtSetMachiningParam( MCH_MP.TOOLINVERT, not Machining.ToolInvert)
|
||||||
|
sErr = ''
|
||||||
|
bIsApplyOk = ML.ApplyMachining( true, false)
|
||||||
end
|
end
|
||||||
EgtSetMachiningParam( MCH_MP.BLOCKEDAXIS, BL.GetBlockedAxis( Machining.Name, Machining.BlockedAxis.Orientation, b3Raw, Machining.BlockedAxis.VtN, Machining.BlockedAxis.VtOut))
|
|
||||||
if Machining.SuggestedAngles.Index == 1 then
|
|
||||||
Machining.SuggestedAngles.Index = 2
|
|
||||||
else
|
|
||||||
Machining.SuggestedAngles.Index = 1
|
|
||||||
end
|
|
||||||
EgtSetMachiningParam( MCH_MP.INITANGS, BL.GetChainSawInitAngs( Machining.SuggestedAngles.VtN, Machining.SuggestedAngles.VtOrtho, Machining.SuggestedAngles.Index))
|
|
||||||
sErr = ''
|
|
||||||
bIsApplyOk = ML.ApplyMachining( true, false)
|
|
||||||
end
|
end
|
||||||
if not bIsApplyOk then
|
if not bIsApplyOk then
|
||||||
nErr, sErr = EgtGetLastMachMgrError()
|
nErr, sErr = EgtGetLastMachMgrError()
|
||||||
@@ -5149,18 +5235,16 @@ function SawPlusChain.Saw.CalculateMachiningParameters( Proc, FaceToMachine, Edg
|
|||||||
Cutting.Message = 'Feature '.. Proc.FeatureId .. ' : strategy ' .. SawPlusChain.Name .. ' not applicable - saw blade not found'
|
Cutting.Message = 'Feature '.. Proc.FeatureId .. ' : strategy ' .. SawPlusChain.Name .. ' not applicable - saw blade not found'
|
||||||
Cutting.CanApply = false
|
Cutting.CanApply = false
|
||||||
EgtOutLog( Cutting.Message)
|
EgtOutLog( Cutting.Message)
|
||||||
return Cutting
|
|
||||||
end
|
end
|
||||||
Cutting.Type = MCH_OY.MILLING
|
Cutting.Type = MCH_OY.MILLING
|
||||||
Cutting.Tool = SawPlusChain.GetToolFromMachining( Cutting.Name)
|
Cutting.Tool = SawPlusChain.GetToolFromMachining( Cutting.Name)
|
||||||
|
|
||||||
-- verifica dimensioni tasca compatibili
|
-- verifica dimensioni tasca e direzione compatibili
|
||||||
-- se tasca meno spessa della lama la strategia non è applicabile
|
-- se tasca meno spessa della lama la strategia non è applicabile
|
||||||
if Cutting.Tool.Thickness > dPocketHeight + 10 * GEO.EPS_SMALL then
|
if Cutting.Tool.Thickness > dPocketHeight + 10 * GEO.EPS_SMALL then
|
||||||
Cutting.Message = 'Feature '.. Proc.FeatureId .. ' : strategy ' .. SawPlusChain.Name .. ' not applicable - pocket too narrow for saw blade thickness'
|
Cutting.Message = 'Feature '.. Proc.FeatureId .. ' : strategy ' .. SawPlusChain.Name .. ' not applicable - pocket too narrow for saw blade thickness'
|
||||||
Cutting.CanApply = false
|
Cutting.CanApply = false
|
||||||
EgtOutLog( Cutting.Message)
|
EgtOutLog( Cutting.Message)
|
||||||
return Cutting
|
|
||||||
end
|
end
|
||||||
if #( Proc.MainFaces.SideFaces) > 1 then
|
if #( Proc.MainFaces.SideFaces) > 1 then
|
||||||
-- se tasca più stretta della lama la strategia non è applicabile
|
-- se tasca più stretta della lama la strategia non è applicabile
|
||||||
@@ -5168,9 +5252,13 @@ function SawPlusChain.Saw.CalculateMachiningParameters( Proc, FaceToMachine, Edg
|
|||||||
Cutting.Message = 'Feature '.. Proc.FeatureId .. ' : strategy ' .. SawPlusChain.Name .. ' not applicable - pocket too narrow for saw blade diameter'
|
Cutting.Message = 'Feature '.. Proc.FeatureId .. ' : strategy ' .. SawPlusChain.Name .. ' not applicable - pocket too narrow for saw blade diameter'
|
||||||
Cutting.CanApply = false
|
Cutting.CanApply = false
|
||||||
EgtOutLog( Cutting.Message)
|
EgtOutLog( Cutting.Message)
|
||||||
return Cutting
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
if EdgeToMachine.ToolDirection:getZ() < BD.NZ_MINA then
|
||||||
|
Cutting.CanApply = false
|
||||||
|
Cutting.Message = 'Feature '.. Proc.FeatureId .. ' : skipped sawblade from bottom'
|
||||||
|
EgtOutLog( Cutting.Message)
|
||||||
|
end
|
||||||
|
|
||||||
-- parametri della lavorazione
|
-- parametri della lavorazione
|
||||||
-- inizio e fine aperti o chiusi
|
-- inizio e fine aperti o chiusi
|
||||||
@@ -5301,6 +5389,7 @@ function SawPlusChain.Chainsaw.CalculateMachiningParameters( Proc, FaceToMachine
|
|||||||
Mortising.CanApply = true
|
Mortising.CanApply = true
|
||||||
Mortising.Message = ''
|
Mortising.Message = ''
|
||||||
Mortising.ProcId = Proc.Id
|
Mortising.ProcId = Proc.Id
|
||||||
|
Mortising.AllowToolInvert = false
|
||||||
local bNeedToMachineOtherSide = false
|
local bNeedToMachineOtherSide = false
|
||||||
local dTestCornerRadius = 43
|
local dTestCornerRadius = 43
|
||||||
-- OneSide | OneSideAndExtend | BothSides | BothSidesAndExtend
|
-- OneSide | OneSideAndExtend | BothSides | BothSidesAndExtend
|
||||||
@@ -5344,18 +5433,21 @@ function SawPlusChain.Chainsaw.CalculateMachiningParameters( Proc, FaceToMachine
|
|||||||
Mortising.Message = 'Feature '.. Proc.FeatureId .. ' : strategy ' .. SawPlusChain.Name .. ' not applicable - chainsaw not found'
|
Mortising.Message = 'Feature '.. Proc.FeatureId .. ' : strategy ' .. SawPlusChain.Name .. ' not applicable - chainsaw not found'
|
||||||
Mortising.CanApply = false
|
Mortising.CanApply = false
|
||||||
EgtOutLog( Mortising.Message)
|
EgtOutLog( Mortising.Message)
|
||||||
return Mortising
|
|
||||||
end
|
end
|
||||||
Mortising.Type = MCH_OY.MORTISING
|
Mortising.Type = MCH_OY.MORTISING
|
||||||
Mortising.Tool = SawPlusChain.GetToolFromMachining( Mortising.Name)
|
Mortising.Tool = SawPlusChain.GetToolFromMachining( Mortising.Name)
|
||||||
|
|
||||||
|
-- in caso di tunnel da un lato permetto eventuale inversione lato di lavoro in caso di errori di applicazione (es: Outstroke)
|
||||||
|
if Proc.Topology == 'Tunnel' and sMortisingType == 'OneSide' or sMortisingType == 'OneSideAndExtend' then
|
||||||
|
Mortising.AllowToolInvert = true
|
||||||
|
end
|
||||||
|
|
||||||
-- verifica dimensioni tasca compatibili
|
-- verifica dimensioni tasca compatibili
|
||||||
-- se tasca meno spessa della sega a catena la strategia non è applicabile
|
-- se tasca meno spessa della sega a catena la strategia non è applicabile
|
||||||
if Mortising.Tool.Thickness > dPocketHeight + 10 * GEO.EPS_SMALL then
|
if Mortising.Tool.Thickness > dPocketHeight + 10 * GEO.EPS_SMALL then
|
||||||
Mortising.Message = 'Feature '.. Proc.FeatureId .. ' : strategy ' .. SawPlusChain.Name .. ' not applicable - pocket too narrow for chainsaw thickness'
|
Mortising.Message = 'Feature '.. Proc.FeatureId .. ' : strategy ' .. SawPlusChain.Name .. ' not applicable - pocket too narrow for chainsaw thickness'
|
||||||
Mortising.CanApply = false
|
Mortising.CanApply = false
|
||||||
EgtOutLog( Mortising.Message)
|
EgtOutLog( Mortising.Message)
|
||||||
return Mortising
|
|
||||||
end
|
end
|
||||||
if #( Proc.MainFaces.SideFaces) > 1 then
|
if #( Proc.MainFaces.SideFaces) > 1 then
|
||||||
-- se tasca più stretta della sega a catena la strategia non è applicabile
|
-- se tasca più stretta della sega a catena la strategia non è applicabile
|
||||||
@@ -5363,9 +5455,13 @@ function SawPlusChain.Chainsaw.CalculateMachiningParameters( Proc, FaceToMachine
|
|||||||
Mortising.Message = 'Feature '.. Proc.FeatureId .. ' : strategy ' .. SawPlusChain.Name .. ' not applicable - pocket too narrow for chainsaw width'
|
Mortising.Message = 'Feature '.. Proc.FeatureId .. ' : strategy ' .. SawPlusChain.Name .. ' not applicable - pocket too narrow for chainsaw width'
|
||||||
Mortising.CanApply = false
|
Mortising.CanApply = false
|
||||||
EgtOutLog( Mortising.Message)
|
EgtOutLog( Mortising.Message)
|
||||||
return Mortising
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
if EdgeToMachine.ToolDirection:getZ() < - 10 * GEO.EPS_ANG_SMALL then
|
||||||
|
Mortising.CanApply = false
|
||||||
|
Mortising.Message = 'Feature '.. Proc.FeatureId .. ' : skipped chainsaw from bottom'
|
||||||
|
EgtOutLog( Mortising.Message)
|
||||||
|
end
|
||||||
|
|
||||||
-- parametri della lavorazione
|
-- parametri della lavorazione
|
||||||
-- inizio e fine aperti o chiusi
|
-- inizio e fine aperti o chiusi
|
||||||
@@ -5429,7 +5525,7 @@ function SawPlusChain.Chainsaw.CalculateMachiningParameters( Proc, FaceToMachine
|
|||||||
Mortising.SuggestedAngles = {}
|
Mortising.SuggestedAngles = {}
|
||||||
Mortising.SuggestedAngles.Index = 1
|
Mortising.SuggestedAngles.Index = 1
|
||||||
Mortising.SuggestedAngles.VtN = FaceToMachine.VtN
|
Mortising.SuggestedAngles.VtN = FaceToMachine.VtN
|
||||||
Mortising.SuggestedAngles.VtOrthO = EdgeToMachine.ToolDirection
|
Mortising.SuggestedAngles.VtOrtho = EdgeToMachine.ToolDirection
|
||||||
-- approccio e retrazione
|
-- approccio e retrazione
|
||||||
Mortising.LeadIn, Mortising.LeadOut = SawPlusChain.CalculateLeadInOut( Mortising, EdgeToMachine)
|
Mortising.LeadIn, Mortising.LeadOut = SawPlusChain.CalculateLeadInOut( Mortising, EdgeToMachine)
|
||||||
-- eventuale step verticale
|
-- eventuale step verticale
|
||||||
@@ -5522,9 +5618,9 @@ function SawPlusChain.Make( bOnlySaw, Proc, nRawId)
|
|||||||
local bIsCuttingOk = false
|
local bIsCuttingOk = false
|
||||||
if Cutting.CanApply then
|
if Cutting.CanApply then
|
||||||
bIsCuttingOk, Cutting.Message = SawPlusChain.Saw.ApplyAllSteps( Cutting, b3Raw)
|
bIsCuttingOk, Cutting.Message = SawPlusChain.Saw.ApplyAllSteps( Cutting, b3Raw)
|
||||||
end
|
if not bIsCuttingOk then
|
||||||
if not bIsCuttingOk then
|
return bIsCuttingOk, Cutting.Message
|
||||||
return bIsCuttingOk, Cutting.Message
|
end
|
||||||
end
|
end
|
||||||
local dBottomDepthToMachine = Cutting.RadialOffset
|
local dBottomDepthToMachine = Cutting.RadialOffset
|
||||||
-- lato opposto del tunnel
|
-- lato opposto del tunnel
|
||||||
@@ -5533,9 +5629,9 @@ function SawPlusChain.Make( bOnlySaw, Proc, nRawId)
|
|||||||
bIsCuttingOk = false
|
bIsCuttingOk = false
|
||||||
if Cutting.CanApply then
|
if Cutting.CanApply then
|
||||||
bIsCuttingOk, Cutting.Message = SawPlusChain.Saw.ApplyAllSteps( Cutting, b3Raw)
|
bIsCuttingOk, Cutting.Message = SawPlusChain.Saw.ApplyAllSteps( Cutting, b3Raw)
|
||||||
end
|
if not bIsCuttingOk then
|
||||||
if not bIsCuttingOk then
|
return bIsCuttingOk, Cutting.Message
|
||||||
return bIsCuttingOk, Cutting.Message
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
-- se la lama non è arrivata sul fondo e c'è almeno un lato aperto va lavorato
|
-- se la lama non è arrivata sul fondo e c'è almeno un lato aperto va lavorato
|
||||||
@@ -5546,9 +5642,9 @@ function SawPlusChain.Make( bOnlySaw, Proc, nRawId)
|
|||||||
bIsCuttingOk = false
|
bIsCuttingOk = false
|
||||||
if Cutting.CanApply then
|
if Cutting.CanApply then
|
||||||
bIsCuttingOk, Cutting.Message = SawPlusChain.Saw.ApplyAllSteps( Cutting, b3Raw)
|
bIsCuttingOk, Cutting.Message = SawPlusChain.Saw.ApplyAllSteps( Cutting, b3Raw)
|
||||||
end
|
if not bIsCuttingOk then
|
||||||
if not bIsCuttingOk then
|
return bIsCuttingOk, Cutting.Message
|
||||||
return bIsCuttingOk, Cutting.Message
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- eventuale lavorazione di lama - lato della tasca in cui finisce la lavorazione
|
-- eventuale lavorazione di lama - lato della tasca in cui finisce la lavorazione
|
||||||
@@ -5557,9 +5653,9 @@ function SawPlusChain.Make( bOnlySaw, Proc, nRawId)
|
|||||||
bIsCuttingOk = false
|
bIsCuttingOk = false
|
||||||
if Cutting.CanApply then
|
if Cutting.CanApply then
|
||||||
bIsCuttingOk, Cutting.Message = SawPlusChain.Saw.ApplyAllSteps( Cutting, b3Raw)
|
bIsCuttingOk, Cutting.Message = SawPlusChain.Saw.ApplyAllSteps( Cutting, b3Raw)
|
||||||
end
|
if not bIsCuttingOk then
|
||||||
if not bIsCuttingOk then
|
return bIsCuttingOk, Cutting.Message
|
||||||
return bIsCuttingOk, Cutting.Message
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- la lama è arrivata sul fondo e tasca passante, non servono ulteriori lavorazioni
|
-- la lama è arrivata sul fondo e tasca passante, non servono ulteriori lavorazioni
|
||||||
@@ -5593,9 +5689,9 @@ function SawPlusChain.Make( bOnlySaw, Proc, nRawId)
|
|||||||
bIsMortisingOk = false
|
bIsMortisingOk = false
|
||||||
if Mortising.CanApply then
|
if Mortising.CanApply then
|
||||||
bIsMortisingOk, Mortising.Message = SawPlusChain.Chainsaw.ApplyAllSteps( Mortising, b3Raw)
|
bIsMortisingOk, Mortising.Message = SawPlusChain.Chainsaw.ApplyAllSteps( Mortising, b3Raw)
|
||||||
end
|
if not bIsMortisingOk then
|
||||||
if not bIsMortisingOk then
|
return bIsMortisingOk, Mortising.Message
|
||||||
return bIsMortisingOk, Mortising.Message
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
-- se la sega a catena non è arrivata sul fondo e c'è almeno un lato aperto va lavorato
|
-- se la sega a catena non è arrivata sul fondo e c'è almeno un lato aperto va lavorato
|
||||||
@@ -5606,9 +5702,9 @@ function SawPlusChain.Make( bOnlySaw, Proc, nRawId)
|
|||||||
bIsMortisingOk = false
|
bIsMortisingOk = false
|
||||||
if Mortising.CanApply then
|
if Mortising.CanApply then
|
||||||
bIsMortisingOk, Mortising.Message = SawPlusChain.Chainsaw.ApplyAllSteps( Mortising, b3Raw)
|
bIsMortisingOk, Mortising.Message = SawPlusChain.Chainsaw.ApplyAllSteps( Mortising, b3Raw)
|
||||||
end
|
if not bIsMortisingOk then
|
||||||
if not bIsMortisingOk then
|
return bIsMortisingOk, Mortising.Message
|
||||||
return bIsMortisingOk, Mortising.Message
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- eventuale lavorazione di sega a catena - lato della tasca in cui finisce la lavorazione
|
-- eventuale lavorazione di sega a catena - lato della tasca in cui finisce la lavorazione
|
||||||
@@ -5617,9 +5713,9 @@ function SawPlusChain.Make( bOnlySaw, Proc, nRawId)
|
|||||||
bIsMortisingOk = false
|
bIsMortisingOk = false
|
||||||
if Mortising.CanApply then
|
if Mortising.CanApply then
|
||||||
bIsMortisingOk, Mortising.Message = SawPlusChain.Chainsaw.ApplyAllSteps( Mortising, b3Raw)
|
bIsMortisingOk, Mortising.Message = SawPlusChain.Chainsaw.ApplyAllSteps( Mortising, b3Raw)
|
||||||
end
|
if not bIsMortisingOk then
|
||||||
if not bIsMortisingOk then
|
return bIsMortisingOk, Mortising.Message
|
||||||
return bIsMortisingOk, Mortising.Message
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -5702,23 +5798,38 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa
|
|||||||
if nChamfer < 0 then
|
if nChamfer < 0 then
|
||||||
return false, sErrCham
|
return false, sErrCham
|
||||||
end
|
end
|
||||||
|
-- eventuale forzatura sega a catena
|
||||||
|
local bForceChainsaw = ( EgtGetInfo( Proc.Id, Q_FORCE_CHAINSAW, 'i') or 0) > 0
|
||||||
-- se è un tunnel provo a vedere se è possibile lavorarlo con la svuotatura o con la sega catena
|
-- se è un tunnel provo a vedere se è possibile lavorarlo con la svuotatura o con la sega catena
|
||||||
if bClosedOrthoFaces then
|
if bClosedOrthoFaces then
|
||||||
local bTryWithBlades = true
|
local bTryWithBlades = true
|
||||||
|
local dDimMin, dDimMax, dDepth, vtOrtho, nLundIdFace
|
||||||
|
-- forzata sega a catena
|
||||||
|
if bForceChainsaw then
|
||||||
|
-- ottengo le dimensioni del tunnel
|
||||||
|
dDimMin, dDimMax, dDepth, vtOrtho, nLundIdFace = BL.GetTunnelDimension( Proc, nPartId)
|
||||||
-- lavoro fessura con svuotature (singola o doppia contrapposta)
|
-- lavoro fessura con svuotature (singola o doppia contrapposta)
|
||||||
local sMyMchFind = 'Pocket'
|
else
|
||||||
local nOk, sErr, dDimMin, dDimMax, dDepth, vtOrtho,
|
local sMyMchFind = 'Pocket'
|
||||||
|
local nOk, sErr
|
||||||
|
nOk, sErr, dDimMin, dDimMax, dDepth, vtOrtho,
|
||||||
nLundIdFace = MakeByPockets( Proc, nPhase, nRawId, nPartId, nChamfer, dDepthCham, nAddGrpId, sMyMchFind, false, b3Solid, bClosedOrthoFaces)
|
nLundIdFace = MakeByPockets( Proc, nPhase, nRawId, nPartId, nChamfer, dDepthCham, nAddGrpId, sMyMchFind, false, b3Solid, bClosedOrthoFaces)
|
||||||
if nOk < 0 then
|
if nOk < 0 then
|
||||||
return false, sErr
|
return false, sErr
|
||||||
elseif nOk > 0 then
|
elseif nOk > 0 then
|
||||||
bTryWithBlades = false
|
bTryWithBlades = false
|
||||||
|
end
|
||||||
end
|
end
|
||||||
-- Se la svuotatura precedente non è stata fatta e chamfer non è mutuamente esclusivo provo con la sega-catena
|
-- Se la svuotatura precedente non è stata fatta e chamfer non è mutuamente esclusivo provo con la sega-catena
|
||||||
if bTryWithBlades and nChamfer < 2 then
|
if bTryWithBlades and nChamfer < 2 then
|
||||||
-- verifico se posso farlo con la sega-catena
|
-- verifico se posso farlo con la sega-catena
|
||||||
local bMakeChainSaw, sSawing, dMaxMat, dSawCornerRad, dSawThick, _, dSawWidth = VerifyChainSaw( Proc, dDimMin, dDimMax, dDepth)
|
local bMakeChainSaw, sSawing, dMaxMat, dSawCornerRad, dSawThick, _, dSawWidth = VerifyChainSaw( Proc, dDimMin, dDimMax, dDepth)
|
||||||
if bMakeChainSaw then
|
if bMakeChainSaw then
|
||||||
|
-- se forzata sega a catena devo verificare se inserire lo smusso
|
||||||
|
if bForceChainsaw and nChamfer > 0 then
|
||||||
|
local nOk, sErr = MakeChamfer( Proc, false, nAddGrpId, vtOrtho, b3Solid, nLundIdFace, dDepthCham)
|
||||||
|
if nOk < 0 then return -1, sErr end
|
||||||
|
end
|
||||||
-- Ricalcolo l'affondamento tenendo conto di eventuale inclinazione
|
-- Ricalcolo l'affondamento tenendo conto di eventuale inclinazione
|
||||||
local dSlDepth
|
local dSlDepth
|
||||||
local frSlDh = Frame3d( Proc.Box:getCenter(), vtOrtho)
|
local frSlDh = Frame3d( Proc.Box:getCenter(), vtOrtho)
|
||||||
@@ -6174,6 +6285,7 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa
|
|||||||
if bMillDown and BD.GetBottomToolMaxTotLen then
|
if bMillDown and BD.GetBottomToolMaxTotLen then
|
||||||
dMaxTotLen = BD.GetBottomToolMaxTotLen( vtN)
|
dMaxTotLen = BD.GetBottomToolMaxTotLen( vtN)
|
||||||
end
|
end
|
||||||
|
local dUserMaxElev = EgtGetInfo( Proc.Id, Q_MAX_ELEVATION, 'd')
|
||||||
-- ricerca lavorazione
|
-- ricerca lavorazione
|
||||||
local sPocketing
|
local sPocketing
|
||||||
local _, sMyPocketing, dMyTMaxDepth, dMyTDiam = VerifyPocket( Proc, dDiam, dFacElev + dCollSic, dMaxTotLen, sMchFind, bMillUp, bMillDown)
|
local _, sMyPocketing, dMyTMaxDepth, dMyTDiam = VerifyPocket( Proc, dDiam, dFacElev + dCollSic, dMaxTotLen, sMchFind, bMillUp, bMillDown)
|
||||||
@@ -6181,10 +6293,12 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa
|
|||||||
_, sMyPocketing, dMyTMaxDepth, dMyTDiam = VerifyPocket( Proc, dDiam, dFacElev + dCollSic, dMaxTotLen, sMchFind)
|
_, sMyPocketing, dMyTMaxDepth, dMyTDiam = VerifyPocket( Proc, dDiam, dFacElev + dCollSic, dMaxTotLen, sMchFind)
|
||||||
bMillDown = false
|
bMillDown = false
|
||||||
end
|
end
|
||||||
|
-- se l'utente ha definito un'elevazione custom dUserMaxElev si lavora sempre la faccia standard
|
||||||
if sMyPocketing and
|
if sMyPocketing and
|
||||||
( dMyTMaxDepth > dFacElev + dCollSic - 10 * GEO.EPS_SMALL or ( dMyTMaxDepth > 0.8 * dFacElev + dCollSic and not bIsU) or
|
( dMyTMaxDepth > dFacElev + dCollSic - 10 * GEO.EPS_SMALL or ( dMyTMaxDepth > 0.8 * dFacElev + dCollSic and not bIsU) or
|
||||||
( bIsL and nUseRoughTool == 0) or
|
( bIsL and nUseRoughTool == 0) or
|
||||||
( Proc.Prc == 25 and not bIsU and not bIsL)) then
|
( Proc.Prc == 25 and not bIsU and not bIsL)) or
|
||||||
|
( dUserMaxElev and dUserMaxElev > 10 * GEO.EPS_SMALL) then
|
||||||
sPocketing = sMyPocketing
|
sPocketing = sMyPocketing
|
||||||
end
|
end
|
||||||
if bMillDown then
|
if bMillDown then
|
||||||
@@ -6203,6 +6317,10 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa
|
|||||||
if bForceSideMill then
|
if bForceSideMill then
|
||||||
sPocketing = nil
|
sPocketing = nil
|
||||||
end
|
end
|
||||||
|
-- se forzata sega a catena
|
||||||
|
if bForceChainsaw then
|
||||||
|
sPocketing = nil
|
||||||
|
end
|
||||||
-- leggo parametro Q
|
-- leggo parametro Q
|
||||||
local nQAntisplintResult = EgtGetInfo( Proc.Id, Q_ANTISPLINT_TYPE, 'i') or 0
|
local nQAntisplintResult = EgtGetInfo( Proc.Id, Q_ANTISPLINT_TYPE, 'i') or 0
|
||||||
-- se lavorazione fresa come lama disabilito eventuale antischeggia
|
-- se lavorazione fresa come lama disabilito eventuale antischeggia
|
||||||
@@ -6424,8 +6542,9 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa
|
|||||||
sWarn = EgtIf( #sWarn > 0, sWarn .. '\n' .. sWarn2, sWarn2)
|
sWarn = EgtIf( #sWarn > 0, sWarn .. '\n' .. sWarn2, sWarn2)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- in tutti gli altri casi lancio la MakeByPockets (lavorazione singola o doppia contrapposta, fondo della tasca una faccia fittizia perpendicolare al lato lungo)
|
-- in tutti gli altri casi, a meno che non sia forzata sega a catena, lancio la MakeByPockets
|
||||||
else
|
-- lavorazione singola o doppia contrapposta, fondo della tasca una faccia fittizia perpendicolare al lato lungo
|
||||||
|
elseif not bForceChainsaw then
|
||||||
-- se 2 facce setto i parametri corretti per la MakeByPockets
|
-- se 2 facce setto i parametri corretti per la MakeByPockets
|
||||||
if bForceSideMill and Proc.Fct == 2 then
|
if bForceSideMill and Proc.Fct == 2 then
|
||||||
bIs3Faces = false
|
bIs3Faces = false
|
||||||
@@ -6729,7 +6848,7 @@ local function MakeLongMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
|||||||
end
|
end
|
||||||
-- verifico se applicare gestione speciale per tunnel
|
-- verifico se applicare gestione speciale per tunnel
|
||||||
local nSurfBottomId
|
local nSurfBottomId
|
||||||
if Proc.Topology == 'Tunnel' then
|
if Proc.Topology == 'Tunnel' or ( Proc.Topology == 'Groove' and Proc.IsThrough and Proc.Fct == 3) then
|
||||||
bAddEndCapLeftSide = true
|
bAddEndCapLeftSide = true
|
||||||
bAddEndCapRightSide = true
|
bAddEndCapRightSide = true
|
||||||
-- recupero centro e normale delle facce
|
-- recupero centro e normale delle facce
|
||||||
@@ -7181,13 +7300,13 @@ function ProcessLapJoint.Make( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
|||||||
-- leggo i parametri Q per utilizzare la fresa di fianco e/o lama
|
-- leggo i parametri Q per utilizzare la fresa di fianco e/o lama
|
||||||
local nUseSideTool = EgtGetInfo( Proc.Id, Q_SIDE_ROUGH_TOOL, 'i') or 0
|
local nUseSideTool = EgtGetInfo( Proc.Id, Q_SIDE_ROUGH_TOOL, 'i') or 0
|
||||||
local bUseBlade = EgtGetInfo( Proc.Id, Q_ANTISPLINT_TYPE, 'i') == 1
|
local bUseBlade = EgtGetInfo( Proc.Id, Q_ANTISPLINT_TYPE, 'i') == 1
|
||||||
local bOk, sMyWarn = Long2Cut.Make( Proc, nPhase, nRawId, nPartId, bUseBlade, nUseSideTool)
|
local bOk, sMyWarn, _, AddedIds = Long2Cut.Make( Proc, nPhase, nRawId, nPartId, bUseBlade, nUseSideTool)
|
||||||
-- se non sono riuscito a farlo di lama, riprovo con la fresa
|
-- se non sono riuscito a farlo di lama, riprovo con la fresa
|
||||||
if not bOk and bUseBlade then
|
if not bOk and bUseBlade then
|
||||||
bUseBlade = false
|
bUseBlade = false
|
||||||
return Long2Cut.Make( Proc, nPhase, nRawId, nPartId, bUseBlade, nUseSideTool)
|
return Long2Cut.Make( Proc, nPhase, nRawId, nPartId, bUseBlade, nUseSideTool)
|
||||||
else
|
else
|
||||||
return bOk, sMyWarn
|
return bOk, sMyWarn, nil, AddedIds
|
||||||
end
|
end
|
||||||
-- prima faccia terminale
|
-- prima faccia terminale
|
||||||
elseif b3Fac1:getDimX() < 1 and abs( vtN2:getX()) < GEO.EPS_SMALL then
|
elseif b3Fac1:getDimX() < 1 and abs( vtN2:getX()) < GEO.EPS_SMALL then
|
||||||
|
|||||||
@@ -1391,7 +1391,7 @@ function ProcessLongCut.Make( Proc, nPhase, nRawId, nPartId, bCustUseBlade, nCus
|
|||||||
-- aggiungo geometria
|
-- aggiungo geometria
|
||||||
EgtSetMachiningGeometry( {{ Proc.Id, 0}})
|
EgtSetMachiningGeometry( {{ Proc.Id, 0}})
|
||||||
-- inverto se utensile antiorario per garantire senso di percorrenza migliore
|
-- inverto se utensile antiorario per garantire senso di percorrenza migliore
|
||||||
local bInvert = EgtMdbGetCurrMachiningParam( MCH_MP.SPEED) < 0
|
local bInvert = EgtMdbGetCurrMachiningParam( MCH_MP.SPEED) > 0
|
||||||
-- setto workside e eventuale inversione
|
-- setto workside e eventuale inversione
|
||||||
if bInvert then
|
if bInvert then
|
||||||
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.RIGHT)
|
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.RIGHT)
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ EgtOutLog( ' ProcessLongDoubleCut started', 1)
|
|||||||
-- Dati
|
-- Dati
|
||||||
local BD = require( 'BeamData')
|
local BD = require( 'BeamData')
|
||||||
local ML = require( 'MachiningLib')
|
local ML = require( 'MachiningLib')
|
||||||
|
local Topology = require( 'FeatureTopology')
|
||||||
|
|
||||||
local dLimMinPiece = BD.LEN_SHORT_PART or 1000
|
local dLimMinPiece = BD.LEN_SHORT_PART or 1000
|
||||||
|
|
||||||
@@ -324,6 +325,9 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
|||||||
local nFaceLimit, tFaceLong, ptC, vtN = IdentifyFaces( Proc)
|
local nFaceLimit, tFaceLong, ptC, vtN = IdentifyFaces( Proc)
|
||||||
local dLen = Proc.Box:getDimX()
|
local dLen = Proc.Box:getDimX()
|
||||||
|
|
||||||
|
-- inizializzazione tabella con eventuali lavorazioni create a posteriori da ritornare al chiamante
|
||||||
|
local AddedIds = {}
|
||||||
|
|
||||||
-- recupero lunghezza grezzo totale da info sulla macchinata
|
-- recupero lunghezza grezzo totale da info sulla macchinata
|
||||||
local dBarLen = EgtGetInfo( EgtGetCurrMachGroup(), 'BARLEN', 'd')
|
local dBarLen = EgtGetInfo( EgtGetCurrMachGroup(), 'BARLEN', 'd')
|
||||||
local dOvmHead = b3Raw:getMax():getX() - b3Solid:getMax():getX()
|
local dOvmHead = b3Raw:getMax():getX() - b3Solid:getMax():getX()
|
||||||
@@ -945,18 +949,6 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
|||||||
end
|
end
|
||||||
-- altrimenti concavo
|
-- altrimenti concavo
|
||||||
else
|
else
|
||||||
-- se effettivamente un taglio longitudinale e lama non taglia completamente, limito la lavorazione. Altrimenti esco.
|
|
||||||
for k = 1, #vOrd do
|
|
||||||
if vWidth[vOrd[k]] + BD.CUT_SIC > dMaxDepth then
|
|
||||||
if not( ProcessLong2Cut.Identify( Proc)) then
|
|
||||||
return false
|
|
||||||
else
|
|
||||||
local sWarn2 = 'Warning in ' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) .. ' : elevation (' .. EgtNumToString( vWidth[vOrd[k]], 1) .. ') bigger than max saw depth (' .. EgtNumToString( dMaxDepth, 1) .. ')'
|
|
||||||
if not sWarn then sWarn = '' end
|
|
||||||
sWarn = EgtIf( #sWarn > 0, sWarn .. '\n' .. sWarn2, sWarn2)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
-- si percorrono i lati alto e basso della faccia
|
-- si percorrono i lati alto e basso della faccia
|
||||||
for i = 1, nC do
|
for i = 1, nC do
|
||||||
-- Posizione braccio portatesta
|
-- Posizione braccio portatesta
|
||||||
@@ -986,6 +978,22 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
|||||||
EgtOutLog( sErr)
|
EgtOutLog( sErr)
|
||||||
return false, sErr
|
return false, sErr
|
||||||
end
|
end
|
||||||
|
-- se effettivamente un taglio longitudinale e lama non taglia completamente, limito la lavorazione. Altrimenti esco.
|
||||||
|
local dCheckDepth = 0
|
||||||
|
if bCanUseBlade then
|
||||||
|
dCheckDepth = dMaxDepth
|
||||||
|
elseif bCanUseUnderBlade then
|
||||||
|
dCheckDepth = dMaxDepthDn
|
||||||
|
end
|
||||||
|
if vWidth[vOrd[j]] + 100 * GEO.EPS_SMALL > dCheckDepth then
|
||||||
|
if not( ProcessLong2Cut.Identify( Proc)) then
|
||||||
|
return false
|
||||||
|
else
|
||||||
|
local sWarn2 = 'Warning in ' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) .. ' : elevation (' .. EgtNumToString( vWidth[vOrd[j]], 1) .. ') bigger than max saw depth (' .. EgtNumToString( dCheckDepth, 1) .. ')'
|
||||||
|
if not sWarn then sWarn = '' end
|
||||||
|
sWarn = EgtIf( #sWarn > 0, sWarn .. '\n' .. sWarn2, sWarn2)
|
||||||
|
end
|
||||||
|
end
|
||||||
-- se lama da sotto verifico se la componente Y della profondità di taglio supera la capacità della lama
|
-- se lama da sotto verifico se la componente Y della profondità di taglio supera la capacità della lama
|
||||||
if nSide <= 0 and bCanUseUnderBlade then
|
if nSide <= 0 and bCanUseUnderBlade then
|
||||||
if ( vWidth[vOrd[j]] / 2) > dMaxDepthDn then
|
if ( vWidth[vOrd[j]] / 2) > dMaxDepthDn then
|
||||||
@@ -999,7 +1007,7 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
|||||||
local dLioPerp
|
local dLioPerp
|
||||||
|
|
||||||
if j == 1 then -- il primo taglio lo faccio completo se angolo interno maggiore di 90
|
if j == 1 then -- il primo taglio lo faccio completo se angolo interno maggiore di 90
|
||||||
local dMinOffsBigFace = max( vWidth[vOrd[j]] - dMaxDepth, 0)
|
local dMinOffsBigFace = max( vWidth[vOrd[j]] - dCheckDepth, 0)
|
||||||
-- se la faccia è più grande del massimo materiale lama, allora limito lavorazione
|
-- se la faccia è più grande del massimo materiale lama, allora limito lavorazione
|
||||||
if dMinOffsBigFace > 0 then
|
if dMinOffsBigFace > 0 then
|
||||||
dOffset = dMinOffsBigFace
|
dOffset = dMinOffsBigFace
|
||||||
@@ -1011,7 +1019,7 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
|||||||
end
|
end
|
||||||
dLioPerp = vWidth[vOrd[j]] + BD.CUT_SIC
|
dLioPerp = vWidth[vOrd[j]] + BD.CUT_SIC
|
||||||
else -- il secondo ridotto della distanza minima e della componente spessore della lama
|
else -- il secondo ridotto della distanza minima e della componente spessore della lama
|
||||||
local dMinOffsBigFace = max( vWidth[vOrd[j]] - dMaxDepth, 0)
|
local dMinOffsBigFace = max( vWidth[vOrd[j]] - dCheckDepth, 0)
|
||||||
-- se la faccia è più grande del massimo materiale lama, allora limito lavorazione
|
-- se la faccia è più grande del massimo materiale lama, allora limito lavorazione
|
||||||
if dMinOffsBigFace > 0 then
|
if dMinOffsBigFace > 0 then
|
||||||
dOffset = dMinOffsBigFace
|
dOffset = dMinOffsBigFace
|
||||||
@@ -1070,12 +1078,27 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
|||||||
EgtSetMachiningParam( MCH_MP.LOTANG, dLioTang)
|
EgtSetMachiningParam( MCH_MP.LOTANG, dLioTang)
|
||||||
EgtSetMachiningParam( MCH_MP.LOPERP, dLioPerp)
|
EgtSetMachiningParam( MCH_MP.LOPERP, dLioPerp)
|
||||||
-- imposto posizione braccio porta testa per non ingombrare agli estremi
|
-- imposto posizione braccio porta testa per non ingombrare agli estremi
|
||||||
|
local ptP1LineToMachine, _, ptP2LineToMachine = EgtSurfTmFacetOppositeSide( Proc.Id, vOrd[j] - 1, BL.GetVersRef( vFaceUse[vOrd[j]]), GDB_ID.ROOT)
|
||||||
|
local vtTg = ptP2LineToMachine - ptP1LineToMachine ; vtTg:normalize()
|
||||||
|
local bIsMachiningInverted = EgtGetMachiningParam( MCH_MP.INVERT)
|
||||||
|
if bIsMachiningInverted then
|
||||||
|
vtTg = -vtTg
|
||||||
|
end
|
||||||
|
if BD.C_SIMM then
|
||||||
|
if abs( vtN[vOrd[j]]:getX()) < GEO.EPS_SMALL then
|
||||||
|
nSCC = EgtIf( ( vtTg:getX() > GEO.EPS_SMALL), MCH_SCC.ADIR_XM, MCH_SCC.ADIR_XP)
|
||||||
|
else
|
||||||
|
nSCC = MCH_SCC.NONE
|
||||||
|
end
|
||||||
|
else
|
||||||
|
nSCC = EgtIf( ( i == 1 or i == nC - 1), MCH_SCC.ADIR_XP, MCH_SCC.ADIR_XM)
|
||||||
|
end
|
||||||
EgtSetMachiningParam( MCH_MP.SCC, nSCC)
|
EgtSetMachiningParam( MCH_MP.SCC, nSCC)
|
||||||
-- determino e imposto l'utilizzo della faccia
|
-- determino e imposto l'utilizzo della faccia
|
||||||
EgtSetMachiningParam( MCH_MP.FACEUSE, vFaceUse[vOrd[j]])
|
EgtSetMachiningParam( MCH_MP.FACEUSE, vFaceUse[vOrd[j]])
|
||||||
-- imposto angolo 3° asse rot
|
-- imposto angolo 3° asse rot
|
||||||
local vtOut = EgtIf( vtN[vOrd[j]]:getX() > 0, X_AX(), -X_AX())
|
local vtOut = EgtIf( vtN[vOrd[j]]:getX() > 0, X_AX(), -X_AX())
|
||||||
EgtSetMachiningParam( MCH_MP.BLOCKEDAXIS, BL.GetBlockedAxis( sCutting, 'perpendicular', b3Raw, vtN, vtOut))
|
EgtSetMachiningParam( MCH_MP.BLOCKEDAXIS, BL.GetBlockedAxis( EgtIf( bCanUseUnderBlade, sCuttingDn, sCutting), 'perpendicular', b3Raw, vtN, vtOut))
|
||||||
-- eseguo
|
-- eseguo
|
||||||
if not ML.ApplyMachining( true, false) then
|
if not ML.ApplyMachining( true, false) then
|
||||||
local _, sErr = EgtGetLastMachMgrError()
|
local _, sErr = EgtGetLastMachMgrError()
|
||||||
@@ -1254,6 +1277,11 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
if Proc.bMoveAfterSplit then
|
||||||
|
nC = 1
|
||||||
|
dStartDist = Proc.Box:getDimX() - ( dToolDiam / 2 + 5)
|
||||||
|
dEndDist = - ( dToolDiam / 2 + 5)
|
||||||
|
end
|
||||||
if nIni == 2 then
|
if nIni == 2 then
|
||||||
dStartDist, dEndDist = dEndDist, dStartDist
|
dStartDist, dEndDist = dEndDist, dStartDist
|
||||||
dStartAccDist, dEndAccDist = dEndAccDist, dStartAccDist
|
dStartAccDist, dEndAccDist = dEndAccDist, dStartAccDist
|
||||||
@@ -1365,6 +1393,19 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
if not Proc.MoveAfterSplit and not bEndFixed and not bConvex then
|
||||||
|
-- recupero gruppo per geometria addizionale
|
||||||
|
local nAddGrpId = BL.GetAddGroup( nPartId)
|
||||||
|
if not nAddGrpId then
|
||||||
|
local sErr = 'Error : missing AddGroup'
|
||||||
|
EgtOutLog( sErr)
|
||||||
|
return false, sErr
|
||||||
|
end
|
||||||
|
local AddId = EgtCopyGlob( Proc.Id, nAddGrpId) or GDB_ID.NULL
|
||||||
|
local AddProc = { Id = AddId, Grp = 0, Prc = 12, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg, PartId = Proc.PartId, bMoveAfterSplit = true}
|
||||||
|
Topology.Classify( AddProc, b3Raw)
|
||||||
|
table.insert( AddedIds, AddProc)
|
||||||
|
end
|
||||||
|
|
||||||
-- altrimenti lavorazione di fianco : Long2CutSide o Long2CutDown
|
-- altrimenti lavorazione di fianco : Long2CutSide o Long2CutDown
|
||||||
else
|
else
|
||||||
@@ -1807,8 +1848,8 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return true, sWarn
|
return true, sWarn, nil, AddedIds
|
||||||
end
|
end
|
||||||
|
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
return ProcessLong2Cut
|
return ProcessLong2Cut
|
||||||
|
|||||||
+11
-11
@@ -3,6 +3,7 @@
|
|||||||
-- 2020/05/28 Tipo di lavorazione passato da Mark a Text.
|
-- 2020/05/28 Tipo di lavorazione passato da Mark a Text.
|
||||||
-- 2021/05/03 Aggiunta gestione testa da sotto.
|
-- 2021/05/03 Aggiunta gestione testa da sotto.
|
||||||
-- 2022/12/05 Aggiunta gestione tipo di lavorazione Text_AT.
|
-- 2022/12/05 Aggiunta gestione tipo di lavorazione Text_AT.
|
||||||
|
-- 2024/09/04 In Make gestione di più geometrie ausiliarie ( ora si lavora anche il testo, oltre che alle linee di marcatura)
|
||||||
|
|
||||||
-- Tabella per definizione modulo
|
-- Tabella per definizione modulo
|
||||||
local ProcessMark = {}
|
local ProcessMark = {}
|
||||||
@@ -50,9 +51,6 @@ end
|
|||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
-- Applicazione della lavorazione
|
-- Applicazione della lavorazione
|
||||||
function ProcessMark.Make( Proc, nPhase, nRawId, nPartId)
|
function ProcessMark.Make( Proc, nPhase, nRawId, nPartId)
|
||||||
-- recupero eventuale geometria ausiliaria
|
|
||||||
local AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i')
|
|
||||||
if AuxId then AuxId = AuxId + Proc.Id end
|
|
||||||
-- recupero i dati della marcatura
|
-- recupero i dati della marcatura
|
||||||
local vtExtr
|
local vtExtr
|
||||||
if EgtGetType( Proc.Id) ~= GDB_TY.EXT_TEXT then
|
if EgtGetType( Proc.Id) ~= GDB_TY.EXT_TEXT then
|
||||||
@@ -108,13 +106,15 @@ function ProcessMark.Make( Proc, nPhase, nRawId, nPartId)
|
|||||||
EgtSetOperationMode( nMchFId, false)
|
EgtSetOperationMode( nMchFId, false)
|
||||||
return false, sErr
|
return false, sErr
|
||||||
end
|
end
|
||||||
-- eventuale lavorazione su seconda geometria
|
-- si verifica se ci sono altre geometrie da lavorare
|
||||||
if AuxId then
|
local AdditionalGeometries = EgtSplitString( EgtGetInfo( Proc.Id, 'AUXID', 's')) or {}
|
||||||
|
for i = 1, #AdditionalGeometries do
|
||||||
|
local AuxId = Proc.Id + AdditionalGeometries[i]
|
||||||
-- inserisco la lavorazione di fresatura
|
-- inserisco la lavorazione di fresatura
|
||||||
local sName2 = 'Decor2_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id))
|
local nOtherMachiningId = EgtAddMachining( sName, sMilling)
|
||||||
local nMchF2Id = EgtAddMachining( sName, sMilling)
|
if not nOtherMachiningId then
|
||||||
if not nMchF2Id then
|
sName = 'Decor' .. '_' .. tostring( i) .. '_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id))
|
||||||
local sErr = 'Error adding machining ' .. sName2 .. '-' .. sMilling
|
local sErr = 'Error adding machining ' .. sName .. '-' .. sMilling
|
||||||
EgtOutLog( sErr)
|
EgtOutLog( sErr)
|
||||||
return false, sErr
|
return false, sErr
|
||||||
end
|
end
|
||||||
@@ -125,14 +125,14 @@ function ProcessMark.Make( Proc, nPhase, nRawId, nPartId)
|
|||||||
-- eseguo
|
-- eseguo
|
||||||
if not ML.ApplyMachining( true, false) then
|
if not ML.ApplyMachining( true, false) then
|
||||||
local _, sErr = EgtGetLastMachMgrError()
|
local _, sErr = EgtGetLastMachMgrError()
|
||||||
EgtSetOperationMode( nMchF2Id, false)
|
EgtSetOperationMode( nOtherMachiningId, false)
|
||||||
return false, sErr
|
return false, sErr
|
||||||
end
|
end
|
||||||
-- se geometria a X maggiore, la sposto prima
|
-- se geometria a X maggiore, la sposto prima
|
||||||
local ptS1 = EgtSP( Proc.Id, GDB_ID.ROOT)
|
local ptS1 = EgtSP( Proc.Id, GDB_ID.ROOT)
|
||||||
local ptS2 = EgtSP( AuxId, GDB_ID.ROOT)
|
local ptS2 = EgtSP( AuxId, GDB_ID.ROOT)
|
||||||
if ptS2:getX() > ptS1:getX() then
|
if ptS2:getX() > ptS1:getX() then
|
||||||
EgtRelocateGlob( nMchF2Id, nMchFId, GDB_IN.BEFORE)
|
EgtRelocateGlob( nOtherMachiningId, nMchFId, GDB_IN.BEFORE)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return true
|
return true
|
||||||
|
|||||||
@@ -417,7 +417,8 @@ function ProcessMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
|||||||
local AddId = EgtSurfTmPlaneInBBox( nAddGrpId, ptCutC, vtCutN, b3Solid, GDB_RT.GLOB)
|
local AddId = EgtSurfTmPlaneInBBox( nAddGrpId, ptCutC, vtCutN, b3Solid, GDB_RT.GLOB)
|
||||||
local b3Cut = EgtGetBBoxGlob( AddId or GDB_ID.NULL, GDB_BB.STANDARD)
|
local b3Cut = EgtGetBBoxGlob( AddId or GDB_ID.NULL, GDB_BB.STANDARD)
|
||||||
local CutProc = { Id = AddId, Grp = Proc.Grp - 2, Prc = 10, Box = b3Cut, Fct = 1, Flg = Proc.Flg,
|
local CutProc = { Id = AddId, Grp = Proc.Grp - 2, Prc = 10, Box = b3Cut, Fct = 1, Flg = Proc.Flg,
|
||||||
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId}
|
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId, PartId = Proc.PartId}
|
||||||
|
CutProc.AffectedFaces = BL.GetProcessAffectedFaces( CutProc)
|
||||||
local bFromBottom = ( b3Solid:getDimX() < BD.LEN_SHORT_PART and vtExtr:getZ() > 0.25)
|
local bFromBottom = ( b3Solid:getDimX() < BD.LEN_SHORT_PART and vtExtr:getZ() > 0.25)
|
||||||
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dCurrOvmH, bFromBottom)
|
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dCurrOvmH, bFromBottom)
|
||||||
if not bOk then return bOk, sErr end
|
if not bOk then return bOk, sErr end
|
||||||
|
|||||||
@@ -307,7 +307,8 @@ function ProcessProfCamb.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
|||||||
-- altrimenti applico taglio di lama
|
-- altrimenti applico taglio di lama
|
||||||
else
|
else
|
||||||
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
||||||
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId}
|
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId, PartId = Proc.PartId}
|
||||||
|
CutProc.AffectedFaces = BL.GetProcessAffectedFaces( CutProc)
|
||||||
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dCurrOvmH)
|
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||||
if not bOk then
|
if not bOk then
|
||||||
return false, sErr
|
return false, sErr
|
||||||
|
|||||||
@@ -311,7 +311,8 @@ function ProcessProfConcave.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
|||||||
-- altrimenti applico taglio di lama
|
-- altrimenti applico taglio di lama
|
||||||
else
|
else
|
||||||
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
||||||
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId}
|
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId, PartId = Proc.PartId}
|
||||||
|
CutProc.AffectedFaces = BL.GetProcessAffectedFaces( CutProc)
|
||||||
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dCurrOvmH)
|
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||||
if not bOk then
|
if not bOk then
|
||||||
return false, sErr
|
return false, sErr
|
||||||
|
|||||||
@@ -311,7 +311,8 @@ function ProcessProfConvex.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
|||||||
-- altrimenti applico taglio di lama
|
-- altrimenti applico taglio di lama
|
||||||
else
|
else
|
||||||
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
||||||
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId}
|
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId, PartId = Proc.PartId}
|
||||||
|
CutProc.AffectedFaces = BL.GetProcessAffectedFaces( CutProc)
|
||||||
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dCurrOvmH)
|
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||||
if not bOk then
|
if not bOk then
|
||||||
return false, sErr
|
return false, sErr
|
||||||
|
|||||||
@@ -258,7 +258,8 @@ function ProcessProfFront.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
|||||||
-- altrimenti applico taglio di lama
|
-- altrimenti applico taglio di lama
|
||||||
else
|
else
|
||||||
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
||||||
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId}
|
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId, PartId = Proc.PartId}
|
||||||
|
CutProc.AffectedFaces = BL.GetProcessAffectedFaces( CutProc)
|
||||||
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dCurrOvmH)
|
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||||
if not bOk then
|
if not bOk then
|
||||||
return false, sErr
|
return false, sErr
|
||||||
|
|||||||
@@ -293,7 +293,8 @@ function ProcessProfHead.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
|||||||
-- altrimenti applico taglio di lama
|
-- altrimenti applico taglio di lama
|
||||||
else
|
else
|
||||||
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
||||||
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId}
|
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId, PartId = Proc.PartId}
|
||||||
|
CutProc.AffectedFaces = BL.GetProcessAffectedFaces( CutProc)
|
||||||
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dCurrOvmH)
|
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||||
if not bOk then
|
if not bOk then
|
||||||
return false, sErr
|
return false, sErr
|
||||||
|
|||||||
@@ -134,7 +134,8 @@ function ProcessRidgeLap.Make( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
|||||||
-- applico taglio di lama
|
-- applico taglio di lama
|
||||||
local b3Cut = EgtGetBBoxGlob( AddId or GDB_ID.NULL, GDB_BB.STANDARD)
|
local b3Cut = EgtGetBBoxGlob( AddId or GDB_ID.NULL, GDB_BB.STANDARD)
|
||||||
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = b3Cut, Fct = 1, Flg = Proc.Flg,
|
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = b3Cut, Fct = 1, Flg = Proc.Flg,
|
||||||
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId}
|
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId, PartId = Proc.PartId}
|
||||||
|
CutProc.AffectedFaces = BL.GetProcessAffectedFaces( CutProc)
|
||||||
if BL.IsCutNeeded( CutProc, b3Raw, dOvmHead) then
|
if BL.IsCutNeeded( CutProc, b3Raw, dOvmHead) then
|
||||||
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead, false)
|
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead, false)
|
||||||
if not bOk then return bOk, sErr end
|
if not bOk then return bOk, sErr end
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
-- 2022/06/10 Aggiunto il parametro dOvmTail per gestire sovramateriali in coda diversi da OVM_MID (sezioni alte e larghe)
|
-- 2022/06/10 Aggiunto il parametro dOvmTail per gestire sovramateriali in coda diversi da OVM_MID (sezioni alte e larghe)
|
||||||
-- 2022/07/12 Aggiunta gestione PF1250 e TURN.
|
-- 2022/07/12 Aggiunta gestione PF1250 e TURN.
|
||||||
-- 2023/02/14 Gestite le rotazioni di 90 deg nell'aggiornamento del grezzo.
|
-- 2023/02/14 Gestite le rotazioni di 90 deg nell'aggiornamento del grezzo.
|
||||||
|
-- 2024/09/03 In ApplyDiceCut, se possibile, i tagli paralleli sono fatti con un unico passaggio di fianco.
|
||||||
|
|
||||||
-- Tabella per definizione modulo
|
-- Tabella per definizione modulo
|
||||||
local ProcessScarfJoint = {}
|
local ProcessScarfJoint = {}
|
||||||
@@ -134,7 +135,9 @@ end
|
|||||||
local function ApplyDiceCut( vFaceOrd, nGoodFace1, nGoodFace4, nAddGrpId, b3Solid, ptC, vtN, Proc, vtRef, bHead, sCutting, dSawDiam, b3Raw, dNewDiceDim)
|
local function ApplyDiceCut( vFaceOrd, nGoodFace1, nGoodFace4, nAddGrpId, b3Solid, ptC, vtN, Proc, vtRef, bHead, sCutting, dSawDiam, b3Raw, dNewDiceDim)
|
||||||
|
|
||||||
local bOk = true
|
local bOk = true
|
||||||
|
local bOk2 = true
|
||||||
local sErr = ''
|
local sErr = ''
|
||||||
|
local sErr2 = ''
|
||||||
|
|
||||||
local vCuts = {}
|
local vCuts = {}
|
||||||
if nGoodFace1 and nGoodFace4 and nGoodFace1 > 0 and nGoodFace4 > 0 then
|
if nGoodFace1 and nGoodFace4 and nGoodFace1 > 0 and nGoodFace4 > 0 then
|
||||||
@@ -185,9 +188,49 @@ local function ApplyDiceCut( vFaceOrd, nGoodFace1, nGoodFace4, nAddGrpId, b3Soli
|
|||||||
-- extra taglio
|
-- extra taglio
|
||||||
local dExtraCut = EgtIf( i % 2 == 1, 0, BD.CUT_EXTRA)
|
local dExtraCut = EgtIf( i % 2 == 1, 0, BD.CUT_EXTRA)
|
||||||
-- lavoro la faccia
|
-- lavoro la faccia
|
||||||
for j = 1, #vCuts[i] do
|
local dMaxDepth = 0
|
||||||
bOk, sErr = Fbs.MakeOne( vCuts[i][j], 0, sCutting, dSawDiam, vtOrthoO, dVzLimDwnUp, dExtraCut, BD.CUT_SIC, 0, 0, 0, nil, b3Raw)
|
if EgtMdbSetCurrMachining( sCutting) then
|
||||||
if not bOk then return bOk, sErr end
|
local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID)
|
||||||
|
if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then
|
||||||
|
dMaxDepth = EgtTdbGetCurrToolMaxDepth() or dMaxDepth
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local dDiceFaceMaxH = 0
|
||||||
|
local dDiceFaceMinH = GEO.INFINITO
|
||||||
|
if ( i % 2) == 0 then
|
||||||
|
for cont = 1, #vCuts[i] do
|
||||||
|
local _, dDiceFaceH, dDiceFaceV = BL.GetFaceHvRefDim( vCuts[i][cont], 0)
|
||||||
|
dDiceFaceMaxH = max( dDiceFaceMaxH, dDiceFaceH)
|
||||||
|
-- calcolo lato orizzontale minore ipotizzando sia un trapezio
|
||||||
|
local dDiceFaceH2 = ( 2 * EgtSurfArea( vCuts[i][cont]) ) / dDiceFaceV - dDiceFaceH
|
||||||
|
dDiceFaceMinH = min( dDiceFaceMinH, dDiceFaceH2)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- se si può fare, faccio unico taglio parallelo
|
||||||
|
if ( i % 2) == 0 and ( dMaxDepth > dDiceFaceMaxH - 0.5 * dDiceFaceMinH + BD.CUT_EXTRA_MIN) then
|
||||||
|
local bDoubleCut = false
|
||||||
|
local dCutExtra = BD.CUT_EXTRA
|
||||||
|
if dMaxDepth < dDiceFaceMaxH + BD.CUT_EXTRA then
|
||||||
|
bDoubleCut = true
|
||||||
|
dCutExtra = - 0.5 * dDiceFaceMinH + BD.CUT_EXTRA_MIN
|
||||||
|
end
|
||||||
|
local nSurfToCut = EgtSurfTmBySewing( nAddGrpId, vCuts[i], false)
|
||||||
|
local nFaceUseCut1, nFaceUseCut2 = MCH_MILL_FU.ORTHO_BACK, MCH_MILL_FU.ORTHO_FRONT
|
||||||
|
if Proc.Tail then
|
||||||
|
nFaceUseCut1, nFaceUseCut2 = nFaceUseCut2, nFaceUseCut1
|
||||||
|
end
|
||||||
|
if bDoubleCut then
|
||||||
|
bOk, sErr = Fbs.MakeOne( nSurfToCut, 0, sCutting, dSawDiam, nFaceUseCut1, nil, dCutExtra, BD.CUT_SIC, 0, 0, 0, '', b3Raw, true)
|
||||||
|
if not bOk then return false, sErr end
|
||||||
|
end
|
||||||
|
bOk2, sErr2 = Fbs.MakeOne( nSurfToCut, 0, sCutting, dSawDiam, nFaceUseCut2, nil, dCutExtra, BD.CUT_SIC, 0, 0, 0, '', b3Raw)
|
||||||
|
if not bOk2 then return false, sErr2 end
|
||||||
|
else
|
||||||
|
for j = 1, #vCuts[i] do
|
||||||
|
bOk, sErr = Fbs.MakeOne( vCuts[i][j], 0, sCutting, dSawDiam, vtOrthoO, dVzLimDwnUp, dExtraCut, BD.CUT_SIC, 0, 0, 0, nil, b3Raw)
|
||||||
|
if not bOk then return bOk, sErr end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- lavoro la faccia interna in ogni caso
|
-- lavoro la faccia interna in ogni caso
|
||||||
@@ -201,7 +244,7 @@ local function ApplyDiceCut( vFaceOrd, nGoodFace1, nGoodFace4, nAddGrpId, b3Soli
|
|||||||
if vFaceOrd[3] ~= 0 then
|
if vFaceOrd[3] ~= 0 then
|
||||||
-- inserisco la lavorazione
|
-- inserisco la lavorazione
|
||||||
local vtOrthoO = Vector3d( vtRef)
|
local vtOrthoO = Vector3d( vtRef)
|
||||||
local bOk, sErr = Fbs.MakeOne( Proc.Id, vFaceOrd[3] - 1, sCutting, dSawDiam, vtOrthoO, dVzLimDwnUp, 0, BD.CUT_SIC, 0, 0, 0, nil, b3Raw)
|
bOk, sErr = Fbs.MakeOne( Proc.Id, vFaceOrd[3] - 1, sCutting, dSawDiam, vtOrthoO, dVzLimDwnUp, 0, BD.CUT_SIC, 0, 0, 0, nil, b3Raw)
|
||||||
if not bOk then return bOk, sErr end
|
if not bOk then return bOk, sErr end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
-- 2022/08/09 Ora se la feature ha meno di due facce viene richiamata la normale Cut.
|
-- 2022/08/09 Ora se la feature ha meno di due facce viene richiamata la normale Cut.
|
||||||
-- 2022/11/09 Aggiunta gestione parametro Q04 per forzare utilizzo fresa di lato e lavorare come FreeContour.
|
-- 2022/11/09 Aggiunta gestione parametro Q04 per forzare utilizzo fresa di lato e lavorare come FreeContour.
|
||||||
-- 2023/02/14 Gestite le rotazioni di 90 deg nell'aggiornamento del grezzo.
|
-- 2023/02/14 Gestite le rotazioni di 90 deg nell'aggiornamento del grezzo.
|
||||||
|
-- 2024/08/05 Se assimilabile ad un taglio (1 faccia) si considerare area non pinzabile testa/coda
|
||||||
|
|
||||||
-- Tabella per definizione modulo
|
-- Tabella per definizione modulo
|
||||||
local ProcessSimpleScarf = {}
|
local ProcessSimpleScarf = {}
|
||||||
@@ -148,7 +149,7 @@ function ProcessSimpleScarf.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, dOvmT
|
|||||||
-- se ci sono meno di due facce si riduce a una normale Cut
|
-- se ci sono meno di due facce si riduce a una normale Cut
|
||||||
local nFacetCnt = EgtSurfTmFacetCount( Proc.Id)
|
local nFacetCnt = EgtSurfTmFacetCount( Proc.Id)
|
||||||
if nFacetCnt < 2 then
|
if nFacetCnt < 2 then
|
||||||
local bOk, sErr = Cut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, nil, nil, nil, nil, nil, dOvmTail)
|
local bOk, sErr = Cut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, nil, nil, nil, nil, nil, dOvmTail, true)
|
||||||
return bOk, sErr
|
return bOk, sErr
|
||||||
end
|
end
|
||||||
-- dati delle facce
|
-- dati delle facce
|
||||||
|
|||||||
+337
-240
@@ -38,6 +38,10 @@ EgtOutLog( ' ProcessSplit started', 1)
|
|||||||
local BD = require( 'BeamData')
|
local BD = require( 'BeamData')
|
||||||
local ML = require( 'MachiningLib')
|
local ML = require( 'MachiningLib')
|
||||||
|
|
||||||
|
if BD.PRECUT_TAIL == nil then
|
||||||
|
BD.PRECUT_TAIL = true
|
||||||
|
end
|
||||||
|
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
-- Riconoscimento della feature
|
-- Riconoscimento della feature
|
||||||
function ProcessSplit.Identify( Proc)
|
function ProcessSplit.Identify( Proc)
|
||||||
@@ -63,7 +67,7 @@ end
|
|||||||
|
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
-- lavorazione smussi
|
-- lavorazione smussi
|
||||||
local function MakeChamfer( nOriId, Proc, nPhase, nRawId, nPartId, dOvmHead)
|
local function MakeChamfer( nOriId, Proc, nPhase, nRawId, nPartId, dOvmTail)
|
||||||
-- verifico che lo smusso sia richiesto
|
-- verifico che lo smusso sia richiesto
|
||||||
local dDepth = EgtGetInfo( nOriId, 'Q06', 'd') or 0
|
local dDepth = EgtGetInfo( nOriId, 'Q06', 'd') or 0
|
||||||
if dDepth < 0.1 then return true end
|
if dDepth < 0.1 then return true end
|
||||||
@@ -165,7 +169,7 @@ end
|
|||||||
|
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
-- lavorazione con sega a catena per sezioni alte e larghe
|
-- lavorazione con sega a catena per sezioni alte e larghe
|
||||||
local function MakeSplitByChainSaw( nSurfId, sSawing, nFaceUse, dDepth, sNotes, dOffs, bExtendStartEnd)
|
local function MakeCutByChainSaw( nSurfId, sSawing, nFaceUse, dDepth, sNotes, dRadialOffset, bExtendStartEnd, bInvert)
|
||||||
-- Recupero i dati dell'utensile
|
-- Recupero i dati dell'utensile
|
||||||
local dMaxMat = 0
|
local dMaxMat = 0
|
||||||
local dSawCornerRad = 0
|
local dSawCornerRad = 0
|
||||||
@@ -205,7 +209,7 @@ local function MakeSplitByChainSaw( nSurfId, sSawing, nFaceUse, dDepth, sNotes,
|
|||||||
local vtOrtho = BL.GetVersRef( nFaceUse)
|
local vtOrtho = BL.GetVersRef( nFaceUse)
|
||||||
EgtSetMachiningParam( MCH_MP.INITANGS, BL.GetChainSawInitAngs( vtN, vtOrtho, 1))
|
EgtSetMachiningParam( MCH_MP.INITANGS, BL.GetChainSawInitAngs( vtN, vtOrtho, 1))
|
||||||
-- imposto offset radiale per mantenere il materiale in coda per la finitura
|
-- imposto offset radiale per mantenere il materiale in coda per la finitura
|
||||||
EgtSetMachiningParam( MCH_MP.OFFSR, dOffs)
|
EgtSetMachiningParam( MCH_MP.OFFSR, dRadialOffset)
|
||||||
-- imposto eventuale allungamento percorso iniziale
|
-- imposto eventuale allungamento percorso iniziale
|
||||||
local dStartAddLen = 0
|
local dStartAddLen = 0
|
||||||
local dEndAddLen = 0
|
local dEndAddLen = 0
|
||||||
@@ -217,7 +221,13 @@ local function MakeSplitByChainSaw( nSurfId, sSawing, nFaceUse, dDepth, sNotes,
|
|||||||
EgtSetMachiningParam( MCH_MP.ENDADDLEN, dEndAddLen)
|
EgtSetMachiningParam( MCH_MP.ENDADDLEN, dEndAddLen)
|
||||||
-- faccio in modo che l'attacco della lama sia dal lato opposto rispetto al corpo macchina
|
-- faccio in modo che l'attacco della lama sia dal lato opposto rispetto al corpo macchina
|
||||||
EgtSetMachiningParam( MCH_MP.TOOLINVERT, true)
|
EgtSetMachiningParam( MCH_MP.TOOLINVERT, true)
|
||||||
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.LEFT)
|
if bInvert and bInvert == true then
|
||||||
|
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.RIGHT)
|
||||||
|
EgtSetMachiningParam( MCH_MP.INVERT, true)
|
||||||
|
else
|
||||||
|
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.LEFT)
|
||||||
|
EgtSetMachiningParam( MCH_MP.INVERT, false)
|
||||||
|
end
|
||||||
if dMaxMat >= dDepth then
|
if dMaxMat >= dDepth then
|
||||||
EgtSetMachiningParam( MCH_MP.DEPTH, dDepth)
|
EgtSetMachiningParam( MCH_MP.DEPTH, dDepth)
|
||||||
-- se massimo affondamento utensile inferiore fessura, setto affondamento ed emetto warning
|
-- se massimo affondamento utensile inferiore fessura, setto affondamento ed emetto warning
|
||||||
@@ -253,12 +263,82 @@ local function MakeSplitByChainSaw( nSurfId, sSawing, nFaceUse, dDepth, sNotes,
|
|||||||
return true, sName, nMchFId
|
return true, sName, nMchFId
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
-- split per sezioni grandi con sega a catena o mix catena + lama
|
||||||
|
function ProcessSplit.MakeBigSectionSplitting( Proc, b3Raw, dOffset, SawingData, Cutting2Data)
|
||||||
|
local sNotes = ''
|
||||||
|
if SawingData.bSplit ~= nil then
|
||||||
|
sNotes = 'Precut;'
|
||||||
|
end
|
||||||
|
local bigSectionSplitType
|
||||||
|
-- se pezzo non troppo alto, taglio singolo da sopra
|
||||||
|
if b3Raw:getDimZ() + BD.CUT_EXTRA_MIN < SawingData.dChainSawMaxMat + 10 * GEO.EPS_SMALL then
|
||||||
|
bigSectionSplitType = "single horizontal"
|
||||||
|
-- se pezzo non troppo largo, taglio singolo da davanti
|
||||||
|
elseif b3Raw:getDimY() + BD.CUT_EXTRA_MIN < min( SawingData.dChainSawMaxMat, SawingData.dChainSawLen - BD.C_SIMM_ENC) + 10 * GEO.EPS_SMALL then
|
||||||
|
bigSectionSplitType = "single vertical"
|
||||||
|
-- se pezzo non troppo largo, tagli dai due fianchi (dietro e davanti)
|
||||||
|
elseif 0.5 * b3Raw:getDimY() + BD.CUT_EXTRA_MIN < min( SawingData.dChainSawMaxMat, SawingData.dChainSawLen - BD.C_SIMM_ENC) + 10 * GEO.EPS_SMALL then
|
||||||
|
bigSectionSplitType = "double vertical"
|
||||||
|
-- altrimenti taglio con sega a catena da sopra e con lama da sotto
|
||||||
|
elseif BD.DOWN_HEAD and ( b3Raw:getDimZ() + BD.CUT_EXTRA_MIN < Cutting2Data.dMaxDepth + SawingData.dChainSawMaxMat + 10 * GEO.EPS_SMALL) then
|
||||||
|
bigSectionSplitType = "double horizontal"
|
||||||
|
end
|
||||||
|
|
||||||
|
-- in base alle scelte precedenti, applico le lavorazioni
|
||||||
|
if bigSectionSplitType == "single horizontal" then
|
||||||
|
local dCutDepth = b3Raw:getDimZ() + BD.CUT_EXTRA_MIN
|
||||||
|
local sNotesSplit = EgtIf( SawingData.bSplit, 'Split;', sNotes)
|
||||||
|
-- verifico se sega a catena lunga e devo quindi estendere ingresso e uscita perchè è probabile che non riesca a ruotare sopra al pezzo
|
||||||
|
local bExtendStartEnd
|
||||||
|
local dMinLengthLongChainSaw = 630
|
||||||
|
if SawingData.dChainSawLen > dMinLengthLongChainSaw - 10 * GEO.EPS_SMALL then
|
||||||
|
bExtendStartEnd = true
|
||||||
|
end
|
||||||
|
local bOk, sErr = MakeCutByChainSaw( Proc.Id, SawingData.sSawing, MCH_MILL_FU.PARAL_TOP, dCutDepth, sNotesSplit, dOffset, bExtendStartEnd, SawingData.bInvert)
|
||||||
|
if not bOk then return bOk, sErr end
|
||||||
|
elseif bigSectionSplitType == "single vertical" then
|
||||||
|
local dCutDepth = b3Raw:getDimY() + BD.CUT_EXTRA_MIN
|
||||||
|
local sNotesSplit = EgtIf( SawingData.bSplit, 'Split;', sNotes)
|
||||||
|
local bOk, sErr = MakeCutByChainSaw( Proc.Id, SawingData.sSawing, MCH_MILL_FU.PARAL_FRONT, dCutDepth, sNotesSplit, dOffset, nil, SawingData.bInvert)
|
||||||
|
if not bOk then return bOk, sErr end
|
||||||
|
elseif bigSectionSplitType == "double vertical" then
|
||||||
|
local dCutDepth = 0.5 * b3Raw:getDimY() + BD.CUT_EXTRA_MIN
|
||||||
|
local sNotesSplit = EgtIf( SawingData.bSplit, 'Presplit;', sNotes)
|
||||||
|
local bOk, sErr = MakeCutByChainSaw( Proc.Id, SawingData.sSawing, MCH_MILL_FU.PARAL_BACK, dCutDepth, sNotesSplit, dOffset, nil, SawingData.bInvert)
|
||||||
|
if not bOk then return bOk, sErr end
|
||||||
|
sNotesSplit = EgtIf( SawingData.bSplit, 'Split;', sNotes)
|
||||||
|
bOk, sErr = MakeCutByChainSaw( Proc.Id, SawingData.sSawing, MCH_MILL_FU.PARAL_FRONT, dCutDepth, sNotesSplit, dOffset, nil, SawingData.bInvert)
|
||||||
|
if not bOk then return bOk, sErr end
|
||||||
|
elseif bigSectionSplitType == "double horizontal" then
|
||||||
|
-- sega a catena da sopra
|
||||||
|
local dChainSawCutDepth = b3Raw:getDimZ() + BD.CUT_EXTRA_MIN - Cutting2Data.dMaxDepth
|
||||||
|
local sNotesSplit = EgtIf( SawingData.bSplit, 'Presplit;', sNotes)
|
||||||
|
local bOk, sErr = MakeCutByChainSaw( Proc.Id, SawingData.sSawing, MCH_MILL_FU.PARAL_TOP, dChainSawCutDepth, sNotesSplit, dOffset, nil, SawingData.bInvert)
|
||||||
|
if not bOk then return bOk, sErr end
|
||||||
|
-- lama da sotto
|
||||||
|
local dCutExtra = -dChainSawCutDepth + BD.CUT_EXTRA_MIN
|
||||||
|
local dVzLimDwnUp
|
||||||
|
if BD.TURN then dVzLimDwnUp = -2 end
|
||||||
|
local sNotes = EgtIf( SawingData.bSplit, 'Split;', sNotes)
|
||||||
|
local bMaximizeVerticalDepth = true
|
||||||
|
bOk, sErr = Fbs.MakeOne( Proc.Id, 0, Cutting2Data.sCutting, Cutting2Data.dSawDiam, MCH_MILL_FU.ORTHO_TOP, dVzLimDwnUp, dCutExtra, BD.CUT_SIC, dOffset, 0, 0, sNotes, b3Raw, nil, bMaximizeVerticalDepth)
|
||||||
|
if not bOk then return false, sErr end
|
||||||
|
-- se è comunque troppo grande per essere separato, esco
|
||||||
|
else
|
||||||
|
local sErr = 'Error : section too big for splitting'
|
||||||
|
EgtOutLog( sErr)
|
||||||
|
return false, sErr, -1
|
||||||
|
end
|
||||||
|
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
-- tagli verticali aggiuntivi
|
-- tagli verticali aggiuntivi
|
||||||
local function AddVerticalPreCuts( Proc, sCutting, dCutXOffset, b3Raw, sNotes)
|
local function AddVerticalPreCuts( Proc, sCutting, dCutXOffset, b3Raw, sNotes)
|
||||||
local _, dimH = BL.GetFaceHvRefDim( Proc.Id, 0, b3Raw)
|
local nVerticalCuts = ceil( Proc.Face[1].WidthTrimmed / ( BD.MAX_LEN_DICE)) - 1
|
||||||
local nVerticalCuts = ceil( dimH / ( BD.MAX_LEN_DICE)) - 1
|
local dVerticalSliceHeight = Proc.Face[1].WidthTrimmed / ( nVerticalCuts + 1)
|
||||||
local dVerticalSliceHeight = dimH / ( nVerticalCuts + 1)
|
|
||||||
-- recupero il diametro dell'utensile
|
-- recupero il diametro dell'utensile
|
||||||
local dSawDiam = 400
|
local dSawDiam = 400
|
||||||
if EgtMdbSetCurrMachining( sCutting) then
|
if EgtMdbSetCurrMachining( sCutting) then
|
||||||
@@ -272,12 +352,212 @@ local function AddVerticalPreCuts( Proc, sCutting, dCutXOffset, b3Raw, sNotes)
|
|||||||
for j = nVerticalCuts, 1, -1 do
|
for j = nVerticalCuts, 1, -1 do
|
||||||
local nFaceUse = MCH_MILL_FU.PARAL_FRONT
|
local nFaceUse = MCH_MILL_FU.PARAL_FRONT
|
||||||
local dVerticalCutOffset = dVerticalSliceHeight * -j
|
local dVerticalCutOffset = dVerticalSliceHeight * -j
|
||||||
bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, nFaceUse, nil, -0.1 -dCutXOffset, BD.CUT_SIC, dVerticalCutOffset, 0, 0, sNotes, b3Raw)
|
local bForceTangentLeadInOut = BD.PRESS_ROLLER
|
||||||
|
bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, nFaceUse, nil, -0.1 -dCutXOffset, BD.CUT_SIC, dVerticalCutOffset, 0, 0, sNotes, b3Raw, nil, nil, nil, bForceTangentLeadInOut)
|
||||||
if not bOk then return bOk, sErr end
|
if not bOk then return bOk, sErr end
|
||||||
end
|
end
|
||||||
|
|
||||||
return bOk, sErr
|
return bOk, sErr
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
-- tagli standard
|
||||||
|
local function MakeStandardCuts( Proc, b3Raw, nCuts, dOffsetBetweenCuts, TailCutType, Cutting1Data, Cutting2Data, dStartOffset, dLenEndRaw)
|
||||||
|
if not TailCutType.sType then
|
||||||
|
TailCutType.sType = ''
|
||||||
|
end
|
||||||
|
local PrecutType = { bBigSectionCut = TailCutType.bBigSectionCut, bHorizCut = TailCutType.bHorizCut, bDoubleHorizCut = TailCutType.bDoubleHorizCut, bDoubleCut = TailCutType.bDoubleCut, bSplit = TailCutType.bSplit, sType = 'Precut', bNeedVerticalAddedCuts = false, bNeedHorizontalAddedCuts = false}
|
||||||
|
if not TailCutType.bDoubleHorizCut then
|
||||||
|
-- flag di lavorazione faccia
|
||||||
|
local nOrthoOpposite = EgtIf( TailCutType.bHorizCut, MCH_MILL_FU.ORTHO_DOWN, MCH_MILL_FU.ORTHO_BACK)
|
||||||
|
-- calcolo extra taglio ed accorciamento
|
||||||
|
local dCutExtra = 0
|
||||||
|
local dAccStart = 0
|
||||||
|
local dAccEnd = 0
|
||||||
|
if TailCutType.bBigSectionCut and BD.C_SIMM then
|
||||||
|
-- qui arrivano sezioni molto grandi su macchine tipo PF con materiale da asportare inferiore allo spessore lama
|
||||||
|
local dSawRad = Cutting1Data.dSawDiam / 2
|
||||||
|
dCutExtra = - ( b3Raw:getDimY() - dSawRad)
|
||||||
|
dAccEnd = dSawRad
|
||||||
|
elseif b3Raw:getDimZ() < BD.MIN_DIM_HBEAM + 10 * GEO.EPS_SMALL or b3Raw:getDimY() < 2 * BD.MAX_DIM_HTCUT_HBEAM + 10 * GEO.EPS_SMALL then
|
||||||
|
dCutExtra = EgtIf( TailCutType.bDoubleCut, - 0.5 * b3Raw:getDimY() + BD.CUT_EXTRA_MIN, BD.CUT_EXTRA)
|
||||||
|
else
|
||||||
|
dCutExtra = - ( b3Raw:getDimY() - Cutting1Data.dMaxDepth)
|
||||||
|
local dSawRad = Cutting1Data.dSawDiam / 2
|
||||||
|
-- distanza in Y tra il centro della lama e l'intersezione tra la lama stessa e la massima Z della trave, + extra
|
||||||
|
-- se taglio doppio l'intersezione sarà in mezzeria, se taglio singolo sarà all'estremo opposto della trave
|
||||||
|
local dKL = dSawRad - Cutting1Data.dMaxDepth + EgtIf( TailCutType.bDoubleCut, b3Raw:getDimY() / 2 + BD.CUT_EXTRA_MIN, b3Raw:getDimY() + BD.CUT_EXTRA)
|
||||||
|
-- lunghezza minima del percorso di lavorazione, in caso accorciamento porti a lunghezza negativa
|
||||||
|
local dMinSawingLength = 5
|
||||||
|
if BD.C_SIMM then
|
||||||
|
dAccEnd = sqrt( max( dSawRad * dSawRad - dKL * dKL, 0))
|
||||||
|
-- non posso comunque accorciare più della dimensione della geometria, quindi in caso allungo entrata
|
||||||
|
if dAccEnd > b3Raw:getDimZ() - 100 * GEO.EPS_SMALL then
|
||||||
|
dAccStart = b3Raw:getDimZ() - dAccEnd - dMinSawingLength
|
||||||
|
end
|
||||||
|
else
|
||||||
|
dAccStart = sqrt( max( dSawRad * dSawRad - dKL * dKL, 0))
|
||||||
|
-- non posso comunque accorciare più della dimensione della geometria, quindi in caso allungo uscita
|
||||||
|
if dAccStart > b3Raw:getDimZ() - 100 * GEO.EPS_SMALL then
|
||||||
|
dAccEnd = b3Raw:getDimZ() - dAccStart - dMinSawingLength
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- per travi alte faccio faccio dei tagli orizzontali aggiuntivi
|
||||||
|
if TailCutType.bNeedHorizontalAddedCuts then
|
||||||
|
-- taglio a zero (con lama) per evitare problemi con grezzo più lungo del previsto. Se BigSection il pretaglio è già stato fatto.
|
||||||
|
if not TailCutType.bBigSectionCut and BD.PRECUT_TAIL then
|
||||||
|
dStartOffset = dLenEndRaw
|
||||||
|
local bOkPrecut, sErrPrecut = MakeStandardCuts( Proc, b3Raw, 1, 0, PrecutType, Cutting1Data, Cutting2Data, dStartOffset)
|
||||||
|
if not bOkPrecut then
|
||||||
|
return false, sErrPrecut
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local nHorizontalCuts = ceil ( Proc.Face[1].HeightTrimmed / BD.MAX_DIM_DICE) - 1
|
||||||
|
local dHorizontalSliceHeight = Proc.Face[1].HeightTrimmed / ( nHorizontalCuts + 1)
|
||||||
|
for i = nCuts, 1, -1 do
|
||||||
|
local dCutXOffset = ( i - 1) * dOffsetBetweenCuts
|
||||||
|
-- tagli orizzontali
|
||||||
|
for j = nHorizontalCuts, 1, -1 do
|
||||||
|
local nFaceUse = MCH_MILL_FU.PARAL_DOWN
|
||||||
|
local dHorizontalCutOffset = dHorizontalSliceHeight * -j
|
||||||
|
local bForceTangentLeadInOut = BD.PRESS_ROLLER
|
||||||
|
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0 , Cutting1Data.sCutting, Cutting1Data.dSawDiam, nFaceUse, nil, -0.1 - dCutXOffset, BD.CUT_SIC, dHorizontalCutOffset, 0, 0, 'Precut;', b3Raw, nil, nil, nil, bForceTangentLeadInOut)
|
||||||
|
if not bOk then return false, sErr end
|
||||||
|
end
|
||||||
|
-- se necessario taglio verticale doppio, eseguo l'opposto
|
||||||
|
if TailCutType.bDoubleCut then
|
||||||
|
-- gli accorciamenti vanno invertiti per il taglio opposto
|
||||||
|
local dAccStartDoubleCut, dAccEndDoubleCut = dAccEnd, dAccStart
|
||||||
|
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, Cutting1Data.sCutting, Cutting1Data.dSawDiam, MCH_MILL_FU.ORTHO_FRONT, nil, dCutExtra, BD.CUT_SIC, dCutXOffset, dAccStartDoubleCut, dAccEndDoubleCut, 'Precut;', b3Raw, true)
|
||||||
|
if not bOk then return false, sErr end
|
||||||
|
end
|
||||||
|
-- taglio verticale
|
||||||
|
local sInfo = 'Precut'
|
||||||
|
if i == 1 and TailCutType.sType ~= 'Precut' then
|
||||||
|
sInfo = 'Cut'
|
||||||
|
end
|
||||||
|
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, Cutting1Data.sCutting, Cutting1Data.dSawDiam, nOrthoOpposite, nil, dCutExtra, BD.CUT_SIC, dCutXOffset, dAccStart, dAccEnd, sInfo, b3Raw, true)
|
||||||
|
if not bOk then return false, sErr end
|
||||||
|
end
|
||||||
|
return true, sWarn
|
||||||
|
end
|
||||||
|
|
||||||
|
-- taglio a zero (con lama) per evitare problemi con grezzo più lungo del previsto. Se BigSection il pretaglio è già stato fatto.
|
||||||
|
if not TailCutType.bBigSectionCut and BD.PRECUT_TAIL and TailCutType.bNeedVerticalAddedCuts then
|
||||||
|
dStartOffset = dLenEndRaw
|
||||||
|
local bOkPrecut, sErrPrecut = MakeStandardCuts( Proc, b3Raw, 1, 0, PrecutType, Cutting1Data, Cutting2Data, dStartOffset)
|
||||||
|
if not bOkPrecut then
|
||||||
|
return false, sErrPrecut
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- se necessari tagli in doppio, eseguo gli opposti
|
||||||
|
if TailCutType.bDoubleCut then
|
||||||
|
-- gli accorciamenti vanno invertiti per il taglio opposto
|
||||||
|
local dAccStartDoubleCut, dAccEndDoubleCut = dAccEnd, dAccStart
|
||||||
|
for i = nCuts, 1, -1 do
|
||||||
|
local dCutOffset = ( i - 1) * dOffsetBetweenCuts
|
||||||
|
if i == 1 and TailCutType.sType =='Precut' then
|
||||||
|
dCutOffset = dStartOffset
|
||||||
|
end
|
||||||
|
local sNotes = EgtIf( TailCutType.bSplit, 'Presplit;', 'Precut;')
|
||||||
|
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, Cutting1Data.sCutting, Cutting1Data.dSawDiam, MCH_MILL_FU.ORTHO_FRONT, nil, dCutExtra, BD.CUT_SIC, dCutOffset, dAccStartDoubleCut, dAccEndDoubleCut, sNotes, b3Raw, true)
|
||||||
|
if not bOk then return false, sErr end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- eseguo i tagli necessari
|
||||||
|
for i = nCuts, 1, -1 do
|
||||||
|
local dCutOffset = ( i - 1) * dOffsetBetweenCuts
|
||||||
|
-- se trave larga effettuo tagli verticali aggiuntivi
|
||||||
|
if TailCutType.bNeedVerticalAddedCuts then
|
||||||
|
local sSpecNotes = EgtIf( TailCutType.bSplit, 'Presplit;', 'Precut;')
|
||||||
|
local bOk, sErr = AddVerticalPreCuts( Proc, Cutting1Data.sCutting, dCutOffset, b3Raw, sSpecNotes)
|
||||||
|
if not bOk then return bOk, sErr end
|
||||||
|
end
|
||||||
|
if i == 1 and TailCutType.sType =='Precut' then
|
||||||
|
dCutOffset = dStartOffset
|
||||||
|
end
|
||||||
|
local sNotes
|
||||||
|
if TailCutType.bSplit then
|
||||||
|
sNotes = EgtIf( i == 1, 'Split;', 'Presplit;')
|
||||||
|
else
|
||||||
|
sNotes = EgtIf( i == 1 and TailCutType.sType ~= 'Precut', 'Cut;', 'Precut;')
|
||||||
|
end
|
||||||
|
-- se primo taglio da sopra e PF o ONE richiedo risalita preliminare a Zmax
|
||||||
|
if i == nCuts and TailCutType.bHorizCut and BD.C_SIMM and not BD.DOWN_HEAD then
|
||||||
|
sNotes = EgtSetValInNotes( sNotes, 'StartZmax', 2)
|
||||||
|
end
|
||||||
|
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, Cutting1Data.sCutting, Cutting1Data.dSawDiam, nOrthoOpposite, nil, dCutExtra, BD.CUT_SIC, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw, true)
|
||||||
|
if not bOk then return false, sErr end
|
||||||
|
end
|
||||||
|
-- altrimenti necessari tagli da sopra e sotto con testa opportuna
|
||||||
|
else
|
||||||
|
-- verifico esistenza della lavorazione con lama da sotto
|
||||||
|
if not Cutting2Data.sCutting then
|
||||||
|
local sErr = 'Error : cutting H2 not found in library'
|
||||||
|
EgtOutLog( sErr)
|
||||||
|
return false, sErr
|
||||||
|
end
|
||||||
|
-- verifico che le due lame riescano a lavorare la sezione
|
||||||
|
local dDimZ = b3Raw:getDimZ()
|
||||||
|
local dExtra = Cutting1Data.dMaxVertDepth + Cutting2Data.dMaxDepth - dDimZ
|
||||||
|
if ( dExtra - 2 * BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL < 0) and not TailCutType.bBigSectionCut then
|
||||||
|
local sErr = 'Error : section too big for tail cut'
|
||||||
|
EgtOutLog( sErr)
|
||||||
|
return false, sErr
|
||||||
|
end
|
||||||
|
-- calcolo extra taglio ed accorciamento
|
||||||
|
local dCutExtra = -Cutting2Data.dMaxDepth + dExtra / 2 + BD.CUT_EXTRA_MIN
|
||||||
|
local dCutExtra2 = -Cutting1Data.dMaxVertDepth + dExtra / 2 + BD.CUT_EXTRA_MIN
|
||||||
|
local dAccStart = 0
|
||||||
|
-- limiti da sotto
|
||||||
|
local dVzLimDwnUp
|
||||||
|
if BD.TURN then dVzLimDwnUp = -2 end
|
||||||
|
-- taglio a zero (con lama) per evitare problemi con grezzo più lungo del previsto. Se BigSection il pretaglio è già stato fatto.
|
||||||
|
if not TailCutType.bBigSectionCut and BD.PRECUT_TAIL and TailCutType.bNeedVerticalAddedCuts then
|
||||||
|
dStartOffset = dLenEndRaw
|
||||||
|
local bOkPrecut, sErrPrecut = MakeStandardCuts( Proc, b3Raw, 1, 0, PrecutType, Cutting1Data, Cutting2Data, dStartOffset)
|
||||||
|
if not bOkPrecut then
|
||||||
|
return false, sErrPrecut
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- eseguo i tagli da sotto necessari
|
||||||
|
for i = nCuts, 1, -1 do
|
||||||
|
local dCutOffset = ( i - 1) * dOffsetBetweenCuts
|
||||||
|
if i == 1 and TailCutType.sType =='Precut' then
|
||||||
|
dCutOffset = dStartOffset
|
||||||
|
end
|
||||||
|
local sNotes = EgtIf( TailCutType.bSplit, 'Presplit;', 'Precut;')
|
||||||
|
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, Cutting2Data.sCutting, Cutting2Data.dSawDiam, MCH_MILL_FU.ORTHO_TOP, dVzLimDwnUp, dCutExtra2, BD.CUT_SIC, dCutOffset, dAccStart, 0, sNotes, b3Raw, nil, true)
|
||||||
|
if not bOk then return false, sErr end
|
||||||
|
end
|
||||||
|
-- eseguo i tagli da sopra necessari
|
||||||
|
for i = nCuts, 1, -1 do
|
||||||
|
local dCutOffset = ( i - 1) * dOffsetBetweenCuts
|
||||||
|
if i == 1 and TailCutType.sType =='Precut' then
|
||||||
|
dCutOffset = dStartOffset
|
||||||
|
end
|
||||||
|
-- se trave larga effettuo tagli verticali aggiuntivi
|
||||||
|
if TailCutType.bNeedVerticalAddedCuts then
|
||||||
|
local sSpecNotes = EgtIf( TailCutType.bSplit, 'Presplit;', 'Precut;')
|
||||||
|
local bOk, sErr = AddVerticalPreCuts( Proc, Cutting1Data.sCutting, dCutOffset, b3Raw, sSpecNotes)
|
||||||
|
if not bOk then return bOk, sErr end
|
||||||
|
end
|
||||||
|
local sNotes
|
||||||
|
if TailCutType.bSplit then
|
||||||
|
sNotes = EgtIf( i == 1, 'Split;', 'Presplit;')
|
||||||
|
else
|
||||||
|
sNotes = EgtIf( i == 1 and TailCutType.sType ~= 'Precut', 'Cut;', 'Precut;')
|
||||||
|
end
|
||||||
|
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, Cutting1Data.sCutting, Cutting1Data.dSawDiam, MCH_MILL_FU.ORTHO_DOWN, dVzLimDwnUp, dCutExtra, BD.CUT_SIC, dCutOffset, dAccStart, 0, sNotes, b3Raw)
|
||||||
|
if not bOk then return false, sErr end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
-- Applicazione della lavorazione
|
-- Applicazione della lavorazione
|
||||||
function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrStd, bPreMove, vtMove, dOvmTail)
|
function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrStd, bPreMove, vtMove, dOvmTail)
|
||||||
@@ -289,7 +569,7 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrSt
|
|||||||
-- inserimento smussi
|
-- inserimento smussi
|
||||||
local nOriId = EgtGetInfo( Proc.Id, 'ORI', 'i')
|
local nOriId = EgtGetInfo( Proc.Id, 'ORI', 'i')
|
||||||
if nOriId then
|
if nOriId then
|
||||||
local bOkc, sErrC = MakeChamfer( nOriId, Proc, nPhase, nRawId, nPartId, dOvmHead)
|
local bOkc, sErrC = MakeChamfer( nOriId, Proc, nPhase, nRawId, nPartId, dOvmTail)
|
||||||
if not bOkc then return bOkc, sErrC end
|
if not bOkc then return bOkc, sErrC end
|
||||||
end
|
end
|
||||||
-- recupero la lavorazione
|
-- recupero la lavorazione
|
||||||
@@ -326,6 +606,20 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrSt
|
|||||||
dSawThick2 = EgtTdbGetCurrToolParam(MCH_TP.THICK) or dSawThick2
|
dSawThick2 = EgtTdbGetCurrToolParam(MCH_TP.THICK) or dSawThick2
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
-- recupero dati utensile della sega a catena più lunga a disposizione
|
||||||
|
local sSawing = ML.FindSawing( 'SawingForSplitting', nil, nil, 'Longest')
|
||||||
|
if not sSawing then
|
||||||
|
sSawing = ML.FindSawing( 'Sawing', nil, nil, 'Longest')
|
||||||
|
end
|
||||||
|
local dChainSawMaxMat = 0
|
||||||
|
local dChainSawLen = 0
|
||||||
|
if EgtMdbSetCurrMachining( sSawing or '') then
|
||||||
|
local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID)
|
||||||
|
if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then
|
||||||
|
dChainSawMaxMat = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT) or dChainSawMaxMat
|
||||||
|
dChainSawLen = EgtTdbGetCurrToolParam( MCH_TP.LEN) or dChainSawLen
|
||||||
|
end
|
||||||
|
end
|
||||||
-- caratteristiche taglio
|
-- caratteristiche taglio
|
||||||
local dDimYRef = EgtIf( b3Raw:getDimZ() < BD.MIN_DIM_HBEAM + 10 * GEO.EPS_SMALL, dSawMaxDepth, abs( BD.MAX_DIM_HTCUT_HBEAM))
|
local dDimYRef = EgtIf( b3Raw:getDimZ() < BD.MIN_DIM_HBEAM + 10 * GEO.EPS_SMALL, dSawMaxDepth, abs( BD.MAX_DIM_HTCUT_HBEAM))
|
||||||
local bBigSectionCut = ( b3Raw:getDimY() > 2 * dDimYRef - BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL) and
|
local bBigSectionCut = ( b3Raw:getDimY() > 2 * dDimYRef - BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL) and
|
||||||
@@ -335,8 +629,6 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrSt
|
|||||||
local bDoubleCut = ( not bHorizCut and not bDoubleHorizCut and b3Raw:getDimY() > dDimYRef - BD.CUT_EXTRA + 10 * GEO.EPS_SMALL)
|
local bDoubleCut = ( not bHorizCut and not bDoubleHorizCut and b3Raw:getDimY() > dDimYRef - BD.CUT_EXTRA + 10 * GEO.EPS_SMALL)
|
||||||
-- dati geometrici del taglio
|
-- dati geometrici del taglio
|
||||||
local ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, 0, GDB_ID.ROOT)
|
local ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, 0, GDB_ID.ROOT)
|
||||||
-- flag di lavorazione faccia
|
|
||||||
local nOrthoOpposite = EgtIf( bHorizCut, MCH_MILL_FU.ORTHO_DOWN, MCH_MILL_FU.ORTHO_BACK)
|
|
||||||
-- separazione solo se esiste grezzo successivo con pezzi o scaricabile
|
-- separazione solo se esiste grezzo successivo con pezzi o scaricabile
|
||||||
local nNextRawId = EgtGetNextRawPart( nRawId)
|
local nNextRawId = EgtGetNextRawPart( nRawId)
|
||||||
local bSplit = ( nNextRawId and ( EgtGetPartInRawPartCount( nNextRawId) > 0 or EgtGetRawPartBBox( nNextRawId):getDimX() >= BD.MinRaw))
|
local bSplit = ( nNextRawId and ( EgtGetPartInRawPartCount( nNextRawId) > 0 or EgtGetRawPartBBox( nNextRawId):getDimX() >= BD.MinRaw))
|
||||||
@@ -344,8 +636,6 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrSt
|
|||||||
local dLenEndRaw = dOvmTail
|
local dLenEndRaw = dOvmTail
|
||||||
local nCuts = 1
|
local nCuts = 1
|
||||||
local dOffsL = 0
|
local dOffsL = 0
|
||||||
local _, dimH, dimV = BL.GetFaceHvRefDim( Proc.Id, 0, b3Raw)
|
|
||||||
local dMinTailScrapForAdditionalCuts = 10.123
|
|
||||||
if not bSplit then
|
if not bSplit then
|
||||||
-- cerco grezzo successivo che sia nella fase
|
-- cerco grezzo successivo che sia nella fase
|
||||||
if nNextRawId and EgtVerifyRawPartPhase( nNextRawId, nPhase) then
|
if nNextRawId and EgtVerifyRawPartPhase( nNextRawId, nPhase) then
|
||||||
@@ -355,94 +645,38 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrSt
|
|||||||
dOffsL = dLenEndRaw / nCuts
|
dOffsL = dLenEndRaw / nCuts
|
||||||
-- aggiorno ingombro del grezzo corrente con quello del successivo
|
-- aggiorno ingombro del grezzo corrente con quello del successivo
|
||||||
b3Raw:Add( b3NextRaw)
|
b3Raw:Add( b3NextRaw)
|
||||||
|
else
|
||||||
|
dLenEndRaw = min( dOvmTail, abs( ptC:getX() - b3Raw:getMin():getX()))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
-- determino la necessità di tagli aggiuntivi
|
||||||
|
local dMinTailScrapForAdditionalCuts = 10.123
|
||||||
|
local bNeedVerticalAddedCuts = not bSplit and ( Proc.Face[1].WidthTrimmed > BD.MAX_LEN_DICE) and ( dLenEndRaw > dMinTailScrapForAdditionalCuts - 10 * GEO.EPS_SMALL)
|
||||||
|
local bNeedHorizontalAddedCuts = not bSplit and ( Proc.Face[1].HeightTrimmed > ( BD.MIN_HEIGHT_ADDED_CUTS or BD.MAX_LEN_DICE)) and not bBigSectionCut and ( dLenEndRaw > dMinTailScrapForAdditionalCuts - 10 * GEO.EPS_SMALL)
|
||||||
|
-- dati lavorazioni sopra e sotto
|
||||||
|
local Cutting1Data = { sCutting = sCutting, dSawDiam = dSawDiam, dMaxDepth = dSawMaxDepth, dSawThick = dSawThick, dMaxVertDepth = dMaxVertDepth}
|
||||||
|
local Cutting2Data = { sCutting = sCutting2, dSawDiam = dSawDiam2, dMaxDepth = dSawMaxDepth2, dSawThick = dSawThick2}
|
||||||
|
local SawingData = { sSawing = sSawing, dChainSawMaxMat = dChainSawMaxMat, dChainSawLen = dChainSawLen, bSplit = bSplit or false}
|
||||||
|
-- dati sul taglio di coda da effettuare
|
||||||
|
local TailCutType = { bBigSectionCut = bBigSectionCut, bHorizCut = bHorizCut, bDoubleHorizCut = bDoubleHorizCut, bDoubleCut = bDoubleCut, bSplit = bSplit, bNeedVerticalAddedCuts = bNeedVerticalAddedCuts, bNeedHorizontalAddedCuts = bNeedHorizontalAddedCuts}
|
||||||
-- se taglio per pezzi alti e larghi
|
-- se taglio per pezzi alti e larghi
|
||||||
local nNewPhase = 0
|
local nNewPhase = 0
|
||||||
if bBigSectionCut then
|
if bBigSectionCut then
|
||||||
local bFinishingNeeded = false
|
local bFinishingNeeded = false
|
||||||
if bSplit then
|
if bSplit then
|
||||||
-- recupero dati utensile della sega a catena più lunga a disposizione
|
-- assegno offset in lunghezza
|
||||||
local sSawing = ML.FindSawing( 'SawingForSplitting', nil, nil, 'Longest')
|
local dTailOffset = 0
|
||||||
if not sSawing then
|
|
||||||
sSawing = ML.FindSawing( 'Sawing', nil, nil, 'Longest')
|
|
||||||
end
|
|
||||||
local dChainSawMaxMat = 0
|
|
||||||
local dChainSawLen = 0
|
|
||||||
if EgtMdbSetCurrMachining( sSawing or '') then
|
|
||||||
local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID)
|
|
||||||
if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then
|
|
||||||
dChainSawMaxMat = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT) or dChainSawMaxMat
|
|
||||||
dChainSawLen = EgtTdbGetCurrToolParam( MCH_TP.LEN) or dChainSawLen
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local bigSectionSplitType
|
|
||||||
-- se pezzo non troppo alto, taglio singolo da sopra
|
|
||||||
if b3Raw:getDimZ() + BD.CUT_EXTRA_MIN < dChainSawMaxMat + 10 * GEO.EPS_SMALL then
|
|
||||||
bigSectionSplitType = "single horizontal"
|
|
||||||
-- se pezzo non troppo largo, taglio singolo da davanti
|
|
||||||
elseif b3Raw:getDimY() + BD.CUT_EXTRA_MIN < min( dChainSawMaxMat, dChainSawLen - BD.C_SIMM_ENC) + 10 * GEO.EPS_SMALL then
|
|
||||||
bigSectionSplitType = "single vertical"
|
|
||||||
-- se pezzo non troppo largo, tagli dai due fianchi (dietro e davanti)
|
|
||||||
elseif 0.5 * b3Raw:getDimY() + BD.CUT_EXTRA_MIN < min( dChainSawMaxMat, dChainSawLen - BD.C_SIMM_ENC) + 10 * GEO.EPS_SMALL then
|
|
||||||
bigSectionSplitType = "double vertical"
|
|
||||||
-- altrimenti taglio con sega a catena da sopra e con lama da sotto
|
|
||||||
elseif BD.DOWN_HEAD and ( b3Raw:getDimZ() + BD.CUT_EXTRA_MIN < dSawMaxDepth2 + dChainSawMaxMat + 10 * GEO.EPS_SMALL) then
|
|
||||||
bigSectionSplitType = "double horizontal"
|
|
||||||
end
|
|
||||||
|
|
||||||
-- assegno offset in lunghezza
|
|
||||||
local dOffs = 0
|
|
||||||
if dOvmTail > BD.OVM_CHAIN_HBEAM then
|
if dOvmTail > BD.OVM_CHAIN_HBEAM then
|
||||||
dOffs = dOvmTail - BD.OVM_CHAIN_HBEAM
|
dTailOffset = dOvmTail - BD.OVM_CHAIN_HBEAM
|
||||||
bFinishingNeeded = true
|
bFinishingNeeded = true
|
||||||
end
|
end
|
||||||
|
-- split per grande sezione
|
||||||
-- in base alle scelte precedenti, applico le lavorazioni
|
local bOk, sErr, nNewPhase2 = ProcessSplit.MakeBigSectionSplitting( Proc, b3Raw, dTailOffset, SawingData, Cutting2Data)
|
||||||
if bigSectionSplitType == "single horizontal" then
|
if nNewPhase2 then
|
||||||
local dCutDepth = b3Raw:getDimZ() + BD.CUT_EXTRA_MIN
|
nNewPhase = nNewPhase2
|
||||||
local sNotesSplit = 'Split;'
|
end
|
||||||
-- verifico se sega a catena lunga e devo quindi estendere ingresso e uscita perchè è probabile che non riesca a ruotare sopra al pezzo
|
if not bOk then
|
||||||
local bExtendStartEnd
|
return bOk, sErr, nNewPhase
|
||||||
local dMinLengthLongChainSaw = 630
|
|
||||||
if dChainSawLen > dMinLengthLongChainSaw - 10 * GEO.EPS_SMALL then
|
|
||||||
bExtendStartEnd = true
|
|
||||||
end
|
|
||||||
local bOk, sErr = MakeSplitByChainSaw( Proc.Id, sSawing, MCH_MILL_FU.PARAL_TOP, dCutDepth, sNotesSplit, dOffs, bExtendStartEnd)
|
|
||||||
if not bOk then return bOk, sErr, nNewPhase end
|
|
||||||
elseif bigSectionSplitType == "single vertical" then
|
|
||||||
local dCutDepth = b3Raw:getDimY() + BD.CUT_EXTRA_MIN
|
|
||||||
local sNotesSplit = 'Split;'
|
|
||||||
local bOk, sErr = MakeSplitByChainSaw( Proc.Id, sSawing, MCH_MILL_FU.PARAL_FRONT, dCutDepth, sNotesSplit, dOffs)
|
|
||||||
if not bOk then return bOk, sErr, nNewPhase end
|
|
||||||
elseif bigSectionSplitType == "double vertical" then
|
|
||||||
local dCutDepth = 0.5 * b3Raw:getDimY() + BD.CUT_EXTRA_MIN
|
|
||||||
local sNotesSplit = 'Presplit;'
|
|
||||||
local bOk, sErr = MakeSplitByChainSaw( Proc.Id, sSawing, MCH_MILL_FU.PARAL_BACK, dCutDepth, sNotesSplit, dOffs)
|
|
||||||
if not bOk then return bOk, sErr, nNewPhase end
|
|
||||||
sNotesSplit = 'Split;'
|
|
||||||
bOk, sErr = MakeSplitByChainSaw( Proc.Id, sSawing, MCH_MILL_FU.PARAL_FRONT, dCutDepth, sNotesSplit, dOffs)
|
|
||||||
if not bOk then return bOk, sErr, nNewPhase end
|
|
||||||
elseif bigSectionSplitType == "double horizontal" then
|
|
||||||
-- sega a catena da sopra
|
|
||||||
local dChainSawCutDepth = b3Raw:getDimZ() + BD.CUT_EXTRA_MIN - dSawMaxDepth2
|
|
||||||
local sNotesSplit = 'Presplit;'
|
|
||||||
local bOk, sErr = MakeSplitByChainSaw( Proc.Id, sSawing, MCH_MILL_FU.PARAL_TOP, dChainSawCutDepth, sNotesSplit, dOffs)
|
|
||||||
if not bOk then return bOk, sErr, nNewPhase end
|
|
||||||
-- lama da sotto
|
|
||||||
local dCutExtra = -dChainSawCutDepth + BD.CUT_EXTRA_MIN
|
|
||||||
local dVzLimDwnUp
|
|
||||||
if BD.TURN then dVzLimDwnUp = -2 end
|
|
||||||
local sNotes = 'Split;'
|
|
||||||
local bMaximizeVerticalDepth = true
|
|
||||||
bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting2, dSawDiam2, MCH_MILL_FU.ORTHO_TOP, dVzLimDwnUp, dCutExtra, BD.CUT_SIC, dOffs, 0, 0, sNotes, b3Raw, nil, bMaximizeVerticalDepth)
|
|
||||||
if not bOk then return false, sErr end
|
|
||||||
-- se è comunque troppo grande per essere separato, esco
|
|
||||||
else
|
|
||||||
local sErr = 'Error : section too big for splitting'
|
|
||||||
EgtOutLog( sErr)
|
|
||||||
return false, sErr, -1
|
|
||||||
end
|
end
|
||||||
-- se necessaria finitura, creo nuova fase
|
-- se necessaria finitura, creo nuova fase
|
||||||
if bFinishingNeeded then
|
if bFinishingNeeded then
|
||||||
@@ -490,12 +724,20 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrSt
|
|||||||
else
|
else
|
||||||
dMaxElev = Proc.Box:getMax():getX() - b3Raw:getMin():getX()
|
dMaxElev = Proc.Box:getMax():getX() - b3Raw:getMin():getX()
|
||||||
end
|
end
|
||||||
|
-- taglio a zero (con sega a catena o mix catena + lama) per evitare problemi con grezzo più lungo del previsto
|
||||||
|
if BD.PRECUT_TAIL and not bSplit then
|
||||||
|
local dTailOffset = dLenEndRaw
|
||||||
|
local bOkPrecut, sErrPrecut = ProcessSplit.MakeBigSectionSplitting( Proc, b3Raw, dTailOffset, SawingData, Cutting2Data)
|
||||||
|
if not bOkPrecut then
|
||||||
|
return false, sErrPrecut
|
||||||
|
end
|
||||||
|
end
|
||||||
-- se finitura con lama
|
-- se finitura con lama
|
||||||
if nQ05 < 2 or ( not bSplit and dMaxElev > dSawThickCheck) then
|
if nQ05 < 2 or ( not bSplit and dMaxElev > dSawThickCheck) then
|
||||||
-- controllo se è necessario un taglio con dicing o si deve proseguire ai casi standard
|
-- controllo se è necessario un taglio con dicing o si deve proseguire ai casi standard
|
||||||
if bSplit or dMaxElev > dSawThickCheck then
|
if bSplit or dMaxElev > dSawThickCheck then
|
||||||
local bOk, sErr
|
local bOk, sErr
|
||||||
if not bSplit and ( dimH > BD.MAX_LEN_DICE) and ( dLenEndRaw > dMinTailScrapForAdditionalCuts - 10 * GEO.EPS_SMALL) then
|
if bNeedVerticalAddedCuts then
|
||||||
-- ad ogni offset di taglio dovrò fare prima i tagli verticali e poi i cubetti
|
-- ad ogni offset di taglio dovrò fare prima i tagli verticali e poi i cubetti
|
||||||
for i = nCuts, 1, -1 do
|
for i = nCuts, 1, -1 do
|
||||||
local nAddGrpId = BL.GetAddGroup( Proc.PartId)
|
local nAddGrpId = BL.GetAddGroup( Proc.PartId)
|
||||||
@@ -560,156 +802,11 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrSt
|
|||||||
return true, nil, nNewPhase
|
return true, nil, nNewPhase
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- se tagli standard
|
|
||||||
if not bDoubleHorizCut then
|
|
||||||
-- calcolo extra taglio ed accorciamento
|
|
||||||
local dCutExtra = 0
|
|
||||||
local dAccStart = 0
|
|
||||||
local dAccEnd = 0
|
|
||||||
if bBigSectionCut and BD.C_SIMM then
|
|
||||||
-- qui arrivano sezioni molto grandi su macchine tipo PF con materiale da asportare inferiore allo spessore lama
|
|
||||||
local dSawRad = dSawDiam / 2
|
|
||||||
dCutExtra = - ( b3Raw:getDimY() - dSawRad)
|
|
||||||
dAccEnd = dSawRad
|
|
||||||
elseif b3Raw:getDimZ() < BD.MIN_DIM_HBEAM + 10 * GEO.EPS_SMALL or b3Raw:getDimY() < 2 * BD.MAX_DIM_HTCUT_HBEAM + 10 * GEO.EPS_SMALL then
|
|
||||||
dCutExtra = EgtIf( bDoubleCut, - 0.5 * b3Raw:getDimY() + BD.CUT_EXTRA_MIN, BD.CUT_EXTRA)
|
|
||||||
else
|
|
||||||
dCutExtra = - ( b3Raw:getDimY() - dSawMaxDepth)
|
|
||||||
local dSawRad = dSawDiam / 2
|
|
||||||
-- distanza in Y tra il centro della lama e l'intersezione tra la lama stessa e la massima Z della trave, + extra
|
|
||||||
-- se taglio doppio l'intersezione sarà in mezzeria, se taglio singolo sarà all'estremo opposto della trave
|
|
||||||
local dKL = dSawRad - dSawMaxDepth + EgtIf( bDoubleCut, b3Raw:getDimY() / 2 + BD.CUT_EXTRA_MIN, b3Raw:getDimY() + BD.CUT_EXTRA)
|
|
||||||
-- lunghezza minima del percorso di lavorazione, in caso accorciamento porti a lunghezza negativa
|
|
||||||
local dMinSawingLength = 5
|
|
||||||
if BD.C_SIMM then
|
|
||||||
dAccEnd = sqrt( max( dSawRad * dSawRad - dKL * dKL, 0))
|
|
||||||
-- non posso comunque accorciare più della dimensione della geometria, quindi in caso allungo entrata
|
|
||||||
if dAccEnd > b3Raw:getDimZ() - 100 * GEO.EPS_SMALL then
|
|
||||||
dAccStart = b3Raw:getDimZ() - dAccEnd - dMinSawingLength
|
|
||||||
end
|
|
||||||
else
|
|
||||||
dAccStart = sqrt( max( dSawRad * dSawRad - dKL * dKL, 0))
|
|
||||||
-- non posso comunque accorciare più della dimensione della geometria, quindi in caso allungo uscita
|
|
||||||
if dAccStart > b3Raw:getDimZ() - 100 * GEO.EPS_SMALL then
|
|
||||||
dAccEnd = b3Raw:getDimZ() - dAccStart - dMinSawingLength
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- per travi alte faccio faccio dei tagli orizzontali aggiuntivi
|
local bOk, sErr = MakeStandardCuts( Proc, b3Raw, nCuts, dOffsL, TailCutType, Cutting1Data, Cutting2Data, nil, dLenEndRaw)
|
||||||
local bAreHorizontalCutsNeeded = not bSplit and ( dimV > BD.MAX_LEN_DICE) and not bBigSectionCut and ( dLenEndRaw > dMinTailScrapForAdditionalCuts - 10 * GEO.EPS_SMALL)
|
|
||||||
if bAreHorizontalCutsNeeded then
|
|
||||||
local nHorizontalCuts = ceil ( dimV / BD.MAX_DIM_DICE) - 1
|
|
||||||
local dHorizontalSliceHeight = dimV / ( nHorizontalCuts + 1)
|
|
||||||
for i = nCuts, 1, -1 do
|
|
||||||
local dCutXOffset = ( i - 1) * dOffsL
|
|
||||||
-- tagli orizzontali
|
|
||||||
for j = nHorizontalCuts, 1, -1 do
|
|
||||||
local nFaceUse = MCH_MILL_FU.PARAL_DOWN
|
|
||||||
local dHorizontalCutOffset = dHorizontalSliceHeight * -j
|
|
||||||
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0 , sCutting, dSawDiam, nFaceUse, nil, -0.1 - dCutXOffset, BD.CUT_SIC, dHorizontalCutOffset, 0, 0, 'Precut;', b3Raw)
|
|
||||||
if not bOk then return false, sErr end
|
|
||||||
end
|
|
||||||
-- se necessario taglio verticale doppio, eseguo l'opposto
|
|
||||||
if bDoubleCut then
|
|
||||||
-- gli accorciamenti vanno invertiti per il taglio opposto
|
|
||||||
local dAccStartDoubleCut, dAccEndDoubleCut = dAccEnd, dAccStart
|
|
||||||
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, MCH_MILL_FU.ORTHO_FRONT, nil, dCutExtra, BD.CUT_SIC, dCutXOffset, dAccStartDoubleCut, dAccEndDoubleCut, 'Precut;', b3Raw, true)
|
|
||||||
if not bOk then return false, sErr end
|
|
||||||
end
|
|
||||||
-- taglio verticale
|
|
||||||
local sInfo = 'PreCut;'
|
|
||||||
if i == 1 then sInfo = 'Cut;' end
|
|
||||||
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, nOrthoOpposite, nil, dCutExtra, BD.CUT_SIC, dCutXOffset, dAccStart, dAccEnd, sInfo, b3Raw)
|
|
||||||
if not bOk then return false, sErr end
|
|
||||||
end
|
|
||||||
return true, sWarn, nNewPhase
|
|
||||||
end
|
|
||||||
|
|
||||||
-- se necessari tagli in doppio, eseguo gli opposti
|
return bOk, sErr, nNewPhase
|
||||||
if bDoubleCut then
|
end
|
||||||
-- gli accorciamenti vanno invertiti per il taglio opposto
|
|
||||||
local dAccStartDoubleCut, dAccEndDoubleCut = dAccEnd, dAccStart
|
|
||||||
for i = nCuts, 1, -1 do
|
|
||||||
local dCutOffset = ( i - 1) * dOffsL
|
|
||||||
local sNotes = EgtIf( bSplit, 'Presplit;', 'Precut;')
|
|
||||||
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, MCH_MILL_FU.ORTHO_FRONT, nil, dCutExtra, BD.CUT_SIC, dCutOffset, dAccStartDoubleCut, dAccEndDoubleCut, sNotes, b3Raw, true)
|
|
||||||
if not bOk then return false, sErr end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
-- eseguo i tagli necessari
|
|
||||||
for i = nCuts, 1, -1 do
|
|
||||||
local dCutOffset = ( i - 1) * dOffsL
|
|
||||||
-- se trave larga effettuo tagli verticali aggiuntivi
|
|
||||||
if not bSplit and ( dimH > BD.MAX_LEN_DICE) and ( dLenEndRaw > dMinTailScrapForAdditionalCuts - 10 * GEO.EPS_SMALL) then
|
|
||||||
local sSpecNotes = EgtIf( bSplit, 'Presplit;', 'Precut;')
|
|
||||||
local bOk, sErr = AddVerticalPreCuts( Proc, sCutting, dCutOffset, b3Raw, sSpecNotes)
|
|
||||||
if not bOk then return bOk, sErr end
|
|
||||||
end
|
|
||||||
local sNotes
|
|
||||||
if bSplit then
|
|
||||||
sNotes = EgtIf( i == 1, 'Split;', 'Presplit;')
|
|
||||||
else
|
|
||||||
sNotes = EgtIf( i == 1, 'Cut;', 'Precut;')
|
|
||||||
end
|
|
||||||
-- se primo taglio da sopra e PF o ONE richiedo risalita preliminare a Zmax
|
|
||||||
if i == nCuts and bHorizCut and BD.C_SIMM and not BD.DOWN_HEAD then
|
|
||||||
sNotes = EgtSetValInNotes( sNotes, 'StartZmax', 2)
|
|
||||||
end
|
|
||||||
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, nOrthoOpposite, nil, dCutExtra, BD.CUT_SIC, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw)
|
|
||||||
if not bOk then return false, sErr end
|
|
||||||
end
|
|
||||||
-- altrimenti necessari tagli da sopra e sotto con testa opportuna
|
|
||||||
else
|
|
||||||
-- verifico esistenza della lavorazione con lama da sotto
|
|
||||||
if not sCutting2 then
|
|
||||||
local sErr = 'Error : cutting H2 not found in library'
|
|
||||||
EgtOutLog( sErr)
|
|
||||||
return false, sErr
|
|
||||||
end
|
|
||||||
-- verifico che le due lame riescano a lavorare la sezione
|
|
||||||
local dDimZ = b3Raw:getDimZ()
|
|
||||||
local dExtra = dMaxVertDepth + dSawMaxDepth2 - dDimZ
|
|
||||||
if ( dExtra - 2 * BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL < 0) and not bBigSectionCut then
|
|
||||||
local sErr = 'Error : section too big for tail cut'
|
|
||||||
EgtOutLog( sErr)
|
|
||||||
return false, sErr
|
|
||||||
end
|
|
||||||
-- calcolo extra taglio ed accorciamento
|
|
||||||
local dCutExtra = -dSawMaxDepth2 + dExtra / 2 + BD.CUT_EXTRA_MIN
|
|
||||||
local dCutExtra2 = -dMaxVertDepth + dExtra / 2 + BD.CUT_EXTRA_MIN
|
|
||||||
local dAccStart = 0
|
|
||||||
-- limiti da sotto
|
|
||||||
local dVzLimDwnUp
|
|
||||||
if BD.TURN then dVzLimDwnUp = -2 end
|
|
||||||
-- eseguo i tagli da sotto necessari
|
|
||||||
for i = nCuts, 1, -1 do
|
|
||||||
local dCutOffset = ( i - 1) * dOffsL
|
|
||||||
local sNotes = EgtIf( bSplit, 'Presplit;', 'Precut;')
|
|
||||||
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting2, dSawDiam2, MCH_MILL_FU.ORTHO_TOP, dVzLimDwnUp, dCutExtra2, BD.CUT_SIC, dCutOffset, dAccStart, 0, sNotes, b3Raw, nil, true)
|
|
||||||
if not bOk then return false, sErr end
|
|
||||||
end
|
|
||||||
-- eseguo i tagli da sopra necessari
|
|
||||||
for i = nCuts, 1, -1 do
|
|
||||||
local dCutOffset = ( i - 1) * dOffsL
|
|
||||||
-- se trave larga effettuo tagli verticali aggiuntivi
|
|
||||||
if not bSplit and ( dimH > BD.MAX_LEN_DICE) and ( dLenEndRaw > dMinTailScrapForAdditionalCuts - 10 * GEO.EPS_SMALL) then
|
|
||||||
local sSpecNotes = EgtIf( bSplit, 'Presplit;', 'Precut;')
|
|
||||||
local bOk, sErr = AddVerticalPreCuts( Proc, sCutting, dCutOffset, b3Raw, sSpecNotes)
|
|
||||||
if not bOk then return bOk, sErr end
|
|
||||||
end
|
|
||||||
local sNotes
|
|
||||||
if bSplit then
|
|
||||||
sNotes = EgtIf( i == 1, 'Split;', 'Presplit;')
|
|
||||||
else
|
|
||||||
sNotes = EgtIf( i == 1, 'Cut;', 'Precut;')
|
|
||||||
end
|
|
||||||
local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, MCH_MILL_FU.ORTHO_DOWN, dVzLimDwnUp, dCutExtra, BD.CUT_SIC, dCutOffset, dAccStart, 0, sNotes, b3Raw)
|
|
||||||
if not bOk then return false, sErr end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return true, nil, nNewPhase
|
|
||||||
end
|
|
||||||
|
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
return ProcessSplit
|
return ProcessSplit
|
||||||
|
|||||||
@@ -212,7 +212,8 @@ local function MakeTwoFaces( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
|||||||
EgtSetInfo( AddId, 'TASKID', Proc.TaskId)
|
EgtSetInfo( AddId, 'TASKID', Proc.TaskId)
|
||||||
-- applico lavorazione
|
-- applico lavorazione
|
||||||
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
||||||
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId}
|
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId, PartId = Proc.PartId}
|
||||||
|
CutProc.AffectedFaces = BL.GetProcessAffectedFaces( CutProc)
|
||||||
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead)
|
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead)
|
||||||
if not bOk then return bOk, sErr end
|
if not bOk then return bOk, sErr end
|
||||||
end
|
end
|
||||||
@@ -223,7 +224,8 @@ local function MakeTwoFaces( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
|||||||
EgtSetInfo( AddId, 'TASKID', Proc.TaskId)
|
EgtSetInfo( AddId, 'TASKID', Proc.TaskId)
|
||||||
-- applico lavorazione
|
-- applico lavorazione
|
||||||
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
||||||
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId}
|
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId, PartId = Proc.PartId}
|
||||||
|
CutProc.AffectedFaces = BL.GetProcessAffectedFaces( CutProc)
|
||||||
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead)
|
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead)
|
||||||
if not bOk then return bOk, sErr end
|
if not bOk then return bOk, sErr end
|
||||||
end
|
end
|
||||||
@@ -392,7 +394,8 @@ local function MakeThreeFaces( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
|||||||
EgtSetInfo( AddId, 'TASKID', Proc.TaskId)
|
EgtSetInfo( AddId, 'TASKID', Proc.TaskId)
|
||||||
-- applico lavorazione
|
-- applico lavorazione
|
||||||
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
||||||
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId}
|
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId, PartId = Proc.PartId}
|
||||||
|
CutProc.AffectedFaces = BL.GetProcessAffectedFaces( CutProc)
|
||||||
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead)
|
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead)
|
||||||
if not bOk then return bOk, sErr end
|
if not bOk then return bOk, sErr end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
-- ProcessStepJointNotch.lua by Egaltech s.r.l. 2022/11/03
|
-- ProcessStepJointNotch.lua by Egaltech s.r.l. 2022/11/03
|
||||||
-- Gestione calcolo tacca a gradino per Travi
|
-- Gestione calcolo tacca a gradino per Travi
|
||||||
-- 2022/11/03 Correzione per riconoscimento testa da sotto su fresatura.
|
-- 2022/11/03 Correzione per riconoscimento testa da sotto su fresatura.
|
||||||
|
-- 2024/06/28 In MakeFourFaces aggiunta copia del parametro PartId sulla nuova Proc
|
||||||
|
|
||||||
-- Tabella per definizione modulo
|
-- Tabella per definizione modulo
|
||||||
local ProcessStepJointNotch = {}
|
local ProcessStepJointNotch = {}
|
||||||
@@ -384,7 +385,7 @@ local function MakeFourFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, nDiffWidt
|
|||||||
EgtSurfTmSwapFacets( AddId, 1, 3)
|
EgtSurfTmSwapFacets( AddId, 1, 3)
|
||||||
EgtSetName( AddId, 'AddCut_' .. tostring( Proc.Id))
|
EgtSetName( AddId, 'AddCut_' .. tostring( Proc.Id))
|
||||||
-- applico lavorazione
|
-- applico lavorazione
|
||||||
local NewProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg}
|
local NewProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg, PartId = Proc.PartId}
|
||||||
local b3Raw = EgtGetRawPartBBox( nRawId)
|
local b3Raw = EgtGetRawPartBBox( nRawId)
|
||||||
Topology.Classify( NewProc, b3Raw)
|
Topology.Classify( NewProc, b3Raw)
|
||||||
local bOk, sErr = MakeTwoFaces( NewProc, nPhase, nRawId, nPartId, dOvmHead, nDiffWidth)
|
local bOk, sErr = MakeTwoFaces( NewProc, nPhase, nRawId, nPartId, dOvmHead, nDiffWidth)
|
||||||
@@ -481,7 +482,7 @@ local function MakeChamfer( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- se diretta verso Z
|
-- se diretta verso Z
|
||||||
elseif abs( vtExtr:getZ()) > 0.99 then
|
elseif abs( vtExtr:getZ()) > 0.99 and not ( BD.DOWN_HEAD or nTypePos == 0) then
|
||||||
-- se diretta verso Z+
|
-- se diretta verso Z+
|
||||||
if vtExtr:getZ() > 0 then
|
if vtExtr:getZ() > 0 then
|
||||||
-- se sborda verso Z+ abilito solo la lavorazione della parte normale
|
-- se sborda verso Z+ abilito solo la lavorazione della parte normale
|
||||||
@@ -506,7 +507,7 @@ local function MakeChamfer( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
|||||||
local dExtra = 2
|
local dExtra = 2
|
||||||
-- recupero la lavorazione
|
-- recupero la lavorazione
|
||||||
local sMillType = 'Mark'
|
local sMillType = 'Mark'
|
||||||
local bDownHead = ( BD.DOWN_HEAD and abs( vtExtr:getZ()) < 0.1)
|
local bDownHead = BD.DOWN_HEAD and vtExtr:getZ() < GEO.EPS_SMALL
|
||||||
local sMilling, bH2
|
local sMilling, bH2
|
||||||
sMilling, _, _, bH2 = ML.FindMilling( sMillType, nil, nil, nil, nil, true, bDownHead)
|
sMilling, _, _, bH2 = ML.FindMilling( sMillType, nil, nil, nil, nil, true, bDownHead)
|
||||||
if not sMilling then
|
if not sMilling then
|
||||||
@@ -539,6 +540,14 @@ local function MakeChamfer( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
if bExeOpposite then
|
if bExeOpposite then
|
||||||
|
bDownHead = BD.DOWN_HEAD and vtExtr:getZ() > - GEO.EPS_SMALL
|
||||||
|
sMilling, _, _, bH2 = ML.FindMilling( sMillType, nil, nil, nil, nil, true, bDownHead)
|
||||||
|
if not sMilling then
|
||||||
|
local sErr = 'Error : milling not found in library'
|
||||||
|
EgtOutLog( sErr)
|
||||||
|
return false, sErr
|
||||||
|
end
|
||||||
|
bDownHead = ( bDownHead and bH2)
|
||||||
-- Inserisco la lavorazione del lato opposto
|
-- Inserisco la lavorazione del lato opposto
|
||||||
local sName2 = 'SJN_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id))
|
local sName2 = 'SJN_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id))
|
||||||
local nMch2Id = EgtAddMachining( sName2, sMilling)
|
local nMch2Id = EgtAddMachining( sName2, sMilling)
|
||||||
|
|||||||
@@ -200,7 +200,8 @@ function ProcessTenon.Make( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
|||||||
else
|
else
|
||||||
local b3Cut = EgtGetBBoxGlob( AddId or GDB_ID.NULL, GDB_BB.STANDARD)
|
local b3Cut = EgtGetBBoxGlob( AddId or GDB_ID.NULL, GDB_BB.STANDARD)
|
||||||
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = b3Cut, Fct = 1, Flg = Proc.Flg,
|
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = b3Cut, Fct = 1, Flg = Proc.Flg,
|
||||||
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId}
|
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId, PartId = Proc.PartId}
|
||||||
|
CutProc.AffectedFaces = BL.GetProcessAffectedFaces( CutProc)
|
||||||
local bFromBottom = ( bShortPart and vtExtr:getZ() > 0.25)
|
local bFromBottom = ( bShortPart and vtExtr:getZ() > 0.25)
|
||||||
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead, bFromBottom)
|
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead, bFromBottom)
|
||||||
if not bOk then
|
if not bOk then
|
||||||
|
|||||||
@@ -232,7 +232,8 @@ local function MakeMachByBlade( Proc, nPhase, nRawId, nPartId, dOvmHead, b3Raw,
|
|||||||
-- se va fatto, inserisco la lavorazione
|
-- se va fatto, inserisco la lavorazione
|
||||||
if bCut then
|
if bCut then
|
||||||
local CutProc = { Id = AuxId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
local CutProc = { Id = AuxId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
||||||
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId}
|
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId, PartId = Proc.PartId}
|
||||||
|
CutProc.AffectedFaces = BL.GetProcessAffectedFaces( CutProc)
|
||||||
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead)
|
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead)
|
||||||
-- se taglio applicato setto la nota al gruppo Mach per non doverla lavorare una seconda volta
|
-- se taglio applicato setto la nota al gruppo Mach per non doverla lavorare una seconda volta
|
||||||
if bOk then
|
if bOk then
|
||||||
@@ -330,7 +331,8 @@ local function MakeMachByBlade( Proc, nPhase, nRawId, nPartId, dOvmHead, b3Raw,
|
|||||||
-- se va fatto, inserisco la lavorazione
|
-- se va fatto, inserisco la lavorazione
|
||||||
if bCut then
|
if bCut then
|
||||||
local CutProc = { Id = AuxId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
local CutProc = { Id = AuxId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
||||||
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId}
|
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId, PartId = Proc.PartId}
|
||||||
|
CutProc.AffectedFaces = BL.GetProcessAffectedFaces( CutProc)
|
||||||
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead)
|
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead)
|
||||||
-- se taglio applicato setto la nota al gruppo Mach per non doverla lavorare una seconda volta
|
-- se taglio applicato setto la nota al gruppo Mach per non doverla lavorare una seconda volta
|
||||||
if bOk then
|
if bOk then
|
||||||
|
|||||||
+1
-1
@@ -15,7 +15,7 @@ EgtEnableDebug( false)
|
|||||||
--NEST.MACHINE = 'Essetre-90480019_MW'
|
--NEST.MACHINE = 'Essetre-90480019_MW'
|
||||||
--NEST.FLAG = 3
|
--NEST.FLAG = 3
|
||||||
|
|
||||||
local sLog = ' +++ BeamNestProcess : ' .. NEST.FILE .. ', ' .. NEST.MACHINE .. ', ' .. LEN["1"]
|
local sLog = ' +++ BeamNestProcess : ' .. NEST.FILE .. ', ' .. NEST.MACHINE .. ', ' .. LEN[1]
|
||||||
EgtOutLog( sLog)
|
EgtOutLog( sLog)
|
||||||
|
|
||||||
-- flag per abilitare statistiche in log
|
-- flag per abilitare statistiche in log
|
||||||
|
|||||||
@@ -1,5 +1,48 @@
|
|||||||
==== Beam Update Log ====
|
==== Beam Update Log ====
|
||||||
|
|
||||||
|
Versione 2.6i1 (09/09/2024)
|
||||||
|
- Added : refactoring e modifiche a HeadCut e Split per introduzione pretagli a zero sul grezzo, per evitare problemi con pezzi non lunghi quanto ci si aspetta
|
||||||
|
- Added : in Mark, gestita la lavorazione del testo
|
||||||
|
- Modif : gestione dipendenza foro-tasca in caso di fase con pezzo ribaltato
|
||||||
|
- Modif : in Headcut e Split aggiunta gestione parametro MIN_HEIGHT_ADDED_CUTS da BeamData per scegliere l'altezza minima per cui devono essere aggiunti i tagli orizzontali supplementari
|
||||||
|
- Modif : se Lapjoint attraversata da L055, la lapjoint viene fatta prima
|
||||||
|
- Modif : in ScarfJoint, in dicing, tagli paralleli fatti con unico passaggio di fianco per evitare che il cubetto rimanga appoggiato al motore
|
||||||
|
- Fixed : corretto caso di groove lunga passante a 3 facce che non veniva lavorata
|
||||||
|
- Fixed : in FacesBySaw -> MakeOne corretta gestione lato di lavoro quando il percorso è orizzontale
|
||||||
|
|
||||||
|
Versione 2.6h2 (26/08/2024)
|
||||||
|
- Added : in BatchProcess e New si verifica l'abilitazione alla generazione con EgtVerifyKeyOption
|
||||||
|
- Modif : in FacesBySaw introdotti attacchi tangenziali solo da un lato, limitati a facce con Z negative
|
||||||
|
- Modif : in LapJoint -> tunnel lo smusso funziona anche se è forzata la sega a catena
|
||||||
|
- Modif : in LapJoint -> svuotatura, se l'utente ha definito un'elevazione custom si lavora sempre la faccia standard
|
||||||
|
- Modif : in FacesBySaw -> MakeOne aggiunta la possibilità di passare una direzione di lavoro alternativa per poter rispettare contemporaneamente la direzione di lavoro concorde e la direzione di taglio.
|
||||||
|
|
||||||
|
Versione 2.6h1 (20/08/2024)
|
||||||
|
- Modif : in SimpleScarf, se assimilabile a un taglio, si considera area non pinzabile
|
||||||
|
- Modif : in LapJoint gestito smusso nel caso Groove-Blind-RightAngles-Parallel-4
|
||||||
|
- Modif : varie modifiche ai tagli di lama per evitare chiusura rulli pneumatici e finecorsa
|
||||||
|
- Modif : in BatchProcessNew, se presente flag apposito in EgtCam5, si evita la generazione
|
||||||
|
|
||||||
|
Versione 2.6g4 (19/07/2024)
|
||||||
|
- Modif : in BatchProcess e BatchProcessNew si forza ricalcolo ogni volta che si è in situazione di CHECK o CHECK + GENERATE
|
||||||
|
|
||||||
|
Versione 2.6g3 (07/07/2024)
|
||||||
|
- Added : aggiunta possibilità di funzione GetNzLimDownUp specifica per ogni macchina
|
||||||
|
- Modif : anche nel taglio a cubetti si chiama GetNzLimDownUp di macchina, se presente, per decidere limite orientamento lama verso il basso
|
||||||
|
- Modif : in BeamExec inserito controllo massimo numero di facce per lanciare GetFacetsInfo
|
||||||
|
- Fixed : in LapJoint corretto typo in nome variabile che provocava mancata impostazione asse bloccato
|
||||||
|
|
||||||
|
Versione 2.6g2 (04/07/2024)
|
||||||
|
- Modif : le lavorazioni BlockHaus, se vicine alla coda, vengono spostate dopo il taglio di separazione
|
||||||
|
|
||||||
|
Versione 2.6g1 (01/07/2024)
|
||||||
|
- Modif : in LongDoubleCut gestita correttamente SCC per lama
|
||||||
|
- Modif : in MachiningLib miglioramenti a scelta testa ottimizzata
|
||||||
|
- Modif : in ProcessDtTenon correzione in scelta testa
|
||||||
|
- Modif : In LapJoint -> VerifySideMillAsSaw modificato criterio ricerca utensile in base a normale della faccia
|
||||||
|
- Fixed : in MakeAntiSplintBySaw se non si trova adiacenza tra le facce si restituisce errore
|
||||||
|
- Fixed : In StepJointNotch, MakeFourFaces corretta copia feature con PartId mancante
|
||||||
|
|
||||||
Versione 2.6f2 (17/06/2024)
|
Versione 2.6f2 (17/06/2024)
|
||||||
- Modif : correzione a tagli a cubetti (ripristinata versione pre 2.6f1)
|
- Modif : correzione a tagli a cubetti (ripristinata versione pre 2.6f1)
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -2,5 +2,5 @@
|
|||||||
-- Gestione della versione di Beam
|
-- Gestione della versione di Beam
|
||||||
|
|
||||||
NAME = 'Beam'
|
NAME = 'Beam'
|
||||||
VERSION = '2.6f2'
|
VERSION = '2.6i1'
|
||||||
MIN_EXE = '2.6e2'
|
MIN_EXE = '2.6e5'
|
||||||
|
|||||||
Reference in New Issue
Block a user