Compare commits
65 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e0c4f85bfb | |||
| 675b730dcf | |||
| 0f122feaac | |||
| eec524a00f | |||
| d4b7fe1910 | |||
| 880cecfde2 | |||
| b05d1aa7b8 | |||
| b775610125 | |||
| 9e284d509b | |||
| dd7a1e80b2 | |||
| 919b32ca8d | |||
| fef5db6046 | |||
| 0d5dd4d348 | |||
| e526502177 | |||
| 325f30c61b | |||
| f824cde2d0 | |||
| a61b27f292 | |||
| e582f7a38b | |||
| a813d5d742 | |||
| 93e92da027 | |||
| d862e8a2c5 | |||
| d79151c1d3 | |||
| 3d62e41811 | |||
| c796a5351f | |||
| 00d7dd2970 | |||
| eb09d0b65d | |||
| 0c7a7daba4 | |||
| 6f14e4f2c2 | |||
| 950060f4dc | |||
| 1007e08e9d | |||
| 04acc25535 | |||
| 38e26b9e48 | |||
| 72b7cbac1b | |||
| 5f1b863013 | |||
| 250802048a | |||
| a8d0bcfec4 | |||
| 459eff5610 | |||
| a749895229 | |||
| 04489421e7 | |||
| 0c16b5e969 | |||
| 9193924fbd | |||
| adbd5e944e | |||
| f76797cbd8 | |||
| 09e93d600d | |||
| 63f4df2a7d | |||
| 80c5035c74 | |||
| c9451e65e1 | |||
| 19706d6264 | |||
| 46ca7c793f | |||
| e26540193c | |||
| af107a780e | |||
| 4befa4eee3 | |||
| 07db2da825 | |||
| a4e6600510 | |||
| cb8465d977 | |||
| e867e1decf | |||
| 1cd697cf80 | |||
| 729143ce45 | |||
| 3f707396bb | |||
| 2b3a36a496 | |||
| d9e4285748 | |||
| 91d5b0ac84 | |||
| db5334217b | |||
| 54c835f717 | |||
| 86e2324856 |
+137
-25
@@ -442,7 +442,7 @@ local function CalcHeadTailMachBeforeIntersDrillings( vProc, b3Raw)
|
||||
local b3TailBox
|
||||
for i = 1, #vProc do
|
||||
local Proc = vProc[i]
|
||||
if Proc.Box and not Proc.Box:isEmpty() then
|
||||
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.Head and Proc.Box:getCenter():getX() < dHeadX then
|
||||
dHeadX = Proc.Box:getCenter():getX()
|
||||
@@ -467,6 +467,7 @@ end
|
||||
local function AnalyzeHeadFeatures( b3Solid, vProc, dRawW, dRawH)
|
||||
local nReplacedFeatureId = nil
|
||||
local bHeadFinishingNeeded = true
|
||||
local nCuttingFeatureId = nil
|
||||
for i = 1, #vProc do
|
||||
local Proc = vProc[i]
|
||||
-- controllo se esiste già una feature taglio di testa
|
||||
@@ -481,15 +482,19 @@ local function AnalyzeHeadFeatures( b3Solid, vProc, dRawW, dRawH)
|
||||
if Proc.Head and Proc.Id ~= nReplacedFeatureId and Proc.Prc ~= 340 then
|
||||
-- controllo se la feature taglia l'intera sezione; in caso positivo la finitura non è necessaria
|
||||
bHeadFinishingNeeded = not BL.IsFeatureCuttingEntireSection( Proc.Box, dRawW, dRawH)
|
||||
if not bHeadFinishingNeeded and ( ( Proc.Grp == 1 or Proc.Grp == 2) and Proc.Prc == 10) and ( Proc.Flg > 0) then
|
||||
nCuttingFeatureId = Proc.Id
|
||||
end
|
||||
end
|
||||
end
|
||||
return bHeadFinishingNeeded, nReplacedFeatureId
|
||||
return bHeadFinishingNeeded, nReplacedFeatureId, nCuttingFeatureId
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
local function AnalyzeTailFeatures( b3Solid, vProc, dRawW, dRawH)
|
||||
local nReplacedFeatureId = nil
|
||||
local bTailFinishingNeeded = true
|
||||
local nCuttingFeatureId = nil
|
||||
for i = 1, #vProc do
|
||||
local Proc = vProc[i]
|
||||
-- controllo se esistè già una feature taglio di coda
|
||||
@@ -504,9 +509,12 @@ local function AnalyzeTailFeatures( b3Solid, vProc, dRawW, dRawH)
|
||||
if Proc.Tail and Proc.Id ~= nReplacedFeatureId and Proc.Prc ~= 350 then
|
||||
-- controllo se la feature taglia l'intera sezione; in caso positivo la finitura non è necessaria
|
||||
bTailFinishingNeeded = not BL.IsFeatureCuttingEntireSection( Proc.Box, dRawW, dRawH)
|
||||
if not bTailFinishingNeeded and ( ( Proc.Grp == 1 or Proc.Grp == 2) and Proc.Prc == 10) and ( Proc.Flg > 0) then
|
||||
nCuttingFeatureId = Proc.Id
|
||||
end
|
||||
end
|
||||
end
|
||||
return bTailFinishingNeeded, nReplacedFeatureId
|
||||
return bTailFinishingNeeded, nReplacedFeatureId, nCuttingFeatureId
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
@@ -600,6 +608,22 @@ function BeamExec.ProcessBeams( dRawW, dRawH, dRawL, dOvmHead, dOvmMid, vBeam, b
|
||||
local b3Part = EgtGetBBoxGlob( Pz or GDB_ID.NULL, GDB_BB.EXACT)
|
||||
local b3Solid = vBeam[i].Box
|
||||
if b3Part:isEmpty() or b3Solid:isEmpty() then break end
|
||||
-- creo o pulisco gruppo geometrie aggiuntive
|
||||
if not BL.CreateOrEmptyAddGroup( Pz) then
|
||||
local sOut = 'Error creating Additional Group in Part ' .. tostring( Pz)
|
||||
return false, sOut
|
||||
end
|
||||
-- analizzo le features per valutare l'esistenza di feature head/tail che renderebbero inutili le rispettive finiture o di tagli di testa/coda sostituiti da cui leggere il parametro Q05
|
||||
local vProc = CollectFeatures( Pz, b3Solid, 0)
|
||||
local bSFinishingNeeded, nReplacedHeadCutFeatureId, nHeadCuttingFeatureId = AnalyzeHeadFeatures( b3Solid, vProc, dRawW, dRawH)
|
||||
local bEFinishingNeeded, nReplacedTailCutFeatureId, nTailCuttingFeatureId = AnalyzeTailFeatures( b3Solid, vProc, dRawW, dRawH)
|
||||
-- Scrivo gli di delle facce di taglio custom: serviranno dopo per calcolare l'elevazione rispetto a queste
|
||||
if nHeadCuttingFeatureId then
|
||||
EgtSetInfo( vBeam[i].Id, 'HEADCUTFEATUREID', nHeadCuttingFeatureId)
|
||||
end
|
||||
if nTailCuttingFeatureId then
|
||||
EgtSetInfo( vBeam[i].Id, 'TAILCUTFEATUREID', nTailCuttingFeatureId)
|
||||
end
|
||||
if bBigSectionCut then
|
||||
-- lascio in coda solo il materiale necessario; il resto verrà tolto nell'head cut successivo
|
||||
local lastB3Solid = nil
|
||||
@@ -612,9 +636,6 @@ function BeamExec.ProcessBeams( dRawW, dRawH, dRawL, dOvmHead, dOvmMid, vBeam, b
|
||||
dOffset = dOvmMid
|
||||
end
|
||||
end
|
||||
-- analizzo le features per valutare l'esistenza di feature head/tail che renderebbero inutili le rispettive finiture o di tagli di testa/coda sostituiti da cui leggere il parametro Q05
|
||||
local vProc = CollectFeatures( Pz, b3Solid, 0)
|
||||
local bSFinishingNeeded, nReplacedHeadCutFeatureId = AnalyzeHeadFeatures( b3Solid, vProc, dRawW, dRawH)
|
||||
local iSQ05Value = nil
|
||||
if nReplacedHeadCutFeatureId then
|
||||
iSQ05Value = EgtGetInfo( nReplacedHeadCutFeatureId, 'Q05', 'i')
|
||||
@@ -624,7 +645,6 @@ function BeamExec.ProcessBeams( dRawW, dRawH, dRawL, dOvmHead, dOvmMid, vBeam, b
|
||||
else
|
||||
DeltaSMin = BD.OVM_BLADE_HBEAM
|
||||
end
|
||||
local bEFinishingNeeded, nReplacedTailCutFeatureId = AnalyzeTailFeatures( b3Solid, vProc, dRawW, dRawH)
|
||||
local iEQ05Value = nil
|
||||
if nReplacedTailCutFeatureId then
|
||||
iEQ05Value = EgtGetInfo( nReplacedTailCutFeatureId, 'Q05', 'i')
|
||||
@@ -662,11 +682,7 @@ function BeamExec.ProcessBeams( dRawW, dRawH, dRawL, dOvmHead, dOvmMid, vBeam, b
|
||||
-- assegno ordine in lavorazione
|
||||
Cnt = Cnt + 1
|
||||
EgtSetInfo( nRaw, 'ORD', Cnt)
|
||||
-- creo o pulisco gruppo geometrie aggiuntive
|
||||
if not BL.CreateOrEmptyAddGroup( Pz) then
|
||||
local sOut = 'Error creating Additional Group in Part ' .. tostring( Pz)
|
||||
return false, sOut
|
||||
end
|
||||
|
||||
-- aggiungo faccia per taglio iniziale al pezzo
|
||||
BL.AddPartStartFace( Pz, b3Solid)
|
||||
-- se sovramateriale di testa, lo notifico
|
||||
@@ -780,7 +796,82 @@ local function PrintFeatures( vProc, b3Raw)
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
local function OrderFeatures( vProc, b3Raw)
|
||||
-- mi assicuro che i tagli di testa e coda troncanti (usati per ridurre i percorsi utensile in testa e coda) siano sempre fatti per primi
|
||||
local function ReorderTruncatingCuts( vProc, nPartId)
|
||||
if not nPartId or #vProc == 0 then return end
|
||||
|
||||
local nHeadCuttingFeatureId = EgtGetInfo( nPartId, 'HEADCUTFEATUREID', 'i')
|
||||
local nTailCuttingFeatureId = EgtGetInfo( nPartId, 'TAILCUTFEATUREID', 'i')
|
||||
|
||||
-- tagli di testa
|
||||
-- 1: si trovano gli indici del taglio di testa e del rispettivo taglio troncante
|
||||
local nHeadCutIndex, nHeadCuttingFeatureIndex
|
||||
for index, value in ipairs( vProc) do
|
||||
if value.Prc == 340 then
|
||||
nHeadCutIndex = index
|
||||
end
|
||||
if value.Id == nHeadCuttingFeatureId then
|
||||
nHeadCuttingFeatureIndex = index
|
||||
end
|
||||
end
|
||||
|
||||
-- 2: se non c'è il taglio di testa, il taglio troncante è il primo. Se c'è il taglio di testa, il taglio troncante lo deve seguire.
|
||||
if not nHeadCutIndex and nHeadCuttingFeatureIndex then
|
||||
local HeadCuttingFeature = vProc[ nHeadCuttingFeatureIndex]
|
||||
table.remove( vProc, nHeadCuttingFeatureIndex)
|
||||
table.insert( vProc, 1, HeadCuttingFeature)
|
||||
elseif nHeadCutIndex and nHeadCuttingFeatureIndex then
|
||||
if abs( nHeadCutIndex - nHeadCuttingFeatureIndex) ~= 1 then
|
||||
local HeadCut = vProc[ nHeadCutIndex]
|
||||
local HeadCuttingFeature = vProc[ nHeadCuttingFeatureIndex]
|
||||
|
||||
table.remove( vProc, nHeadCutIndex)
|
||||
-- rimuovere il primo potrebbe aver cambiato l'indice del secondo
|
||||
if nHeadCutIndex < nHeadCuttingFeatureIndex then
|
||||
nHeadCuttingFeatureIndex = nHeadCuttingFeatureIndex - 1
|
||||
end
|
||||
table.remove( vProc, nHeadCuttingFeatureIndex)
|
||||
|
||||
table.insert( vProc, nHeadCutIndex, HeadCut)
|
||||
table.insert( vProc, nHeadCutIndex + 1, HeadCuttingFeature)
|
||||
end
|
||||
end
|
||||
|
||||
-- tagli di coda
|
||||
-- 1: si trovano gli indici del taglio di coda e del rispettivo taglio troncante
|
||||
local nTailCutIndex, nTailCuttingFeatureIndex
|
||||
for index, value in ipairs( vProc) do
|
||||
if value.Prc == 350 then
|
||||
nTailCutIndex = index
|
||||
end
|
||||
if value.Id == nTailCuttingFeatureId then
|
||||
nTailCuttingFeatureIndex = index
|
||||
end
|
||||
end
|
||||
|
||||
-- 2: il taglio di coda c'è sempre. Il taglio troncante lo deve seguire.
|
||||
if nTailCutIndex and nTailCuttingFeatureIndex then
|
||||
if abs( nTailCutIndex - nTailCuttingFeatureIndex) ~= 1 then
|
||||
local TailCut = vProc[ nTailCutIndex]
|
||||
local TailCuttingFeature = vProc[ nTailCuttingFeatureIndex]
|
||||
|
||||
table.remove( vProc, nTailCutIndex)
|
||||
-- rimuovere il primo potrebbe aver cambiato l'indice del secondo
|
||||
if nTailCutIndex < nTailCuttingFeatureIndex then
|
||||
nTailCuttingFeatureIndex = nTailCuttingFeatureIndex - 1
|
||||
end
|
||||
table.remove( vProc, nTailCuttingFeatureIndex)
|
||||
|
||||
table.insert( vProc, nTailCutIndex, TailCut)
|
||||
table.insert( vProc, nTailCutIndex + 1, TailCuttingFeature)
|
||||
end
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
local function OrderFeatures( vProc, b3Raw, nPartId)
|
||||
|
||||
local dDrillPenalty = EgtIf( BD.PRESS_ROLLER, 200, 100)
|
||||
local dSmallDrillRange = EgtIf( b3Raw:getDimX() < BD.LEN_SHORT_PART, BD.DRILL_RANGE_SP or 200, BD.DRILL_RANGE or 600)
|
||||
@@ -901,12 +992,12 @@ local function OrderFeatures( vProc, b3Raw)
|
||||
if abs( B2.Box:getDimX() - b3Raw:getDimX()) < 0.2 * b3Raw:getDimX() then
|
||||
return not ( B1.Tail or B2.Box:getMin():getX() + 20 > B1.Box:getCenter():getX())
|
||||
end
|
||||
-- se primo è foro e l'altro no, lo penalizzo
|
||||
if Drill.Identify(B1) and not Drill.Identify(B2) then
|
||||
return ( B1.Box:getCenter():getX() > B2.Box:getMax():getX() + dDrillPenalty)
|
||||
-- se primo è foro e l'altro no, lo penalizzo (a patto che il foro non attraversi nessuna feature)
|
||||
if Drill.Identify(B1) and not B1.Dependency and not Drill.Identify(B2) then
|
||||
return ( B1.Box:getCenter():getX() > B2.Box:getMax():getX() + dDrillPenalty)
|
||||
end
|
||||
-- se primo è altro e secondo è foro, lo premio
|
||||
if not Drill.Identify(B1) and Drill.Identify(B2) then
|
||||
-- se primo è altro e secondo è foro, lo premio (a patto che il foro non attraversi nessuna feature)
|
||||
if not Drill.Identify(B1) and not B2.Dependency and Drill.Identify(B2) then
|
||||
return ( B1.Box:getMax():getX() + dDrillPenalty > B2.Box:getCenter():getX())
|
||||
end
|
||||
-- se prima è mortasa coda di rondine sul fianco e secondo taglio longitudinale, la coda di rondine va sempre prima
|
||||
@@ -1099,6 +1190,8 @@ local function OrderFeatures( vProc, b3Raw)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
ReorderTruncatingCuts( vProc, nPartId)
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
@@ -1852,7 +1945,9 @@ local function VerifyDrillMirrored( Proc, vProc, b3Raw)
|
||||
-- recupero la lunghezza della parte inclinata della punta
|
||||
local dToolDoubleTipLength = EgtTdbGetCurrToolParam( MCH_TP.TOTLEN) - EgtTdbGetCurrToolParam( MCH_TP.LEN)
|
||||
-- se foratura splittata, verifico che la distanza minima tra le due punte sia rispettata
|
||||
if abs( Proc.Flg) == 2 and not ( ( ( 2 * dDrillingStep - dToolTipLength - dToolDoubleTipLength) - MIRROR_DRILLINGS_MIN_DISTANCE) > 10 * GEO.EPS_SMALL) then
|
||||
local dTipDistance = 2 * dDrillingStep - dToolTipLength - dToolDoubleTipLength
|
||||
if abs( Proc.Flg) == 2 and not ( ( dTipDistance - MIRROR_DRILLINGS_MIN_DISTANCE) > 10 * GEO.EPS_SMALL) then
|
||||
EgtOutLog( 'Double drilling skipped, tip distance too small ( ' .. dTipDistance .. ' mm) ')
|
||||
return
|
||||
end
|
||||
-- verifico se in doppio
|
||||
@@ -2021,7 +2116,7 @@ local function AreDrillingsMirrored( Proc, ProcMirror, b3Raw)
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
function GetFeatureInfoAndDependency( vProc, b3Raw)
|
||||
function GetFeatureInfoAndDependency( vProc, b3Raw, nPartId)
|
||||
-- ciclo tutte le feature
|
||||
for i = 1, #vProc do
|
||||
local Proc = vProc[i]
|
||||
@@ -2046,7 +2141,8 @@ function GetFeatureInfoAndDependency( vProc, b3Raw)
|
||||
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) then
|
||||
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
|
||||
@@ -2062,6 +2158,22 @@ function GetFeatureInfoAndDependency( vProc, b3Raw)
|
||||
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
|
||||
@@ -2073,13 +2185,13 @@ function BeamExec.ProcessFeatures()
|
||||
end
|
||||
-- costanti per doppio
|
||||
MIRROR_DRILLINGS_MIN_DISTANCE = 40
|
||||
MIRROR_POCKETS_MIN_DISTANCE = 50
|
||||
MIRROR_POCKETS_MIN_DISTANCE = EgtIf( BD.DOWN_HEAD, 35, 50)
|
||||
-- verifica se possibile rotazione di 90 gradi
|
||||
BD.ROT90 = BD.ROT90 and Verify90DegRotation( EgtGetFirstRawPart())
|
||||
-- ciclo sui pezzi
|
||||
local nTotErr = 0
|
||||
local Stats = {}
|
||||
local nOrd = 1
|
||||
local nOrd = 1
|
||||
local nRawId = EgtGetFirstRawPart()
|
||||
while nRawId do
|
||||
-- verifico che il grezzo contenga pezzi oppure sia abbastanza lungo da essere scaricato coi carrelli
|
||||
@@ -2103,7 +2215,7 @@ function BeamExec.ProcessFeatures()
|
||||
-- recupero le feature di lavorazione della trave
|
||||
local vProc = CollectFeatures( nPartId, b3Raw, dCurrOvmH, dCurrOvmT)
|
||||
-- recupero informazioni ausiliarie feature e dipendenze tra feature stesse
|
||||
GetFeatureInfoAndDependency( vProc, b3Raw)
|
||||
GetFeatureInfoAndDependency( vProc, b3Raw, nPartId)
|
||||
|
||||
-- verifica presenza forature influenzate da lavorazioni di testa o coda
|
||||
if BD.IMPROVE_HEAD_TAIL_DRILLINGS then
|
||||
@@ -2115,7 +2227,7 @@ function BeamExec.ProcessFeatures()
|
||||
SetMirroredFeatures( vProc, b3Raw)
|
||||
end
|
||||
-- le ordino lungo X
|
||||
OrderFeatures( vProc, b3Raw)
|
||||
OrderFeatures( vProc, b3Raw, nPartId)
|
||||
-- le classifico
|
||||
local bAllOk, bSomeDown, bSomeSide, bSplitRot = ClassifyFeatures( vProc, b3Raw, Stats)
|
||||
if not bAllOk then
|
||||
|
||||
+14
-12
@@ -551,7 +551,7 @@ function BeamLib.GetFaceWithMostAdj( Proc, nPartId, bCompare3Fc, dCosSideAng)
|
||||
local nAddGrpId = BeamLib.GetAddGroup( nPartId)
|
||||
if not nAddGrpId then
|
||||
EgtOutLog( 'Error : missing AddGroup')
|
||||
return 0, 0, 0
|
||||
return 0, 0, 0, 0
|
||||
end
|
||||
-- verifico eventuale intersezione tra la faccia i-1 esima e la proiezione dell'altra sulla stessa
|
||||
local nShadowFacetId = EgtCopySurfTmFacet( nSurfId, j - 1, nAddGrpId)
|
||||
@@ -698,17 +698,19 @@ function BeamLib.GetFaceHvRefDim( nSurfId, nFacet, b3Raw)
|
||||
local b3HV = EgtSurfTmGetFacetBBoxRef( nSurfId, nFacet, GDB_BB.STANDARD, frHV)
|
||||
local dDimH = b3HV:getDimX()
|
||||
local dDimV = b3HV:getDimY()
|
||||
|
||||
-- Si mantiene rettangolo minimo perchè in alcuni casi andava in collisione. Lascio il calcolo in caso si debba ripristinare.
|
||||
-- se definito grezzo (o solido), applico eventuali limiti
|
||||
if b3Raw then
|
||||
local dCoeffY = abs( frHV:getVersX():getY())
|
||||
if dCoeffY > GEO.EPS_SMALL then
|
||||
dDimH = min( dDimH, b3Raw:getDimY() / dCoeffY)
|
||||
end
|
||||
local dCoeffZ = abs( frHV:getVersY():getZ())
|
||||
if dCoeffZ > GEO.EPS_SMALL then
|
||||
dDimV = min( dDimV, b3Raw:getDimZ() / dCoeffZ)
|
||||
end
|
||||
end
|
||||
-- if b3Raw then
|
||||
-- local dCoeffY = abs( frHV:getVersX():getY())
|
||||
-- if dCoeffY > GEO.EPS_SMALL then
|
||||
-- dDimH = min( dDimH, b3Raw:getDimY() / dCoeffY)
|
||||
-- end
|
||||
-- local dCoeffZ = abs( frHV:getVersY():getZ())
|
||||
-- if dCoeffZ > GEO.EPS_SMALL then
|
||||
-- dDimV = min( dDimV, b3Raw:getDimZ() / dCoeffZ)
|
||||
-- end
|
||||
-- end
|
||||
-- restituisco i valori calcolati
|
||||
return frHV, dDimH, dDimV
|
||||
end
|
||||
@@ -1189,7 +1191,7 @@ end
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
-- restituisce vero se la feature con box b3Proc taglia l'intera sezione della barra, rappresentata dalle sue dimensioni W e H
|
||||
function BeamLib.IsFeatureCuttingEntireSection( b3Proc, dRawW, dRawH)
|
||||
return ((abs(b3Proc:getDimY() - dRawW) < 10 * GEO.EPS_SMALL or b3Proc:getDimY() > dRawW) and (abs(b3Proc:getDimZ() - dRawH) < 10 * GEO.EPS_SMALL or b3Proc:getDimZ() > dRawH))
|
||||
return ( b3Proc:getDimY() > ( dRawW - 500 * GEO.EPS_SMALL) and b3Proc:getDimZ() > ( dRawH - 500 * GEO.EPS_SMALL))
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
|
||||
+12
-7
@@ -65,11 +65,14 @@ function ProcessCut.Classify( Proc, b3Raw)
|
||||
end
|
||||
-- recupero i dati del taglio
|
||||
local ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, 0, GDB_ID.ROOT)
|
||||
if vtN:getZ() <= - 0.5 and abs( vtN:getY()) > 0.1 or ( vtN:getZ() <= - 0.174 and abs( vtN:getY()) > 0.866) then
|
||||
-- calcolo le massime estensioni lineari orizzontale e verticale della faccia
|
||||
local _, DimH, DimV = BL.GetFaceHvRefDim( Proc.Id, 0, b3Raw)
|
||||
-- calcolo le massime estensioni lineari orizzontale e verticale della faccia
|
||||
local _, DimH, DimV = BL.GetFaceHvRefDim( Proc.Id, 0, b3Raw)
|
||||
if ( vtN:getZ() <= - 0.5 and abs( vtN:getY()) > 0.1) or
|
||||
( vtN:getZ() <= - 0.174 and abs( vtN:getY()) > 0.866) or
|
||||
( vtN:getZ() <= - 0.174 and abs( vtN:getZ()) * DimV > BD.MAX_DIM_DICE)
|
||||
then
|
||||
-- confronto queste estensioni con la massima dimensione del DiceCut (impossibile lavorare se entrambe maggiori)
|
||||
if DimH > BD.MAX_DIM_DICE and DimV > BD.MAX_DIM_DICE then
|
||||
if DimH > BD.MAX_DIM_DICE + 100 * GEO.EPS_SMALL and DimV > BD.MAX_DIM_DICE + 100 * GEO.EPS_SMALL then
|
||||
return true, true
|
||||
end
|
||||
end
|
||||
@@ -90,7 +93,7 @@ function ProcessCut.Classify( Proc, b3Raw)
|
||||
end
|
||||
end
|
||||
-- calcolo l'ingombro orizzontale della faccia
|
||||
local _, DimH, DimV = BL.GetFaceHvRefDim( Proc.Id, 0)
|
||||
_, DimH, DimV = BL.GetFaceHvRefDim( Proc.Id, 0)
|
||||
-- confronto questo ingombro con il doppio della massima dimensione del DiceCut (impossibile lavorare sotto da sopra se più di 2 tagli oppure se tipo PF, taglio inclinato in Y e non taglio singolo orizzontale)
|
||||
if DimH > 2 * BD.MAX_DIM_DICE or ( BD.C_SIMM and ( abs( vtN:getY()) > 0.1) and dMaxMat < DimH + BD.CUT_EXTRA) then
|
||||
return true, true
|
||||
@@ -379,7 +382,9 @@ local function MakeFromTop( sCutting, Proc, nPhase, nRawId, nPartId, dOvmHead, b
|
||||
local vCuts = {}
|
||||
local dDicingOffsetP
|
||||
local dDicingOffsetO
|
||||
if ( ( not Proc.AdvTail) or bForceDicing) and ( dCutH > dMaxDepth - BD.CUT_EXTRA - 3 * BD.COLL_SIC or dCutV > dMaxVertDepth - BD.CUT_EXTRA - 3 * BD.COLL_SIC) then
|
||||
if ( ( not Proc.AdvTail) or bForceDicing) and
|
||||
( dCutH - 100 * GEO.EPS_SMALL > dMaxDepth - BD.CUT_EXTRA - 3 * BD.COLL_SIC or
|
||||
dCutV - 100 * GEO.EPS_SMALL > dMaxVertDepth - BD.CUT_EXTRA - 3 * BD.COLL_SIC) then
|
||||
local ptExtra, vtExtra
|
||||
local bAutoCalcSurf = true
|
||||
if Proc.AdvTail then
|
||||
@@ -627,7 +632,7 @@ local function MakeFromTop( sCutting, Proc, nPhase, nRawId, nPartId, dOvmHead, b
|
||||
local vtOrthoO
|
||||
if bFromBottom and dCutV < dMaxDepth - BD.CUT_EXTRA and vtN:getZ() > 0 then
|
||||
vtOrthoO = -Z_AX()
|
||||
elseif ( bHorizCut or ( dCutV < dMaxDepth - BD.CUT_EXTRA and not bVertCutOk)) and
|
||||
elseif ( bHorizCut and not bVertCutOk) and
|
||||
( not bVertCutOk or b3Solid:getDimX() > BD.LEN_SHORT_PART or Proc.AdvTail or ( vtN:getX() > 0 and vtN:getZ() <= 0.708) or ( abs( vtN:getY()) < 0.1 and vtN:getZ() <= 0)) then
|
||||
vtOrthoO = Z_AX()
|
||||
elseif b3Solid:getDimX() < BD.LEN_SHORT_PART and not Proc.AdvTail and abs( vtN:getY()) > 0.259 and
|
||||
|
||||
@@ -475,13 +475,36 @@ function ProcessDoubleCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
-- dati delle facce
|
||||
local ptC = {}
|
||||
local vtN = {}
|
||||
ptC[1], vtN[1] = EgtSurfTmFacetCenter( Proc.Id, 0, GDB_ID.ROOT)
|
||||
ptC[2], vtN[2] = EgtSurfTmFacetCenter( Proc.Id, 1, GDB_ID.ROOT)
|
||||
local idFirstFace, idSecondFace
|
||||
|
||||
-- se ci sono più di due face (caso insolito), si prendono le facce più grandi
|
||||
if Proc.Fct > 2 then
|
||||
local Area = {}
|
||||
-- si prendono le due più grandi, potrebbero essercene più di due
|
||||
for i = 1, Proc.Fct do
|
||||
local _, dL, dW = EgtSurfTmFacetMinAreaRectangle( Proc.Id, i - 1)
|
||||
table.insert( Area, { nIndex = i-1, dArea = dL*dW})
|
||||
end
|
||||
-- ordina 'Area' in ordine decrescente
|
||||
table.sort( Area, function( A, B)
|
||||
return A.dArea > B.dArea
|
||||
end
|
||||
)
|
||||
idFirstFace = Area[1].nIndex
|
||||
idSecondFace = Area[2].nIndex
|
||||
else
|
||||
idFirstFace = 0
|
||||
idSecondFace = 1
|
||||
end
|
||||
|
||||
ptC[1], vtN[1] = EgtSurfTmFacetCenter( Proc.Id, idFirstFace, GDB_ID.ROOT)
|
||||
ptC[2], vtN[2] = EgtSurfTmFacetCenter( Proc.Id, idSecondFace, GDB_ID.ROOT)
|
||||
|
||||
-- normale media per capire se taglio di testa o di coda
|
||||
local vtNm = ( vtN[1] + vtN[2]) ; vtNm:normalize()
|
||||
local bHead = ( vtNm:getX() > 0)
|
||||
-- angolo diedro per stabilire se taglio convesso
|
||||
local bAdj, ptP1, ptP2, dAng = EgtSurfTmFacetsContact( Proc.Id, 0, 1, GDB_ID.ROOT)
|
||||
local bAdj, ptP1, ptP2, dAng = EgtSurfTmFacetsContact( Proc.Id, idFirstFace, idSecondFace, GDB_ID.ROOT)
|
||||
local bConvex = true
|
||||
local bOnY = true
|
||||
local ptPs = ( ptC[1] + ptC[2]) / 2
|
||||
@@ -492,8 +515,8 @@ function ProcessDoubleCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
bConvex = ( dAng > 0)
|
||||
end
|
||||
-- determino quale faccia è più grande
|
||||
local _, dB1, dH1 = EgtSurfTmFacetMinAreaRectangle( Proc.Id, 0)
|
||||
local _, dB2, dH2 = EgtSurfTmFacetMinAreaRectangle( Proc.Id, 1)
|
||||
local _, dB1, dH1 = EgtSurfTmFacetMinAreaRectangle( Proc.Id, idFirstFace)
|
||||
local _, dB2, dH2 = EgtSurfTmFacetMinAreaRectangle( Proc.Id, idSecondFace)
|
||||
local nBigInd = EgtIf( dB1 * dH1 >= dB2 * dH2, 1, 2)
|
||||
local nSmaInd = 3 - nBigInd
|
||||
-- inserimento smussi
|
||||
@@ -560,8 +583,8 @@ function ProcessDoubleCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
dMaxDepth = EgtTdbGetCurrToolMaxDepth() or dMaxDepth
|
||||
end
|
||||
end
|
||||
local _, _, dDimV1 = BL.GetFaceHvRefDim( Proc.Id, 0, b3Raw)
|
||||
local _, _, dDimV2 = BL.GetFaceHvRefDim( Proc.Id, 1, b3Raw)
|
||||
local _, _, dDimV1 = BL.GetFaceHvRefDim( Proc.Id, idFirstFace, b3Raw)
|
||||
local _, _, dDimV2 = BL.GetFaceHvRefDim( Proc.Id, idSecondFace, b3Raw)
|
||||
local bFace1TooLongForBlade, bFace2TooLongForBlade = ( dDimV1 >= dMaxDepth), ( dDimV2 >= dMaxDepth)
|
||||
local dFace1Ang, dFace2Ang = vtN[1]:getZ(), vtN[2]:getZ()
|
||||
if bFace1TooLongForBlade and dFace1Ang < ( BD.CUT_VZ_MIN or -0.484) or bFace2TooLongForBlade and dFace2Ang < ( BD.CUT_VZ_MIN or -0.484) then
|
||||
|
||||
@@ -638,16 +638,6 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId)
|
||||
end
|
||||
-- se lavorazione in doppio
|
||||
if Proc.Double and Proc.Double > 0 then
|
||||
-- calcolo gli step reali
|
||||
local dStep = EgtGetMachiningParam( MCH_MP.STEP)
|
||||
local nNumStep = ceil( dDepth/dStep)
|
||||
local dRealStep = dDepth / nNumStep
|
||||
-- Se foro passante e nel penultimo step le punte si trovano più vicine del minimo ( MinDistX1X2 + Puntina centraggio H1 + puntina centraggio H2) ricalcolo facendo uno step in meno
|
||||
if bOpen and ( nNumStep > 1) and ( ( dLen / 2) - ( dRealStep * (nNumStep - 1))) * 2 < ( 40 + 10 + 10) then
|
||||
dRealStep = ceil( dDepth / (nNumStep - 1))
|
||||
EgtSetMachiningParam( MCH_MP.STEP, dRealStep)
|
||||
sMyWarn ='Warning in drill-double : step changed to ' .. tostring(dRealStep) .. 'mm'
|
||||
end
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'DOUBLE', Proc.Double)
|
||||
if Proc.Double ~= Proc.PrevDouble then
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'StartZmax', 2)
|
||||
|
||||
+106
-84
@@ -51,6 +51,23 @@ function ProcessDtMortise.FrontIdentify( Proc)
|
||||
return (( Proc.Grp == 3 or Proc.Grp == 4) and Proc.Prc == 56)
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- Riconoscimento della feature profonda, non sulla faccia della trave
|
||||
function ProcessDtMortise.IsDeeper( Proc, b3Raw)
|
||||
-- recupero i dati della curva di contorno della faccia di fondo
|
||||
local AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i')
|
||||
if not AuxId then return false end
|
||||
AuxId = AuxId + Proc.Id
|
||||
local vtExtr = EgtCurveExtrusion( AuxId, GDB_RT.GLOB)
|
||||
if ( AreSameVectorApprox( vtExtr, -Y_AX()) and Proc.Box:getMin():getY() > b3Raw:getMin():getY() + 100 * GEO.EPS_SMALL) or
|
||||
( AreSameVectorApprox( vtExtr, Y_AX()) and Proc.Box:getMax():getY() < b3Raw:getMax():getY() - 100 * GEO.EPS_SMALL) or
|
||||
( AreSameVectorApprox( vtExtr, -Z_AX()) and Proc.Box:getMin():getZ() > b3Raw:getMin():getZ() + 100 * GEO.EPS_SMALL) or
|
||||
( AreSameVectorApprox( vtExtr, Z_AX()) and Proc.Box:getMax():getZ() < b3Raw:getMax():getZ() - 100 * GEO.EPS_SMALL) then
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- Verifica se feature di coda
|
||||
function ProcessDtMortise.IsTailFeature( Proc, b3Raw)
|
||||
@@ -172,6 +189,7 @@ end
|
||||
---------------------------------------------------------------------
|
||||
-- Applicazione della lavorazione
|
||||
function ProcessDtMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
local sWarn
|
||||
bMakeAntiSplitPath = true
|
||||
-- ingombro del pezzo
|
||||
local b3Solid = EgtGetBBoxGlob( EgtGetFirstNameInGroup( nPartId, 'Box') or GDB_ID.NULL, GDB_BB.STANDARD)
|
||||
@@ -447,94 +465,98 @@ function ProcessDtMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
local nAuxId1 = CalcPathAtHeight( Proc.Id, AuxId, nAddGrpId, dAltMort, dSideAng, b3Solid)
|
||||
-- se esiste il percorso
|
||||
if nAuxId1 then
|
||||
-- creo percorso sulla parte alta della mortasa
|
||||
local dToolRadDelta = dAltMort * tan( dSideAng)
|
||||
local dTopDiam = dToolDiam + 2 * dToolRadDelta
|
||||
-- recupero punto iniziale e finale del percorso
|
||||
local ptStart = EgtSP( nAuxId1, GDB_RT.GLOB)
|
||||
local ptEnd = EgtEP( nAuxId1, GDB_RT.GLOB)
|
||||
if ptStart and ptEnd then
|
||||
local nId1
|
||||
-- se richiesti due segmenti di linea
|
||||
if not bMakeAsByArc then
|
||||
-- determino il punto comune dei due segmenti
|
||||
local vtDelta = ( ptEnd - ptStart) / 4
|
||||
vtDelta:rotate( vtExtr, -90)
|
||||
local ptMid = ( ptStart + ptEnd) / 2 + vtDelta
|
||||
-- creo la spezzata formata dai due segmenti
|
||||
nId1 = EgtCurveCompoFromPoints( nAddGrpId, { ptStart, ptMid, ptEnd}, GDB_RT.GLOB)
|
||||
-- altrimenti richiesto arco
|
||||
if EgtCurveIsFlat( nAuxId1) then
|
||||
-- creo percorso sulla parte alta della mortasa
|
||||
local dToolRadDelta = dAltMort * tan( dSideAng)
|
||||
local dTopDiam = dToolDiam + 2 * dToolRadDelta
|
||||
-- recupero punto iniziale e finale del percorso
|
||||
local ptStart = EgtSP( nAuxId1, GDB_RT.GLOB)
|
||||
local ptEnd = EgtEP( nAuxId1, GDB_RT.GLOB)
|
||||
if ptStart and ptEnd then
|
||||
local nId1
|
||||
-- se richiesti due segmenti di linea
|
||||
if not bMakeAsByArc then
|
||||
-- determino il punto comune dei due segmenti
|
||||
local vtDelta = ( ptEnd - ptStart) / 4
|
||||
vtDelta:rotate( vtExtr, -90)
|
||||
local ptMid = ( ptStart + ptEnd) / 2 + vtDelta
|
||||
-- creo la spezzata formata dai due segmenti
|
||||
nId1 = EgtCurveCompoFromPoints( nAddGrpId, { ptStart, ptMid, ptEnd}, GDB_RT.GLOB)
|
||||
-- altrimenti richiesto arco
|
||||
else
|
||||
-- direzione del segmento
|
||||
local vtDir = ptEnd - ptStart ;
|
||||
local dLen = vtDir:len()
|
||||
vtDir:normalize()
|
||||
-- direzioni tangenti iniziale e finale
|
||||
local vtStart = EgtSV( nAuxId1, GDB_RT.GLOB)
|
||||
local vtEnd = EgtEV( nAuxId1, GDB_RT.GLOB)
|
||||
-- angoli
|
||||
local dAngStart = acos( vtStart * vtDir)
|
||||
local dAngEnd = acos( vtEnd * vtDir)
|
||||
local dMaxAng = min( 30, dAngStart, dAngEnd)
|
||||
if dLen < dTopDiam then
|
||||
dMaxAng = min( dMaxAng, asin( dLen / dTopDiam))
|
||||
end
|
||||
local vtTg = vtDir ; vtTg:rotate( vtExtr, -dMaxAng)
|
||||
-- creo l'arco
|
||||
nId1 = EgtArc2PV( nAddGrpId, ptStart, ptEnd, vtTg, GDB_RT.GLOB)
|
||||
end
|
||||
if not nId1 then
|
||||
local sErr = 'Wrong geometry : Error on DtMortise '
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
EgtModifyCurveExtrusion( nId1, vtExtr, GDB_RT.GLOB)
|
||||
-- inserisco la lavorazione di contornatura anti splint
|
||||
local sNameF = 'DtMtAS_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id))
|
||||
local nMchFId = EgtAddMachining( sNameF, sMilling)
|
||||
if not nMchFId then
|
||||
local sErr = 'Error adding machining ' .. sNameF .. '-' .. sMilling
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
-- aggiungo geometria
|
||||
EgtSetMachiningGeometry( {{ nId1, -1}})
|
||||
-- setto affondamento pari all'altezza della mortsasa
|
||||
EgtSetMachiningParam( MCH_MP.DEPTH, dAltMort)
|
||||
-- setto offset radiale con aggiunto un ulteriore allargamento di 1mm
|
||||
EgtSetMachiningParam( MCH_MP.OFFSR, dToolRadDelta - 1)
|
||||
-- antischeggia sempre con una passata
|
||||
if bMultipleZPasses then
|
||||
EgtSetMachiningParam( MCH_MP.STEP, 0)
|
||||
end
|
||||
-- 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))
|
||||
-- se necessario, imposto SCC
|
||||
if nSCC then
|
||||
EgtSetMachiningParam( MCH_MP.SCC, nSCC)
|
||||
end
|
||||
-- dichiaro non si generano sfridi per VMill
|
||||
local sUserNotes = 'MaxElev='.. EgtNumToString( dAltMort, 1) .. '; VMRS=0;'
|
||||
-- se lavorazione in doppio
|
||||
if Proc.Double and Proc.Double > 0 then
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'DOUBLE', Proc.Double)
|
||||
if Proc.Double ~= nMyPrevDouble then
|
||||
nMyPrevDouble = Proc.Double
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'StartZmax', 2)
|
||||
end
|
||||
end
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
-- eseguo
|
||||
if not ML.ApplyMachining( true, false) then
|
||||
local _, sErr = EgtGetLastMachMgrError()
|
||||
EgtSetOperationMode( nMchFId, false)
|
||||
return false, sErr
|
||||
end
|
||||
else
|
||||
-- direzione del segmento
|
||||
local vtDir = ptEnd - ptStart ;
|
||||
local dLen = vtDir:len()
|
||||
vtDir:normalize()
|
||||
-- direzioni tangenti iniziale e finale
|
||||
local vtStart = EgtSV( nAuxId1, GDB_RT.GLOB)
|
||||
local vtEnd = EgtEV( nAuxId1, GDB_RT.GLOB)
|
||||
-- angoli
|
||||
local dAngStart = acos( vtStart * vtDir)
|
||||
local dAngEnd = acos( vtEnd * vtDir)
|
||||
local dMaxAng = min( 30, dAngStart, dAngEnd)
|
||||
if dLen < dTopDiam then
|
||||
dMaxAng = min( dMaxAng, asin( dLen / dTopDiam))
|
||||
end
|
||||
local vtTg = vtDir ; vtTg:rotate( vtExtr, -dMaxAng)
|
||||
-- creo l'arco
|
||||
nId1 = EgtArc2PV( nAddGrpId, ptStart, ptEnd, vtTg, GDB_RT.GLOB)
|
||||
end
|
||||
if not nId1 then
|
||||
local sErr = 'Wrong geometry : Error on DtMortise '
|
||||
local sErr = 'Wrong geometry : Error on DtMortise ' .. tostring( Proc.Id)
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
EgtModifyCurveExtrusion( nId1, vtExtr, GDB_RT.GLOB)
|
||||
-- inserisco la lavorazione di contornatura anti splint
|
||||
local sNameF = 'DtMtAS_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id))
|
||||
local nMchFId = EgtAddMachining( sNameF, sMilling)
|
||||
if not nMchFId then
|
||||
local sErr = 'Error adding machining ' .. sNameF .. '-' .. sMilling
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
-- aggiungo geometria
|
||||
EgtSetMachiningGeometry( {{ nId1, -1}})
|
||||
-- setto affondamento pari all'altezza della mortsasa
|
||||
EgtSetMachiningParam( MCH_MP.DEPTH, dAltMort)
|
||||
-- setto offset radiale con aggiunto un ulteriore allargamento di 1mm
|
||||
EgtSetMachiningParam( MCH_MP.OFFSR, dToolRadDelta - 1)
|
||||
-- antischeggia sempre con una passata
|
||||
if bMultipleZPasses then
|
||||
EgtSetMachiningParam( MCH_MP.STEP, 0)
|
||||
end
|
||||
-- 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))
|
||||
-- se necessario, imposto SCC
|
||||
if nSCC then
|
||||
EgtSetMachiningParam( MCH_MP.SCC, nSCC)
|
||||
end
|
||||
-- dichiaro non si generano sfridi per VMill
|
||||
local sUserNotes = 'MaxElev='.. EgtNumToString( dAltMort, 1) .. '; VMRS=0;'
|
||||
-- se lavorazione in doppio
|
||||
if Proc.Double and Proc.Double > 0 then
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'DOUBLE', Proc.Double)
|
||||
if Proc.Double ~= nMyPrevDouble then
|
||||
nMyPrevDouble = Proc.Double
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'StartZmax', 2)
|
||||
end
|
||||
end
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
-- eseguo
|
||||
if not ML.ApplyMachining( true, false) then
|
||||
local _, sErr = EgtGetLastMachMgrError()
|
||||
EgtSetOperationMode( nMchFId, false)
|
||||
return false, sErr
|
||||
end
|
||||
else
|
||||
local sErr = 'Wrong geometry : Error on DtMortise ' .. tostring( Proc.Id)
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
sWarn = 'Warning : skipped DoveTail mortise antisplint'
|
||||
end
|
||||
else
|
||||
local sErr = 'Wrong geometry : Error on DtMortise ' .. tostring( Proc.Id)
|
||||
@@ -675,7 +697,7 @@ function ProcessDtMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
return false, sErr
|
||||
end
|
||||
end
|
||||
return true
|
||||
return true, sWarn
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
|
||||
+118
-6
@@ -64,14 +64,14 @@ local function VerifyOrientation( Proc, vtN, b3Raw)
|
||||
-- se tenone praticamente in asse, accetto fino a -22 deg
|
||||
if abs( vtN:getY()) < 0.088 then
|
||||
return ( vtN:getZ() >= -0.375)
|
||||
-- altrimenti, accetto fino a -10 deg
|
||||
-- altrimenti, accetto fino a -12.5 deg
|
||||
else
|
||||
return ( vtN:getZ() >= -0.174)
|
||||
return ( vtN:getZ() >= -0.216)
|
||||
end
|
||||
-- altrimenti
|
||||
else
|
||||
-- accetto fino a -7deg
|
||||
return ( vtN:getZ() >= -0.122)
|
||||
-- accetto fino a -12.5 deg
|
||||
return ( vtN:getZ() >= -0.216)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -209,7 +209,20 @@ function ProcessDtTenon.Make( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
local CutProc = { Id = AddId, Grp = Proc.Grp, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
|
||||
Head = Proc.Head, Tail = Proc.Tail, CutId = Proc.CutId, TaskId = Proc.TaskId, PartId = Proc.PartId}
|
||||
CutProc.AffectedFaces = BL.GetProcessAffectedFaces( CutProc)
|
||||
local bFromBottom = ( b3Solid:getDimX() < BD.LEN_SHORT_PART and vtExtr:getZ() > 0.25)
|
||||
|
||||
-- se esiste grezzo successivo non serve tagliare dal basso
|
||||
local bFromBottom
|
||||
local dTotalLength = 0
|
||||
local nNextRawId = EgtGetNextRawPart( nRawId)
|
||||
while nNextRawId do
|
||||
dTotalLength = dTotalLength + EgtGetRawPartBBox( nNextRawId):getDimX()
|
||||
nNextRawId = EgtGetNextRawPart( nNextRawId)
|
||||
end
|
||||
if dTotalLength > BD.MinRaw and not Proc.Tail then
|
||||
bFromBottom = false
|
||||
else
|
||||
bFromBottom = ( b3Solid:getDimX() < BD.LEN_SHORT_PART and vtExtr:getZ() > 0.25)
|
||||
end
|
||||
local bOk, sErr = Cut.Make( CutProc, nPhase, nRawId, nPartId, dOvmHead, bFromBottom)
|
||||
if not bOk then return bOk, sErr end
|
||||
end
|
||||
@@ -352,8 +365,107 @@ function ProcessDtTenon.Make( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
BL.UpdateTCING( nRawId, dOffs)
|
||||
end
|
||||
end
|
||||
|
||||
-- si controllano le ultime 5 facce della feature
|
||||
local nIndFace = -1
|
||||
for i = 1, 5 do
|
||||
if abs( vtExtr * EgtSurfTmFacetNormVersor( Proc.Id, Proc.Fct-i, GDB_ID.ROOT)) < GEO.EPS_ANG_SMALL then
|
||||
nIndFace = Proc.Fct-i
|
||||
end
|
||||
end
|
||||
-- controllo se serve passaggio di finitura in caso il tenone non cominci dal bordo della trave (P14 > 0)
|
||||
if nIndFace > 0 then
|
||||
-- verifico se almeno uno dei punti iniziale e finale della curva giace in uno dei piani limite del pezzo, quindi se è un lato aperto
|
||||
local bOpen = false
|
||||
local ptIni = EgtSP( AuxId, GDB_RT.GLOB)
|
||||
local ptFin = EgtEP( AuxId, GDB_RT.GLOB)
|
||||
if ( abs( ptIni:getX() - b3Solid:getMax():getX()) < 100 * GEO.EPS_SMALL or abs( ptFin:getX() - b3Solid:getMax():getX()) < 100 * GEO.EPS_SMALL) or
|
||||
( abs( ptIni:getX() - b3Solid:getMin():getX()) < 100 * GEO.EPS_SMALL or abs( ptFin:getX() - b3Solid:getMin():getX()) < 100 * GEO.EPS_SMALL) or
|
||||
( abs( ptIni:getY() - b3Solid:getMax():getY()) < 100 * GEO.EPS_SMALL or abs( ptFin:getY() - b3Solid:getMax():getY()) < 100 * GEO.EPS_SMALL) or
|
||||
( abs( ptIni:getY() - b3Solid:getMin():getY()) < 100 * GEO.EPS_SMALL or abs( ptFin:getY() - b3Solid:getMin():getY()) < 100 * GEO.EPS_SMALL) or
|
||||
( abs( ptIni:getZ() - b3Solid:getMax():getZ()) < 100 * GEO.EPS_SMALL or abs( ptFin:getZ() - b3Solid:getMax():getZ()) < 100 * GEO.EPS_SMALL) or
|
||||
( abs( ptIni:getZ() - b3Solid:getMin():getZ()) < 100 * GEO.EPS_SMALL or abs( ptFin:getZ() - b3Solid:getMin():getZ()) < 100 * GEO.EPS_SMALL) then
|
||||
bOpen = true
|
||||
end
|
||||
-- se entrambi i punti non sono sul limite pezzo
|
||||
if not bOpen then
|
||||
-- recupero la lavorazione
|
||||
sMillType = 'Tenon'
|
||||
sMilling = ML.FindMilling( sMillType .. EgtIf( bMillDown and not bMillUp, '_H2', ''), nil, nil, nil, nil, bMillUp, bMillDown)
|
||||
if not sMilling then
|
||||
local sErr = 'Error : milling to finish the tenon not found in library'
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
-- recupero i dati dell'utensile
|
||||
if EgtMdbSetCurrMachining( sMilling) then
|
||||
local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID)
|
||||
if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then
|
||||
dTDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dTDiam
|
||||
dMaxMat = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT) or dMaxMat
|
||||
local dSpeed = EgtMdbGetCurrMachiningParam( MCH_MP.SPEED) or 0
|
||||
bCW = ( dSpeed >= 0)
|
||||
end
|
||||
|
||||
-- inserisco la passata finale della lavorazione
|
||||
local sNameF = 'TenF_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id))
|
||||
local nMchFId = EgtAddMachining( sNameF, sMilling)
|
||||
if not nMchFId then
|
||||
local sErr = 'Error adding machining ' .. sNameF .. '-' .. sMilling
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
-- aggiungo geometria
|
||||
EgtSetMachiningGeometry( {{ Proc.Id, nIndFace}})
|
||||
-- sistemo i parametri
|
||||
EgtSetMachiningParam( MCH_MP.DEPTH_STR, 'TH')
|
||||
-- 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, true, false))
|
||||
EgtSetMachiningParam( MCH_MP.LITANG, 0.7 * dTDiam)
|
||||
EgtSetMachiningParam( MCH_MP.LIPERP, 20)
|
||||
EgtSetMachiningParam( MCH_MP.LOTANG, 0.7 * dTDiam)
|
||||
EgtSetMachiningParam( MCH_MP.LOPERP, 20)
|
||||
|
||||
local nFaceUse
|
||||
if vtExtr:getX() > -GEO.EPS_SMALL then
|
||||
nFaceUse = MCH_MILL_FU.PARAL_LEFT
|
||||
else
|
||||
nFaceUse = MCH_MILL_FU.PARAL_RIGHT
|
||||
end
|
||||
EgtSetMachiningParam( MCH_MP.FACEUSE, nFaceUse)
|
||||
|
||||
-- imposto elevazione
|
||||
local sUserNotes = EgtSetVal( 'MaxElev', EgtNumToString( dDtTenH, 1)) .. ';'
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
|
||||
-- imposto posizione braccio porta testa
|
||||
local nSCC = MCH_SCC.NONE
|
||||
if BD.TURN then
|
||||
if abs( vtAx:getY()) > abs( vtAx:getZ()) then
|
||||
nSCC = EgtIf( vtAx:getY() > 0, MCH_SCC.ADIR_YP, MCH_SCC.ADIR_YM)
|
||||
else
|
||||
nSCC = EgtIf( vtAx:getZ() > 0, MCH_SCC.ADIR_ZP, MCH_SCC.ADIR_ZM)
|
||||
end
|
||||
elseif not BD.C_SIMM then
|
||||
nSCC = MCH_SCC.ADIR_YM
|
||||
if abs( vtExtr:getY()) > 0.088 then
|
||||
nSCC = EgtIf( vtExtr:getX() < GEO.EPS_SMALL, MCH_SCC.ADIR_XM, MCH_SCC.ADIR_XP)
|
||||
end
|
||||
end
|
||||
EgtSetMachiningParam( MCH_MP.SCC, nSCC)
|
||||
-- eseguo
|
||||
if not ML.ApplyMachining( true, false) then
|
||||
local _, sErr = EgtGetLastMachMgrError()
|
||||
EgtSetOperationMode( nMchFId, false)
|
||||
return false, sErr
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
return ProcessDtTenon
|
||||
|
||||
@@ -159,6 +159,105 @@ local function MakeChamfer( nOriId, Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
return true, nil
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- smussi in testa
|
||||
local function MakeHeadChamfer( idProc, nPartId)
|
||||
local dDepthHeadChamfer = EgtGetInfo( idProc, 'Q08', 'd') or 0
|
||||
-- se non attivo esco subito
|
||||
if dDepthHeadChamfer < 100 * GEO.EPS_SMALL then
|
||||
return
|
||||
end
|
||||
|
||||
-- recupero gruppo per geometria aggiuntiva
|
||||
local AddGrpId = BL.GetAddGroup( nPartId)
|
||||
if not AddGrpId then
|
||||
local sErr = 'Error on process StartFace impossible to find AddGroup'
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
|
||||
-- recupero la lavorazione
|
||||
local sMilling = ML.FindMilling( 'Mark')
|
||||
if not sMilling then
|
||||
local sErr = 'Error : milling not found in library'
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
|
||||
local nLoopId, nLoopCnt = EgtExtractSurfTmFacetLoops( idProc, 0, AddGrpId)
|
||||
if not nLoopId or nLoopCnt > 1 then
|
||||
local sErr = 'Error MakeHeadChamfer : too many loops'
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
|
||||
-- setto direzione estrusione corretta
|
||||
EgtModifyCurveExtrusion( nLoopId, X_AX())
|
||||
EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.RIGHT))
|
||||
|
||||
local dQ09Value = EgtGetInfo( idProc, 'Q09', 'd')
|
||||
local bChamferedEdge = dQ09Value > 0
|
||||
|
||||
local nIdFirstEntity, nEntityCnt = EgtExplodeCurveCompo( nLoopId)
|
||||
local p3MidPoint = EgtMP( nIdFirstEntity, GDB_ID.GRID)
|
||||
|
||||
for i = 0, nEntityCnt - 1 do
|
||||
if EgtCurveLength( nIdFirstEntity + i) - 10 < abs( dQ09Value) * 2 then
|
||||
local sErr = 'Error MakeHeadChamfer : Q09 too high'
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
end
|
||||
|
||||
-- creo raccordo o fillet
|
||||
for i = 0, nEntityCnt - 1 do
|
||||
local idFirst = nIdFirstEntity + i
|
||||
local idSecond = EgtIf( i == nEntityCnt - 1, nIdFirstEntity, idFirst + 1)
|
||||
local ptEndPointFirst = EgtEP( idFirst, GDB_ID.GRID) - ( abs( dQ09Value) * EgtEV( idFirst, GDB_ID.GRID))
|
||||
local ptStartPointSecond = EgtSP( idSecond, GDB_ID.GRID) + ( abs( dQ09Value) * EgtEV( idSecond, GDB_ID.GRID))
|
||||
|
||||
if bChamferedEdge then
|
||||
EgtCurveChamfer( AddGrpId, idFirst, ptEndPointFirst, idSecond, ptStartPointSecond, abs( dQ09Value), true, GDB_RT.GRID)
|
||||
else
|
||||
EgtCurveFillet( AddGrpId, idFirst, ptEndPointFirst, idSecond, ptStartPointSecond, abs( dQ09Value), true, GDB_RT.GRID)
|
||||
end
|
||||
end
|
||||
|
||||
EgtSelectPathObjs( nIdFirstEntity, true)
|
||||
local idGeom, idGeomCnt = EgtCurveCompoByChain( AddGrpId, GDB_ID.SEL, {0,0,0}, true)
|
||||
if not idGeom or idGeomCnt > 1 then
|
||||
local sErr = 'Error MakeHeadChamfer : too many loops'
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
EgtChangeClosedCurveStartPoint( idGeom, p3MidPoint, GDB_RT.GRID)
|
||||
|
||||
-- Inserisco la lavorazione del lato standard
|
||||
local dExtra = 2
|
||||
local sName1 = 'HeadCham_' .. ( EgtGetName( idProc) or tostring( idProc))
|
||||
local nMch1Id = EgtAddMachining( sName1, sMilling)
|
||||
if not nMch1Id then
|
||||
local sErr = 'Error adding machining ' .. sName1 .. '-' .. sMilling
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
-- aggiungo geometria
|
||||
EgtSetMachiningGeometry( {{ idGeom, -1}})
|
||||
-- assegno affondamento e offset radiale
|
||||
EgtSetMachiningParam( MCH_MP.DEPTH, dDepthHeadChamfer + dExtra)
|
||||
EgtSetMachiningParam( MCH_MP.OFFSR, dExtra)
|
||||
-- assegno lato di lavoro
|
||||
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.RIGHT)
|
||||
-- eseguo
|
||||
if not ML.ApplyMachining( true, false) then
|
||||
local _, sErr = EgtGetLastMachMgrError()
|
||||
EgtSetOperationMode( nMch1Id, false)
|
||||
return false, sErr
|
||||
end
|
||||
|
||||
return true, nil
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- tagli verticali aggiuntivi
|
||||
local function AddVerticalPreCuts( Proc, sCutting, dCutXOffset, b3Raw, dOffsetBetweenCuts)
|
||||
@@ -533,6 +632,16 @@ function ProcessHeadCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bNeedHCut
|
||||
|
||||
local bOk, sErr = MakeStandardCuts( Proc, b3Raw, nCuts, dOffsL, HeadCutType, Cutting1Data, Cutting2Data, nil, dOvmHead)
|
||||
|
||||
|
||||
-- alla fine del taglio si aggiungono gli smussi in testa
|
||||
local _, sErrHeadChamfer = MakeHeadChamfer( nOriId or Proc.Id, nPartId)
|
||||
if sErr then
|
||||
sErr = sErr..'\n'..sErrHeadChamfer
|
||||
else
|
||||
sErr = sErrHeadChamfer
|
||||
end
|
||||
|
||||
|
||||
return bOk, sErr
|
||||
end
|
||||
|
||||
|
||||
+753
-21
@@ -129,6 +129,10 @@ EgtOutLog( ' ProcessLapJoint started', 1)
|
||||
-- Dati
|
||||
local BD = require( 'BeamData')
|
||||
local ML = require( 'MachiningLib')
|
||||
local WHISK_OFFS = 0.1
|
||||
local WHISK_SAFE = 5
|
||||
local MIN_LEN_CUT = 30
|
||||
|
||||
|
||||
-- variabili assegnazione parametri Q
|
||||
local Q_FORCE_BLADE = '' -- i
|
||||
@@ -146,7 +150,7 @@ local Q_MAX_ELEVATION = '' -- d
|
||||
local Q_SAW_PLUS_CHAIN = '' -- i
|
||||
local Q_FORCE_CHAINSAW = '' -- i
|
||||
local Q_CHAINSAW_FROM_SIDE = '' -- i
|
||||
|
||||
local Q_MILL_AS_BLADE_CONVENTIONAL = '' -- i
|
||||
|
||||
-- variabile smussi
|
||||
local bMadeChamfer
|
||||
@@ -195,11 +199,14 @@ local function AssignQIdent( Proc)
|
||||
Q_FORCE_CHAINSAW = 'Q12'
|
||||
-- TODO da riportare a Q13 quando è sistemata la gestione del movimento in macchina nell'attacco laterale
|
||||
Q_CHAINSAW_FROM_SIDE = 'Q999'
|
||||
Q_MILL_AS_BLADE_CONVENTIONAL = ''
|
||||
Q_CLEAN_CORNER = ''
|
||||
|
||||
if ( Proc.Grp == 3 or Proc.Grp == 4) and Proc.Prc == 16 then
|
||||
Q_FORCE_BLADE = 'Q01' -- i
|
||||
Q_DEPTH_CHAMFER = 'Q04' -- d
|
||||
Q_ONLY_CHAMFER = 'Q05' -- i
|
||||
Q_MILL_AS_BLADE_CONVENTIONAL = 'Q14' -- i
|
||||
elseif ( Proc.Grp == 3 or Proc.Grp == 4) and Proc.Prc == 17 then
|
||||
Q_DEPTH_CHAMFER = 'Q01' -- d
|
||||
Q_ONLY_CHAMFER = 'Q02' -- i
|
||||
@@ -220,6 +227,8 @@ local function AssignQIdent( Proc)
|
||||
Q_BLADE_ON_ALONG_FACE = 'Q04' -- i
|
||||
Q_ANTISPLINT_TYPE = 'Q06' -- i
|
||||
Q_DEPTH_CHAMFER = 'Q07' -- d
|
||||
Q_MILL_AS_BLADE_CONVENTIONAL = 'Q14' -- i
|
||||
Q_CLEAN_CORNER = 'Q15' -- i
|
||||
elseif ( Proc.Grp == 1 or Proc.Grp == 2) and Proc.Prc == 30 then
|
||||
Q_BLADE_ON_ALONG_FACE = 'Q04' -- i
|
||||
elseif ( Proc.Grp == 3 or Proc.Grp == 4) and Proc.Prc == 32 then
|
||||
@@ -228,19 +237,23 @@ local function AssignQIdent( Proc)
|
||||
Q_ANTISPLINT_TYPE = 'Q06' -- i
|
||||
elseif ( Proc.Grp == 3 or Proc.Grp == 4) and Proc.Prc == 33 then
|
||||
Q_ANTISPLINT_TYPE = 'Q06' -- i
|
||||
Q_MILL_AS_BLADE_CONVENTIONAL = 'Q14' -- i
|
||||
elseif ( Proc.Grp == 3 or Proc.Grp == 4) and Proc.Prc == 34 then
|
||||
Q_CONTOUR_SMALL_TOOL = 'Q01' -- i
|
||||
Q_USE_MILL = 'Q02' -- i
|
||||
Q_ANTISPLINT_TYPE = 'Q06' -- i
|
||||
elseif ( Proc.Grp == 4) and Proc.Prc == 37 then
|
||||
Q_ANTISPLINT_TYPE = 'Q06' -- i
|
||||
Q_MILL_AS_BLADE_CONVENTIONAL = 'Q14' -- i
|
||||
elseif ( Proc.Grp == 4) and Proc.Prc == 39 then
|
||||
Q_CONTOUR_SMALL_TOOL = 'Q01' -- i
|
||||
Q_USE_MILL = 'Q02' -- i
|
||||
Q_ANTISPLINT_TYPE = 'Q06' -- i
|
||||
Q_MILL_AS_BLADE_CONVENTIONAL = 'Q14' -- i
|
||||
elseif ( Proc.Grp == 3 or Proc.Grp == 4) and Proc.Prc == 90 then
|
||||
Q_ANTISPLINT_TYPE = 'Q03' -- i
|
||||
Q_SIDE_ROUGH_TOOL = 'Q04' -- i
|
||||
Q_MILL_AS_BLADE_CONVENTIONAL = 'Q14' -- i
|
||||
end
|
||||
-- le altre features gestite non hanno parametri Q
|
||||
end
|
||||
@@ -796,7 +809,8 @@ function ProcessLapJoint.IsTailFeature( Proc, b3Raw)
|
||||
if ( dEndDist > BD.MAX_DIST_HTFEA) or bUseBHSideMill then
|
||||
if not( BD.BH_MACHINE) and bUseBHSideMill and ( Proc.Box:getMax():getX() - b3Solid:getMin():getX()) < 400 and b3Solid:getDimX() > BD.LEN_VERY_SHORT_PART then
|
||||
return true
|
||||
else
|
||||
-- se Front Slot e pezzo abbastanza lungo si rimanda la decisione a più avanti
|
||||
elseif not ( ( Proc.Prc == 17) and ( b3Solid:getDimX() > ( BD.LEN_VERY_SHORT_PART or BD.LEN_SHORT_PART))) then
|
||||
return false
|
||||
end
|
||||
end
|
||||
@@ -2855,7 +2869,13 @@ local function MakeByMillAsSaw( Proc, nPhase, nRawId, nPartId, nFacInd,
|
||||
for i = 1, nStep do
|
||||
local dOffs = ( i - 1) * dStep
|
||||
if vtN:getZ() < dVzLimDwnUp then dOffs = dOffs + dSawThick end
|
||||
local bOk, sErr, nMchId = Fbs.MakeOne( Proc.Id, nFacAdj, sCutting, dSawDiam, nFaceUse, dVzLimDwnUp, 0, BD.CUT_SIC, dOffs, dStartDist, dEndDist, nil, b3Raw)
|
||||
-- forzatura lavorazione discorde in base a parametro Q su feature
|
||||
local nQ14Param = EgtGetInfo( Proc.Id, Q_MILL_AS_BLADE_CONVENTIONAL, 'd') or 0
|
||||
local bForceInvert = nQ14Param == 1 or ( nQ14Param == 2 and vtN:getX() < 0.1 and Proc.AffectedFaces.Bottom)
|
||||
if bForceInvert and i == 1 then
|
||||
dStartDist, dEndDist = dEndDist, dStartDist
|
||||
end
|
||||
local bOk, sErr, nMchId = Fbs.MakeOne( Proc.Id, nFacAdj, sCutting, dSawDiam, nFaceUse, dVzLimDwnUp, 0, BD.CUT_SIC, dOffs, dStartDist, dEndDist, nil, b3Raw, bForceInvert)
|
||||
if not bOk then return bOk, sErr end
|
||||
-- setto l'elevazione
|
||||
local sNotes = 'MaxElev=' .. EgtNumToString( 0, 1) .. ';'
|
||||
@@ -3437,7 +3457,7 @@ local function MakeAntiSplintBySaw( Proc, nFacet, vtN, b3Raw, nFacInd, bReduceDe
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function MakePocket( Proc, nPartId, b3Solid, ptPs, tvtN, nFaceRef, sMchFind, nUseRoughTool, sMasterPocket, dPrevFaceElev, tDimAndRef, dAng, bOpenOutRaw, bLapJointAngTrasm, nPhase, nRawId)
|
||||
local function MakePocket( Proc, nPartId, b3Solid, ptPs, tvtN, nFaceRef, sMchFind, nUseRoughTool, sMasterPocket, dPrevFaceElev, tDimAndRef, dAng, bOpenOutRaw, bLapJointAngTrasm, nPhase, nRawId, dCustomMaxElev)
|
||||
-- distanza dal pezzo successivo
|
||||
local dDistToNextPiece = BL.GetDistanceToNextPart( nRawId, nPhase)
|
||||
-- calcolo l'elevazione dal punto medio
|
||||
@@ -3540,11 +3560,10 @@ local function MakePocket( Proc, nPartId, b3Solid, ptPs, tvtN, nFaceRef, sMchFin
|
||||
end
|
||||
end
|
||||
end
|
||||
-- eventuale massima elevazione imposta dall'utente
|
||||
local dMaxElev = EgtGetInfo( Proc.Id, Q_MAX_ELEVATION, 'd')
|
||||
if dMaxElev and dMaxElev < 1 then dMaxElev = nil end
|
||||
-- eventuale massima elevazione forzata
|
||||
if dCustomMaxElev and dCustomMaxElev < 1 then dCustomMaxElev = nil end
|
||||
-- se elevazione superiore a massimo affondamento della fresa, riduco opportunamente
|
||||
dElev = dMaxElev or dElev
|
||||
dElev = dCustomMaxElev or dElev
|
||||
local sWarn
|
||||
local dDepth = dElev
|
||||
if dElev > dMaxDepth + 10 * GEO.EPS_SMALL then
|
||||
@@ -3565,6 +3584,11 @@ local function MakePocket( Proc, nPartId, b3Solid, ptPs, tvtN, nFaceRef, sMchFin
|
||||
if not ML.ApplyMachining( true, false) then
|
||||
-- provo ad allargare leggermente la tasca
|
||||
EgtSetMachiningParam( MCH_MP.OFFSR, -0.1)
|
||||
-- se percorso a Zig-Zag, provo a cambiarlo in spirale
|
||||
local nPocketSubType = EgtGetMachiningParam( MCH_MP.SUBTYPE)
|
||||
if nPocketSubType == MCH_POCK_SUB.ZIGZAG then
|
||||
EgtSetMachiningParam( MCH_MP.SUBTYPE, MCH_POCK_SUB.SPIRALIN)
|
||||
end
|
||||
if not ML.ApplyMachining( true, false) then
|
||||
local _, sErr = EgtGetLastMachMgrError()
|
||||
EgtSetOperationMode( nMchFId, false)
|
||||
@@ -3721,7 +3745,7 @@ local function MachineByMill( Proc, nPhase, nRawId, nPartId, b3Solid, tvtN, nBas
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
else
|
||||
sWarn = 'Warning : lapjoint chamfer angle machined with different tool'
|
||||
sWarn = 'Warning : lapjoint angled face machined with different tool'
|
||||
end
|
||||
end
|
||||
-- recupero i dati dell'utensile
|
||||
@@ -3732,6 +3756,15 @@ local function MachineByMill( Proc, nPhase, nRawId, nPartId, b3Solid, tvtN, nBas
|
||||
dTDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dTDiam
|
||||
end
|
||||
end
|
||||
-- se utensile troppo più grande dell'originale salto la lavorazione
|
||||
if sTuuidPk and EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuidPk) or '') then
|
||||
local dTDiamOriginalTool = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or 0
|
||||
if dTDiam > 2 * dTDiamOriginalTool then
|
||||
sWarn = 'Warning : lapjoint angled face skipped (no compatible tool)'
|
||||
EgtOutLog( sWarn)
|
||||
return true, sWarn
|
||||
end
|
||||
end
|
||||
-- Calcolo uso faccia
|
||||
local nFaceUse = BL.GetNearestParalOpposite( tDimAndRef[1][3]:getVersZ())
|
||||
-- inserisco la lavorazione di fresatura
|
||||
@@ -5873,11 +5906,662 @@ end
|
||||
|
||||
--#endregion SawPlusChain
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function ReorderFacesFromTab( nIdSurf, vFace)
|
||||
|
||||
local nFacCnt = EgtSurfTmFacetCount( nIdSurf)
|
||||
for i = 1, #vFace do
|
||||
for j = 1, nFacCnt do
|
||||
-- ottengo punto iniziale e versore della faccia
|
||||
local ptC, vtN = EgtSurfTmFacetCenter( nIdSurf, (j-1), GDB_ID.ROOT)
|
||||
-- se versore e posizione coincidono e non corrispondono al numero faccia, faccio lo swap
|
||||
if AreSameVectorExact( vFace[i].Norm, vtN) and AreSamePointEpsilon( vFace[i].Cen, ptC, 50*GEO.EPS_SMALL) then
|
||||
if (j-1) ~= vFace[i].Fac then
|
||||
EgtSurfTmSwapFacets( nIdSurf, vFace[i].Fac, (j-1))
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
return nIdSurf
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function CalcInterference( nNewProc, vtExtr, ptCentr, dDiam1, dDiam2,
|
||||
dTall1, dTall2, dDiam3, dTall3)
|
||||
local ptCentrGrid1 = ptCentr + ( vtExtr * 0.01)
|
||||
local frOriTool = Frame3d( ptCentrGrid1, vtExtr)
|
||||
local bColl1 = EgtTestConeSurface( frOriTool, dDiam1/2, dDiam2/2, dTall1, nNewProc, 0, GDB_RT.GLOB)
|
||||
if bColl1 then return true end
|
||||
local ptCentrGrid2 = ptCentr + ( vtExtr * ( dTall1 + 0.01))
|
||||
frOriTool = Frame3d( ptCentrGrid2, vtExtr)
|
||||
local bColl2 = EgtTestCylSurface( frOriTool, dDiam2/2, dTall2, nNewProc, 0, GDB_RT.GLOB)
|
||||
if bColl2 then return true end
|
||||
local ptCentrGrid3 = ptCentr + ( vtExtr * ( dTall2 + 0.01))
|
||||
frOriTool = Frame3d( ptCentrGrid3, vtExtr)
|
||||
local bColl3 = EgtTestCylSurface( frOriTool, dDiam3/2, dTall3, nNewProc, 0, GDB_RT.GLOB)
|
||||
if bColl3 then return true end
|
||||
-- restituisco risultato controllo collisioni
|
||||
return false
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function MakeLocalSurf( ptP1, ptP2, ptP3, nAddGrpId)
|
||||
-- verifico che i tre punti siano definiti
|
||||
if not ptP1 or not ptP2 or not ptP3 then
|
||||
return nil
|
||||
end
|
||||
-- creo il contorno
|
||||
local nLoopId = EgtCurveCompoFromPoints( nAddGrpId, { ptP1, ptP2, ptP3, ptP1}, GDB_RT.GLOB)
|
||||
if not nLoopId then
|
||||
return nil
|
||||
end
|
||||
-- creo la superfice triangolare (quindi piana)
|
||||
local nFaceId = EgtSurfTmByFlatContour( nAddGrpId, nLoopId, 0.01)
|
||||
EgtErase( nLoopId)
|
||||
if not nFaceId then
|
||||
return nil
|
||||
end
|
||||
-- se normale negativa inverto
|
||||
local vtN1 = EgtSurfTmFacetNormVersor( nFaceId, 0, GDB_ID.ROOT)
|
||||
if vtN1:getZ() < -0.01 then
|
||||
EgtInvertSurf( nFaceId)
|
||||
end
|
||||
|
||||
return nFaceId
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function AddMillCornerMachining( nPartId, nNewProc, nFacInd, tFacAdj, nAddGrpId,
|
||||
dToolDiam, sMilling, dOffsAng,
|
||||
dDiam1, dDiam2, dTall1,
|
||||
dTall2, dDiam3, dTall3, bMakeLocSurf, vFace, vtN)
|
||||
|
||||
-- variabili costruzione geometria
|
||||
local pAuxId = {}
|
||||
local nAuxId
|
||||
local ptApPoint
|
||||
local AuxId
|
||||
local nNewProcLoc
|
||||
-- se devo creare superfice locale
|
||||
if bMakeLocSurf then
|
||||
-- creo superfice locale o esco
|
||||
local nSurfToAdd = MakeLocalSurf( tFacAdj[7], tFacAdj[8], tFacAdj[9], nAddGrpId)
|
||||
if nSurfToAdd then
|
||||
local nFacCntPre = EgtSurfTmFacetCount( nNewProc.Id)
|
||||
-- creo copia del percorso principale e gli aggiungo la nuova faccia
|
||||
nNewProcLoc = EgtCopyGlob( nNewProc.Id, nAddGrpId)
|
||||
nNewProcLoc = EgtSurfTmBySewing( nAddGrpId, {nNewProcLoc,nSurfToAdd} , true)
|
||||
-- riordino le facce
|
||||
nNewProcLoc = ReorderFacesFromTab( nNewProcLoc, vFace)
|
||||
-- acquisisco il numero della faccia
|
||||
local nFacCnt = EgtSurfTmFacetCount( nNewProcLoc)
|
||||
nFacInd = nFacCnt - 1
|
||||
else
|
||||
local sErr = 'Cannot make local bottom surface'
|
||||
EgtOutLog( sErr)
|
||||
return true, ''
|
||||
end
|
||||
else
|
||||
nNewProcLoc = nNewProc.Id
|
||||
end
|
||||
-- prendo il primo versore
|
||||
local _, vtN1 = EgtSurfTmFacetCenter( nNewProcLoc, nFacInd, GDB_ID.ROOT)
|
||||
local _, vtN2 = EgtSurfTmFacetCenter( nNewProcLoc, tFacAdj[1], GDB_ID.ROOT)
|
||||
local _, vtN3 = EgtSurfTmFacetCenter( nNewProcLoc, tFacAdj[2], GDB_ID.ROOT)
|
||||
-- trovo il punto sulla superfice di riferimento
|
||||
local _, ptLocP1, ptLocP2, _ = EgtSurfTmFacetsContact( nNewProcLoc, nFacInd, tFacAdj[1], GDB_ID.ROOT)
|
||||
local _, ptLocP3, ptLocP4, _ = EgtSurfTmFacetsContact( nNewProcLoc, nFacInd, tFacAdj[2], GDB_ID.ROOT)
|
||||
-- se ho creato faccia locale su copia superficie, cancella la copia
|
||||
if bMakeLocSurf then
|
||||
EgtErase( nNewProcLoc)
|
||||
end
|
||||
local nIdIniPoint
|
||||
local nIdEndPoint
|
||||
if ptLocP1 and ptLocP2 then
|
||||
if ( dist( ptLocP1, tFacAdj[4]) < GEO.EPS_SMALL) or ( dist( ptLocP2, tFacAdj[4]) < GEO.EPS_SMALL) then
|
||||
nIdEndPoint = 4
|
||||
nIdIniPoint = 5
|
||||
elseif ( dist( ptLocP1, tFacAdj[5]) < GEO.EPS_SMALL) or ( dist( ptLocP2, tFacAdj[5]) < GEO.EPS_SMALL) then
|
||||
nIdEndPoint = 5
|
||||
nIdIniPoint = 4
|
||||
end
|
||||
end
|
||||
-- versore direzione
|
||||
local vtExtr = tFacAdj[nIdIniPoint] - tFacAdj[nIdEndPoint]
|
||||
vtExtr:normalize()
|
||||
-- versore direzione di uscita
|
||||
local vtExtrExit
|
||||
-- inserisco le prime tre linee
|
||||
if nIdIniPoint and nIdEndPoint then
|
||||
-- se fresatura da sotto salto la lavorazione
|
||||
if vtExtr:getZ() < BD.DRILL_VZ_MIN then
|
||||
local sErr = 'Error : Impossible insert clean corner from bottom'
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
-- sommo i tre versori per avere una direzione media
|
||||
vtExtrExit = vtN2 + vtN3
|
||||
vtExtrExit:normalize()
|
||||
-- calcolo angolo tilt di 45°
|
||||
vtExtr = vtExtrExit + vtN
|
||||
vtExtr:normalize()
|
||||
local vtCheck = Vector3d(vtExtr)
|
||||
-- se ho un offset angolare ruoto il percorso
|
||||
if abs(dOffsAng) > 100 * GEO.EPS_SMALL then
|
||||
vtCheck:rotate( vtN, dOffsAng)
|
||||
end
|
||||
-- controllo se c'è collisione con le facce della superfice
|
||||
if CalcInterference( nNewProc.Id, vtCheck, tFacAdj[nIdEndPoint], dDiam1, dDiam2,
|
||||
dTall1, dTall2, dDiam3, dTall3) then
|
||||
local sErr = 'Collision detect from clean corner tool and surface'
|
||||
EgtOutLog( sErr)
|
||||
return true, ''
|
||||
end
|
||||
nAuxId = EgtLine( nAddGrpId, tFacAdj[nIdIniPoint], tFacAdj[nIdEndPoint], GDB_RT.GLOB)
|
||||
table.insert( pAuxId, nAuxId)
|
||||
-- se offset angolare valido e/o negativo creo il baffo precedente
|
||||
if dOffsAng < ( 100 * GEO.EPS_SMALL) then
|
||||
-- se il punto finale corrisponde con il punto utilizzato in precedenza, uso l'altro
|
||||
if dist( tFacAdj[nIdEndPoint], ptLocP1) < 10 * GEO.EPS_SMALL then
|
||||
ptApPoint = ptLocP2
|
||||
else
|
||||
ptApPoint = ptLocP1
|
||||
end
|
||||
nAuxId = EgtLine( nAddGrpId, tFacAdj[nIdEndPoint], ptApPoint, GDB_RT.GLOB)
|
||||
local dLenTrimExt = dist( tFacAdj[nIdEndPoint], ptApPoint) - (( dToolDiam/2) + 0.2)
|
||||
-- se la distanza dei due punti della linea è maggiore dal raggio fresa + delta, trimmo al raggio fresa + delta
|
||||
if dLenTrimExt > 10 * GEO.EPS_SMALL then
|
||||
EgtTrimExtendCurveByLen( nAuxId , -dLenTrimExt, ptApPoint, GDB_RT.GLOB)
|
||||
-- se ho l'offset angolare ruoto la linea per compensare la rotazione che verrà applicata
|
||||
if abs(dOffsAng) > 100 * GEO.EPS_SMALL then
|
||||
EgtRotate( nAuxId, tFacAdj[nIdEndPoint], vtN, -dOffsAng, GDB_RT.GLOB)
|
||||
end
|
||||
-- prendo il nuovo punto finale
|
||||
ptApPoint = EgtEP( nAuxId, GDB_RT.GLOB)
|
||||
else
|
||||
-- se ho l'offset angolare ruoto la linea per compensare la rotazione che verrà applicata
|
||||
if abs(dOffsAng) > 100 * GEO.EPS_SMALL then
|
||||
EgtRotate( nAuxId, tFacAdj[nIdEndPoint], vtN, -dOffsAng, GDB_RT.GLOB)
|
||||
end
|
||||
end
|
||||
table.insert( pAuxId, nAuxId)
|
||||
-- creo linea di ritorno
|
||||
nAuxId = EgtLine( nAddGrpId, ptApPoint, tFacAdj[nIdEndPoint], GDB_RT.GLOB)
|
||||
table.insert( pAuxId, nAuxId)
|
||||
end
|
||||
end
|
||||
-- inserisco le ultime tre linee
|
||||
-- trovo il secondo punto sulla superfice di riferimento
|
||||
ptLocP1, ptLocP2 = ptLocP3, ptLocP4
|
||||
if ptLocP1 and ptLocP2 then
|
||||
-- se il punto finale corrisponde con il punto utilizzato in precedenza, uso l'altro
|
||||
if dist( tFacAdj[nIdEndPoint], ptLocP1) < 10 * GEO.EPS_SMALL then
|
||||
ptApPoint = ptLocP2
|
||||
else
|
||||
ptApPoint = ptLocP1
|
||||
end
|
||||
-- se offset angolare valido e/o negativo creo il baffo precedente
|
||||
if dOffsAng > -( 100 * GEO.EPS_SMALL) then
|
||||
nAuxId = EgtLine( nAddGrpId, tFacAdj[nIdEndPoint], ptApPoint, GDB_RT.GLOB)
|
||||
local dLenTrimExt = dist( tFacAdj[nIdEndPoint], ptApPoint) - (( dToolDiam/2) + 0.2)
|
||||
-- se la distanza dei due punti della linea è maggiore dal raggio fresa + delta, trimmo al raggio fresa + delta
|
||||
if dLenTrimExt > 10 * GEO.EPS_SMALL then
|
||||
EgtTrimExtendCurveByLen( nAuxId , -dLenTrimExt, ptApPoint, GDB_RT.GLOB)
|
||||
-- se ho l'offset angolare ruoto la linea per compensare la rotazione che verrà applicata
|
||||
if abs(dOffsAng) > 100 * GEO.EPS_SMALL then
|
||||
EgtRotate( nAuxId, tFacAdj[nIdEndPoint], vtN, -dOffsAng, GDB_RT.GLOB)
|
||||
end
|
||||
-- prendo il nuovo punto finale
|
||||
ptApPoint = EgtEP( nAuxId, GDB_RT.GLOB)
|
||||
else
|
||||
-- se ho l'offset angolare ruoto la linea per compensare la rotazione che verrà applicata
|
||||
if abs(dOffsAng) > 100 * GEO.EPS_SMALL then
|
||||
EgtRotate( nAuxId, tFacAdj[nIdEndPoint], vtN, -dOffsAng, GDB_RT.GLOB)
|
||||
end
|
||||
end
|
||||
table.insert( pAuxId, nAuxId)
|
||||
-- creo linea di ritorno
|
||||
nAuxId = EgtLine( nAddGrpId, ptApPoint, tFacAdj[nIdEndPoint], GDB_RT.GLOB)
|
||||
table.insert( pAuxId, nAuxId)
|
||||
end
|
||||
-- ultima linea di distacco (5mm in direzione utensile)
|
||||
local pEnd = tFacAdj[nIdEndPoint] + ( 5 * vtExtr)
|
||||
nAuxId = EgtLine( nAddGrpId, tFacAdj[nIdEndPoint], pEnd, GDB_RT.GLOB)
|
||||
table.insert( pAuxId, nAuxId)
|
||||
end
|
||||
-- trasformo in percorso
|
||||
if #pAuxId > 0 then
|
||||
AuxId = EgtCurveCompo( nAddGrpId, pAuxId, true)
|
||||
EgtSetInfo( AuxId, 'TASKID', nNewProc.TaskId)
|
||||
EgtSetInfo( AuxId, 'CUTID', nNewProc.CutId)
|
||||
end
|
||||
-- se non c'é il percorso do errore
|
||||
if not AuxId then
|
||||
local sErr = 'Error : impossible make clean corner path'
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
-- modifico versore direzione
|
||||
EgtModifyCurveExtrusion( AuxId, vtExtr, GDB_RT.GLOB)
|
||||
-- se ho un offset angolare ruoto il percorso
|
||||
if abs(dOffsAng) > 100 * GEO.EPS_SMALL then
|
||||
EgtRotate( AuxId, tFacAdj[nIdEndPoint], vtN, dOffsAng, GDB_RT.GLOB)
|
||||
end
|
||||
-- inserisco la lavorazione
|
||||
local sName = 'Clean_' .. ( EgtGetName( nNewProc.Id) or tostring( nNewProc.Id))
|
||||
local nMchId = EgtAddMachining( sName, sMilling)
|
||||
if not nMchId then
|
||||
local sErr = 'Error adding machining ' .. sName .. '-' .. sMilling
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
EgtSetInfo( nMchId, 'Part', nPartId)
|
||||
|
||||
-- aggiungo geometria
|
||||
EgtSetMachiningGeometry( {{ AuxId, -1}})
|
||||
-- imposto posizione braccio porta testa
|
||||
local nSCC = MCH_SCC.ADIR_ZP
|
||||
EgtSetMachiningParam( MCH_MP.SCC, nSCC)
|
||||
EgtSetMachiningParam( MCH_MP.LEADINTYPE, 0)
|
||||
EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, 4)
|
||||
-- allungo inizio e fine di 10mm
|
||||
EgtSetMachiningParam( MCH_MP.STARTADDLEN, 10)
|
||||
EgtSetMachiningParam( MCH_MP.ENDADDLEN, 10)
|
||||
-- setto affondamento 0
|
||||
EgtSetMachiningParam( MCH_MP.DEPTH, 0)
|
||||
-- forzo lato correzione a centrato
|
||||
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.CENTER)
|
||||
-- leggo eventuali note esistenti della lavorazione
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES)
|
||||
-- Note utente con dichiarazione nessuna generazione sfridi per Vmill
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'VMRS', 0)
|
||||
-- aggiungo alle note massima elevazione
|
||||
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( 0.0, 1))
|
||||
-- scrivo le note della lavorazione
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
if not EgtApplyMachining( true, false) then
|
||||
local _, sErr = EgtGetLastMachMgrError()
|
||||
EgtSetOperationMode( nMchId, false)
|
||||
return false, sErr
|
||||
else
|
||||
local _, sWarn = EgtGetMachMgrWarning( 0)
|
||||
if EgtIsMachiningEmpty() then
|
||||
EgtSetOperationMode( nMchId, false)
|
||||
return false, sWarn
|
||||
end
|
||||
end
|
||||
|
||||
return true, ''
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function AddMillCorner( vFace, Proc, dToolDiam, nAddGrpId, nMasterNewProc, vtN)
|
||||
local sMilling, dMaxDepth
|
||||
-- se ripresa angolo con fresa cono 60° con ripresa
|
||||
|
||||
-- recupero la lavorazione di fresatura
|
||||
sMilling, dMaxDepth = ML.FindMilling( 'CleanCorner60')
|
||||
if not sMilling then
|
||||
local sErr = 'Error : CleanCorner 60 not found in library'
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
|
||||
-- recupero i dati dell'utensile
|
||||
local dMillDiam = 20
|
||||
local dMillTotDiam = 20
|
||||
local dMillDiamTh = 20
|
||||
local dToolLength = 20
|
||||
local dThickTool = 20
|
||||
local dSideAng = 0
|
||||
if EgtMdbSetCurrMachining( sMilling) then
|
||||
local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID)
|
||||
if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then
|
||||
dMillDiamTh = EgtTdbGetCurrToolThDiam() or dMillDiamTh
|
||||
dMillTotDiam = EgtTdbGetCurrToolParam( MCH_TP.TOTDIAM) or dMillTotDiam
|
||||
dSideAng = EgtTdbGetCurrToolParam( MCH_TP.SIDEANG) or dSideAng
|
||||
dMillDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dMillDiam
|
||||
dThickTool = EgtTdbGetCurrToolParam( MCH_TP.THICK) or dThickTool
|
||||
dToolLength = EgtTdbGetCurrToolParam( MCH_TP.LEN) or dToolLength
|
||||
dMaxDepth = EgtTdbGetCurrToolMaxDepth() or dMaxDepth -- qui è la distanza dal portautensile
|
||||
-- calcolo il secondo diametro del cono
|
||||
dMillTotDiam = dMillDiam + ( abs(dThickTool) * tan(dSideAng)) * 2
|
||||
end
|
||||
end
|
||||
-- copio la feature nel layer di appoggio
|
||||
local nNewProc = { CutId = Proc.CutId, TaskId = Proc.TaskId}
|
||||
if nMasterNewProc then
|
||||
nNewProc.Id = nMasterNewProc
|
||||
else
|
||||
nNewProc.Id = EgtCopyGlob( Proc.Id, nAddGrpId) or GDB_ID.NULL
|
||||
end
|
||||
local nFacCnt = EgtSurfTmFacetCount( nNewProc.Id)
|
||||
local nFacInd, dDimMin, dDimMax, dDepth, nSurfInt
|
||||
local bMakeLocSurf = true
|
||||
|
||||
-- verifico se ciclo chiuso
|
||||
local bClosed = ( abs( vFace[1].AngPrev) > 0.1)
|
||||
-- ciclo di inserimento delle fresate sulle facce del contorno in esame
|
||||
local i = 1
|
||||
-- se faccia finale con fine non lavorato, forzo partenza da prima faccia non tutta saltata (tipo 4)
|
||||
if bClosed and ( vFace[#vFace].Type == 4 or ( vFace[#vFace].Type & 2) ~= 0) then
|
||||
while i <= #vFace and vFace[i].Type == 4 do
|
||||
i = i + 1
|
||||
end
|
||||
end
|
||||
-- se facce tutte da saltare, parto dall'inizio
|
||||
local bAllType4 = ( i > #vFace)
|
||||
if bAllType4 or bClosed then i = 1 end
|
||||
while i <= #vFace do
|
||||
-- se tutta la faccia o la sua fine senza taglio, inserisco una fresatura
|
||||
if ( vFace[i].Type & 2) ~= 0 or vFace[i].Type == 4 then
|
||||
-- variabili costruzione geometria (nFace1, nFace2, tFacAdj)
|
||||
local nFace1 = vFace[i].Fac
|
||||
-- ricavo i tre punti per eventuale superficie locale
|
||||
local ptLoc1, ptLoc2, ptLoc3
|
||||
-- aggiungo geometria
|
||||
local j = EgtIf( i < #vFace, i + 1, EgtIf( bClosed, 1, nil))
|
||||
if not j then return true end
|
||||
local nFace2 = vFace[j].Fac
|
||||
-- punto in comune tra le due facce (punto precedente della faccia [j])
|
||||
ptLoc1 = vFace[j].PPrev
|
||||
-- punto precedente (punto precedente della faccia [i])
|
||||
if vFace[i].PPrev then
|
||||
ptLoc3 = vFace[i].PPrev
|
||||
else
|
||||
if abs( vtN:getZ()) > abs( vtN:getY()) then
|
||||
ptLoc3 = Point3d( vFace[i].Cen:getX(), vFace[i].Cen:getY(), ptLoc1:getZ())
|
||||
else
|
||||
ptLoc3 = Point3d( vFace[i].Cen:getX(), ptLoc1:getY(), vFace[i].Cen:getZ())
|
||||
end
|
||||
end
|
||||
-- punto successivo ( precedente della faccia successiva)
|
||||
local k = EgtIf( j < #vFace, j + 1, EgtIf( bClosed, 1, nil))
|
||||
-- se è un percorso aperto prendo il punto medio della seconda faccia come punto locale 2
|
||||
if not k then
|
||||
if abs( vtN:getZ()) > abs( vtN:getY()) then
|
||||
ptLoc2 = Point3d( vFace[j].Cen:getX(), vFace[j].Cen:getY(), ptLoc1:getZ())
|
||||
else
|
||||
ptLoc2 = Point3d( vFace[j].Cen:getX(), ptLoc1:getY(), vFace[j].Cen:getZ())
|
||||
end
|
||||
else
|
||||
ptLoc2 = vFace[k].PPrev
|
||||
end
|
||||
-- ricavo i punti e l'angolo interno
|
||||
local _, ptP1, ptP2, dAng = EgtSurfTmFacetsContact( nNewProc.Id, nFace1, nFace2, GDB_ID.ROOT)
|
||||
-- se punti validi e angolo è interno e non è quasi piatto e >= 90 creo istanza
|
||||
local tFacAdj = {}
|
||||
if ptP1 and ptP2 and dAng < 0 and dAng < -6 and dAng > -( 90 + 10 * GEO.EPS_SMALL) then
|
||||
local dLen = dist( ptP1, ptP2)
|
||||
tFacAdj = { nFace1, nFace2, dLen, ptP1, ptP2, dAng, ptLoc1, ptLoc2, ptLoc3}
|
||||
end
|
||||
-- se ho un elemento creo percorso o percorsi in base al tipo di cono e all'apertura dall'angolo rispetto ai 90°
|
||||
-- con una tolleranza di 2 gradi
|
||||
if #tFacAdj > 0 then
|
||||
if (dAng + 90) > 2 then
|
||||
local dAngOffs = (dAng + 90) / 2
|
||||
-- primo taglio
|
||||
local bOk, sErr = AddMillCornerMachining( Proc.PartId, nNewProc, nFacInd, tFacAdj, nAddGrpId,
|
||||
dToolDiam, sMilling, -dAngOffs,
|
||||
dMillDiam, dMillTotDiam, abs( dThickTool),
|
||||
dMaxDepth, dMillDiamTh, dToolLength, bMakeLocSurf, vFace, vtN)
|
||||
if not bOk then return bOk, sErr end
|
||||
-- secondo taglio
|
||||
bOk, sErr = AddMillCornerMachining( Proc.PartId, nNewProc, nFacInd, tFacAdj, nAddGrpId,
|
||||
dToolDiam, sMilling, dAngOffs,
|
||||
dMillDiam, dMillTotDiam, abs( dThickTool),
|
||||
dMaxDepth, dMillDiamTh, dToolLength, bMakeLocSurf, vFace, vtN)
|
||||
if not bOk then return bOk, sErr end
|
||||
-- altrimenti ho un solo percorso
|
||||
else
|
||||
local bOk, sErr = AddMillCornerMachining( Proc.PartId, nNewProc, nFacInd, tFacAdj, nAddGrpId,
|
||||
dToolDiam, sMilling, 0,
|
||||
dMillDiam, dMillTotDiam, abs( dThickTool),
|
||||
dMaxDepth, dMillDiamTh, dToolLength, bMakeLocSurf, vFace, vtN)
|
||||
if not bOk then return bOk, sErr end
|
||||
end
|
||||
end
|
||||
end
|
||||
-- passo alla successiva
|
||||
i = i + 1
|
||||
end
|
||||
-- cancello la copia della superfice
|
||||
if nNewProc.Id then
|
||||
EgtErase( nNewProc.Id)
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function GetOtherRegions( nPartId)
|
||||
local vOthers = {}
|
||||
local nOtherId = EgtGetFirstPartInRawPart( EgtGetFirstRawPart() or GDB_ID.NULL)
|
||||
while nOtherId do
|
||||
local nRegId = EgtGetFirstInGroup( EgtGetFirstNameInGroup( nOtherId, 'Outline') or GDB_ID.NULL)
|
||||
while nRegId do
|
||||
local vtN = EgtSurfFrNormVersor( nRegId, GDB_ID.ROOT)
|
||||
if EgtExistsInfo( nRegId, 'REGION') and vtN and AreSameVectorApprox( vtN, Z_AX()) then
|
||||
local b3Reg = EgtGetBBoxGlob( nRegId, GDB_BB.STANDARD)
|
||||
if b3Reg then
|
||||
table.insert( vOthers, { PartId = nOtherId, RegId = nRegId, Box = b3Reg})
|
||||
end
|
||||
end
|
||||
nRegId = EgtGetNext( nRegId)
|
||||
end
|
||||
nOtherId = EgtGetNextPartInRawPart( nOtherId)
|
||||
end
|
||||
return vOthers
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function GetFacesData( nNewProc, dToolDiam, dToolMaxDepth, dToolThick, nAddGrpId, nPartId, vtNBottom)
|
||||
|
||||
local nNumFacet = EgtSurfTmFacetCount( nNewProc)
|
||||
local vFace = {}
|
||||
-- recupero i dati di tutte le facce
|
||||
for i = 1, nNumFacet do
|
||||
-- indici faccia corrente e precedente
|
||||
local nFac = i - 1
|
||||
local nPrecFac
|
||||
nPrecFac = EgtIf( i == 1, nNumFacet - 1, i - 2)
|
||||
|
||||
-- recupero centro e normale della faccia
|
||||
local ptCen, vtN = EgtSurfTmFacetCenter( nNewProc, nFac, GDB_ID.ROOT)
|
||||
-- recupero le dimensioni della faccia
|
||||
local _, dLen, dWidth = BL.GetFaceHvRefDim( nNewProc, nFac)
|
||||
-- recupero l'angolo con la faccia precedente
|
||||
local bAdj, ptLocP1, ptLocP2, dAng = EgtSurfTmFacetsContact( nNewProc, nPrecFac, nFac, GDB_ID.ROOT)
|
||||
-- verifico che l'adiacenza sia veramente con il precedente (percorro con normale a destra)
|
||||
if bAdj then
|
||||
if ( vtN ^ ( ptLocP1 - ptCen)) * vtNBottom > 0 then
|
||||
bAdj = false
|
||||
end
|
||||
end
|
||||
-- salvo i dati
|
||||
vFace[i] = { Fac = nFac, Cen = ptCen, Norm = vtN, Len = dLen, Width = dWidth, AngPrev = EgtIf( bAdj, dAng, 0)}
|
||||
if bAdj then
|
||||
-- se rivolto verso Z
|
||||
if abs( vtNBottom:getZ()) > abs( vtNBottom:getY()) then
|
||||
if ptLocP1:getZ() < ptLocP2:getZ() then
|
||||
vFace[i].PPrev = ptLocP1
|
||||
else
|
||||
vFace[i].PPrev = ptLocP2
|
||||
end
|
||||
else
|
||||
if vtNBottom:getY() > 0 then
|
||||
vFace[i].PPrev = EgtIf( ptLocP1:getY() < ptLocP2:getY(), ptLocP1, ptLocP2)
|
||||
else
|
||||
vFace[i].PPrev = EgtIf( ptLocP1:getY() > ptLocP2:getY(), ptLocP1, ptLocP2)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
-- analizzo le facce
|
||||
local dMaxWidth = 0
|
||||
for i = 1, #vFace do
|
||||
-- aggiorno la massima larghezza
|
||||
if vFace[i].Width > dMaxWidth then
|
||||
dMaxWidth = vFace[i].Width
|
||||
end
|
||||
-- verifico l'affondamento
|
||||
local dDepth = BD.CUT_EXTRA
|
||||
if vFace[i].Width + BD.CUT_EXTRA > dToolMaxDepth then
|
||||
dDepth = dToolMaxDepth - vFace[i].Width
|
||||
end
|
||||
-- lunghezza baffo
|
||||
local dElev = vFace[i].Width + dDepth
|
||||
local dWhisk = ( dToolDiam / 2) + WHISK_SAFE
|
||||
-- determino la lunghezza del taglio passante e il tipo di attacco e uscita
|
||||
local dLen = vFace[i].Len
|
||||
local nType = 0
|
||||
if vFace[i].AngPrev < -0.1 then
|
||||
nType = nType + 1
|
||||
end
|
||||
if vFace[EgtIf( i < nNumFacet, i + 1, 1)].AngPrev < -0.1 then
|
||||
nType = nType + 2
|
||||
end
|
||||
-- se lunghezza non significativa, non va inserito il taglio
|
||||
if dLen < MIN_LEN_CUT then
|
||||
nType = 4
|
||||
end
|
||||
vFace[i].Depth = dDepth
|
||||
vFace[i].Whisk = dWhisk
|
||||
vFace[i].Type = nType
|
||||
end
|
||||
-- recupero le regioni degli altri pezzi
|
||||
local vOthers = GetOtherRegions( nPartId)
|
||||
-- verifico i baffi sporgenti dei tagli rispetto alle altre regioni
|
||||
for i = 1, #vFace do
|
||||
-- verifico il baffo iniziale
|
||||
if vFace[i].Type ~= 4 and ( vFace[i].Type & 1) == 0 then
|
||||
-- creo il rettangolo del baffo
|
||||
local vtOrt = Vector3d( vFace[i].Norm:getX(), vFace[i].Norm:getY(), 0) ; vtOrt:normalize()
|
||||
local vtDir = Vector3d( vtOrt) ; vtDir:rotate( Z_AX(), -90)
|
||||
local vtUp = Vector3d( vtDir) ; vtUp:rotate( vFace[i].Norm, -90)
|
||||
local ptIni = vFace[i].Cen + vFace[i].Width / 2 * vtUp + ( vFace[i].Len / 2 + WHISK_OFFS) * vtDir + WHISK_OFFS * vtOrt
|
||||
local ptDir = ptIni + ( vFace[i].Whisk - WHISK_OFFS) * vtDir
|
||||
local ptCross = ptDir + ( dToolThick - WHISK_OFFS) * vtOrt
|
||||
local WhId = EgtSurfFrRectangle3P( nAddGrpId, ptIni, ptCross, ptDir, GDB_RT.GLOB)
|
||||
local b3Wh = EgtGetBBoxGlob( WhId or GDB_ID.NULL, GDB_BB.STANDARD)
|
||||
-- verifico se interferisce con gli altri pezzi
|
||||
for j = 1, #vOthers do
|
||||
if OverlapsXY( b3Wh, vOthers[j].Box) then
|
||||
local nClass = EgtSurfFrChunkSimpleClassify( WhId, 0, vOthers[j].RegId, 0)
|
||||
if nClass ~= GDB_RC.OUT then
|
||||
local dLen = vFace[i].Len - vFace[i].Whisk + EgtIf( ( vFace[i].Type & 2) ~= 0, -vFace[i].Whisk, 0)
|
||||
if dLen >= MIN_LEN_CUT then
|
||||
vFace[i].Type = vFace[i].Type + 1
|
||||
else
|
||||
vFace[i].Type = 4
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
EgtErase( WhId)
|
||||
end
|
||||
-- verifico il baffo finale
|
||||
if vFace[i].Type ~= 4 and ( vFace[i].Type & 2) == 0 then
|
||||
-- creo il rettangolo del baffo
|
||||
local vtOrt = Vector3d( vFace[i].Norm:getX(), vFace[i].Norm:getY(), 0) ; vtOrt:normalize()
|
||||
local vtDir = Vector3d( vtOrt) ; vtDir:rotate( Z_AX(), 90)
|
||||
local vtUp = Vector3d( vtDir) ; vtUp:rotate( vFace[i].Norm, 90)
|
||||
local ptIni = vFace[i].Cen + vFace[i].Width / 2 * vtUp + ( vFace[i].Len / 2 + WHISK_OFFS) * vtDir + WHISK_OFFS * vtOrt
|
||||
local ptDir = ptIni + ( vFace[i].Whisk - WHISK_OFFS) * vtDir
|
||||
local ptCross = ptDir + ( dToolThick - WHISK_OFFS) * vtOrt
|
||||
local WhId = EgtSurfFrRectangle3P( nAddGrpId, ptIni, ptCross, ptDir, GDB_RT.GLOB)
|
||||
local b3Wh = EgtGetBBoxGlob( WhId or GDB_ID.NULL, GDB_BB.STANDARD)
|
||||
-- verifico se interferisce con gli altri pezzi
|
||||
for j = 1, #vOthers do
|
||||
if OverlapsXY( b3Wh, vOthers[j].Box) then
|
||||
local nClass = EgtSurfFrChunkSimpleClassify( WhId, 0, vOthers[j].RegId, 0)
|
||||
if nClass ~= GDB_RC.OUT then
|
||||
local dLen = vFace[i].Len - vFace[i].Whisk + EgtIf( ( vFace[i].Type & 1) ~= 0, -vFace[i].Whisk, 0)
|
||||
if dLen >= MIN_LEN_CUT then
|
||||
vFace[i].Type = vFace[i].Type + 2
|
||||
else
|
||||
vFace[i].Type = 4
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
EgtErase( WhId)
|
||||
end
|
||||
end
|
||||
-- eventuali stampe
|
||||
for i = 1, #vFace do
|
||||
local Face = vFace[i]
|
||||
local sOut = 'Face '..tostring( Face.Fac)..' C'..tostring( Face.Cen)..' N'..tostring( Face.Norm)..
|
||||
' L='..EgtNumToString( Face.Len, 1)..' W='..EgtNumToString( Face.Width, 1)..' Ap='..EgtNumToString( Face.AngPrev, 1)..
|
||||
' D='..EgtNumToString( Face.Depth, 1)..' B='..EgtNumToString( Face.Whisk, 1)..' T='..tostring( Face.Type)
|
||||
EgtOutLog( sOut, 3)
|
||||
end
|
||||
|
||||
return vFace, dMaxWidth, nNewProc
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function ReorderFaces( nIdSurf, nNumFacet, vtNBottom)
|
||||
-- cerco una faccia senza precedenti
|
||||
local nFirstFac
|
||||
for i = 1, nNumFacet do
|
||||
-- centro e normale della faccia
|
||||
local ptCen, vtN = EgtSurfTmFacetCenter( nIdSurf, i - 1, GDB_ID.ROOT)
|
||||
-- verifico con le altre facce
|
||||
local bFoundPrec
|
||||
for j = 1, nNumFacet do
|
||||
if j ~= i then
|
||||
-- verifico se è precedente
|
||||
local bAdj, ptP1, _, _ = EgtSurfTmFacetsContact( nIdSurf, i - 1, j - 1, GDB_ID.ROOT)
|
||||
if bAdj and ( vtN ^ ( ptCen - ptP1)) * vtNBottom > 0 then
|
||||
bFoundPrec = true
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
if not bFoundPrec then
|
||||
nFirstFac = i
|
||||
break
|
||||
end
|
||||
end
|
||||
-- se trovata, la metto al primo posto
|
||||
if nFirstFac and nFirstFac ~= 1 then
|
||||
EgtSurfTmSwapFacets( nIdSurf, nFirstFac - 1, 0)
|
||||
end
|
||||
-- ordino le facce in modo da avere una sequenza ordinata con le normali a destra
|
||||
for i = 1, nNumFacet - 1 do
|
||||
-- centro e normale della faccia
|
||||
local ptCen, vtN = EgtSurfTmFacetCenter( nIdSurf, i - 1, GDB_ID.ROOT)
|
||||
-- cerco la successiva
|
||||
for j = i + 1, nNumFacet do
|
||||
-- verifico se è successiva
|
||||
local bAdj, ptP1, _, _ = EgtSurfTmFacetsContact( nIdSurf, i - 1, j - 1, GDB_ID.ROOT)
|
||||
if bAdj and ( vtN ^ ( ptP1 - ptCen)) * vtNBottom > 0 then
|
||||
EgtSurfTmSwapFacets( nIdSurf, i, j - 1)
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function RemoveBottomFaceAndReorder( Proc, nAddGrpId, nFaceToDel, vtN)
|
||||
-- copio la superfice nel gruppo ausiliario
|
||||
local nNewProc = EgtCopyGlob( Proc.Id, nAddGrpId) or GDB_ID.NULL
|
||||
EgtSurfTmRemoveFacet( nNewProc, nFaceToDel)
|
||||
local nNumFacet = EgtSurfTmFacetCount( nNewProc)
|
||||
ReorderFaces( nNewProc, nNumFacet, vtN)
|
||||
return nNewProc, nNumFacet
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePart, bPrevBhSideMill, bAllWithEndCap)
|
||||
if not BD.MAXDIAM_POCK_CORNER then
|
||||
BD.MAXDIAM_POCK_CORNER = 30
|
||||
end
|
||||
local nMGrpId = EgtGetCurrMachGroup()
|
||||
local sWarn
|
||||
-- recupero l'ingombro del grezzo di appartenenza
|
||||
local b3Raw = EgtGetRawPartBBox( nRawId)
|
||||
@@ -6464,6 +7148,35 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa
|
||||
dMaxTotLen = BD.GetBottomToolMaxTotLen( vtN)
|
||||
end
|
||||
local dUserMaxElev = EgtGetInfo( Proc.Id, Q_MAX_ELEVATION, 'd')
|
||||
local dCustomMaxElev
|
||||
-- se esistono tagli troncanti in testa o in coda, si calcola il MaxElev da applicare
|
||||
if not dUserMaxElev then
|
||||
local nTailCutId = EgtGetInfo( nPartId, 'TAILCUTFEATUREID', 'i')
|
||||
local nHeadCutId = EgtGetInfo( nPartId, 'HEADCUTFEATUREID', 'i')
|
||||
if nHeadCutId or nTailCutId then
|
||||
local nSurfPartId = EgtCopyGlob( EgtGetFirstNameInGroup( EgtGetFirstNameInGroup( nPartId, 'Box') or GDB_ID.NULL, 'Box'), nAddGrpId)
|
||||
if nHeadCutId then
|
||||
local ptCCutSurf, vtNCutSurf = EgtSurfTmFacetCenter( nHeadCutId, 0, GDB_ID.ROOT)
|
||||
EgtCutSurfTmPlane( nSurfPartId, ptCCutSurf, vtNCutSurf, false, GDB_RT.GLOB)
|
||||
local nSurfPartIdOld = nSurfPartId
|
||||
nSurfPartId = EgtSurfTmBySewing( nAddGrpId, { nSurfPartId, nHeadCutId}, false)
|
||||
EgtErase( nSurfPartIdOld)
|
||||
end
|
||||
-- in coda si usa il troncante solo se la feature è settata da lavorare dopo separazione (Tail), altrimenti si rischia che venga fatta prima del taglio
|
||||
if nTailCutId and Proc.Tail then
|
||||
local ptCCutSurf, vtNCutSurf = EgtSurfTmFacetCenter( nTailCutId, 0, GDB_ID.ROOT)
|
||||
EgtCutSurfTmPlane( nSurfPartId, ptCCutSurf, vtNCutSurf, false, GDB_RT.GLOB)
|
||||
local nSurfPartIdOld = nSurfPartId
|
||||
nSurfPartId = EgtSurfTmBySewing( nAddGrpId, { nSurfPartId, nTailCutId}, false)
|
||||
EgtErase( nSurfPartIdOld)
|
||||
end
|
||||
dCustomMaxElev = EgtSurfTmFacetElevationInClosedSurfTm( Proc.Id, nFacInd, nSurfPartId, true)
|
||||
if dCustomMaxElev then
|
||||
dCustomMaxElev = dCustomMaxElev + dCollSic
|
||||
end
|
||||
EgtErase( nSurfPartId)
|
||||
end
|
||||
end
|
||||
-- ricerca lavorazione
|
||||
local sPocketing
|
||||
local _, sMyPocketing, dMyTMaxDepth, dMyTDiam = VerifyPocket( Proc, dDiam, dFacElev + dCollSic, dMaxTotLen, sMchFind, bMillUp, bMillDown)
|
||||
@@ -6471,14 +7184,20 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa
|
||||
_, sMyPocketing, dMyTMaxDepth, dMyTDiam = VerifyPocket( Proc, dDiam, dFacElev + dCollSic, dMaxTotLen, sMchFind)
|
||||
bMillDown = false
|
||||
end
|
||||
-- se l'utente ha definito un'elevazione custom dUserMaxElev si lavora sempre la faccia standard
|
||||
if sMyPocketing and
|
||||
( dMyTMaxDepth > dFacElev + dCollSic - 10 * GEO.EPS_SMALL or ( dMyTMaxDepth > 0.8 * dFacElev + dCollSic and not bIsU) or
|
||||
( bIsL and nUseRoughTool == 0) or
|
||||
( bIsL and Proc.Prc == 20) or
|
||||
( Proc.Prc == 25 and not bIsU and not bIsL)) or
|
||||
( dUserMaxElev and dUserMaxElev > 10 * GEO.EPS_SMALL) then
|
||||
sPocketing = sMyPocketing
|
||||
-- se è presente un'elevazione custom dCustomMaxElev si lavora sempre la faccia standard
|
||||
if sMyPocketing then
|
||||
if dUserMaxElev then
|
||||
dCustomMaxElev = dUserMaxElev
|
||||
elseif dCustomMaxElev and ( dMyTMaxDepth < dCustomMaxElev + dCollSic - 10 * GEO.EPS_SMALL) then
|
||||
dCustomMaxElev = nil
|
||||
end
|
||||
if ( dMyTMaxDepth > dFacElev + dCollSic - 10 * GEO.EPS_SMALL or ( dMyTMaxDepth > 0.8 * dFacElev + dCollSic and not bIsU) or
|
||||
( bIsL and nUseRoughTool == 0) or
|
||||
( bIsL and Proc.Prc == 20) or
|
||||
( Proc.Prc == 25 and not bIsU and not bIsL)) or
|
||||
( dCustomMaxElev and dCustomMaxElev > 10 * GEO.EPS_SMALL) then
|
||||
sPocketing = sMyPocketing
|
||||
end
|
||||
end
|
||||
if bMillDown then
|
||||
sMchFind = sMchFind ..'_H2'
|
||||
@@ -6704,7 +7423,7 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa
|
||||
dToolMaxDiam = dToolTargetDiam
|
||||
end
|
||||
local _, sPocketing = VerifyPocket( Proc, dToolMaxDiam, dFacElev, nil, sMyMchFind)
|
||||
bOk, sWarn2, sTuuidPk, dDiamTool, dDepth = MakePocket( Proc, nPartId, b3Solid, ptPs, tvtNx, nFacInd, sMyMchFind, nUseRoughTool, sPocketing, dMachDepth, nil, nil, bAllWithEndCap, nil, nPhase, nRawId)
|
||||
bOk, sWarn2, sTuuidPk, dDiamTool, dDepth = MakePocket( Proc, nPartId, b3Solid, ptPs, tvtNx, nFacInd, sMyMchFind, nUseRoughTool, sPocketing, dMachDepth, nil, nil, bAllWithEndCap, nil, nPhase, nRawId, dCustomMaxElev)
|
||||
if not bOk then return false, sWarn2 end
|
||||
if sWarn2 then
|
||||
if not sWarn then sWarn = '' end
|
||||
@@ -6926,7 +7645,7 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa
|
||||
if ( Proc.Fct == 4 and bTailOnSide) and ( dDistToNextPiece > dToolDiameter + 10 * GEO.EPS_SMALL) then
|
||||
sMchFind = EgtIf( bMillDown, 'OpenPocket_H2', 'OpenPocket')
|
||||
end
|
||||
bOk, sWarn2, sTuuidPk, dDiamTool = MakePocket( Proc, nPartId, b3Solid, ptC, tvtNx, nFacInd, sMchFind, nUseRoughTool, sPocketing, dMachiningDepth, nil, nil, bAllWithEndCap, bLapJointAngTrasm, nPhase, nRawId)
|
||||
bOk, sWarn2, sTuuidPk, dDiamTool = MakePocket( Proc, nPartId, b3Solid, ptC, tvtNx, nFacInd, sMchFind, nUseRoughTool, sPocketing, dMachiningDepth, nil, nil, bAllWithEndCap, bLapJointAngTrasm, nPhase, nRawId, dCustomMaxElev)
|
||||
if not bOk then return false, sWarn2 end
|
||||
if sWarn2 then
|
||||
if not sWarn then sWarn = '' end
|
||||
@@ -6971,6 +7690,7 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa
|
||||
end
|
||||
local nBoreOnCorner = EgtGetInfo( Proc.Id, Q_BORE_ON_CORNER, 'i') or 0
|
||||
local nContourSmallTool = EgtGetInfo( Proc.Id, Q_CONTOUR_SMALL_TOOL, 'i') or 0
|
||||
local nCleanCorner = EgtGetInfo( Proc.Id, Q_CLEAN_CORNER, 'i') or 1
|
||||
-- se abilitato dal parametro Q inserisco foro sullo spigolo
|
||||
if nBoreOnCorner == 1 then
|
||||
local bOk, sWarn2
|
||||
@@ -7000,6 +7720,18 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa
|
||||
sWarn = EgtIf( #sWarn > 0, sWarn .. '\n' .. sWarn2, sWarn2)
|
||||
end
|
||||
end
|
||||
-- se richiesta pulizia spigoli con fresa a V
|
||||
if nCleanCorner > 0 then
|
||||
local dThElev = dToolThDiameter / 2 * sqrt( vtN:getX() * vtN:getX() + vtN:getY() * vtN:getY())
|
||||
local nNewProc = RemoveBottomFaceAndReorder( Proc, nAddGrpId, nFacInd, vtN)
|
||||
local vFace, dDepth = GetFacesData( nNewProc, dToolDiameter, dMaxToolMaterial, ( dToolDiameter/2), nAddGrpId, Proc.PartId, vtN)
|
||||
local bCleanCornerOk, sCleanCornerWarn = AddMillCorner( vFace, Proc, dToolDiameter, nAddGrpId, nNewProc, vtN)
|
||||
if not bCleanCornerOk then return false, sCleanCornerWarn end
|
||||
if sCleanCornerWarn then
|
||||
if not sWarn then sWarn = '' end
|
||||
sWarn = EgtIf( #sWarn > 0, sWarn .. '\n' .. sCleanCornerWarn, sCleanCornerWarn)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -7207,7 +7939,7 @@ local function TestTwoFacesDownHead( Proc)
|
||||
end
|
||||
-- recupero le caratteristiche della feature e delle facce
|
||||
local vtRes = Proc.Face[1].VtN ^ Proc.Face[2].VtN
|
||||
Proc.IsTopDownRabbet = abs( vtRes:getZ()) > 10 * GEO.EPS_SMALL
|
||||
Proc.IsTopDownRabbet = Proc.AffectedFaces.Top and abs( vtRes:getZ()) > 10 * GEO.EPS_SMALL
|
||||
for i = 1, Proc.Fct do
|
||||
Proc.Face[i].IsTooDownwardForTopBlade = Proc.Face[i].VtN:getZ() < ( BD.CUT_VZ_MIN or -0.484) - 10 * GEO.EPS_SMALL
|
||||
Proc.Face[i].IsTooWideForTopBlade = Proc.Face[i].WidthTrimmed > dTopBladeMaxDepth
|
||||
@@ -7477,7 +8209,7 @@ function ProcessLapJoint.Make( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
end
|
||||
-- se lunghezza richiede spezzatura
|
||||
if ( Proc.Box:getDimX() > BD.LONGCUT_MAXLEN) or
|
||||
( Proc.Box:getDimX() > 0.7 * b3Solid:getDimX() and Proc.Box:getDimX() > BD.LONGCUT_ENDLEN) or
|
||||
( Proc.Box:getDimX() > 0.7 * b3Solid:getDimX() and ( b3Solid:getDimX() > ( BD.LEN_VERY_SHORT_PART or BD.LEN_SHORT_PART))) or
|
||||
( ( nForceUseBladeOnNotContinueFace and nForceUseBladeOnNotContinueFace > 0) and ( Proc.Box:getDimX() > ( BD.LEN_SHORT_PART or 1000))) then
|
||||
-- una faccia
|
||||
if Proc.Fct == 1 then
|
||||
|
||||
@@ -1280,10 +1280,10 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
||||
nFin = 1
|
||||
else
|
||||
if vtN[vOrd[1]]:getZ() >= vtN[vOrd[2]]:getZ() then
|
||||
if vtN[vOrd[2]]:getZ() < dLimitAngle then
|
||||
nFin = 1
|
||||
else
|
||||
if vtN[vOrd[1]]:getZ() < dLimitAngle then
|
||||
nIni = 2
|
||||
else
|
||||
nFin = 1
|
||||
end
|
||||
else
|
||||
if vtN[vOrd[1]]:getZ() < dLimitAngle then
|
||||
@@ -1334,7 +1334,7 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
||||
nSCC = EgtIf( nSide == -1, MCH_SCC.ADIR_ZM, MCH_SCC.ADIR_ZP)
|
||||
end
|
||||
else
|
||||
local bFromZM = (( vtN[vOrd[i]]:getZ() < 0 and bConvex) or ( vtN[vOrd[i]]:getZ() > 0 and not bConvex))
|
||||
local bFromZM = (( vtN[vOrd[i]]:getZ() < 10 * GEO.EPS_ANG_SMALL and bConvex) or ( vtN[vOrd[i]]:getZ() > - 10 * GEO.EPS_ANG_SMALL and not bConvex))
|
||||
nSCC = EgtIf( bFromZM, MCH_SCC.ADIR_ZM, MCH_SCC.ADIR_ZP)
|
||||
end
|
||||
end
|
||||
@@ -1352,7 +1352,7 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster
|
||||
if dMachDepth > dMaxDepth - 10 * GEO.EPS_ANG_SMALL then
|
||||
-- verifico se posso lavorare la faccia 2
|
||||
local nOtherFace = EgtIf( i == 1, 2, 1)
|
||||
if j == 1 and vtN[vOrd[nOtherFace]]:getZ() > dLimitAngle and vWidth[vOrd[i]] < dMaxDepth then
|
||||
if Proc.Fct == 2 and j == 1 and vtN[vOrd[nOtherFace]]:getZ() > dLimitAngle and vWidth[vOrd[i]] < dMaxDepth then
|
||||
vOrd[1], vOrd[2] = vOrd[2], vOrd[1]
|
||||
dLargh = vWidth[vOrd[i]]
|
||||
dSal, dEal = dEal, dSal
|
||||
|
||||
@@ -353,6 +353,18 @@ function ProcessMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
BL.SetOpenSide( AuxId, b3Solid)
|
||||
end
|
||||
|
||||
-- recupero il raggio minimo della mortasa
|
||||
local dMaxDiam = 1000
|
||||
local nSt, nEnd = EgtCurveDomain( AuxId)
|
||||
for i = nSt, nEnd - 1 do
|
||||
local dRad = EgtCurveCompoRadius( AuxId, i)
|
||||
-- se è un raggio, setto ed esco subito. Tutti i raggi sono uguali nella mortasa
|
||||
if dRad > 0 then
|
||||
dMaxDiam = dRad * 2
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
-- caso speciale feature trimmata diversamente in/out: si ricostruisce la curva non trimmata
|
||||
-- recupero gruppo per geometria addizionale
|
||||
local nAddGrpId = BL.GetAddGroup( nPartId)
|
||||
@@ -486,6 +498,10 @@ function ProcessMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
end
|
||||
-- determino larghezza della mortasa
|
||||
if dL < dW then dL, dW = dW, dL end
|
||||
|
||||
-- si prende il minimo tra larghezza mortasa e il raggio minimo impostato da parametro
|
||||
dMaxDiam = min( dW, dMaxDiam)
|
||||
|
||||
-- abilitazione lavorazione da sotto
|
||||
local bPockUp = ( BD.DOWN_HEAD and vtExtr:getZ() > -0.259)
|
||||
local bPockDown = ( BD.DOWN_HEAD and vtExtr:getZ() < 0.174)
|
||||
@@ -564,16 +580,16 @@ function ProcessMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
end
|
||||
local sPocketing
|
||||
if Proc.Prc ~= 53 then
|
||||
sPocketing = ProcessMortise.VerifyMortiseOrPocket( Proc, dW, dMorH, nil, sPockType..sMchExt, bPockDown, bExcludeH2)
|
||||
sPocketing = ProcessMortise.VerifyMortiseOrPocket( Proc, dMaxDiam, dMorH, nil, sPockType..sMchExt, bPockDown, bExcludeH2)
|
||||
if not sPocketing and bPockUp then
|
||||
sPocketing = ProcessMortise.VerifyMortiseOrPocket( Proc, dW, dMorH, nil, sPockType..sMchExt, _, bExcludeH2)
|
||||
sPocketing = ProcessMortise.VerifyMortiseOrPocket( Proc, dMaxDiam, dMorH, nil, sPockType..sMchExt, _, bExcludeH2)
|
||||
end
|
||||
end
|
||||
if not sPocketing then
|
||||
sPockType = 'Pocket'
|
||||
sPocketing = ProcessMortise.VerifyMortiseOrPocket( Proc, dW, dMorH, nil, sPockType..sMchExt, bPockDown, bExcludeH2)
|
||||
sPocketing = ProcessMortise.VerifyMortiseOrPocket( Proc, dMaxDiam, dMorH, nil, sPockType..sMchExt, bPockDown, bExcludeH2)
|
||||
if not sPocketing and bPockUp then
|
||||
sPocketing = ProcessMortise.VerifyMortiseOrPocket( Proc, dW, dMorH, nil, sPockType..sMchExt, _, bExcludeH2)
|
||||
sPocketing = ProcessMortise.VerifyMortiseOrPocket( Proc, dMaxDiam, dMorH, nil, sPockType..sMchExt, _, bExcludeH2)
|
||||
end
|
||||
end
|
||||
if not sPocketing then
|
||||
@@ -594,6 +610,7 @@ function ProcessMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
bCW = ( dSpeed >= 0)
|
||||
end
|
||||
end
|
||||
|
||||
-- inserisco la lavorazione di svuotatura
|
||||
local sName = 'Mort_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id))
|
||||
local nMchFId = EgtAddMachining( sName, sPocketing)
|
||||
@@ -613,6 +630,11 @@ function ProcessMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
EgtSetMachiningParam( MCH_MP.SUBTYPE, MCH_POCK_SUB.SPIRALIN)
|
||||
end
|
||||
|
||||
-- se diametro utensile esattamente uguale a larghezza tasca, e tasca tonda, si setta un offset radiale negativo
|
||||
if Proc.Fct > 6 and abs( dMillDiam - dW) < 100 * GEO.EPS_SMALL then
|
||||
EgtSetMachiningParam( MCH_MP.OFFSR, - 50 * GEO.EPS_SMALL)
|
||||
end
|
||||
|
||||
-- aggiungo geometria
|
||||
EgtSetMachiningGeometry( {{ AuxId, -1}})
|
||||
-- sistemo la direzione di lavoro
|
||||
|
||||
@@ -506,7 +506,7 @@ function ProcessProfCamb.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
-- se il chamfer non è esclusivo continuo con le altre lavorazioni
|
||||
if nChamfer < 2 then
|
||||
-- verifico se necessario lavorare in doppio
|
||||
local bDouble = ( dProfDepth + BD.CUT_EXTRA > dToolMaxDepth)
|
||||
local bDouble = ( dProfDepth + BD.CUT_EXTRA - 100 * GEO.EPS_SMALL > dToolMaxDepth)
|
||||
local dDepth = min( dToolMaxDepth, dProfDepth / 2 + BD.MILL_OVERLAP)
|
||||
-- se lavorazione da due parti, aggiungo la seconda
|
||||
local sMillingDown
|
||||
@@ -796,8 +796,10 @@ function ProcessProfCamb.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
if bDoubleFinishMill then
|
||||
local sNewName = 'FinB_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id))
|
||||
local nMch2Id = EgtCopyMachining( sNewName, EgtGetName( nMchId))
|
||||
-- ottengo l'inversione e setto il contrario
|
||||
local bInvertMode = EgtGetMachiningParam( MCH_MP.INVERT)
|
||||
EgtSetMachiningParam( MCH_MP.INVERT, not bInvertMode)
|
||||
EgtSetMachiningParam( MCH_MP.TOOLINVERT, true)
|
||||
EgtSetMachiningParam( MCH_MP.INVERT, true)
|
||||
|
||||
-- eseguo
|
||||
if not ML.ApplyMachining( true, false) then
|
||||
|
||||
@@ -453,7 +453,7 @@ function ProcessProfConcave.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
end
|
||||
end
|
||||
-- verifico se necessario lavorare in doppio
|
||||
local bDouble = ( dProfDepth + BD.CUT_EXTRA > dToolMaxDepth)
|
||||
local bDouble = ( dProfDepth + BD.CUT_EXTRA - 100 * GEO.EPS_SMALL > dToolMaxDepth)
|
||||
local dDepth = min( dToolMaxDepth, dProfDepth / 2 + BD.MILL_OVERLAP)
|
||||
-- se lavorazione da due parti, aggiungo la seconda
|
||||
local sMillingDown
|
||||
|
||||
@@ -453,7 +453,7 @@ function ProcessProfConvex.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH)
|
||||
end
|
||||
end
|
||||
-- verifico se necessario lavorare in doppio
|
||||
local bDouble = ( dProfDepth + BD.CUT_EXTRA > dToolMaxDepth)
|
||||
local bDouble = ( dProfDepth + BD.CUT_EXTRA - 100 * GEO.EPS_SMALL > dToolMaxDepth)
|
||||
local dDepth = min( dToolMaxDepth, dProfDepth / 2 + BD.MILL_OVERLAP)
|
||||
-- se lavorazione da due parti, aggiungo la seconda
|
||||
local sMillingDown
|
||||
|
||||
+131
-1
@@ -167,6 +167,99 @@ local function MakeChamfer( nOriId, Proc, nPhase, nRawId, nPartId, dOvmTail)
|
||||
return true, nil
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- smussi in coda
|
||||
local function MakeTailChamfer( idProc, nPartId, dDepthTailChamfer)
|
||||
-- recupero gruppo per geometria aggiuntiva
|
||||
local AddGrpId = BL.GetAddGroup( nPartId)
|
||||
if not AddGrpId then
|
||||
local sErr = 'Error on process StartFace impossible to find AddGroup'
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
|
||||
-- recupero la lavorazione
|
||||
local sMilling = ML.FindMilling( 'Mark')
|
||||
if not sMilling then
|
||||
local sErr = 'Error : milling not found in library'
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
|
||||
local nLoopId, nLoopCnt = EgtExtractSurfTmFacetLoops( idProc, 0, AddGrpId)
|
||||
if not nLoopId or nLoopCnt > 1 then
|
||||
local sErr = 'Error MakeHeadChamfer : too many loops'
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
|
||||
-- setto direzione estrusione corretta
|
||||
EgtModifyCurveExtrusion( nLoopId, -X_AX())
|
||||
EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.LEFT))
|
||||
|
||||
local dQ09Value = EgtGetInfo( idProc, 'Q09', 'd')
|
||||
local bChamferedEdge = dQ09Value > 0
|
||||
|
||||
local nIdFirstEntity, nEntityCnt = EgtExplodeCurveCompo( nLoopId)
|
||||
local p3MidPoint = EgtMP( nIdFirstEntity, GDB_ID.GRID)
|
||||
|
||||
for i = 0, nEntityCnt - 1 do
|
||||
if EgtCurveLength( nIdFirstEntity + i) - 10 < abs( dQ09Value) * 2 then
|
||||
local sErr = 'Error MakeTailChamfer : Q09 too high'
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
end
|
||||
|
||||
-- creo raccordo o fillet
|
||||
for i = 0, nEntityCnt - 1 do
|
||||
local idFirst = nIdFirstEntity + i
|
||||
local idSecond = EgtIf( i == nEntityCnt - 1, nIdFirstEntity, idFirst + 1)
|
||||
local ptEndPointFirst = EgtEP( idFirst, GDB_ID.GRID) - ( abs( dQ09Value) * EgtEV( idFirst, GDB_ID.GRID))
|
||||
local ptStartPointSecond = EgtSP( idSecond, GDB_ID.GRID) + ( abs( dQ09Value) * EgtEV( idSecond, GDB_ID.GRID))
|
||||
|
||||
if bChamferedEdge then
|
||||
EgtCurveChamfer( AddGrpId, idFirst, ptEndPointFirst, idSecond, ptStartPointSecond, abs( dQ09Value), true, GDB_RT.GRID)
|
||||
else
|
||||
EgtCurveFillet( AddGrpId, idFirst, ptEndPointFirst, idSecond, ptStartPointSecond, abs( dQ09Value), true, GDB_RT.GRID)
|
||||
end
|
||||
end
|
||||
|
||||
EgtSelectPathObjs( nIdFirstEntity, true)
|
||||
local idGeom, idGeomCnt = EgtCurveCompoByChain( AddGrpId, GDB_ID.SEL, {0,0,0}, true)
|
||||
if not idGeom or idGeomCnt > 1 then
|
||||
local sErr = 'Error MakeTailChamfer : too many loops'
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
EgtChangeClosedCurveStartPoint( idGeom, p3MidPoint, GDB_RT.GRID)
|
||||
|
||||
-- Inserisco la lavorazione del lato standard
|
||||
local dExtra = 2
|
||||
local sName1 = 'TailCham_' .. ( EgtGetName( idProc) or tostring( idProc))
|
||||
local nMch1Id = EgtAddMachining( sName1, sMilling)
|
||||
if not nMch1Id then
|
||||
local sErr = 'Error adding machining ' .. sName1 .. '-' .. sMilling
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
-- aggiungo geometria
|
||||
EgtSetMachiningGeometry( {{ idGeom, -1}})
|
||||
-- assegno affondamento e offset radiale
|
||||
EgtSetMachiningParam( MCH_MP.DEPTH, dDepthTailChamfer + dExtra)
|
||||
EgtSetMachiningParam( MCH_MP.OFFSR, dExtra)
|
||||
-- assegno lato di lavoro
|
||||
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.RIGHT)
|
||||
-- eseguo
|
||||
if not ML.ApplyMachining( true, false) then
|
||||
local _, sErr = EgtGetLastMachMgrError()
|
||||
EgtSetOperationMode( nMch1Id, false)
|
||||
return false, sErr
|
||||
end
|
||||
|
||||
return true, nil
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- lavorazione con sega a catena per sezioni alte e larghe
|
||||
local function MakeCutByChainSaw( nSurfId, sSawing, nFaceUse, dDepth, sNotes, dRadialOffset, bExtendStartEnd, bInvert)
|
||||
@@ -662,7 +755,7 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrSt
|
||||
local dMinTailScrapForAdditionalCuts = 10.123
|
||||
local bNeedVerticalAddedCuts = not bSplit and ( Proc.Face[1].WidthTrimmed > BD.MAX_LEN_DICE) and ( dLenEndRaw > dMinTailScrapForAdditionalCuts - 10 * GEO.EPS_SMALL)
|
||||
local bNeedHorizontalAddedCuts = not bSplit and not bBigSectionCut and
|
||||
( Proc.Face[1].HeightTrimmed > ( BD.MIN_HEIGHT_ADDED_CUTS or BD.MAX_LEN_DICE)) and
|
||||
( Proc.Face[1].HeightTrimmed > ( BD.MIN_HEIGHT_ADDED_CUTS or BD.MAX_LEN_DICE) + 100 * GEO.EPS_SMALL) and
|
||||
( dLenEndRaw > dMinTailScrapForAdditionalCuts - 10 * GEO.EPS_SMALL) and
|
||||
dOffsL < BD.MAX_DIM_DICE
|
||||
-- dati lavorazioni sopra e sotto
|
||||
@@ -819,6 +912,43 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrSt
|
||||
|
||||
local bOk, sErr = MakeStandardCuts( Proc, b3Raw, nCuts, dOffsL, TailCutType, Cutting1Data, Cutting2Data, nil, dLenEndRaw)
|
||||
|
||||
-- se smussi in coda da aggiungere
|
||||
local dDepthTailChamfer = EgtGetInfo( nOriId or Proc.Id, 'Q08', 'd') or 0
|
||||
if dDepthTailChamfer > 100 * GEO.EPS_SMALL then
|
||||
-- creo subito nuova fase qui, a meno che non sia stata già creata
|
||||
if nNewPhase == 0 then
|
||||
BL.AddPhaseWithRawParts( nRawId, BD.OriXR, BD.PosXR, BD.RAW_OFFSET)
|
||||
nNewPhase = EgtGetCurrPhase()
|
||||
local nDispId = EgtGetPhaseDisposition( nNewPhase)
|
||||
if sDownOrSideOrStd == 'down' then
|
||||
EgtRotateRawPart( nRawId, X_AX(), 180)
|
||||
EgtSetInfo( nDispId, 'TYPE', 'MID2')
|
||||
EgtSetInfo( nDispId, 'ROT', -2)
|
||||
elseif sDownOrSideOrStd == 'side' then
|
||||
if bPreMove then EgtMoveRawPart( nRawId, vtMove) end
|
||||
EgtRotateRawPart( nRawId, X_AX(), EgtIf( BD.RIGHT_LOAD, -90, 90))
|
||||
if not bPreMove then EgtMoveRawPart( nRawId, vtMove) end
|
||||
EgtSetInfo( nDispId, 'TYPE', 'MID2')
|
||||
EgtSetInfo( nDispId, 'ROT', -1)
|
||||
else
|
||||
EgtSetInfo( nDispId, 'TYPE', 'END')
|
||||
end
|
||||
EgtSetInfo( nDispId, 'ORD', nOrd)
|
||||
-- se grezzo successivo senza pezzi e finale, va tolto
|
||||
local nNextRawId = EgtGetNextRawPart( nRawId)
|
||||
if nNextRawId and EgtGetPartInRawPartCount( nNextRawId) == 0 and EgtGetRawPartBBox( nNextRawId):getDimX() < BD.MinRaw then
|
||||
EgtRemoveRawPartFromCurrPhase( nNextRawId)
|
||||
end
|
||||
end
|
||||
-- alla fine del taglio si aggiungono gli smussi in testa
|
||||
local _, sErrHeadChamfer = MakeTailChamfer( nOriId or Proc.Id, nPartId, dDepthTailChamfer)
|
||||
if sErr then
|
||||
sErr = sErr..'\n'..sErrHeadChamfer
|
||||
else
|
||||
sErr = sErrHeadChamfer
|
||||
end
|
||||
end
|
||||
|
||||
return bOk, sErr, nNewPhase
|
||||
end
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ local Fbs = require( 'FacesBySaw')
|
||||
local DC = require( 'DiceCut')
|
||||
local Cut = require( 'ProcessCut')
|
||||
local Topology = require( 'FeatureTopology')
|
||||
local LapJoint = require( 'ProcessLapJoint')
|
||||
|
||||
EgtOutLog( ' ProcessStepJointNotch started', 1)
|
||||
|
||||
@@ -49,7 +50,7 @@ function ProcessStepJointNotch.Classify( Proc)
|
||||
-- numero delle facce
|
||||
local nFacetCnt = EgtSurfTmFacetCount( Proc.Id)
|
||||
-- gestisco solo 2 o 4 facce
|
||||
if nFacetCnt ~= 2 and nFacetCnt ~= 4 and nFacetCnt ~= 6 and nFacetCnt ~= 8 then
|
||||
if nFacetCnt ~= 2 and nFacetCnt ~= 3 and nFacetCnt ~= 4 and nFacetCnt ~= 6 and nFacetCnt ~= 8 then
|
||||
return false, false
|
||||
end
|
||||
-- verifico le normali delle facce
|
||||
@@ -583,6 +584,9 @@ end
|
||||
---------------------------------------------------------------------
|
||||
-- Applicazione della lavorazione
|
||||
function ProcessStepJointNotch.Make( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
if Proc.Fct == 3 then
|
||||
return LapJoint.Make( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
end
|
||||
-- esecuzione eventuale smusso
|
||||
-- ottengo anche il flag che indica che la feature è larga come la trave
|
||||
local bOkc, sErrC, nDiffWidth = MakeChamfer( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@
|
||||
-- Intestazioni
|
||||
require( 'EgtBase')
|
||||
_ENV = EgtProtectGlobal()
|
||||
EgtEnableDebug( false)
|
||||
EgtEnableDebug( true)
|
||||
|
||||
-- Imposto direttorio libreria specializzata per Travi
|
||||
EgtAddToPackagePath( BEAM.BASEDIR .. '\\LuaLibs\\?.lua')
|
||||
|
||||
@@ -1,5 +1,36 @@
|
||||
==== Beam Update Log ====
|
||||
|
||||
Versione 2.7j2 (30/10/2025)
|
||||
- Fixed : in DoubleCut gestito il caso in cui si ha una terza faccia piccola da non lavorare
|
||||
|
||||
Versione 2.7j1 (28/10/2025)
|
||||
- Modif : migliorato ordinamento feature
|
||||
- Modif : in mortasa si considera ora il raggio minimo impostato da parametro P
|
||||
- Modif : migliorie in tenone a coda di rondine
|
||||
- Fixed : in mortasa corretto percorso errato in caso di diametro utensile uguale a larghezza tasca
|
||||
- Fixed : in profilo cambered (103) gestito correttamente inverti in lavorazione
|
||||
|
||||
Versione 2.7i2 (30/09/2025)
|
||||
- Modif : migliorie a mortasa e tenone a coda di rondine
|
||||
- Modif : migliorie a LongDoubleCut
|
||||
- Modif : migliorie ai tagli
|
||||
|
||||
Versione 2.7i1 (03/09/2025)
|
||||
- Added : in Tenone a coda di rondine aggiunto passaggio di finitura in caso di P14 > 0
|
||||
- Modif : in LapJoint migliorata la scelta lama in caso di due facce e altre piccole correzioni
|
||||
|
||||
Versione 2.7h3 (26/08/2025)
|
||||
- Added : in LapJoint, se possibile, si ricalcola l'elevazione in caso di feature troncanti testa/coda
|
||||
- Modif : eventuali feature troncanti testa/coda sono fatte sempre subito dopo i rispettivi tagli di testa/coda
|
||||
|
||||
Versione 2.7h2 (19/08/2025)
|
||||
- Modif : migliorata ottimizzazione teste
|
||||
- Modif : migliorate forature in doppio
|
||||
- Modif : in LapJoint migliorate lavorazioni lama + sega a catena
|
||||
- Modif : in LapJoint migliorata spezzatura per feature lunghe rispetto al pezzo
|
||||
- Modif : in LapJoint tipo BirdsMouth migliorata lavorazione faccia inclinata
|
||||
- Modif : in StepJointNotch, se 3 facce si riconduce a LapJoint
|
||||
|
||||
Versione 2.7h1 (05/08/2025)
|
||||
- Fixed : in Mortise migliorata la lavorazione in caso di feature trimmata
|
||||
- Modif : in LapJoint, riduzione massimo materiale lama per lavorazioni antischeggia di lama con direzione verticale
|
||||
|
||||
+2
-2
@@ -2,5 +2,5 @@
|
||||
-- Gestione della versione di Beam
|
||||
|
||||
NAME = 'Beam'
|
||||
VERSION = '2.7h1'
|
||||
MIN_EXE = '2.7f2'
|
||||
VERSION = '2.7j2'
|
||||
MIN_EXE = '2.7k2'
|
||||
|
||||
Reference in New Issue
Block a user