Compare commits
76 Commits
2.7l2
...
Ticket#2811
| Author | SHA1 | Date | |
|---|---|---|---|
| a9ec6744e3 | |||
| 5c82ab27c8 | |||
| 723f1a0d10 | |||
| 6c18d3fa95 | |||
| e910d6e6ba | |||
| 1f3906ab35 | |||
| 183a4a564a | |||
| be4575e984 | |||
| 1af37a5589 | |||
| 7c9b20ae2e | |||
| 5dd839dace | |||
| 6ae1e94cd5 | |||
| bbffd69e1e | |||
| 30028fecf0 | |||
| cf96d7bc90 | |||
| 89fefbcbad | |||
| 6892759956 | |||
| 78a3e907ce | |||
| 63133c8813 | |||
| 58e32bdfd0 | |||
| 6528e6e77c | |||
| 48f1ac5e4d | |||
| fbca8d3abd | |||
| 6c61edc338 | |||
| 6643673196 | |||
| 7d33ea6799 | |||
| 7dd0c14f5f | |||
| 232adff332 | |||
| d55caac3c9 | |||
| 3edc65b785 | |||
| eb4f709db3 | |||
| f6316cc75a | |||
| bd8a551005 | |||
| 1729e57dbf | |||
| 261ce7992d | |||
| 48a1139eea | |||
| 70b2002a24 | |||
| f14cb632d6 | |||
| f019633466 | |||
| 57833ebad9 | |||
| 04a4458562 | |||
| b150b5387d | |||
| ce05aed8c9 | |||
| 6820d88560 | |||
| ae31898e05 | |||
| eb1878c17c | |||
| 468fb5debc | |||
| 67fa66cf4f | |||
| e4b4e846ef | |||
| 102bdc8018 | |||
| 5ca2c39506 | |||
| 2c3aaf01dc | |||
| f52bf933a1 | |||
| 993a022894 | |||
| 60448c217a | |||
| 3a5338c29b | |||
| 7177b58836 | |||
| bedb274c0f | |||
| 1df1529bd1 | |||
| 51a8ad95b2 | |||
| 394fb2194f | |||
| 9288304051 | |||
| 99b77ff1e0 | |||
| 5885954f22 | |||
| 440c739e9c | |||
| 026c86297e | |||
| d4454331c0 | |||
| bb5b135694 | |||
| c94e6f858b | |||
| 49f5ba9cc9 | |||
| 1ed912ebfd | |||
| d1d204b260 | |||
| 3cd3557b12 | |||
| 70b0c3d3d2 | |||
| 2798616813 | |||
| fa74016932 |
+69
-2
@@ -144,6 +144,12 @@ local function UpdateAuxData( sAuxFile)
|
||||
EgtSetInfo( BtlInfoId, 'LOAD90', sLoad90)
|
||||
bModif = true
|
||||
end
|
||||
-- Se definito UNLOAD, aggiorno
|
||||
local sUnload = EgtGetStringFromIni( 'AuxData', 'UNLOAD', '', sAuxFile)
|
||||
if sUnload ~= '' then
|
||||
EgtSetInfo( BtlInfoId, 'UNLOAD', sUnload)
|
||||
bModif = true
|
||||
end
|
||||
-- Se definito PROJID, aggiorno
|
||||
local sProjId = EgtGetStringFromIni( 'AuxData', 'PROJID', '', sAuxFile)
|
||||
if sProjId ~= '' then
|
||||
@@ -241,7 +247,11 @@ if bToProcess then
|
||||
EgtEraseFile( sNgeFile)
|
||||
-- eseguo import
|
||||
EgtNewFile()
|
||||
if not EgtImportBtl( BEAM.FILE, EIB_FL.TS3_POS + EIB_FL.USEUATTR) then
|
||||
local nBtlFlag = EIB_FL.TS3_POS + EIB_FL.USEUATTR
|
||||
if BD.USE_PART_OFFSET then
|
||||
nBtlFlag = nBtlFlag + EIB_FL.PARTOFFSET
|
||||
end
|
||||
if not EgtImportBtl( BEAM.FILE, nBtlFlag) then
|
||||
BEAM.ERR = 13
|
||||
BEAM.MSG = 'Error importing BTL file : ' .. BEAM.FILE
|
||||
WriteErrToLogFile( BEAM.ERR, BEAM.MSG)
|
||||
@@ -381,7 +391,7 @@ if bToProcess then
|
||||
end
|
||||
end
|
||||
|
||||
-- Verifico sezione barra non troppo piccola
|
||||
-- Verifico sezione barra non troppo piccola
|
||||
if dRawW < BD.MIN_WIDTH - 10 * GEO.EPS_SMALL or dRawH < BD.MIN_HEIGHT - 10 * GEO.EPS_SMALL then
|
||||
local sOut = 'Sezione (' .. EgtNumToString( dRawW, 2) .. ' x ' .. EgtNumToString( dRawH, 2) .. ') ' ..
|
||||
'sotto i limiti della macchina (' .. EgtNumToString( BD.MIN_WIDTH, 2) .. ' x ' .. EgtNumToString( BD.MIN_HEIGHT, 2) .. ')'
|
||||
@@ -391,6 +401,63 @@ if bToProcess then
|
||||
PostErrView( BEAM.ERR, BEAM.MSG)
|
||||
return
|
||||
end
|
||||
|
||||
-- Se presente offset da btl, verifico se offset uguale per tutti i pezzi
|
||||
if BD.USE_PART_OFFSET then
|
||||
vBeamErr = {}
|
||||
local sPartOffset = EgtGetInfo( vBeam[1].Id, 'PARTOFFSET', 's') or ''
|
||||
local vPartOffset = EgtSplitString( sPartOffset)
|
||||
local dRotAng = EgtGetInfo( vBeam[1].Id, 'ROTATED_OK', 'd') or 0
|
||||
|
||||
for i = 2, #vBeam do
|
||||
local sPartOffsetCurrent = EgtGetInfo( vBeam[i].Id, 'PARTOFFSET', 's') or ''
|
||||
local vPartOffsetCurrent = EgtSplitString( sPartOffsetCurrent)
|
||||
local dRotAngCurrent = EgtGetInfo( vBeam[i].Id, 'ROTATED_OK', 'd') or 0
|
||||
local dRotAngDelta = abs( dRotAngCurrent - dRotAng)
|
||||
if ( #vPartOffset == 5) and ( #vPartOffsetCurrent == 5) then
|
||||
if dRotAngDelta < GEO.EPS_ANG_SMALL then
|
||||
if ( vPartOffsetCurrent[2] ~= vPartOffsetCurrent[2])
|
||||
or ( vPartOffsetCurrent[3] ~= vPartOffset[3])
|
||||
or ( vPartOffsetCurrent[4] ~= vPartOffset[4])
|
||||
or ( vPartOffsetCurrent[5] ~= vPartOffset[5]) then
|
||||
|
||||
table.insert( vBeamErr, i)
|
||||
end
|
||||
elseif dRotAngDelta - 180 < GEO.EPS_ANG_SMALL then
|
||||
if ( vPartOffsetCurrent[2] ~= vPartOffsetCurrent[4])
|
||||
or ( vPartOffsetCurrent[3] ~= vPartOffset[5])
|
||||
or ( vPartOffsetCurrent[4] ~= vPartOffset[2])
|
||||
or ( vPartOffsetCurrent[5] ~= vPartOffset[3]) then
|
||||
|
||||
table.insert( vBeamErr, i)
|
||||
end
|
||||
-- se pezzo ruotato di 90deg rispetto al principale, al momento si dà sempre errore
|
||||
else
|
||||
table.insert( vBeamErr, i)
|
||||
end
|
||||
else
|
||||
if sPartOffsetCurrent ~= sPartOffset then
|
||||
table.insert( vBeamErr, i)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if #vBeamErr > 0 then
|
||||
local sOut = 'Part offset not consistent in beam(s) : '
|
||||
for i = #vBeamErr, 1, -1 do
|
||||
local sSeparator = ', '
|
||||
if i == 1 then
|
||||
sSeparator = ''
|
||||
end
|
||||
sOut = sOut .. vBeam[vBeamErr[i]].Name .. sSeparator
|
||||
end
|
||||
BEAM.ERR = 17
|
||||
BEAM.MSG = sOut
|
||||
WriteErrToLogFile( BEAM.ERR, BEAM.MSG)
|
||||
PostErrView( BEAM.ERR, BEAM.MSG)
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
-- Lunghezza della barra
|
||||
local dRawL = ( EgtGetInfo( EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or GDB_ID.NULL, 'BARLEN', 'd') or 12000) + 0.1
|
||||
|
||||
+160
-75
@@ -304,7 +304,7 @@ local function NeedTopologyFeature( Proc)
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
local function CollectFeatures( PartId, b3Raw, dCurrOvmH, dCurrOvmT)
|
||||
local function CollectFeatures( PartId, b3Raw, dCurrOvmH, dCurrOvmT, bCreatePreDrill)
|
||||
local dRawW = b3Raw:getDimY()
|
||||
local dRawH = b3Raw:getDimZ()
|
||||
-- recupero le feature
|
||||
@@ -365,7 +365,7 @@ local function CollectFeatures( PartId, b3Raw, dCurrOvmH, dCurrOvmT)
|
||||
-- assegno diametro e facce di ingresso e uscita (dati tabelle sempre per riferimento)
|
||||
Proc.Diam, Proc.Len, Proc.Fcs, Proc.Fce = Drill.GetData( Proc, b3Raw)
|
||||
-- verifico se devo inserire i prefori
|
||||
if Drill.IsPredrillNeeded( Proc) then
|
||||
if Drill.IsPredrillNeeded( Proc) and bCreatePreDrill then
|
||||
local bAddProc, PredrillProc= Drill.AddPredrillFromDrillProc( Proc)
|
||||
if bAddProc then
|
||||
table.insert( vProc, PredrillProc)
|
||||
@@ -443,7 +443,7 @@ local function CalcHeadTailMachBeforeIntersDrillings( vProc, b3Raw)
|
||||
for i = 1, #vProc do
|
||||
local Proc = vProc[i]
|
||||
if Proc.Box and not Proc.Box:isEmpty() then
|
||||
if Proc.Fct == 1 and BL.IsFeatureCuttingEntireSection( Proc.Box, b3Raw:getDimY(), b3Raw:getDimZ()) and ( Proc.Head or Proc.Tail) and Proc.Prc ~= 340 and Proc.Prc ~= 350 then
|
||||
if Proc.Fct == 1 and BL.IsFeatureCuttingEntireSection( Proc.Box, b3Raw:getDimY(), b3Raw:getDimZ()) and ( Proc.Head or Proc.Tail) and Proc.Prc ~= 350 then
|
||||
if Proc.Head and Proc.Box:getCenter():getX() < dHeadX then
|
||||
dHeadX = Proc.Box:getCenter():getX()
|
||||
nHeadId = Proc.Id
|
||||
@@ -554,12 +554,6 @@ function BeamExec.ProcessBeams( dRawW, dRawH, dRawL, dOvmHead, dOvmMid, vBeam, b
|
||||
BD.OVM_BLADE_HBEAM = ( BD.OVM_BLADE_HBEAM or 11)
|
||||
BD.OVM_CHAIN_HBEAM = ( BD.OVM_CHAIN_HBEAM or 8)
|
||||
|
||||
-- se pretagli di coda sono attivi, aumento di 10mm la lunghezza del grezzo per fare effettivamente tagliare del materiale.
|
||||
-- Altrimenti le lavorazioni pensano di essere nel vuoto e si muovono in rapido
|
||||
if BD.PRECUT_TAIL and VerifyBigSectionCut( dRawW, dRawH) then
|
||||
dRawL = dRawL + 10
|
||||
end
|
||||
|
||||
-- sovramateriale intermedio nullo se non definito
|
||||
dOvmMid = ( dOvmMid or 0)
|
||||
|
||||
@@ -582,11 +576,6 @@ function BeamExec.ProcessBeams( dRawW, dRawH, dRawL, dOvmHead, dOvmMid, vBeam, b
|
||||
-- salvo nota con lunghezza grezzo
|
||||
-- Recupero l'identificativo del gruppo di lavoro corrente
|
||||
local nMGrpId = EgtGetCurrMachGroup()
|
||||
-- Lunghezza della barra
|
||||
local dBarLen = EgtGetInfo( nMGrpId, 'BARLEN', 'd')
|
||||
if not dBarLen then
|
||||
EgtSetInfo( nMGrpId, 'BARLEN', dRawL)
|
||||
end
|
||||
|
||||
-- Area tavola
|
||||
local b3Tab = EgtGetTableArea()
|
||||
@@ -598,6 +587,18 @@ function BeamExec.ProcessBeams( dRawW, dRawH, dRawL, dOvmHead, dOvmMid, vBeam, b
|
||||
-- Impostazione dell'attrezzaggio di default
|
||||
EgtImportSetup()
|
||||
|
||||
-- se pretagli di coda sono attivi, aumento di 10mm la lunghezza del grezzo per fare effettivamente tagliare del materiale.
|
||||
-- Altrimenti le lavorazioni pensano di essere nel vuoto e si muovono in rapido
|
||||
if BD.PRECUT_TAIL and VerifyBigSectionCut( dRawW, dRawH) then
|
||||
dRawL = dRawL + 10
|
||||
end
|
||||
|
||||
-- Lunghezza della barra
|
||||
local dBarLen = EgtGetInfo( nMGrpId, 'BARLEN', 'd')
|
||||
if not dBarLen then
|
||||
EgtSetInfo( nMGrpId, 'BARLEN', dRawL)
|
||||
end
|
||||
|
||||
-- Inserimento dei pezzi con il loro grezzo
|
||||
local Cnt = 0
|
||||
local Len = dRawL
|
||||
@@ -880,6 +881,45 @@ local function ReorderTruncatingCuts( vProc, nPartId)
|
||||
return true
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
-- mi assicuro che vengano rispettate le dipendenze tra le feature
|
||||
local function ReorderFeatureWithDependency( vProc)
|
||||
-- si riordina considerando le dipendenze con alcuni limiti:
|
||||
-- * se ci sono dipendenze incrociate il risultato finale non è controllato ( A->B e B->C e C->A)
|
||||
-- * se ci sono dipendenze opposte va in errore ( A->B e B->A)
|
||||
|
||||
-- si sistemano le feature da lavorare prima
|
||||
local i = 1
|
||||
local nMaxIter = ( #vProc * #vProc) + 1
|
||||
local nIter = 0
|
||||
while i <= #vProc do
|
||||
nIter = nIter + 1
|
||||
if nIter > nMaxIter then
|
||||
error( "UNEXPECTED ERROR ON DEPENDENCY")
|
||||
end
|
||||
|
||||
-- si controllano solo i fori
|
||||
if Drill.Identify( vProc[i]) and vProc[i].Dependency and vProc[i].Dependency.ExecBefore and vProc[i].Dependency.ExecBefore.Id then
|
||||
local nRefId = vProc[i].Dependency.ExecBefore.Id
|
||||
local nRefIndex
|
||||
|
||||
for j = 1, #vProc do
|
||||
if i ~= j and vProc[j].Id == nRefId then
|
||||
nRefIndex = j
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
-- se il processo deve stare prima, ma ora è dopo
|
||||
if nRefIndex and nRefIndex < i then
|
||||
table.insert( vProc, nRefIndex, table.remove( vProc, i))
|
||||
i = max( nRefIndex - 1, 1)
|
||||
end
|
||||
end
|
||||
i = i + 1
|
||||
end
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
local function OrderFeatures( vProc, b3Raw, nPartId)
|
||||
|
||||
@@ -1202,6 +1242,9 @@ local function OrderFeatures( vProc, b3Raw, nPartId)
|
||||
end
|
||||
|
||||
ReorderTruncatingCuts( vProc, nPartId)
|
||||
|
||||
-- si riverificano feature con dipendenze
|
||||
ReorderFeatureWithDependency( vProc)
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
@@ -1458,7 +1501,7 @@ local function AddFeatureMachining( Proc, nPhase, nRawId, nPartId, dCurrOvmH, bN
|
||||
-- se foratura ( 3/4-040-X)
|
||||
elseif Drill.Identify( Proc) then
|
||||
-- esecuzione foratura
|
||||
bOk, sErr = Drill.Make( Proc, nPhase, nRawId, nPartId)
|
||||
bOk, sErr = Drill.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
-- se giunzione francese ( 1/2-035-X)
|
||||
elseif FrenchRidgeLap.Identify( Proc) then
|
||||
-- esecuzione giunzione francese
|
||||
@@ -1930,10 +1973,7 @@ local function VerifyDrillMirrored( Proc, vProc, b3Raw)
|
||||
sDrilling, sType, dMaxDepth = ML.FindDrilling( dDiam, 0, true, false, true)
|
||||
dMachiningDepth = dMaxDepth or dMachiningDepth
|
||||
end
|
||||
if not sDrilling
|
||||
or ( sType ~= 'Drill' and ( sType ~= 'Pocket'or ( Proc.Fcs ~= 0 and Proc.Fce ~= 0)))
|
||||
or not EgtMdbSetCurrMachining( sDrilling) then
|
||||
|
||||
if not sDrilling or not EgtMdbSetCurrMachining( sDrilling) then
|
||||
return
|
||||
end
|
||||
local dDrillingStep = EgtMdbGetCurrMachiningParam( MCH_MP.STEP)
|
||||
@@ -2046,14 +2086,18 @@ local function SetDrillingsToMachineAfterHeadOrTailCut( vProc, vMachineBeforeInt
|
||||
if vDistHead and #vDistHead > 0 then
|
||||
-- verifico che il foro sia di testa
|
||||
if ( bOpen or ( not bOpen and vtExtr:getX() > 0 and vProc[i].Fcs ~= 0) or ( not bOpen and vtExtr:getX() < 0 and vProc[i].Fce ~= 0)) then
|
||||
vProc[i].MachineAfterHeadCutId = vMachineBeforeIntersectingDrillings.Head.Id
|
||||
if vProc[i].Dependency and vProc[i].Dependency.ExecAfter and vProc[i].Dependency.ExecAfter.Id == vMachineBeforeIntersectingDrillings.Head.Id then
|
||||
vProc[i].MachineAfterHeadCutId = vMachineBeforeIntersectingDrillings.Head.Id
|
||||
end
|
||||
vProc[i].Head = true
|
||||
end
|
||||
-- se esiste intersezione tra il foro e la feature di coda
|
||||
elseif vDistTail and #vDistTail > 0 then
|
||||
-- verifico che il foro sia di coda
|
||||
if ( bOpen or ( not bOpen and vtExtr:getX() < 0 and vProc[i].Fcs ~= 0) or ( not bOpen and vtExtr:getX() > 0 and vProc[i].Fce ~= 0)) then
|
||||
vProc[i].MachineAfterTailCutId = vMachineBeforeIntersectingDrillings.Tail.Id
|
||||
if vProc[i].Dependency and vProc[i].Dependency.ExecAfter and vProc[i].Dependency.ExecAfter.Id == vMachineBeforeIntersectingDrillings.Tail.Id then
|
||||
vProc[i].MachineAfterTailCutId = vMachineBeforeIntersectingDrillings.Tail.Id
|
||||
end
|
||||
vProc[i].Tail = true
|
||||
end
|
||||
end
|
||||
@@ -2061,6 +2105,7 @@ local function SetDrillingsToMachineAfterHeadOrTailCut( vProc, vMachineBeforeInt
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
local function AreDrillingsMirrored( Proc, ProcMirror, b3Raw)
|
||||
if Proc.Id == ProcMirror.Id then return false end
|
||||
@@ -2127,63 +2172,103 @@ end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
function GetFeatureInfoAndDependency( vProc, b3Raw, nPartId)
|
||||
-- ciclo tutte le feature
|
||||
for i = 1, #vProc do
|
||||
local Proc = vProc[i]
|
||||
-- calcolo topologia della feature
|
||||
if NeedTopologyFeature( Proc) then
|
||||
Topology.Classify( Proc, b3Raw)
|
||||
-- se non richiesto, setto 'SPECIAL'
|
||||
else
|
||||
Proc.Topology = 'SPECIAL'
|
||||
Proc.TopologyLongName = Proc.Topology
|
||||
end
|
||||
-- controllo la feature con tutte le altre per recuperare le dipendenze
|
||||
for j = 1, #vProc do
|
||||
local ProcB = vProc[j]
|
||||
-- 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
|
||||
-- se foro in coda non setto la dipendenza
|
||||
if not ProcB.AffectedFaces.Left then
|
||||
Proc.PassedByHole = true
|
||||
ProcB.Dependency = {}
|
||||
ProcB.Dependency.ExecBefore = Proc
|
||||
end
|
||||
if vProc and #vProc > 0 and nPartId then
|
||||
-- recupero ID per tagli troncanti testa e coda
|
||||
local nHeadCuttingFeatureId = EgtGetInfo( nPartId, 'HEADCUTFEATUREID', 'i') or 0
|
||||
local nTailCuttingFeatureId = EgtGetInfo( nPartId, 'TAILCUTFEATUREID', 'i') or 0
|
||||
-- ciclo tutte le feature
|
||||
for i = 1, #vProc do
|
||||
local Proc = vProc[i]
|
||||
-- calcolo topologia della feature
|
||||
if NeedTopologyFeature( Proc) then
|
||||
Topology.Classify( Proc, b3Raw)
|
||||
-- se non richiesto, setto 'SPECIAL'
|
||||
else
|
||||
Proc.Topology = 'SPECIAL'
|
||||
Proc.TopologyLongName = Proc.Topology
|
||||
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) and DtMortise.IsDeeper( ProcB, b3Raw) then
|
||||
Proc.PassedByDtMortise = true
|
||||
end
|
||||
-- se tenone è attraversato da foro allora il foro deve essere fatto prima
|
||||
if Tenon.Identify( Proc) and Drill.Identify( ProcB) and Overlaps( Proc.Box, ProcB.Box) then
|
||||
Proc.PassedByHole = true
|
||||
end
|
||||
-- verifiche per specchiature
|
||||
if BD.DOWN_HEAD or BD.TWO_EQUAL_HEADS then
|
||||
-- forature
|
||||
if BD.DOUBLE_HEAD_DRILLING and Drill.Identify( Proc) and Drill.Identify( ProcB) and not Proc.Mirror then
|
||||
if AreDrillingsMirrored( Proc, ProcB, b3Raw) then
|
||||
Proc.Mirror = ProcB
|
||||
-- controllo la feature con tutte le altre per recuperare le dipendenze
|
||||
for j = 1, #vProc do
|
||||
-- non si controlla feature con sé stessa
|
||||
if i ~= j then
|
||||
local ProcB = vProc[j]
|
||||
-- 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
|
||||
-- se foro in coda non setto la dipendenza
|
||||
if not ProcB.AffectedFaces.Left then
|
||||
Proc.PassedByHole = true
|
||||
ProcB.Dependency = {}
|
||||
ProcB.Dependency.ExecBefore = Proc
|
||||
end
|
||||
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) and DtMortise.IsDeeper( ProcB, b3Raw) then
|
||||
Proc.PassedByDtMortise = true
|
||||
end
|
||||
-- se tenone è attraversato da foro allora il foro deve essere fatto prima
|
||||
if Tenon.Identify( Proc) and Drill.Identify( ProcB) and Overlaps( Proc.Box, ProcB.Box) then
|
||||
Proc.PassedByHole = true
|
||||
end
|
||||
-- se taglio attraversato da foro, si definisce precedenza in base ad angolo
|
||||
if Drill.Identify( Proc) and ( Cut.Identify( ProcB) or ProcB.Prc == 340 or ProcB.Proc == 350) and Overlaps( Proc.Box, ProcB.Box) then
|
||||
-- recupero e verifico l'entità foro
|
||||
local DrillAuxId = ( EgtGetInfo( Proc.Id, 'AUXID', 'i') or 0) + Proc.Id
|
||||
local vtDrillExtr = EgtCurveExtrusion( DrillAuxId, GDB_RT.GLOB)
|
||||
local bOpen = ( Proc.Fce ~= 0) and ( Proc.Fce ~= Proc.Fcs)
|
||||
local ptCut, vtCutN = EgtSurfTmFacetCenter( ProcB.Id, 0, GDB_ID.ROOT)
|
||||
local dMaxAngleDrillOnCut = BD.MAX_ANGLE_DRILL_CUT or 10
|
||||
if ( GetAngle( vtDrillExtr, vtCutN) > dMaxAngleDrillOnCut) and not ( ProcB.Prc == 340 or ProcB.Proc == 350) then
|
||||
if bOpen and GetAngle( -vtDrillExtr, vtCutN) < dMaxAngleDrillOnCut then
|
||||
ProcB.Dependency = {}
|
||||
ProcB.Dependency.ExecBefore = Proc
|
||||
Proc.Dependency = {}
|
||||
Proc.Dependency.ExecAfter = ProcB
|
||||
else
|
||||
Proc.Dependency = {}
|
||||
Proc.Dependency.ExecBefore = ProcB
|
||||
ProcB.Dependency = {}
|
||||
ProcB.Dependency.ExecAfter = Proc
|
||||
end
|
||||
else
|
||||
ProcB.Dependency = {}
|
||||
ProcB.Dependency.ExecBefore = Proc
|
||||
Proc.Dependency = {}
|
||||
Proc.Dependency.ExecAfter = ProcB
|
||||
end
|
||||
end
|
||||
-- verifiche per specchiature
|
||||
if BD.DOWN_HEAD or BD.TWO_EQUAL_HEADS then
|
||||
-- forature
|
||||
if BD.DOUBLE_HEAD_DRILLING and Drill.Identify( Proc) and Drill.Identify( ProcB) and not Proc.Mirror then
|
||||
if AreDrillingsMirrored( Proc, ProcB, b3Raw) then
|
||||
Proc.Mirror = ProcB
|
||||
end
|
||||
end
|
||||
end
|
||||
-- verifiche per tagli troncanti testa e coda: devono sempre essere subito dopo il taglio di testa e il taglio di coda, rispettivamente
|
||||
if Proc.Prc == 340 and ProcB == nHeadCuttingFeatureId then
|
||||
Proc.Dependency = {}
|
||||
Proc.Dependency.ExecBefore = ProcB
|
||||
elseif Proc == nHeadCuttingFeatureId and ProcB.Prc == 340 then
|
||||
ProcB.Dependency = {}
|
||||
ProcB.Dependency.ExecBefore = Proc
|
||||
elseif Proc.Prc == 350 and ProcB == nTailCuttingFeatureId then
|
||||
Proc.Dependency = {}
|
||||
Proc.Dependency.ExecBefore = ProcB
|
||||
elseif Proc == nTailCuttingFeatureId and ProcB.Prc == 350 then
|
||||
ProcB.Dependency = {}
|
||||
ProcB.Dependency.ExecBefore = Proc
|
||||
end
|
||||
-- se una feature deve essere lavorata prima dei tagli troncanti, si setta che non esiste taglio troncante
|
||||
if Proc.Dependency and Proc.Dependency.ExecBefore and Proc.Dependency.ExecBefore.Id == nHeadCuttingFeatureId then
|
||||
-- EgtRemoveInfo( nPartId, 'HEADCUTFEATUREID')
|
||||
end
|
||||
if Proc.Dependency and Proc.Dependency.ExecBefore and Proc.Dependency.ExecBefore.Id == nTailCuttingFeatureId then
|
||||
-- EgtRemoveInfo( nPartId, 'TAILCUTFEATUREID')
|
||||
end
|
||||
end
|
||||
end
|
||||
-- verifiche per tagli troncanti testa e coda: devono sempre essere subito dopo il taglio di testa e il taglio di coda, rispettivamente
|
||||
local nHeadCuttingFeatureId = EgtGetInfo( nPartId, 'HEADCUTFEATUREID', 'i')
|
||||
local nTailCuttingFeatureId = EgtGetInfo( nPartId, 'TAILCUTFEATUREID', 'i')
|
||||
if Proc.Prc == 340 and ProcB == nHeadCuttingFeatureId then
|
||||
Proc.Dependency = {}
|
||||
Proc.Dependency.ExecBefore = ProcB
|
||||
elseif Proc == nHeadCuttingFeatureId and ProcB.Prc == 340 then
|
||||
ProcB.Dependency = {}
|
||||
ProcB.Dependency.ExecBefore = Proc
|
||||
elseif Proc.Prc == 350 and ProcB == nTailCuttingFeatureId then
|
||||
Proc.Dependency = {}
|
||||
Proc.Dependency.ExecBefore = ProcB
|
||||
elseif Proc == nTailCuttingFeatureId and ProcB.Prc == 350 then
|
||||
ProcB.Dependency = {}
|
||||
ProcB.Dependency.ExecBefore = Proc
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -2223,7 +2308,7 @@ function BeamExec.ProcessFeatures()
|
||||
local dCurrOvmH = EgtGetInfo( nRawId, 'HOVM', 'd') or 0
|
||||
local dCurrOvmT = EgtGetInfo( nRawId, 'TOVM', 'd') or 0
|
||||
-- recupero le feature di lavorazione della trave
|
||||
local vProc = CollectFeatures( nPartId, b3Raw, dCurrOvmH, dCurrOvmT)
|
||||
local vProc = CollectFeatures( nPartId, b3Raw, dCurrOvmH, dCurrOvmT, true)
|
||||
-- recupero informazioni ausiliarie feature e dipendenze tra feature stesse
|
||||
GetFeatureInfoAndDependency( vProc, b3Raw, nPartId)
|
||||
|
||||
|
||||
@@ -1393,6 +1393,11 @@ function BeamLib.GetToolFromMachining( sMachiningName)
|
||||
else
|
||||
Tool.IsOnAggregate = false
|
||||
end
|
||||
Tool.StemDiameter = EgtTdbGetCurrToolParam( MCH_TP.STEMDIAM) or 0
|
||||
Tool.MaxDepth = EgtTdbGetCurrToolMaxDepth() or 0
|
||||
if Tool.StemDiameter > Tool.Diameter + GEO.EPS_SMALL then
|
||||
Tool.MaxDepth = Tool.MaxDepth - BD.COLL_SIC
|
||||
end
|
||||
-- altri utensili al momento non previsti
|
||||
else
|
||||
error( 'Wrong tool type')
|
||||
@@ -1403,5 +1408,39 @@ function BeamLib.GetToolFromMachining( sMachiningName)
|
||||
return Tool
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
--- copia una tabella lua in modo ricorsivo, ossia mantiene indipendenti anche tutte le sottotabelle
|
||||
--- ATTENZIONE: in caso di modifiche vanno gestiti anche i tipi custom; sarebbe meglio metterla nel LuaLibs
|
||||
function BeamLib.TableCopyDeep( OriginalTable)
|
||||
-- controllo se oggetto passato è valido, altrimenti errore. Non deve mai succedere
|
||||
if not OriginalTable then
|
||||
error( "TableCopyDeep : can't copy nil object")
|
||||
end
|
||||
local CopiedTable = {}
|
||||
for key, value in pairs( OriginalTable) do
|
||||
if type( value) == "table" then
|
||||
if isBBox3d( value) then
|
||||
CopiedTable[ key] = BBox3d( value)
|
||||
elseif isColor3d( value) then
|
||||
CopiedTable[ key] = Color3d( value)
|
||||
elseif isFrame3d( value) then
|
||||
CopiedTable[ key] = Frame3d( value)
|
||||
elseif isPoint3d( value) then
|
||||
CopiedTable[ key] = Point3d( value)
|
||||
elseif isQuaternion( value) then
|
||||
CopiedTable[ key] = Quaternion( value)
|
||||
elseif isVector3d( value) then
|
||||
CopiedTable[ key] = Vector3d( value)
|
||||
else
|
||||
CopiedTable[ key] = BeamLib.TableCopyDeep( value)
|
||||
end
|
||||
else
|
||||
CopiedTable[ key] = value
|
||||
end
|
||||
end
|
||||
|
||||
return CopiedTable
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
return BeamLib
|
||||
@@ -30,7 +30,7 @@ local function ApplyPocket( Proc, nSurfId, nFacet, sPocketing, nInd, dMaxElev, v
|
||||
-- imposto uso faccia
|
||||
EgtSetMachiningParam( MCH_MP.FACEUSE, MCH_MILL_FU.ORTHO_CONT)
|
||||
-- imposto note utente
|
||||
local sNotes = ''
|
||||
local sNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
-- eventuale massima elevazione
|
||||
if dMaxElev > 0.1 then
|
||||
sNotes = EgtSetValInNotes( sNotes, 'MaxElev', EgtNumToString( dMaxElev, 2))
|
||||
|
||||
@@ -231,7 +231,7 @@ local function GetEdgeToMachineFromVector( nSurfId, nFacet, vtOrthO)
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDwnUp, dCutExtra, dCutSic, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw, bForceInvert, bMaximizeVerticalDepth, bSpecialTangentLeadInOut, sLeadInOutType, Par5Alternative, dActualElevation)
|
||||
function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDwnUp, dCutExtra, dCutSic, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw, bForceInvert, bMaximizeVerticalDepth, bSpecialTangentLeadInOut, sLeadInOutType, Par5Alternative, dActualElevation, bForceClimbCut)
|
||||
-- se lama con asse parallelo alla faccia, passo alla apposita funzione
|
||||
if ( Par5 == MCH_MILL_FU.PARAL_DOWN or
|
||||
Par5 == MCH_MILL_FU.PARAL_TOP or
|
||||
@@ -298,7 +298,7 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw
|
||||
if not BD.TURN or abs( ptP2:getY() - ptP1:getY()) < 250 then
|
||||
local bIsMachiningDownwards = ( 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
|
||||
if ( bIsSawCCW ~= bDownUp) and ( bIsMachiningDownwards or not ( bIsMachiningDownwards or bIsMachiningUpwards) or bForceClimbCut) then
|
||||
bInvert = true
|
||||
elseif ( ( bIsSawCCW ~= bDownUp) ~= bIsMachiningDownwards) then
|
||||
if Par5Alternative then
|
||||
@@ -596,14 +596,16 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw
|
||||
EgtSetMachiningGeometry( {{ nSurfId, nFacet}})
|
||||
-- imposto uso faccia
|
||||
EgtSetMachiningParam( MCH_MP.FACEUSE, nFaceUse)
|
||||
-- vtFaceUse non funziona correttaemnte in caso che il lato da lavorare sia a 45°. Potrebbe ritornare una trilinea, non gestibile. Quindi si setta l'EDGE
|
||||
-- vtFaceUse non funziona correttamente in caso che il lato da lavorare sia a 45°. Potrebbe ritornare una trilinea, non gestibile. Quindi si setta l'EDGE
|
||||
local nEdgeFaceUse = GetEdgeToMachineFromVector( nSurfId, nFacet, vtOrthO)
|
||||
if nEdgeFaceUse and ( AreSameOrOppositeDirApprox( vtOrthO:getX(), 0.707) or AreSameOrOppositeDirApprox( vtOrthO:getY(), 0.707) or AreSameOrOppositeDirApprox( vtOrthO:getZ(), 0.707)) then
|
||||
local sNoteEdgeFaceUse = 'EdgesFaceUse=' .. EgtNumToString( nEdgeFaceUse) .. ';'
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sNoteEdgeFaceUse)
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'EdgesFaceUse', EgtNumToString( nEdgeFaceUse))
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
else
|
||||
local sNoteVtFaceUse = 'VtFaceUse=' .. EgtNumToString( vtOrthO:getX(),3) .. ',' .. EgtNumToString( vtOrthO:getY(),3) .. ',' .. EgtNumToString( vtOrthO:getZ(),3) .. ';'
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sNoteVtFaceUse)
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'VtFaceUse', EgtNumToString( vtOrthO:getX(), 3) .. ',' .. EgtNumToString( vtOrthO:getY(), 3) .. ',' .. EgtNumToString( vtOrthO:getZ(), 3))
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
-- imposto allungamenti iniziale e finale (in caso si utilizzi EDGE, non serve prolungare o accorciare)
|
||||
EgtSetMachiningParam( MCH_MP.STARTADDLEN, dAllStart - dAccStart)
|
||||
EgtSetMachiningParam( MCH_MP.ENDADDLEN, dAllEnd - dAccEnd)
|
||||
|
||||
+130
-39
@@ -37,6 +37,7 @@ EgtOutLog( ' ProcessDrill started', 1)
|
||||
-- Dati
|
||||
local BD = require( 'BeamData')
|
||||
local ML = require( 'MachiningLib')
|
||||
local FreeContour = require( 'ProcessFreeContour')
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- Riconoscimento della feature
|
||||
@@ -134,7 +135,8 @@ function ProcessDrill.Split( Proc, b3Raw)
|
||||
local bOpen = ( Proc.Fce ~= 0) and ( Proc.Fce ~= Proc.Fcs)
|
||||
-- recupero flag abilitazione split (0=auto,1=no)
|
||||
local bTrySplit = ( EgtGetInfo( Proc.Id, 'Q02', 'i') ~= 1)
|
||||
if not bTrySplit then
|
||||
local bOnlyContour = ( EgtGetInfo( Proc.Id, 'Q04', 'i') == 1)
|
||||
if ( not bTrySplit) or bOnlyContour then
|
||||
return false
|
||||
end
|
||||
-- restituisco se va fatto in doppio (solo fori orizzontali)
|
||||
@@ -313,9 +315,39 @@ local function GetHoleStartData( ptCen, vtExtr, b3Solid)
|
||||
return nFac, CosB, vFaces
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function GetSCC( Proc, vtExtr, b3Solid, bDrillAngTrasm, nPhase)
|
||||
local nSCC = MCH_SCC.NONE
|
||||
|
||||
if bDrillAngTrasm then
|
||||
nSCC = MCH_SCC.ADIR_NEAR
|
||||
elseif BD.TURN == 2 then
|
||||
nSCC = MCH_SCC.ADIR_ZP
|
||||
elseif not BD.C_SIMM and not BD.TURN then
|
||||
nSCC = MCH_SCC.ADIR_YM
|
||||
if AreSameVectorApprox( vtExtr, Z_AX()) then
|
||||
nSCC = MCH_SCC.ADIR_YM
|
||||
elseif abs( vtExtr:getX()) < 0.1 then
|
||||
local bNearTail = ( Proc.Box:getCenter():getX() < b3Solid:getCenter():getX() and Proc.Box:getCenter():getX() - b3Solid:getMin():getX() < 1000)
|
||||
local bVeryShortPart = ( BD.LEN_VERY_SHORT_PART and b3Solid:getDimX() < BD.LEN_VERY_SHORT_PART)
|
||||
nSCC = EgtIf( BL.IsPartFinalPhase( nPhase) or ( bNearTail and not bVeryShortPart), MCH_SCC.ADIR_XM, MCH_SCC.ADIR_XP)
|
||||
elseif vtExtr:getY() > 0.1 then
|
||||
nSCC = MCH_SCC.ADIR_YP
|
||||
end
|
||||
else
|
||||
nSCC = MCH_SCC.NONE
|
||||
end
|
||||
|
||||
return nSCC
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- Applicazione della lavorazione
|
||||
function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId)
|
||||
function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
-- Se forzato contorno foro forzo richiamo a FreeContour e uscita dalla funzione
|
||||
if EgtGetInfo( Proc.Id, 'Q04', 'i') == 1 then
|
||||
return FreeContour.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
end
|
||||
-- default per costanti
|
||||
BD.DRILL_VX_MAX_ANGLEDRILL = ( BD.DRILL_VX_MAX_ANGLEDRILL or 0.928)
|
||||
-- ingombro del pezzo
|
||||
@@ -354,10 +386,11 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId)
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
local nFac, CosB
|
||||
-- se non già richiesta inversione e invertibile
|
||||
if not bToInvert and Proc.Flg == 1 and -vtExtr:getZ() >= BD.DRILL_VZ_MIN then
|
||||
-- se il foro è cieco o dalla faccia sotto o troppo inclinato all'inizio, lo inverto
|
||||
local nFac, CosB, _ = GetHoleStartData( ptCen, vtExtr, b3Solid)
|
||||
nFac, CosB, _ = GetHoleStartData( ptCen, vtExtr, b3Solid)
|
||||
if Proc.Fcs == 0 or (( nFac == 2 or CosB > BD.DRILL_VX_MAX) and bOpen) then
|
||||
bToInvert = true
|
||||
end
|
||||
@@ -389,10 +422,11 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId)
|
||||
-- primo gruppo di controlli con lunghezza utensile pari a metà foro se passante
|
||||
-- recupero la lavorazione
|
||||
local sDrilling, sType, dMaxDepth, dMaxToolLength, dToolDiam, dDiamTh, dToolFreeLen = ML.FindDrilling( dDiam, dCheckDepth, bDrillUp, bDrillDown, bExcludeH2, bDrillAngTrasm, Proc.IsPredrill)
|
||||
|
||||
local dMaxDepthOri
|
||||
local vFaces
|
||||
if sDrilling then
|
||||
-- Determino la faccia di inizio del foro e dati correlati
|
||||
local nFac, CosB, vFaces = GetHoleStartData( ptCen, vtExtr, b3Solid)
|
||||
nFac, CosB, vFaces = GetHoleStartData( ptCen, vtExtr, b3Solid)
|
||||
-- Calcolo acciorciamento affondamento utile per evitare collisione portautensile con faccia
|
||||
local TgA = CosB / sqrt( 1 - CosB * CosB)
|
||||
local dSubL = ( dDiamTh / 2 + ( Proc.Diam - dToolDiam) / 2 + 4) * TgA
|
||||
@@ -400,7 +434,7 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId)
|
||||
if BD.C_SIMM and CosB > 0.866 then
|
||||
dSubL = ( 190 / 2 + ( Proc.Diam - dToolDiam) / 2 + 4) * TgA - 116
|
||||
end
|
||||
local dMaxDepthOri = dMaxDepth
|
||||
dMaxDepthOri = dMaxDepth
|
||||
dMaxDepth = min( dMaxDepth, max( dToolFreeLen - dSubL, 0))
|
||||
-- se utensile scelto non arriva in fondo, cerco il più lungo
|
||||
if dMaxDepth < GEO.EPS_SMALL * 10 then
|
||||
@@ -507,11 +541,13 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId)
|
||||
if not bToInvert and Proc.Flg == 1 and bOpen and abs( vtExtr:getZ()) < 0.259 and abs( vtExtr:getY()) > 0.966 then
|
||||
local Tool = BL.GetToolFromMachining( sDrilling)
|
||||
-- lato testa e lato di lavoro devono corrispondere
|
||||
if ( ( Tool.PreferredSide.bFront == true) and vtExtr:getY() > 10 * GEO.EPS_SMALL)
|
||||
or ( ( Tool.PreferredSide.bBack == true) and vtExtr:getY() < - 10 * GEO.EPS_SMALL) then
|
||||
ptCen = ptCen - vtExtr * dLen
|
||||
vtExtr = - vtExtr
|
||||
bToInvert = true
|
||||
if Tool.PreferredSide then
|
||||
if ( ( Tool.PreferredSide.bFront == true) and vtExtr:getY() > 10 * GEO.EPS_SMALL)
|
||||
or ( ( Tool.PreferredSide.bBack == true) and vtExtr:getY() < - 10 * GEO.EPS_SMALL) then
|
||||
ptCen = ptCen - vtExtr * dLen
|
||||
vtExtr = - vtExtr
|
||||
bToInvert = true
|
||||
end
|
||||
end
|
||||
end
|
||||
-- Determino la faccia di inizio del foro e dati correlati
|
||||
@@ -527,6 +563,17 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId)
|
||||
dMaxDepth = min( dMaxDepth, max( dToolFreeLen - dSubL, 0))
|
||||
-- Verifico inclinazione foro nei limiti
|
||||
local bTryDrill = EgtIf( dMaxDepth > 0, ( CosB < BD.DRILL_VX_MAX), false)
|
||||
-- se il foro deve essere eseguito dopo un taglio, potrebbe essere perchè il taglio crea una superficie perpendicolare
|
||||
if Proc.Dependency and Proc.Dependency.ExecAfter then
|
||||
local ptCut, vtCutN = EgtSurfTmFacetCenter( Proc.Dependency.ExecAfter.Id, 0, GDB_ID.ROOT)
|
||||
local dMaxAngleDrillOnCut = BD.MAX_ANGLE_DRILL_CUT or 10
|
||||
local dAngle = GetAngle( vtExtr, vtCutN)
|
||||
CosB = cos( dAngle)
|
||||
if dAngle < dMaxAngleDrillOnCut then
|
||||
-- controllo di essere nei limiti
|
||||
bTryDrill = true
|
||||
end
|
||||
end
|
||||
if ( CosB > 0.8 * BD.DRILL_VX_MAX and CosB < BD.DRILL_VX_MAX_ANGLEDRILL) then
|
||||
-- cerco le forature speciali AngleDrill
|
||||
local sDrilling3, sType3, dMaxDepth3 = ML.FindAngleDrilling( dDiam, dCheckDepth, bDrillUp, bDrillDown)
|
||||
@@ -577,6 +624,7 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId)
|
||||
dDepth = dMaxDepth
|
||||
dMaxElev = dMaxDepth
|
||||
end
|
||||
|
||||
-- inserisco la lavorazione
|
||||
local sName = EgtIf( EgtStartsWith( sType, 'Predrill'), 'Predrill_', 'Drill_') .. ( EgtGetName( Proc.Id) or tostring( Proc.Id))
|
||||
local nMchId = EgtAddMachining( sName, sDrilling)
|
||||
@@ -587,6 +635,8 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId)
|
||||
end
|
||||
-- aggiungo geometria
|
||||
EgtSetMachiningGeometry( {{ AuxId, -1}})
|
||||
-- eventuali note utente
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
-- eventuale inversione
|
||||
if sType == 'Drill' or sType == 'Drill_H2' or sType == 'Drill_AT' or sType == 'AngleDrill' or sType == 'Predrill' then
|
||||
EgtSetMachiningParam( MCH_MP.INVERT, bToInvert)
|
||||
@@ -594,31 +644,25 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId)
|
||||
EgtSetMachiningParam( MCH_MP.TOOLINVERT, bToInvert)
|
||||
end
|
||||
-- imposto posizione braccio porta testa
|
||||
local nSCC = MCH_SCC.NONE
|
||||
if bDrillAngTrasm then
|
||||
nSCC = MCH_SCC.ADIR_NEAR
|
||||
elseif BD.TURN == 2 then
|
||||
nSCC = MCH_SCC.ADIR_ZP
|
||||
elseif not BD.C_SIMM and not BD.TURN then
|
||||
nSCC = MCH_SCC.ADIR_YM
|
||||
if AreSameVectorApprox( vtExtr, Z_AX()) then
|
||||
nSCC = MCH_SCC.ADIR_YM
|
||||
elseif abs( vtExtr:getX()) < 0.1 then
|
||||
local bNearTail = ( Proc.Box:getCenter():getX() < b3Solid:getCenter():getX() and Proc.Box:getCenter():getX() - b3Solid:getMin():getX() < 1000)
|
||||
local bVeryShortPart = ( BD.LEN_VERY_SHORT_PART and b3Solid:getDimX() < BD.LEN_VERY_SHORT_PART)
|
||||
nSCC = EgtIf( BL.IsPartFinalPhase( nPhase) or ( bNearTail and not bVeryShortPart), MCH_SCC.ADIR_XM, MCH_SCC.ADIR_XP)
|
||||
elseif vtExtr:getY() > 0.1 then
|
||||
nSCC = MCH_SCC.ADIR_YP
|
||||
end
|
||||
else
|
||||
nSCC = MCH_SCC.NONE
|
||||
end
|
||||
local nSCC = GetSCC( Proc, vtExtr, b3Solid, bDrillAngTrasm, nPhase)
|
||||
EgtSetMachiningParam( MCH_MP.SCC, nSCC)
|
||||
-- imposto affondamento
|
||||
if Proc.Double and Proc.Double > 0 and dDepth > Proc.MachDepthDouble + 10 * GEO.EPS_SMALL then
|
||||
sMyWarn = 'Warning in double head drilling : depth (' .. EgtNumToString( dDepth, 1) .. ') reduced to (' .. EgtNumToString( Proc.MachDepthDouble, 1) .. ') to match H2 max tool depth'
|
||||
dDepth = Proc.MachDepthDouble
|
||||
dMaxElev = Proc.MachDepthDouble
|
||||
local dLastStepDepth
|
||||
if Proc.Double and Proc.Double > 0 then
|
||||
if ( sType == 'Pocket_AT' or sType == 'Pocket') then
|
||||
if bOpen then
|
||||
local dReduceDepth = MIRROR_POCKETS_MIN_DISTANCE / 2 + 10
|
||||
dLastStepDepth = dDepth + dReduceDepth
|
||||
dDepth = dDepth - dReduceDepth
|
||||
end
|
||||
else
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'LastStep', MIRROR_DRILLINGS_MIN_DISTANCE / 2 + 15)
|
||||
end
|
||||
if dDepth > Proc.MachDepthDouble + 10 * GEO.EPS_SMALL then
|
||||
sMyWarn = 'Warning in double head drilling : depth (' .. EgtNumToString( dDepth, 1) .. ') reduced to (' .. EgtNumToString( Proc.MachDepthDouble, 1) .. ') to match H2 max tool depth'
|
||||
dDepth = Proc.MachDepthDouble
|
||||
dMaxElev = Proc.MachDepthDouble
|
||||
end
|
||||
end
|
||||
EgtSetMachiningParam( MCH_MP.DEPTH, dDepth)
|
||||
-- imposto il valore della distanza di sicurezza per l'attacco. Se il valore del db utensili è troppo basso lo alzo a 10.
|
||||
@@ -626,11 +670,19 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId)
|
||||
local dMinStartPos = 10
|
||||
local dStartPos = max( dMinStartPos, dToolDbStartPos)
|
||||
EgtSetMachiningParam( MCH_MP.STARTPOS, dStartPos)
|
||||
-- Note utente con dichiarazione nessuna generazione sfridi per Vmill
|
||||
local sUserNotes = EgtSetVal( 'VMRS', 0) .. ';'
|
||||
-- dichiarazione nessuna generazione sfridi per Vmill
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'VMRS', 0)
|
||||
-- aggiungo alle note massima elevazione (coincide con affondamento)
|
||||
if dMaxElev then
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dMaxElev, 1))
|
||||
local dCustomMaxElev
|
||||
if Proc.dCustomMaxElev and type( Proc.dCustomMaxElev) == "number" and Proc.dCustomMaxElev > 10 * GEO.EPS_SMALL then
|
||||
dCustomMaxElev = Proc.dCustomMaxElev
|
||||
end
|
||||
if dMaxElev or dCustomMaxElev then
|
||||
if dCustomMaxElev then
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dCustomMaxElev, 1))
|
||||
else
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dMaxElev, 1))
|
||||
end
|
||||
end
|
||||
-- se foro passante, aggiungo questa qualifica alle note
|
||||
if ( sType == 'Drill' or sType == 'Drill_H2' or sType == 'AngleDrill') and bOpen then
|
||||
@@ -656,7 +708,7 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId)
|
||||
end
|
||||
if not bOk then
|
||||
local _, sErr = EgtGetLastMachMgrError()
|
||||
EgtSetOperationMode( nMchId, false)
|
||||
EgtSetOperationMode( nMchId, false)
|
||||
return false, sErr
|
||||
else
|
||||
local _, sWarn = EgtGetMachMgrWarning( 0)
|
||||
@@ -664,6 +716,45 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId)
|
||||
EgtSetOperationMode( nMchId, false)
|
||||
return false, sWarn
|
||||
else
|
||||
-- se DrillPocket passante in doppio si fa lavorazione aggiuntiva dell'ultimo step
|
||||
if Proc.Double and Proc.Double > 0 and ( sType == 'Pocket_AT' or sType == 'Pocket') and bOpen then
|
||||
local idMachiningLastStep = EgtCopyMachining( EgtIf( EgtStartsWith( sType, 'Predrill'), 'Predrill_', 'Drill_') .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)), sName)
|
||||
EgtSetCurrMachining( idMachiningLastStep)
|
||||
if dLastStepDepth > dMaxDepth + 10 * GEO.EPS_SMALL then
|
||||
sMyWarn = 'Warning in drill pocket last step: depth (' .. EgtNumToString( dLastStepDepth, 1) .. ') bigger than max tool depth (' .. EgtNumToString( dMaxDepth, 1) .. ')'
|
||||
dLastStepDepth = dMaxDepth
|
||||
end
|
||||
local dMaxElevLastStep = dLastStepDepth - dDepth
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dMaxElevLastStep, 1))
|
||||
EgtSetMachiningParam( MCH_MP.DEPTH, dLastStepDepth)
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'DOUBLE', '')
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'StartZmax', '')
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
local bOkLastStep = ML.ApplyMachining( true, false)
|
||||
if not bOkLastStep and bDownDrill and bOpen and abs( Proc.Flg) == 1 then
|
||||
if sType == 'Drill' or sType == 'Drill_H2' or sType == 'AngleDrill' then
|
||||
EgtSetMachiningParam( MCH_MP.INVERT, true)
|
||||
else
|
||||
EgtSetMachiningParam( MCH_MP.TOOLINVERT, true)
|
||||
end
|
||||
bOkLastStep = ML.ApplyMachining( true, false)
|
||||
end
|
||||
if not bOkLastStep then
|
||||
local _, sErr = EgtGetLastMachMgrError()
|
||||
EgtSetOperationMode( nMchId, false)
|
||||
return false, sErr
|
||||
else
|
||||
local _, sWarnLastStep = EgtGetMachMgrWarning( 0)
|
||||
if not bOkLastStep then
|
||||
sWarnLastStep = 'Drillpocket double : incomplete, last step missing'
|
||||
end
|
||||
local sPreviousWarn = sMyWarn or sWarn
|
||||
if sWarnLastStep then
|
||||
if not sPreviousWarn then sPreviousWarn = '' end
|
||||
sMyWarn = EgtIf( #sPreviousWarn > 0, sPreviousWarn .. '\n' .. sWarnLastStep, sWarnLastStep)
|
||||
end
|
||||
end
|
||||
end
|
||||
return true, ( sMyWarn or sWarn)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -136,9 +136,11 @@ local function CalcPathAtHeight( nProcId, AuxId, nAddGrpId, dHeight, dSideAng, b
|
||||
local vtBoxDiag = b3Solid:getMax() - b3Solid:getMin()
|
||||
local nCount
|
||||
NewAuxId, nCount = EgtTrimFlatCurveWithBox( NewAuxId, refBox, vtBoxDiag, true, true, GDB_RT.GLOB)
|
||||
-- eseguo traslazione e offset per portarla sul top
|
||||
-- per ogni curva creata, eseguo traslazione e offset per portarla sul top
|
||||
local vtMove = EgtCurveExtrusion( AuxId, GDB_RT.GLOB) * ( dHeight - 10 * GEO.EPS_SMALL)
|
||||
EgtMove( NewAuxId, vtMove, GDB_RT.GLOB)
|
||||
for i = 1, nCount do
|
||||
EgtMove( NewAuxId + i - 1, vtMove, GDB_RT.GLOB)
|
||||
end
|
||||
-- se divisa in più parti, le unisco congiungendole con segmenti
|
||||
if nCount > 1 then
|
||||
if EgtGetType( NewAuxId) ~= GDB_TY.CRV_COMPO then
|
||||
@@ -147,7 +149,7 @@ local function CalcPathAtHeight( nProcId, AuxId, nAddGrpId, dHeight, dSideAng, b
|
||||
for i = 2, nCount do
|
||||
local CrvId = NewAuxId + i - 1
|
||||
local ptStart = EgtSP( CrvId)
|
||||
EgtAddCurveCompoLine( NewAuxId, ptStart)
|
||||
EgtAddCurveCompoLine( NewAuxId, ptStart)
|
||||
EgtAddCurveCompoCurve( NewAuxId, CrvId)
|
||||
end
|
||||
end
|
||||
@@ -229,7 +231,8 @@ function ProcessDtMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
local dAltMort = b3DtMrt:getDimZ()
|
||||
-- verifico se di tipo pocket
|
||||
local bPocket = ( EgtGetInfo( Proc.Id, 'P05', 'i') == 1)
|
||||
if bPocket then bMakeAntiSplitPath = false end
|
||||
local dForcePrecutBypass = EgtGetInfo( Proc.Id, 'Q01', 'i')
|
||||
if bPocket or dForcePrecutBypass == 1 then bMakeAntiSplitPath = false end
|
||||
-- verifico se frontale
|
||||
local bFront = ( Proc.Prc == 56)
|
||||
-- se mortasa di fronte, eseguo il taglio della faccia
|
||||
@@ -383,11 +386,10 @@ function ProcessDtMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
-- se con tasca, la lavoro (mai in doppio)
|
||||
if bPocket then
|
||||
-- recupero il contorno della tasca (seconda curva ausiliaria)
|
||||
local sVal = EgtGetInfo( Proc.Id, 'AUXID')
|
||||
local vsAuxId = EgtSplitString( sVal)
|
||||
local vAuxId = EgtGetInfo( Proc.Id, 'AUXID', 'vi')
|
||||
local Aux2Id
|
||||
if vsAuxId and #vsAuxId >=2 then
|
||||
Aux2Id = tonumber( vsAuxId[2])
|
||||
if vAuxId and #vAuxId >=2 then
|
||||
Aux2Id = vAuxId[2]
|
||||
end
|
||||
if Aux2Id then Aux2Id = Aux2Id + Proc.Id end
|
||||
if not Aux2Id or ( EgtGetType( Aux2Id) & GDB_FY.GEO_CURVE) == 0 then
|
||||
@@ -423,7 +425,9 @@ function ProcessDtMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
-- aggiungo geometria
|
||||
EgtSetMachiningGeometry( {{ Aux2Id, -1}})
|
||||
-- dichiaro non si generano sfridi per VMill
|
||||
local sUserNotes = 'MaxElev='.. EgtNumToString( dMaxMat - 0.1, 1) .. '; VMRS=0;'
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dMaxMat - 0.1, 1))
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'VMRS', 0)
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
-- eseguo
|
||||
if not ML.ApplyMachining( true, false) then
|
||||
@@ -534,7 +538,9 @@ function ProcessDtMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
EgtSetMachiningParam( MCH_MP.SCC, nSCC)
|
||||
end
|
||||
-- dichiaro non si generano sfridi per VMill
|
||||
local sUserNotes = 'MaxElev='.. EgtNumToString( dAltMort, 1) .. '; VMRS=0;'
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dAltMort, 1))
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'VMRS', 0)
|
||||
-- se lavorazione in doppio
|
||||
if Proc.Double and Proc.Double > 0 then
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'DOUBLE', Proc.Double)
|
||||
@@ -635,20 +641,44 @@ function ProcessDtMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
-- sistemo il lato e la direzione di lavoro
|
||||
EgtSetMachiningParam( MCH_MP.WORKSIDE, EgtIf( bCW, MCH_MILL_WS.LEFT, MCH_MILL_WS.RIGHT))
|
||||
EgtSetMachiningParam( MCH_MP.INVERT, EgtIf( bCW, false, true))
|
||||
local ptS = EgtSP( AuxId, GDB_ID.ROOT)
|
||||
local ptE = EgtEP( AuxId, GDB_ID.ROOT)
|
||||
-- in presenza di pocket imposto dati ingresso e uscita
|
||||
if bPocket then
|
||||
-- recupero il contorno della tasca (seconda curva ausiliaria)
|
||||
local vAuxId = EgtGetInfo( Proc.Id, 'AUXID', 'vi')
|
||||
-- si prende il centro del percorso da svuotare ( non si controlla che sia presente perchè già verificata in precedenza)
|
||||
local ptPocketCenter = EgtGP( Proc.Id + vAuxId[2], GDB_ID.ROOT)
|
||||
-- calcolo componente tangente e lineare di ingresso
|
||||
local vtS = EgtSV( Proc.Id + vAuxId[1], GDB_ID.ROOT) -- vettore entrante percorso
|
||||
local vtOffS = EgtSV( Proc.Id + vAuxId[1], GDB_ID.ROOT) ; vtOffS:rotate( vtExtr, 90) -- vettore da punto iniziale a centro utensile
|
||||
local vtStartToCenter = ptPocketCenter - ( ptS + ( vtOffS * ( dToolDiam/2))) -- vettore da centro utensilenel punto iniziale e centro del percorso da svuotare
|
||||
local dLenStartToCenter = vtStartToCenter:len() -- distanza da centro utensile a centro del percorso da svuotare
|
||||
local dStartTangComp = abs( vtStartToCenter * vtS) -- prodotto scalare tra vettore entrante e vettore tra centro utensilee percordo da svuotare (componente tangente)
|
||||
local dStartPerpComp = sqrt( dLenStartToCenter^2 - dStartTangComp^2) -- pitagora tra componente tangente e la lunghezza tra i due centri
|
||||
-- calcolo componente tangente e lineare di uscita
|
||||
local vtE = EgtEV( Proc.Id + vAuxId[1], GDB_ID.ROOT)
|
||||
local vtOffE = EgtEV( Proc.Id + vAuxId[1], GDB_ID.ROOT) ; vtOffE:rotate( vtExtr, 90)
|
||||
local vtEndToCenter = ptPocketCenter - ( ptE + ( vtOffE * ( dToolDiam/2)))
|
||||
local dLenEndToCenter = vtEndToCenter:len()
|
||||
local dEndTangComp = abs( vtEndToCenter * vtE)
|
||||
local dEndPerpComp = sqrt( dLenEndToCenter^2 - dEndTangComp^2)
|
||||
|
||||
EgtSetMachiningParam( MCH_MP.STARTPOS, 5)
|
||||
EgtSetMachiningParam( MCH_MP.LEADINTYPE, MCH_MILL_LI.TANGENT)
|
||||
EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, MCH_MILL_LO.AS_LI)
|
||||
EgtSetMachiningParam( MCH_MP.STARTADDLEN, 5)
|
||||
EgtSetMachiningParam( MCH_MP.ENDADDLEN, 0)
|
||||
EgtSetMachiningParam( MCH_MP.LITANG, dToolDiam / 2)
|
||||
EgtSetMachiningParam( MCH_MP.LIPERP, 5)
|
||||
EgtSetMachiningParam( MCH_MP.LITANG, dStartTangComp)
|
||||
EgtSetMachiningParam( MCH_MP.LIPERP, dStartPerpComp)
|
||||
EgtSetMachiningParam( MCH_MP.LIELEV, 0)
|
||||
|
||||
EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, MCH_MILL_LI.TANGENT)
|
||||
EgtSetMachiningParam( MCH_MP.LOTANG, dEndTangComp)
|
||||
EgtSetMachiningParam( MCH_MP.LOPERP, dEndPerpComp)
|
||||
EgtSetMachiningParam( MCH_MP.LOELEV, 0)
|
||||
|
||||
EgtSetMachiningParam( MCH_MP.STARTADDLEN, 0)
|
||||
EgtSetMachiningParam( MCH_MP.ENDADDLEN, 0)
|
||||
-- altrimenti verifico se sono bilanciati ingresso e uscita, per evitare inizio o fine nel legno
|
||||
else
|
||||
local ptS = EgtSP( AuxId, GDB_ID.ROOT)
|
||||
local ptE = EgtEP( AuxId, GDB_ID.ROOT)
|
||||
local dDistS = abs( ( ptS - rfDtMrt:getOrigin()) * rfDtMrt:getVersX())
|
||||
local dDistE = abs( ( ptE - rfDtMrt:getOrigin()) * rfDtMrt:getVersX())
|
||||
local dIni, dFin = EgtCurveDomain( AuxId)
|
||||
@@ -672,7 +702,9 @@ function ProcessDtMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
if bMultipleZPasses then
|
||||
dMaxElev = dVerticalStep
|
||||
end
|
||||
local sUserNotes = EgtSetVal( 'MaxElev', EgtNumToString( dMaxElev - 0.1, 1)) .. ';' .. EgtSetVal( 'VMRS', 0) .. ';'
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dMaxElev - 0.1, 1))
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'VMRS', 0)
|
||||
-- in presenza di pocket dichiaro che non sto entrando e uscendo nel grezzo
|
||||
if bPocket then
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'OutRaw', 3)
|
||||
|
||||
@@ -109,8 +109,9 @@ local function ApplyPocket( Proc, sPocketing, nStep, dSurfStep, nIdSurf, vtExtr)
|
||||
-- imposto uso faccia
|
||||
EgtSetMachiningParam( MCH_MP.FACEUSE, MCH_MILL_FU.ORTHO_CONT)
|
||||
if dSurfStep > 0 then
|
||||
local sNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
-- imposto elevazione
|
||||
local sNotes = 'MaxElev=' .. EgtNumToString( dSurfStep, 2) .. ';'
|
||||
sNotes = EgtSetValInNotes( sNotes, 'MaxElev', EgtNumToString( dSurfStep, 2))
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sNotes)
|
||||
end
|
||||
-- imposto posizione braccio porta testa
|
||||
@@ -322,7 +323,8 @@ function ProcessDtTenon.Make( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
-- sistemo i parametri
|
||||
local dOffs = ( i - 1) * dStep
|
||||
EgtSetMachiningParam( MCH_MP.OFFSR, dOffs)
|
||||
local sUserNotes = EgtSetVal( 'MaxElev', EgtNumToString( dDtTenH, 1)) .. ';'
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dDtTenH, 1))
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
-- sistemo il lato e la direzione di lavoro
|
||||
EgtSetMachiningParam( MCH_MP.WORKSIDE, EgtIf( bCW, MCH_MILL_WS.LEFT, MCH_MILL_WS.RIGHT))
|
||||
@@ -436,7 +438,8 @@ function ProcessDtTenon.Make( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
EgtSetMachiningParam( MCH_MP.FACEUSE, nFaceUse)
|
||||
|
||||
-- imposto elevazione
|
||||
local sUserNotes = EgtSetVal( 'MaxElev', EgtNumToString( dDtTenH, 1)) .. ';'
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dDtTenH, 1))
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
|
||||
-- imposto posizione braccio porta testa
|
||||
|
||||
@@ -29,11 +29,13 @@ local ML = require( 'MachiningLib')
|
||||
local Q_DIM_STRIP = 'Q01' -- d
|
||||
local Q_DEPTH_CHAMFER = 'Q02' -- d
|
||||
local Q_OVERMAT_FOR_FINISH = 'Q03' -- d
|
||||
local Q_ONLY_CONTOUR = 'Q04' -- i, valido solo per drill
|
||||
local Q_ONLY_CHAMFER = 'Q00' -- i
|
||||
local Q_RADIAL_OFFSET = 'Q06' -- d, valido solo per pocket
|
||||
local Q_IGNORE_LASER_PROBLEMS = 'Q07'
|
||||
local Q_FORCE_CLAMPABLE_AREA = 'Q08'
|
||||
local Q_INVERT_LAST_PATH = 'Q09'
|
||||
local Q_MAX_ELEVATION = 'Q10' -- d
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- Riconoscimento della feature
|
||||
@@ -184,6 +186,8 @@ local function VerifyChamfer( Proc, AuxId, nRawId, bMakeVertCham, bDownHead)
|
||||
EgtOutLog( sErr)
|
||||
return -1, 0, sErr
|
||||
end
|
||||
else
|
||||
sMilling = ''
|
||||
end
|
||||
|
||||
return nChamfer, dDepth, sMilling
|
||||
@@ -235,6 +239,7 @@ end
|
||||
local function MakeByMill( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
-- recupero l'ingombro del grezzo di appartenenza
|
||||
local b3Raw = EgtGetRawPartBBox( nRawId)
|
||||
local bContourFromDrill = EgtGetInfo( Proc.Id, Q_ONLY_CONTOUR, 'i') == 1
|
||||
-- ingombro del pezzo
|
||||
local Ls = EgtGetFirstNameInGroup( nPartId, 'Box')
|
||||
local b3Solid = EgtGetBBoxGlob( Ls or GDB_ID.NULL, GDB_BB.STANDARD)
|
||||
@@ -259,7 +264,7 @@ local function MakeByMill( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
-- verifico se in testa o coda
|
||||
local bHead = Proc.Head
|
||||
-- verifico i parametri Q per profondità smusso e per eseguirlo in esclusiva
|
||||
local nChamfer, dDepthCham, sChamfer = VerifyChamfer( Proc, AuxId, nRawId, true)
|
||||
local nChamfer, dDepthCham, sChamfer = VerifyChamfer( Proc, AuxId, nRawId, true, nil)
|
||||
-- recupero la lavorazione
|
||||
local bTopHead = ( BD.DOWN_HEAD and vtExtr:getZ() > -0.1)
|
||||
local bDownHead = ( BD.DOWN_HEAD and vtExtr:getZ() < 0.1)
|
||||
@@ -631,6 +636,14 @@ local function MakeByMill( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
-- eventuale elevazione forzata
|
||||
local dCustomMaxElev = EgtGetInfo( Proc.Id, Q_MAX_ELEVATION, 'd')
|
||||
if dCustomMaxElev and dCustomMaxElev < 1 then dCustomMaxElev = nil end
|
||||
if dCustomMaxElev then
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dCustomMaxElev, 1))
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
end
|
||||
-- assegno affondamento
|
||||
EgtSetMachiningParam( MCH_MP.DEPTH, dDepth)
|
||||
end
|
||||
@@ -663,7 +676,9 @@ local function MakeByMill( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
end
|
||||
|
||||
-- assegno lato di lavoro
|
||||
if Proc.Grp == 0 then
|
||||
if bContourFromDrill then
|
||||
dWorkSide = MCH_MILL_WS.LEFT
|
||||
elseif Proc.Grp == 0 then
|
||||
dWorkSide = MCH_MILL_WS.CENTER
|
||||
elseif ( Proc.Grp == 3 and not bToolInv) or ( Proc.Grp == 4 and bToolInv) or ( Proc.Grp == 1 and bToolInv) or ( Proc.Grp == 2 and bToolInv) then
|
||||
dWorkSide = MCH_MILL_WS.LEFT
|
||||
@@ -695,6 +710,14 @@ local function MakeByMill( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
EgtSetMachiningParam( MCH_MP.TOOLINVERT, bToolInvert)
|
||||
EgtSetMachiningParam( MCH_MP.INVERT, bInvert)
|
||||
EgtSetMachiningParam( MCH_MP.WORKSIDE, dWorkSide)
|
||||
-- setto valori specifici se lavorazione nel pieno del solo contorno di un foro
|
||||
if bContourFromDrill then
|
||||
local dWorkStep = max( ( EgtGetMachiningParam( MCH_MP.STEP) or 0) * 0.75, dToolDiam)
|
||||
EgtSetMachiningParam( MCH_MP.STEP, dWorkStep)
|
||||
EgtSetMachiningParam( MCH_MP.LEADINTYPE, MCH_MILL_LI.GLIDE)
|
||||
EgtSetMachiningParam( MCH_MP.LIELEV, dWorkStep)
|
||||
EgtSetMachiningParam( MCH_MP.LITANG, dWorkStep)
|
||||
end
|
||||
|
||||
|
||||
-- posizione braccio porta testa
|
||||
@@ -897,7 +920,9 @@ local function MakeByPocket( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
end
|
||||
EgtSetMachiningParam( MCH_MP.DEPTH, dDepth)
|
||||
-- imposto elevazione
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, 'MaxElev=' .. EgtNumToString( dMaxDepth, 1) .. ';')
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dMaxDepth, 1))
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
-- imposto eventuale offset radiale, se impostato dall'utente
|
||||
local dRadialOffset = EgtGetInfo( Proc.Id, Q_RADIAL_OFFSET, 'd') or 0
|
||||
if abs( dRadialOffset) > 10 * GEO.EPS_SMALL then
|
||||
@@ -993,6 +1018,10 @@ function ProcessFreeContour.Make( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
Q_DEPTH_CHAMFER = 'Q01'
|
||||
Q_DIM_STRIP = 'Q02'
|
||||
end
|
||||
if Proc.Prc == 40 then
|
||||
Q_DIM_STRIP = ''
|
||||
Q_OVERMAT_FOR_FINISH = ''
|
||||
end
|
||||
-- recupero la tipologia
|
||||
local bPocket = ( EgtGetInfo( Proc.Id, 'PCKT', 'i') == 1)
|
||||
-- se svuotatura
|
||||
|
||||
@@ -196,7 +196,11 @@ local function MakeHeadChamfer( idProc, nPartId)
|
||||
EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.RIGHT))
|
||||
|
||||
local dQ09Value = EgtGetInfo( idProc, 'Q09', 'd')
|
||||
if not dQ09Value then
|
||||
dQ09Value = 0.1
|
||||
end
|
||||
local bChamferedEdge = dQ09Value > 0
|
||||
dQ09Value = EgtIf( bChamferedEdge, max( dQ09Value, 0.1), min( dQ09Value, -0.1))
|
||||
|
||||
local nIdFirstEntity, nEntityCnt = EgtExplodeCurveCompo( nLoopId)
|
||||
local p3MidPoint = EgtMP( nIdFirstEntity, GDB_ID.GRID)
|
||||
@@ -232,6 +236,9 @@ local function MakeHeadChamfer( idProc, nPartId)
|
||||
end
|
||||
EgtChangeClosedCurveStartPoint( idGeom, p3MidPoint, GDB_RT.GRID)
|
||||
|
||||
-- reimposto la griglia
|
||||
EgtSetGridFrame()
|
||||
|
||||
-- Inserisco la lavorazione del lato standard
|
||||
local dExtra = 2
|
||||
local sName1 = 'HeadCham_' .. ( EgtGetName( idProc) or tostring( idProc))
|
||||
|
||||
+610
-138
File diff suppressed because it is too large
Load Diff
@@ -483,9 +483,10 @@ local function MakeByPocketing( Proc, nPhase, nRawId, nPartId)
|
||||
EgtOutLog( sWarn)
|
||||
end
|
||||
-- imposto elevazione e dichiaro non si generano sfridi per VMill
|
||||
local sNotes = 'MaxElev=' .. EgtNumToString( dFacElev, 1) .. ';'
|
||||
sNotes = sNotes .. 'VMRS=0;'
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sNotes)
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dFacElev, 1))
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'VMRS', 0)
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
-- eseguo
|
||||
if not ML.ApplyMachining( true, false) then
|
||||
-- provo ad allargare leggermente la tasca
|
||||
@@ -1425,8 +1426,9 @@ function ProcessLongCut.Make( Proc, nPhase, nRawId, nPartId, bCustUseBlade, nCus
|
||||
EgtSetMachiningParam( MCH_MP.DEPTH, dDepth)
|
||||
-- eventuale nota utente per disabilitare controllo ingresso e uscita in grezzo
|
||||
if k < nO then
|
||||
local sNotes = 'OutRaw=3;'
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sNotes)
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'OutRaw', 3)
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
-- aumento ingresso su spezzoni per evitare collisione durante approccio pezzo
|
||||
if bFront then
|
||||
-- se invertito si allunga ingresso su tutti tranne su ultimo
|
||||
|
||||
@@ -226,9 +226,10 @@ local function MakeByPocketing( Proc, nPhase, nRawId, nPartId, nSide, nFacInd, d
|
||||
EgtOutLog( sWarn)
|
||||
end
|
||||
-- imposto elevazione e dichiaro non si generano sfridi per VMill
|
||||
local sNotes = 'MaxElev=' .. EgtNumToString( dFacElev, 1) .. ';'
|
||||
sNotes = sNotes .. 'VMRS=0;'
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sNotes)
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dFacElev, 1))
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'VMRS', 0)
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
-- eseguo
|
||||
if not ML.ApplyMachining( true, false) then
|
||||
-- provo ad allargare leggermente la tasca
|
||||
@@ -319,7 +320,7 @@ end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- Applicazione della lavorazione
|
||||
function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster, nUseSideToolMaster)
|
||||
function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster, nUseSideToolMaster, nUseConventionalMilling)
|
||||
-- recupero l'ingombro del grezzo di appartenenza
|
||||
local b3Raw = EgtGetRawPartBBox( nRawId)
|
||||
local b3Solid = EgtGetBBoxGlob( EgtGetFirstNameInGroup( nPartId, 'Box') or GDB_ID.NULL, GDB_BB.STANDARD)
|
||||
@@ -1131,8 +1132,17 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
||||
elseif ( nSide ~= -1 or BD.DOWN_HEAD or BD.TURN) and nUseMillOnSide == 0 then
|
||||
-- determino la massima elevazione
|
||||
local dElev = 0
|
||||
local dFacElev1 = BL.GetFaceElevation( Proc, tFaceLong[1], b3Solid)
|
||||
local dFacElev2 = BL.GetFaceElevation( Proc, tFaceLong[2], b3Solid)
|
||||
|
||||
-- calcolo l'elevazione della faccia principale
|
||||
local dFacElev1 = BL.GetFaceElevation( Proc, tFaceLong[vOrd[1]], b3Solid)
|
||||
local dFacElev2 = BL.GetFaceElevation( Proc, tFaceLong[vOrd[2]], b3Solid)
|
||||
local bFacesSwapped = false
|
||||
if bInt and not bConvex and dFacElev1 - 10* GEO.EPS_SMALL > dFacElev2 then
|
||||
vOrd[1], vOrd[2] = vOrd[2], vOrd[1]
|
||||
dFacElev1, dFacElev2 = dFacElev2, dFacElev1
|
||||
bFacesSwapped = true
|
||||
end
|
||||
|
||||
-- se facce concave e a 90 gradi, prendo l'elevazione minima
|
||||
if bOrtho then
|
||||
dElev = min( dFacElev1, dFacElev2)
|
||||
@@ -1141,7 +1151,7 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
||||
end
|
||||
-- recupero la lavorazione
|
||||
local sMilling
|
||||
local bDownHead = ( nSide == -1 and BD.DOWN_HEAD)
|
||||
local bDownHead = ( BD.DOWN_HEAD and ( nSide == -1 or AreSameVectorApprox( vtN[vOrd[1]], -Z_AX())))
|
||||
sMilling = ML.FindMilling( 'Long2Cut', dElev, nil, nil, nil, not bDownHead, bDownHead)
|
||||
|
||||
if not sMilling then
|
||||
@@ -1173,10 +1183,10 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
||||
-- se chiuso e corto, applico svuotatura con fresa opportuna
|
||||
if nFaceLimit == 3 and Proc.Box:getDimX() < 2 * dToolDiam then
|
||||
-- svuotatura della prima faccia longitudinale
|
||||
local bOk, sErr = MakeByPocketing( Proc, nPhase, nRawId, nPartId, nSide, tFaceLong[1], dFacElev1)
|
||||
local bOk, sErr = MakeByPocketing( Proc, nPhase, nRawId, nPartId, nSide, tFaceLong[vOrd[1]], dFacElev1)
|
||||
-- svuotatura della seconda faccia longitudinale
|
||||
if not bOk then return bOk, sErr end
|
||||
return MakeByPocketing( Proc, nPhase, nRawId, nPartId, nSide, tFaceLong[2], dFacElev2)
|
||||
return MakeByPocketing( Proc, nPhase, nRawId, nPartId, nSide, tFaceLong[vOrd[2]], dFacElev2)
|
||||
end
|
||||
-- determino gli estremi
|
||||
local dStartDist = 0
|
||||
@@ -1267,29 +1277,35 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
||||
local dLimitAngle = -0.5 - 20 * GEO.EPS_SMALL
|
||||
-- se facce ortogonali (concave), mantengo la lavorazione di testa sulla faccia più grande purchè non superi di 30 gradi il sottosquadra
|
||||
if bOrtho then
|
||||
if vtN[vOrd[1]]:getZ() > 0.001 and vtN[vOrd[2]]:getZ() > 0.001 then
|
||||
if vtN[vOrd[1]]:getZ() >= vtN[vOrd[2]]:getZ() then
|
||||
nFin = 1
|
||||
else
|
||||
nIni = 2
|
||||
end
|
||||
if bDownHead and AreSameVectorApprox( vtN[vOrd[1]], -Z_AX()) then
|
||||
nFin = 1
|
||||
else
|
||||
if vtN[vOrd[1]]:getZ() < dLimitAngle then
|
||||
nIni = 2
|
||||
elseif vtN[vOrd[2]]:getZ() < dLimitAngle then
|
||||
nFin = 1
|
||||
else
|
||||
if vtN[vOrd[1]]:getZ() >= vtN[vOrd[2]]:getZ() then
|
||||
if vtN[vOrd[1]]:getZ() < dLimitAngle then
|
||||
nIni = 2
|
||||
else
|
||||
nFin = 1
|
||||
end
|
||||
local vtN1 = vtN[vOrd[1]]
|
||||
local vtN2 = vtN[vOrd[2]]
|
||||
if vtN1:getZ() > 0.001 and vtN2:getZ() > 0.001 then
|
||||
if vtN1:getZ() >= vtN2:getZ() then
|
||||
nFin = 1
|
||||
else
|
||||
if vtN[vOrd[1]]:getZ() < dLimitAngle then
|
||||
nIni = 2
|
||||
nIni = 2
|
||||
end
|
||||
else
|
||||
if vtN1:getZ() < dLimitAngle then
|
||||
nIni = 2
|
||||
elseif vtN2:getZ() < dLimitAngle then
|
||||
nFin = 1
|
||||
else
|
||||
if vtN1:getZ() >= vtN2:getZ() then
|
||||
if vtN1:getZ() < dLimitAngle then
|
||||
nIni = 2
|
||||
else
|
||||
nFin = 1
|
||||
end
|
||||
else
|
||||
nFin = 1
|
||||
if vtN1:getZ() < dLimitAngle then
|
||||
nIni = 2
|
||||
else
|
||||
nFin = 1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1313,7 +1329,7 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
||||
-- valore sovrapposizione tra passate con fresa di fianco
|
||||
local dOverLapExtend = 2
|
||||
-- Verifico se da fare di fianco perchè normale troppo verso il basso (minore di -30deg)
|
||||
local bSide = ( vtN[vOrd[i]]:getZ() < dLimitAngle and not ( nSide == -1 and ( BD.DOWN_HEAD or BD.TURN)))
|
||||
local bSide = ( vtN[vOrd[i]]:getZ() < dLimitAngle and not ( bDownHead or ( nSide == -1 and ( BD.DOWN_HEAD or BD.TURN))))
|
||||
-- Limitazioni della lavorazione
|
||||
local nPos = EgtIf( i == 1, j, nC - j + 1)
|
||||
local dSal = EgtIf( nPos == 1, - EgtIf( i == nIni, dStartDist, dEndDist), - EgtIf( i == nIni, dStartAccDist, dEndAccDist) - ( nPos - 2) * dC + EgtIf( bSide, dOverLapExtend, 0))
|
||||
@@ -1380,15 +1396,19 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
local dMySal, dMyEal = dSal, dEal
|
||||
if bFacesSwapped then
|
||||
dMySal, dMyEal = dMyEal, dMySal
|
||||
end
|
||||
-- aggiungo geometria
|
||||
EgtSetMachiningGeometry( {{ Proc.Id, tFaceLong[vOrd[i]]}})
|
||||
-- limito opportunamente la lavorazione
|
||||
if ( nSide == -1 and BD.DOWN_HEAD) then
|
||||
EgtSetMachiningParam( MCH_MP.STARTADDLEN, dEal)
|
||||
EgtSetMachiningParam( MCH_MP.ENDADDLEN, dSal)
|
||||
EgtSetMachiningParam( MCH_MP.STARTADDLEN, dMyEal)
|
||||
EgtSetMachiningParam( MCH_MP.ENDADDLEN, dMySal)
|
||||
else
|
||||
EgtSetMachiningParam( MCH_MP.STARTADDLEN, dSal)
|
||||
EgtSetMachiningParam( MCH_MP.ENDADDLEN, dEal)
|
||||
EgtSetMachiningParam( MCH_MP.STARTADDLEN, dMySal)
|
||||
EgtSetMachiningParam( MCH_MP.ENDADDLEN, dMyEal)
|
||||
end
|
||||
-- imposto posizione braccio porta testa per non ingombrare agli estremi
|
||||
EgtSetMachiningParam( MCH_MP.SCC, nSCC)
|
||||
@@ -1399,6 +1419,28 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
||||
-- imposto lato di lavoro e inversione
|
||||
EgtSetMachiningParam( MCH_MP.WORKSIDE, EgtIf( bIsMachDownUp, MCH_MILL_WS.RIGHT, MCH_MILL_WS.LEFT))
|
||||
EgtSetMachiningParam( MCH_MP.INVERT, EgtIf( bSide, true, false))
|
||||
|
||||
-- si aggiusta la direzione di lavoro in base a rotazione utensile e preferenza utente (nUseConventionalMilling da fuori o Q14)
|
||||
EgtMdbSetCurrMachining( sMilling)
|
||||
local bIsCurrentToolCCW = EgtMdbGetCurrMachiningParam( MCH_MP.SPEED) < 0
|
||||
if nUseConventionalMilling == nil then
|
||||
nUseConventionalMilling = EgtGetInfo( Proc.Id, 'Q14', 'd') or 0
|
||||
end
|
||||
local bUseConventionalMilling = false
|
||||
if nUseConventionalMilling == 1 or ( nUseConventionalMilling == 2 and vtN[vOrd[i]]:getX() < 0.1 and Proc.AffectedFaces.Bottom) then
|
||||
bUseConventionalMilling = true
|
||||
end
|
||||
if bIsCurrentToolCCW ~= bUseConventionalMilling then
|
||||
local dCurrStartAddLen = EgtGetMachiningParam( MCH_MP.STARTADDLEN)
|
||||
local dCurrEndAddLen = EgtGetMachiningParam( MCH_MP.ENDADDLEN)
|
||||
local bCurrInvert = EgtGetMachiningParam( MCH_MP.INVERT)
|
||||
local nCurrWorkside = EgtGetMachiningParam( MCH_MP.WORKSIDE)
|
||||
EgtSetMachiningParam( MCH_MP.STARTADDLEN, dCurrEndAddLen)
|
||||
EgtSetMachiningParam( MCH_MP.ENDADDLEN, dCurrStartAddLen)
|
||||
EgtSetMachiningParam( MCH_MP.INVERT, not bCurrInvert)
|
||||
EgtSetMachiningParam( MCH_MP.WORKSIDE, EgtIf( nCurrWorkside == MCH_MILL_WS.LEFT, MCH_MILL_WS.RIGHT, MCH_MILL_WS.LEFT))
|
||||
end
|
||||
|
||||
-- imposto offset radiale (nullo se concavo o di lato)
|
||||
local dOffsR = EgtIf( k < nO, ( nO - k) * dStep, EgtIf( bConvex, - BD.CUT_EXTRA, 0))
|
||||
if bSide then dOffsR = 0 end
|
||||
@@ -1432,7 +1474,7 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
||||
end
|
||||
end
|
||||
end
|
||||
if not Proc.bMoveAfterSplit and not bConvex and Proc.AffectedFaces.Left then
|
||||
if not Proc.bMoveAfterSplit and not bConvex and Proc.AffectedFaces.Left and Proc.DistanceToNextPart < ( dToolDiam / 2 + 5) then
|
||||
-- recupero gruppo per geometria addizionale
|
||||
local nAddGrpId = BL.GetAddGroup( nPartId)
|
||||
if not nAddGrpId then
|
||||
@@ -1465,8 +1507,8 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
||||
sMilling = ML.FindMilling( sMchType)
|
||||
sPrefix = 'L2CS_'
|
||||
nExtendMach = nUseMillOnSide
|
||||
if nUseMillOnSide == 2 then
|
||||
bRemoveToolRadius = true
|
||||
if nUseMillOnSide == 2 then
|
||||
bRemoveToolRadius = true
|
||||
end
|
||||
-- se testa da sotto
|
||||
if nSide ~= 1 and BD.DOWN_HEAD then
|
||||
@@ -1544,6 +1586,12 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
||||
-- calcolo l'elevazione della faccia principale
|
||||
local dFacElev1 = BL.GetFaceElevation( Proc, tFaceLong[vOrd[1]], b3Solid)
|
||||
local dFacElev2 = BL.GetFaceElevation( Proc, tFaceLong[vOrd[2]], b3Solid)
|
||||
local bFacesSwapped = false
|
||||
if bInt and not bConvex and dFacElev1 - 10* GEO.EPS_SMALL > dFacElev2 then
|
||||
vOrd[1], vOrd[2] = vOrd[2], vOrd[1]
|
||||
dFacElev1, dFacElev2 = dFacElev2, dFacElev1
|
||||
bFacesSwapped = true
|
||||
end
|
||||
-- se fresa di fianco o da sotto calcolo quanto l'utensile può andare vicino al limite se l'elevazione della faccia è minore del raggio utensile
|
||||
if nUseMillOnSide <= 1 or nSide == -1 then
|
||||
local dFacElev = max( dFacElev1, dFacElev2)
|
||||
@@ -1642,6 +1690,11 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
||||
dEndAccDist = 0
|
||||
end
|
||||
end
|
||||
if Proc.bMoveAfterSplit then
|
||||
nC = 1
|
||||
dStartDist = Proc.Box:getDimX() - ( dToolDiam / 2 + 5)
|
||||
dEndDist = - ( dToolDiam / 2 + 5)
|
||||
end
|
||||
-- ciclo sulle parti
|
||||
local nM = 0
|
||||
for j = 1, nC do
|
||||
@@ -1724,7 +1777,7 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
||||
local ptC3 = EgtSurfTmFacetCenter( Proc.Id, tFaceLong[vOrd[i]], GDB_ID.ROOT)
|
||||
local ptDir = ptC3 - ptM ; ptDir:normalize()
|
||||
-- se concave e dal versore Z della faccia (> -20°) o convesso e versore Z ( > -30°) decido se eseguire la lavoraione con la testa da sopra o da sotto
|
||||
if ( not bConvex and vtN[vOrd[i]]:getZ() > -0.9397 and ptDir:getZ() > 0) or
|
||||
if ( not bConvex and vtN[vOrd[i]]:getZ() > -0.9397 and ptDir:getZ() > -0.017) or
|
||||
( bConvex and vtN[vOrd[i]]:getZ() > -0.866 and ptDir:getZ() > 0) then
|
||||
sNameF = sPrefix .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) .. '_' .. tostring( nM)
|
||||
nMchFId = EgtAddMachining( sNameF, sMilling)
|
||||
@@ -1832,9 +1885,39 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
||||
EgtSetMachiningParam( MCH_MP.FACEUSE, vFaceUse[vOrd[i]])
|
||||
end
|
||||
end
|
||||
|
||||
if bFacesSwapped then
|
||||
local dCurrStartAddLen = EgtGetMachiningParam( MCH_MP.STARTADDLEN)
|
||||
local dCurrEndAddLen = EgtGetMachiningParam( MCH_MP.ENDADDLEN)
|
||||
EgtSetMachiningParam( MCH_MP.STARTADDLEN, dCurrEndAddLen)
|
||||
EgtSetMachiningParam( MCH_MP.ENDADDLEN, dCurrStartAddLen)
|
||||
end
|
||||
|
||||
-- imposto lato di lavoro e inversione
|
||||
EgtSetMachiningParam( MCH_MP.WORKSIDE, EgtIf( bIsMachDownUp, MCH_MILL_WS.RIGHT, MCH_MILL_WS.LEFT))
|
||||
EgtSetMachiningParam( MCH_MP.INVERT, true)
|
||||
|
||||
-- si aggiusta la direzione di lavoro in base a rotazione utensile e preferenza utente (nUseConventionalMilling da fuori o Q14)
|
||||
EgtMdbSetCurrMachining( sMilling)
|
||||
local bIsCurrentToolCCW = EgtMdbGetCurrMachiningParam( MCH_MP.SPEED) < 0
|
||||
if nUseConventionalMilling == nil then
|
||||
nUseConventionalMilling = EgtGetInfo( Proc.Id, 'Q14', 'd') or 0
|
||||
end
|
||||
local bUseConventionalMilling = false
|
||||
if nUseConventionalMilling == 1 or ( nUseConventionalMilling == 2 and vtN[vOrd[i]]:getX() < 0.1 and Proc.AffectedFaces.Bottom) then
|
||||
bUseConventionalMilling = true
|
||||
end
|
||||
if bIsCurrentToolCCW ~= bUseConventionalMilling then
|
||||
local dCurrStartAddLen = EgtGetMachiningParam( MCH_MP.STARTADDLEN)
|
||||
local dCurrEndAddLen = EgtGetMachiningParam( MCH_MP.ENDADDLEN)
|
||||
local bCurrInvert = EgtGetMachiningParam( MCH_MP.INVERT)
|
||||
local nCurrWorkside = EgtGetMachiningParam( MCH_MP.WORKSIDE)
|
||||
EgtSetMachiningParam( MCH_MP.STARTADDLEN, dCurrEndAddLen)
|
||||
EgtSetMachiningParam( MCH_MP.ENDADDLEN, dCurrStartAddLen)
|
||||
EgtSetMachiningParam( MCH_MP.INVERT, not bCurrInvert)
|
||||
EgtSetMachiningParam( MCH_MP.WORKSIDE, EgtIf( nCurrWorkside == MCH_MILL_WS.LEFT, MCH_MILL_WS.RIGHT, MCH_MILL_WS.LEFT))
|
||||
end
|
||||
|
||||
-- calcolo la componente dNz non in base alla classificazione della feature (sopra, sotto, fianchi) ma alla componente maggiore
|
||||
-- local dNz = EgtIf( nSide == 0, vtN[vOrd[i]]:getY(), vtN[vOrd[i]]:getZ())
|
||||
-- local dNz = EgtIf( abs(vtN[vOrd[i]]:getY()) >= abs(vtN[vOrd[i]]:getZ()), vtN[vOrd[i]]:getY(), vtN[vOrd[i]]:getZ())
|
||||
|
||||
@@ -128,8 +128,9 @@ end
|
||||
local nFaceUse = BL.GetNearestParalOpposite( vtN)
|
||||
EgtSetMachiningParam( MCH_MP.FACEUSE, nFaceUse)
|
||||
-- applico il parametro plunge, che setta la lavorazione per affondare solamente, senza lavorare tutto il contorno; 1: solo lato iniziale, 2: solo lato finale, 3: entrambi
|
||||
local sNotes = 'Plunge=3;'
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sNotes)
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'Plunge' , 3)
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
-- imposto angolo 3° asse rot
|
||||
local vtOrtho = BL.GetVersRef( nFaceUse)
|
||||
EgtSetMachiningParam( MCH_MP.BLOCKEDAXIS, BL.GetBlockedAxis( sMortising, 'perpendicular'))
|
||||
@@ -692,7 +693,8 @@ function ProcessMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
end
|
||||
end
|
||||
-- imposto elevazione
|
||||
local sUserNotes = 'MaxElev=' .. EgtNumToString( dMorH, 1) .. ';'
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dMorH, 1))
|
||||
-- se lavorazione in doppio
|
||||
if Proc.Double and Proc.Double > 0 then
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'DOUBLE', Proc.Double)
|
||||
@@ -752,7 +754,9 @@ function ProcessMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
-- setto profondità
|
||||
EgtSetMachiningParam( MCH_MP.DEPTH, -nDepthMin+BD.CUT_EXTRA)
|
||||
-- imposto elevazione
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, 'MaxElev=' .. EgtNumToString( (-nDepthMin+BD.CUT_EXTRA), 1) .. ';')
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( (-nDepthMin+BD.CUT_EXTRA), 1))
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
-- eseguo
|
||||
if not ML.ApplyMachining( true, false) then
|
||||
local _, sErr = EgtGetLastMachMgrError()
|
||||
|
||||
@@ -666,7 +666,9 @@ function ProcessProfConcave.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
else
|
||||
EgtSetMachiningParam( MCH_MP.FACEUSE, MCH_MILL_FU.ORTUP_TOP)
|
||||
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.LEFT)
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, 'MaxElev=' .. EgtNumToString( (dToolMaxDepth/2), 1))
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( (dToolMaxDepth/2), 1))
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
end
|
||||
EgtSetMachiningParam( MCH_MP.INVERT, false)
|
||||
EgtSetMachiningParam( MCH_MP.DEPTH_STR, 'TH')
|
||||
@@ -716,7 +718,9 @@ function ProcessProfConcave.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
EgtSetMachiningParam( MCH_MP.DEPTH_STR, 'TH')
|
||||
EgtSetMachiningParam( MCH_MP.STEP, 0)
|
||||
EgtSetMachiningParam( MCH_MP.OFFSR, 0)
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, 'MaxElev=' .. EgtNumToString( dWidth, 1))
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dWidth, 1))
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
if BD.TURN then
|
||||
local nSCC = GetSccForTurn( vtN)
|
||||
EgtSetMachiningParam( MCH_MP.SCC, nSCC)
|
||||
|
||||
@@ -666,7 +666,9 @@ function ProcessProfConvex.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
else
|
||||
EgtSetMachiningParam( MCH_MP.FACEUSE, MCH_MILL_FU.ORTUP_TOP)
|
||||
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.LEFT)
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, 'MaxElev=' .. EgtNumToString( (dToolMaxDepth/2), 1))
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( (dToolMaxDepth/2), 1))
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
end
|
||||
EgtSetMachiningParam( MCH_MP.INVERT, false)
|
||||
EgtSetMachiningParam( MCH_MP.DEPTH_STR, 'TH')
|
||||
@@ -716,7 +718,9 @@ function ProcessProfConvex.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
EgtSetMachiningParam( MCH_MP.DEPTH_STR, 'TH')
|
||||
EgtSetMachiningParam( MCH_MP.STEP, 0)
|
||||
EgtSetMachiningParam( MCH_MP.OFFSR, 0)
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, 'MaxElev=' .. EgtNumToString( dWidth, 1))
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dWidth, 1))
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
if BD.TURN then
|
||||
local nSCC = GetSccForTurn( vtN)
|
||||
EgtSetMachiningParam( MCH_MP.SCC, nSCC)
|
||||
|
||||
@@ -602,7 +602,9 @@ function ProcessProfFront.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
EgtSetMachiningParam( MCH_MP.DEPTH_STR, 'TH')
|
||||
EgtSetMachiningParam( MCH_MP.STEP, 0)
|
||||
EgtSetMachiningParam( MCH_MP.OFFSR, 0)
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, 'MaxElev=' .. EgtNumToString( dWidth, 1))
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dWidth, 1))
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
-- imposto tipo uso faccia
|
||||
local nFaceUse = MCH_MILL_FU.PARAL_DOWN
|
||||
if nSide == -1 then
|
||||
|
||||
@@ -657,7 +657,9 @@ function ProcessProfHead.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
EgtSetMachiningParam( MCH_MP.DEPTH_STR, 'TH')
|
||||
EgtSetMachiningParam( MCH_MP.STEP, 0)
|
||||
EgtSetMachiningParam( MCH_MP.OFFSR, 0)
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, 'MaxElev=' .. EgtNumToString( dElev, 1))
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dElev, 1))
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
-- imposto posizione braccio
|
||||
local nSCC = MCH_SCC.ADIR_YM
|
||||
if nSide == 0 then
|
||||
@@ -697,7 +699,9 @@ function ProcessProfHead.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
EgtSetMachiningParam( MCH_MP.DEPTH_STR, 'TH')
|
||||
EgtSetMachiningParam( MCH_MP.STEP, 0)
|
||||
EgtSetMachiningParam( MCH_MP.OFFSR, 0)
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, 'MaxElev=' .. EgtNumToString( dElev, 1))
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dElev, 1))
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
-- imposto posizione braccio
|
||||
local nSCC = MCH_SCC.ADIR_YM
|
||||
if nSide == 0 then
|
||||
|
||||
@@ -578,7 +578,9 @@ function ProcessScarfJoint.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, dOvmTa
|
||||
EgtSetMachiningGeometry( {{ Proc.Id, vFaceOrd[2]-1}})
|
||||
-- imposto elevazione
|
||||
if dDistFaces then
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, 'MaxElev=' .. EgtNumToString( dDistFaces, 1) .. ';')
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dDistFaces, 1))
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
end
|
||||
-- eseguo
|
||||
if not ML.ApplyMachining( true, false) then
|
||||
|
||||
@@ -198,7 +198,13 @@ local function MakeTailChamfer( idProc, nPartId, dDepthTailChamfer)
|
||||
EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.LEFT))
|
||||
|
||||
local dQ09Value = EgtGetInfo( idProc, 'Q09', 'd')
|
||||
if not dQ09Value then
|
||||
dQ09Value = 0.1
|
||||
end
|
||||
local bChamferedEdge = dQ09Value > 0
|
||||
dQ09Value = EgtIf( bChamferedEdge, max( dQ09Value, 0.1), min( dQ09Value, -0.1))
|
||||
|
||||
|
||||
|
||||
local nIdFirstEntity, nEntityCnt = EgtExplodeCurveCompo( nLoopId)
|
||||
local p3MidPoint = EgtMP( nIdFirstEntity, GDB_ID.GRID)
|
||||
@@ -234,6 +240,9 @@ local function MakeTailChamfer( idProc, nPartId, dDepthTailChamfer)
|
||||
end
|
||||
EgtChangeClosedCurveStartPoint( idGeom, p3MidPoint, GDB_RT.GRID)
|
||||
|
||||
-- reimposto la griglia
|
||||
EgtSetGridFrame()
|
||||
|
||||
-- Inserisco la lavorazione del lato standard
|
||||
local dExtra = 2
|
||||
local sName1 = 'TailCham_' .. ( EgtGetName( idProc) or tostring( idProc))
|
||||
@@ -825,7 +834,7 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrSt
|
||||
-- determinazione materiale da asportare
|
||||
local dSawThickCheck = dSawThick
|
||||
if dSawThick2 > 0 and bDoubleHorizCut then
|
||||
dSawThickCheck = min( dSawThick, dSawThick2)
|
||||
dSawThickCheck = max( min( dSawThick, dSawThick2), dOvmTail)
|
||||
end
|
||||
local dMaxElev = 0
|
||||
if vtN:getX() > 0 then
|
||||
|
||||
+154
-34
@@ -140,6 +140,112 @@ local function MakeChamfer( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
return true
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function MakePocket( Proc, nPartId, ptPs, vtN, nFaceRef, nDiffWidth, sMchFind, nUseRoughTool, tBHx)
|
||||
|
||||
-- calcolo il elevazione dal punto medio
|
||||
local dElev
|
||||
local dLenIn, dLedOut = BL.GetPointDirDepth( nPartId, ptPs, vtN[nFaceRef])
|
||||
if dLenIn > 0 then
|
||||
dElev = dLenIn
|
||||
elseif dLedOut then
|
||||
dElev = dLedOut
|
||||
end
|
||||
local dCollSic = 2 * BD.COLL_SIC
|
||||
local sTuuidMstr
|
||||
-- calcolo il diametro utensile
|
||||
local dDiamTool
|
||||
if nUseRoughTool == 1 then
|
||||
-- se feature passante prendo utensile più grande possibile
|
||||
if ( Proc.AffectedFaces.Top and Proc.AffectedFaces.Bottom) or ( Proc.AffectedFaces.Front and Proc.AffectedFaces.Back) then
|
||||
dDiamTool = nil
|
||||
else
|
||||
dDiamTool = max( 80, min( tBHx[nFaceRef][1], tBHx[nFaceRef][2]))
|
||||
end
|
||||
else
|
||||
-- se non uso truciolatore prendo il valore dalle dimensioni minime delle facce
|
||||
dDiamTool = min( tBHx[nFaceRef][1], tBHx[nFaceRef][2])
|
||||
end
|
||||
-- abilitazione lavorazione da sotto (testa da sotto e direzione normale sotto -30deg)
|
||||
local bTopHead = ( BD.DOWN_HEAD and vtN[nFaceRef]:getZ() > -0.1)
|
||||
local bDownHead = ( BD.DOWN_HEAD and vtN[nFaceRef]:getZ() < 0.1)
|
||||
-- recupero la lavorazione
|
||||
local sPocketing, _, _, bDownHead = ML.FindPocketing( sMchFind.. EgtIf( bDownHead, '_H2', ''), dDiamTool, dElev + dCollSic, nil, bTopHead, bDownHead)
|
||||
if not sPocketing then
|
||||
local sErr = 'Error : pocketing not found in library'
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
-- recupero il diametro dell'utensile
|
||||
if EgtMdbSetCurrMachining( sPocketing) then
|
||||
sTuuidMstr = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID)
|
||||
if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuidMstr) or '') then
|
||||
dDiamTool = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dDiamTool
|
||||
end
|
||||
end
|
||||
-- inserisco la lavorazione di svuotatura
|
||||
local sName = 'Pock_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) .. 'F' .. tostring( nFaceRef - 1)
|
||||
local nMchFId = EgtAddMachining( sName, sPocketing)
|
||||
if not nMchFId then
|
||||
local sErr = 'Error adding machining ' .. sName .. '-' .. sPocketing
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
-- aggiungo geometria
|
||||
EgtSetMachiningGeometry( {{ Proc.Id, (nFaceRef-1)}})
|
||||
-- imposto uso faccia
|
||||
EgtSetMachiningParam( MCH_MP.FACEUSE, MCH_MILL_FU.ORTHO_CONT)
|
||||
-- imposto posizione braccio porta testa
|
||||
if vtN[nFaceRef]:getY() < GEO.EPS_SMALL then
|
||||
EgtSetMachiningParam( MCH_MP.SCC, MCH_SCC.ADIR_YM)
|
||||
else
|
||||
EgtSetMachiningParam( MCH_MP.SCC, MCH_SCC.ADIR_YP)
|
||||
end
|
||||
-- La tasca ha sempre almeno un lato aperto, imposto opportuno attacco
|
||||
EgtSetMachiningParam( MCH_MP.SUBTYPE, MCH_POCK_SUB.SPIRALIN)
|
||||
-- imposto elevazione
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dElev, 1))
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
if not ML.ApplyMachining( true, false) then
|
||||
-- provo ad allargare leggermente la tasca
|
||||
EgtSetMachiningParam( MCH_MP.OFFSR, -0.1)
|
||||
if not ML.ApplyMachining( true, false) then
|
||||
local _, sErr = EgtGetLastMachMgrError()
|
||||
EgtSetOperationMode( nMchFId, false)
|
||||
return false, sErr
|
||||
end
|
||||
end
|
||||
return true, '', sTuuidMstr
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function MachineByMill( Proc, nPhase, nRawId, nPartId, b3Solid, ptC, vtN, nBigInd, nSmaInd, ptPs, tBHx, b3Raw, nDiffWidth, nUseRoughTool, dAng)
|
||||
|
||||
local sMchFind = 'Pocket'
|
||||
-- se feature é larga come trave imposto openpocket
|
||||
if nDiffWidth == 0 then
|
||||
sMchFind = 'OpenPocket'
|
||||
-- altrimenti se non è passante disabilito il truciolatore
|
||||
else
|
||||
nUseRoughTool = 0
|
||||
end
|
||||
-- applico la svuotatura
|
||||
local bOk, sErr, sTuuidMstr = MakePocket( Proc, nPartId, ptPs, vtN, nBigInd, nDiffWidth, sMchFind, nUseRoughTool, tBHx)
|
||||
if not bOk then
|
||||
return bOk, sErr
|
||||
end
|
||||
-- se angolo tra le facce maggiore di 90, inserisco la contornatura o svuotatura del lato più corto
|
||||
if dAng > -90 then
|
||||
-- applico la svuotatura
|
||||
local bOk, sErr = MakePocket( Proc, nPartId, ptPs, vtN, nSmaInd, nDiffWidth, sMchFind, nUseRoughTool, tBHx)
|
||||
if not bOk then
|
||||
return bOk, sErr
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- Applicazione della lavorazione al caso due facce
|
||||
local function MakeTwoFaces( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
@@ -156,6 +262,7 @@ local function MakeTwoFaces( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
return false, sErr
|
||||
end
|
||||
-- dati delle facce
|
||||
local tBHx = {}
|
||||
local ptC = {}
|
||||
local vtN = {}
|
||||
ptC[1], vtN[1] = EgtSurfTmFacetCenter( Proc.Id, 0, GDB_ID.ROOT)
|
||||
@@ -183,11 +290,13 @@ local function MakeTwoFaces( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
end
|
||||
-- recupero i dati dell'utensile
|
||||
local dSawDiam = 400
|
||||
local dSawThick = 2
|
||||
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
|
||||
@@ -239,47 +348,58 @@ local function MakeTwoFaces( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
vtRef[2] = vtN[2] ^ vtTg
|
||||
if vtRef[2] * vtN[1] < 0 then vtRef[2] = - vtRef[2] end
|
||||
-- determino quale faccia è più grande
|
||||
local _, dB1, dH1 = EgtSurfTmFacetMinAreaRectangle( Proc.Id, 0)
|
||||
local _, dB2, dH2 = EgtSurfTmFacetMinAreaRectangle( Proc.Id, 1)
|
||||
local rfFac1, dB1, dH1 = EgtSurfTmFacetMinAreaRectangle( Proc.Id, 0)
|
||||
local rfFac2, dB2, dH2 = EgtSurfTmFacetMinAreaRectangle( Proc.Id, 1)
|
||||
local nBigInd = EgtIf( dB1 * dH1 >= dB2 * dH2, 1, 2)
|
||||
local nSmaInd = 3 - nBigInd
|
||||
-- calcolo extra taglio
|
||||
local dCutExtra = dExtraUp
|
||||
if dAng < -90.5 and dAng > -179.5 then
|
||||
dCutExtra = - dSawThick / tan( 180 + dAng) + dExtraUp
|
||||
end
|
||||
-- verifico se necessari tagli supplementari
|
||||
local vCuts = DC.GetDice( nAddGrpId, b3Solid, ptC[nBigInd], vtN[nBigInd], false, ptC[nSmaInd], vtN[nSmaInd])
|
||||
--DC.PrintOrderCut( vCuts)
|
||||
if #vCuts > 0 then
|
||||
-- sistemo posizione nel DB e nome
|
||||
for i = 1, #vCuts do
|
||||
for j = 1, #vCuts[i] do
|
||||
EgtSetName( vCuts[i][j], 'AddCut_' .. tostring( Proc.Id))
|
||||
EgtSetInfo( vCuts[i][j], 'TASKID', Proc.TaskId)
|
||||
end
|
||||
end
|
||||
-- eseguo
|
||||
for i = 1, #vCuts do
|
||||
-- assegno il modo di tagliare
|
||||
local vtOrthO = EgtIf( ( i % 2) == 1, vtRef[nSmaInd], vtRef[nBigInd])
|
||||
-- lavoro la faccia
|
||||
for j = 1, #vCuts[i] do
|
||||
local dLocCutExtra = EgtIf( j == #vCuts[i], dCutExtra - dExtraUp, dCutExtra)
|
||||
local bOk, sErr = Fbs.MakeOne( vCuts[i][j], 0, sCutting, dSawDiam, vtOrthO, nil, dLocCutExtra, BD.CUT_SIC, 0, 0, 0, nil, b3Raw)
|
||||
if not bOk then
|
||||
return bOk, sErr
|
||||
end
|
||||
end
|
||||
end
|
||||
-- altrimenti, tagli diretti delle facce
|
||||
else
|
||||
local bOk, sErr = Fbs.MakeTwo( Proc, nPhase, nRawId, nPartId, dOvmHead, EgtIf( bHead, 'HeadSide', 'TailSide'))
|
||||
tBHx[1] = {dH1, dV1, rfFac1}
|
||||
tBHx[2] = {dH2, dV2, rfFac2}
|
||||
local nUseRoughTool = EgtGetInfo( Proc.Id, 'Q02', 'i')
|
||||
if nUseRoughTool == 1 and dAng < -0.1 and dAng > -90 then
|
||||
local bOk, sErr = MachineByMill( Proc, nPhase, nRawId, nPartId, b3Solid, ptC, vtN, nBigInd, nSmaInd, ptPs, tBHx, b3Raw, 0, nUseRoughTool, dAng)
|
||||
if not bOk then
|
||||
return bOk, sErr
|
||||
end
|
||||
else
|
||||
-- calcolo extra taglio
|
||||
local dCutExtra = dExtraUp
|
||||
if dAng < -90.5 and dAng > -179.5 then
|
||||
dCutExtra = - dSawThick / tan( 180 + dAng) + dExtraUp
|
||||
end
|
||||
-- verifico se necessari tagli supplementari
|
||||
local vCuts = DC.GetDice( nAddGrpId, b3Solid, ptC[nBigInd], vtN[nBigInd], false, ptC[nSmaInd], vtN[nSmaInd])
|
||||
--DC.PrintOrderCut( vCuts)
|
||||
if #vCuts > 0 then
|
||||
-- sistemo posizione nel DB e nome
|
||||
for i = 1, #vCuts do
|
||||
for j = 1, #vCuts[i] do
|
||||
EgtSetName( vCuts[i][j], 'AddCut_' .. tostring( Proc.Id))
|
||||
EgtSetInfo( vCuts[i][j], 'TASKID', Proc.TaskId)
|
||||
end
|
||||
end
|
||||
-- eseguo
|
||||
for i = 1, #vCuts do
|
||||
-- assegno il modo di tagliare
|
||||
local vtOrthO = EgtIf( ( i % 2) == 1, vtRef[nSmaInd], vtRef[nBigInd])
|
||||
-- lavoro la faccia
|
||||
for j = 1, #vCuts[i] do
|
||||
local dLocCutExtra = EgtIf( j == #vCuts[i], dCutExtra - dExtraUp, dCutExtra)
|
||||
local bOk, sErr = Fbs.MakeOne( vCuts[i][j], 0, sCutting, dSawDiam, vtOrthO, nil, dLocCutExtra, BD.CUT_SIC, 0, 0, 0, nil, b3Raw)
|
||||
if not bOk then
|
||||
return bOk, sErr
|
||||
end
|
||||
end
|
||||
end
|
||||
-- altrimenti, tagli diretti delle facce
|
||||
else
|
||||
local bOk, sErr = Fbs.MakeTwo( Proc, nPhase, nRawId, nPartId, dOvmHead, EgtIf( bHead, 'HeadSide', 'TailSide'))
|
||||
if not bOk then
|
||||
return bOk, sErr
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- eventuale segnalazione ingombro di testa o coda
|
||||
if Proc.Head then
|
||||
local dOffs = b3Raw:getMax():getX() - dOvmHead - Proc.Box:getMin():getX()
|
||||
|
||||
@@ -181,8 +181,9 @@ local function MakePocket( Proc, nPartId, ptPs, vtN, nFaceRef, nDiffWidth, sMchF
|
||||
-- La tasca ha sempre almeno un lato aperto, imposto opportuno attacco
|
||||
EgtSetMachiningParam( MCH_MP.SUBTYPE, MCH_POCK_SUB.SPIRALIN)
|
||||
-- imposto elevazione
|
||||
local sNotes = 'MaxElev=' .. EgtNumToString( dElev, 1) .. ';'
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sNotes)
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dElev, 1))
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
if not ML.ApplyMachining( true, false) then
|
||||
-- provo ad allargare leggermente la tasca
|
||||
EgtSetMachiningParam( MCH_MP.OFFSR, -0.1)
|
||||
|
||||
@@ -236,7 +236,9 @@ function ProcessTenon.Make( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
-- assegno affondamento e offset radiale
|
||||
EgtSetMachiningParam( MCH_MP.DEPTH, -dTenH + dDepth + dExtra)
|
||||
EgtSetMachiningParam( MCH_MP.OFFSR, dExtra)
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, 'MaxElev=' .. EgtNumToString( dDepth + dExtra, 1) .. ';')
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dDepth + dExtra, 1))
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
-- assegno lato di lavoro
|
||||
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.RIGHT)
|
||||
-- eseguo
|
||||
@@ -309,7 +311,8 @@ function ProcessTenon.Make( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
-- aggiungo geometria
|
||||
EgtSetMachiningGeometry( {{ AuxId, -1}})
|
||||
-- sistemo i parametri
|
||||
local sUserNotes = EgtSetVal( 'MaxElev', EgtNumToString( dTenH - 100 * GEO.EPS_SMALL, 1)) .. ';'
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dTenH - 100 * GEO.EPS_SMALL, 1))
|
||||
if i < nPass then sUserNotes = EgtSetValInNotes( sUserNotes, 'OutRaw', 3) end
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
EgtSetMachiningParam( MCH_MP.DEPTH, dDepth)
|
||||
|
||||
@@ -451,12 +451,12 @@ local function MakeMillCut( Proc, i, j, k, sMilling, nFacInd, TabNAD, rfFac, dOf
|
||||
EgtSetMachiningParam( MCH_MP.STARTADDLEN, ( dToolDiam * 0.75))
|
||||
EgtSetMachiningParam( MCH_MP.ENDADDLEN, ( dToolDiam * 0.75))
|
||||
-- Note utente con dichiarazione nessuna generazione sfridi per Vmill solo in ultima passata in Z locale
|
||||
local sUserNotes
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
if i < nStep then
|
||||
sUserNotes = 'MaxElev=' .. EgtNumToString( dStep, 1) .. ';'
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dStep, 1))
|
||||
else
|
||||
sUserNotes = 'VMRS=0;'
|
||||
sUserNotes = sUserNotes .. 'MaxElev=' .. EgtNumToString( dStep, 1) .. ';'
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'VMRS', 0)
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dStep, 1))
|
||||
end
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
-- eseguo
|
||||
|
||||
@@ -142,7 +142,9 @@ local function MakePocket( Proc, nRawId, b3Raw, nPartId)
|
||||
end
|
||||
EgtSetMachiningParam( MCH_MP.DEPTH, min( 0, dMaxDepth - vDepth[i]))
|
||||
-- imposto elevazione
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, 'MaxElev=' .. EgtNumToString( dMaxDepth, 1) .. ';')
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dMaxDepth, 1))
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
-- eseguo
|
||||
if not ML.ApplyMachining( true, false) then
|
||||
local _, sErr = EgtGetLastMachMgrError()
|
||||
|
||||
+34
-1
@@ -1,7 +1,40 @@
|
||||
==== Beam Update Log ====
|
||||
Versione 3.1d1 (08/04/2026)
|
||||
- Added : le forature vengono accorciate con massima elevazione anche in presenza di tagli di testa
|
||||
- Modif : nelle slot con lama verticali si lavora sempre in concordanza
|
||||
- Fixed : in DtMortise correzione a lavorazione antischeggia
|
||||
- Fixed : in LapJoint, se lavorazione vuota, si disattiva sempre; in Q02 si lavora sempre prima il lato sotto.
|
||||
|
||||
Versione 3.1c2 (18/03/2026)
|
||||
- Added : in LapJoint (solo L030) aggiunto Q02 per fare solo contorno per forme a "C" e tunnel; Q17 spessore di eventuale codolo
|
||||
- Modif : per LapJoint e simili il Q06 per antischeggia ora contempla il valore 3 per scegliere la strategia in automatico (lama o fresa)
|
||||
- Modif : in LapJoint migliorie nella lavorazione delle tasche aperte
|
||||
- Modif : in LongDoubleCut e LapJoint lunghe migliorata scelta fresa in caso di tasca che guarda verso il basso
|
||||
- Fixed : in forature in doppio con svuotatura corretto ultimo step
|
||||
- Fixed : in split correzione in caso di materiale di coda molto sottile e testa sotto
|
||||
- Fixed : in LongDoubleCut e LapJoint lunghe eliminata passate finale dopo taglio di coda se non è presente un grezzo successivo
|
||||
|
||||
Versione 3.1c1 (04/03/2026)
|
||||
- Fixed : correzione in ordinamento (fori vs tagli)
|
||||
- Fixed : in drilling rimosso preforo duplicato
|
||||
|
||||
Versione 3.1b1 (26/02/2026)
|
||||
- Added : in LapJoint lunghe gestito Q14 per lavorare discorde
|
||||
- Added : in forature ora sono possibili le DrillPocket in doppio (ultimo step fatto dalla testa principale)
|
||||
- Added : in FreeContour (contornatura) aggiunta Q10 per forzare massima elevazione
|
||||
- Modif : in LongDoubleCut e LapJoint lunghe migliorata la scelta della faccia da lavorare e altre migliorie
|
||||
- Modif : in LapJoint migliorie alle svuotature
|
||||
- Modif : in LapJoint lunghe, negli spezzoni successivi al primo, le svuotature considerano l'area svuotata precedente
|
||||
- Fixed : in forature in doppio si garantisce l'ultimo step per evitare collisioni delle punte o finecorsa
|
||||
- Fixed : in mortasa a coda di rondine tagliata corretti ingresso uscita in caso di svuotatura
|
||||
- Fixed : in tagli di testa e coda corretti smussi con P08 e P09
|
||||
|
||||
Versione 2.7l3 (23/12/2025)
|
||||
- Modif : nei fori che attraversano un taglio si decide la precedenza in base all'angolo tra foro e taglio stesso
|
||||
- Fixed : corretto precut in caso di sega a catena
|
||||
|
||||
Versione 2.7l2 (16/12/2025)
|
||||
- Added : in LapJoint pulizia spigoli con fresa a V su tasche passanti
|
||||
- Added : in LapJoint pulizia spigoli con fresa a V su tasche non passanti
|
||||
|
||||
Versione 2.7l1 (10/12/2025)
|
||||
- Added : in LapJoint aggiunta gestione fresatura con aggregato flottante (Q specifica)
|
||||
|
||||
+3
-3
@@ -1,6 +1,6 @@
|
||||
-- Version.lua by Egaltech s.r.l. 2024/01/30
|
||||
-- Version.lua by Egaltech s.r.l. 2026/02/09
|
||||
-- Gestione della versione di Beam
|
||||
|
||||
NAME = 'Beam'
|
||||
VERSION = '2.7l2'
|
||||
MIN_EXE = '2.7f2'
|
||||
VERSION = '3.1d1'
|
||||
MIN_EXE = '3.1b1'
|
||||
|
||||
Reference in New Issue
Block a user