- in WallExec completata ricerca e esecuzione di fresature in doppio da percorso specchiato
- in WMachiningLib resa globale la funzione IsToolDoubleOk - piccole correzioni
This commit is contained in:
+128
-21
@@ -652,11 +652,14 @@ end
|
||||
-- funzione per l'ordinamento delle features in doppio da accoppiare
|
||||
-- ordinate prima in base alla X e poi alla Y
|
||||
local function SortFeaturesForMirror( Proc1, Proc2)
|
||||
-- tolleranza di ricerca
|
||||
local TOL = EgtIf( Proc1.TopologyLongName == 'DRILLING', WD.DOUBLE_HEAD_DRILLING_TOLERANCE or 0.1 , WD.DOUBLE_HEAD_POCKET_TOLERANCE or 0.5)
|
||||
-- recupero i centri dei box lungo X e Y
|
||||
local Proc1X = Proc1.Box:getCenter():getX()
|
||||
local Proc1Y = Proc1.Box:getCenter():getY()
|
||||
local Proc2X = Proc2.Box:getCenter():getX()
|
||||
local Proc2Y = Proc2.Box:getCenter():getY()
|
||||
-- confronto per ordinamento
|
||||
if Proc1X < Proc2X - TOL then
|
||||
return true
|
||||
elseif abs( Proc1X - Proc2X) < TOL then
|
||||
@@ -666,12 +669,43 @@ local function SortFeaturesForMirror( Proc1, Proc2)
|
||||
end
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
-- funzione per l'ordinamento delle operazioni in doppio da accoppiare
|
||||
-- ordinate prima in base alla X e poi alla Y
|
||||
local function SortOperationsForMirror( nOper1, nOper2)
|
||||
-- tolleranza di ricerca
|
||||
local TOL = 0.1
|
||||
-- recupero il box della prima operazione
|
||||
local nClId1 = EgtGetFirstNameInGroup( nOper1, 'CL')
|
||||
local ptMin1 = EgtGetInfo( nClId1, 'MMIN', 'p')
|
||||
local ptMax1 = EgtGetInfo( nClId1, 'MMAX', 'p')
|
||||
local b3Oper1 = BBox3d( ptMin1, ptMax1)
|
||||
-- recupero il box delle seconda operazione
|
||||
local nClId2 = EgtGetFirstNameInGroup( nOper2, 'CL')
|
||||
local ptMin2 = EgtGetInfo( nClId2, 'MMIN', 'p')
|
||||
local ptMax2 = EgtGetInfo( nClId2, 'MMAX', 'p')
|
||||
local b3Oper2 = BBox3d( ptMin2, ptMax2)
|
||||
-- recupero i centri dei box lungo X e Y
|
||||
local nOper1X = b3Oper1:getCenter():getX()
|
||||
local nOper1Y = b3Oper1:getCenter():getY()
|
||||
local nOper2X = b3Oper2:getCenter():getX()
|
||||
local nOper2Y = b3Oper2:getCenter():getY()
|
||||
-- confronto per ordinamento
|
||||
if nOper1X < nOper2X - TOL then
|
||||
return true
|
||||
elseif abs( nOper1X - nOper2X) < TOL then
|
||||
if nOper1Y < nOper2Y - TOL then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
-- Controlla in vProc la presenza di feature da lavorare in doppio e, se trovate, ne setta i parametri
|
||||
local function SetMirroredFeatures( vProc, b3Raw)
|
||||
|
||||
-- interasse minimo
|
||||
local dMinimumDistanceMirroredFeatures = 780
|
||||
-- inizializzazione array tasche e forature
|
||||
local vPockets = {}
|
||||
local vDrillings = {}
|
||||
|
||||
@@ -715,6 +749,7 @@ local function SetMirroredFeatures( vProc, b3Raw)
|
||||
local Proc = vPockets[nCurrentPocket]
|
||||
if Proc.Flg ~= 0 then
|
||||
local b3Proc = EgtGetBBoxGlob( Proc.Id, GDB_BB.STANDARD)
|
||||
-- cerco evenutale specchiata
|
||||
local nCurrentMirrorPocket = nCurrentPocket + 1
|
||||
while nCurrentMirrorPocket <= #vPockets do
|
||||
local ProcMirror = vPockets[nCurrentMirrorPocket]
|
||||
@@ -794,7 +829,8 @@ local function SetMirroredFeatures( vProc, b3Raw)
|
||||
Proc.MirrorAx = dYMirrorAx
|
||||
-- Offset Z tra le feature
|
||||
Proc.MirrorDeltaZ = dDeltaZ
|
||||
-- rimuovo dalla lista le groove già assegnate
|
||||
|
||||
-- rimuovo dalla lista le pocket già assegnate
|
||||
local ProcMirrorOldId = ProcMirror.Id
|
||||
table.remove( vPockets, nCurrentPocket)
|
||||
-- avendo rimosso un elemento dall'array, potrebbe essere cambiato l'elemento nCurrentMirrorPocket
|
||||
@@ -814,8 +850,9 @@ local function SetMirroredFeatures( vProc, b3Raw)
|
||||
while nCurrentDrilling <= #vDrillings do
|
||||
local Proc = vDrillings[nCurrentDrilling]
|
||||
if Proc.Flg ~= 0 then
|
||||
local nCurrentMirrorDrilling = nCurrentDrilling + 1
|
||||
local b3Proc = EgtGetBBoxGlob( Proc.Id, GDB_BB.STANDARD)
|
||||
-- cerco evenutale specchiata
|
||||
local nCurrentMirrorDrilling = nCurrentDrilling + 1
|
||||
while nCurrentMirrorDrilling <= #vDrillings do
|
||||
local ProcMirror = vDrillings[nCurrentMirrorDrilling]
|
||||
local b3ProcMirror = EgtGetBBoxGlob( ProcMirror.Id, GDB_BB.STANDARD)
|
||||
@@ -838,14 +875,14 @@ local function SetMirroredFeatures( vProc, b3Raw)
|
||||
local b3Tab = EgtGetTableArea()
|
||||
local ptOnMirrorAx = ( Proc.Box:getCenter() + ProcMirror.Box:getCenter()) / 2
|
||||
dYMirrorAx = ptOnMirrorAx:getY() - b3Tab:getMin():getY()
|
||||
|
||||
-- scrivo i parametri nella lavorazione
|
||||
-- 2: specchiatura in Y
|
||||
Proc.Double = 2
|
||||
Proc.Mirror = ProcMirror
|
||||
-- posizione Y dell'asse di specchiatura
|
||||
Proc.MirrorAx = dYMirrorAx
|
||||
-- rimuovo dalla lista le groove già assegnate
|
||||
|
||||
-- rimuovo dalla lista le forature già assegnate
|
||||
local ProcMirrorOldId = ProcMirror.Id
|
||||
table.remove( vDrillings, nCurrentDrilling)
|
||||
-- avendo rimosso un elemento dall'array, potrebbe essere cambiato l'elemento nCurrentMirrorDrilling
|
||||
@@ -866,34 +903,83 @@ end
|
||||
local function SetMirroredOperations()
|
||||
-- interasse minimo
|
||||
local dMinimumDistanceMirroredOperations = 780
|
||||
local nOperIdMaster = EgtGetNextOperation( EgtGetPhaseDisposition( 1))
|
||||
while nOperIdMaster do
|
||||
-- inzializzazione array
|
||||
local vMillings = {}
|
||||
|
||||
-- raccolgo le fresature non già fatte in doppio
|
||||
local nOperId = EgtGetNextOperation( EgtGetPhaseDisposition( 1))
|
||||
while nOperId do
|
||||
EgtSetCurrMachining( nOperId)
|
||||
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES)
|
||||
local bIsDouble = ( EgtGetValInNotes( sUserNotes, 'DOUBLE', 'i') or 0) > 0
|
||||
if not bIsDouble and EgtGetOperationType( nOperId) == MCH_OY.MILLING then
|
||||
table.insert( vMillings, nOperId)
|
||||
end
|
||||
nOperId = EgtGetNextOperation( nOperId)
|
||||
end
|
||||
|
||||
-- ordinamento delle operazioni raccolte secondo X e poi Y crescente
|
||||
table.sort( vMillings, SortOperationsForMirror)
|
||||
|
||||
-- accoppio le fresature
|
||||
local nCurrentMilling = 1
|
||||
while nCurrentMilling <= #vMillings do
|
||||
local nOperIdMaster = vMillings[nCurrentMilling]
|
||||
EgtSetCurrMachining( nOperIdMaster)
|
||||
local sMachining = EgtGetMachiningParam( MCH_MP.NAME, 's')
|
||||
local nClId = EgtGetFirstNameInGroup( nOperIdMaster, 'CL')
|
||||
local nPathId = EgtGetFirstInGroup( nClId or GDB_ID.NULL)
|
||||
-- vettore direzione utensile lavorazione master
|
||||
-- vettore direzione utensile e somma normali facce per lavorazione master
|
||||
local vtTool = EgtGetInfo( nPathId, 'EXTR', 'v')
|
||||
local vtNormSum = EgtGetInfo( nOperIdMaster, 'NORM_SUM', 'v')
|
||||
local ptMin = EgtGetInfo( nClId, 'MMIN', 'p')
|
||||
local ptMax = EgtGetInfo( nClId, 'MMAX', 'p')
|
||||
-- box percorso lavorazione master
|
||||
local b3Operation = BBox3d( ptMin, ptMax)
|
||||
local sMachining = EgtGetMachiningParam( MCH_MP.NAME, 's')
|
||||
-- lavorazione master adatta alla specchiatura
|
||||
local bIsMachiningOk = ( EgtGetMachiningParam( MCH_MP.TYPE) == MCH_OY.MILLING) and EgtGetOperationMode( nOperIdMaster) and WM.IsMachiningOkForDouble( sMachining)
|
||||
local nOperIdMirror = EgtGetNextOperation( EgtGetPhaseDisposition( 1))
|
||||
local bIsMachiningOk = EgtGetOperationMode( nOperIdMaster) and WM.IsMachiningOkForDouble( sMachining)
|
||||
if bIsMachiningOk then
|
||||
while nOperIdMirror do
|
||||
-- recupero la distanza tra centro di rotazione e punta dell'utensile per aumentare o ridurre l'interasse minimo
|
||||
local dTipToPivot, dTipToPivotDouble = 999, 999
|
||||
local dToolMasterTotLength, dToolMasterTotLengthDouble = 999, 999
|
||||
local sToolMasterName = ''
|
||||
if EgtMdbSetCurrMachining( sMachining) then
|
||||
-- recupero l'utensile della lavorazione e il suo doppio
|
||||
sToolMasterName = EgtMdbGetCurrMachiningParam( MCH_MP.TOOL)
|
||||
if EgtTdbSetCurrTool( sToolMasterName or '') then
|
||||
dToolMasterTotLength = EgtTdbGetCurrToolParam( MCH_TP.TOTLEN) or dToolMasterTotLength
|
||||
local sToolDoubleName = EgtTdbGetCurrToolValInNotes( MCH_TP.USERNOTES, 'DOUBLE', 's')
|
||||
if sToolDoubleName and EgtTdbSetCurrTool( sToolDoubleName) then
|
||||
dToolMasterTotLengthDouble = EgtTdbGetCurrToolParam( MCH_TP.TOTLEN) or dToolMasterTotLengthDouble
|
||||
end
|
||||
end
|
||||
end
|
||||
if WD.HEAD_PIVOT_MAIN and WD.HEAD_PIVOT_SECONDARY then
|
||||
dTipToPivot = dToolMasterTotLength + WD.HEAD_PIVOT_MAIN
|
||||
dTipToPivotDouble = dToolMasterTotLengthDouble + WD.HEAD_PIVOT_SECONDARY
|
||||
else
|
||||
local sOut = 'Error : HEAD_PIVOT_MAIN or HEAD_PIVOT_SECONDARY missing in WallData'
|
||||
return false, sOut
|
||||
end
|
||||
-- cerco eventuale specchiata
|
||||
local nCurrentMirrorMilling = nCurrentMilling + 1
|
||||
while nCurrentMirrorMilling <= #vMillings do
|
||||
local nOperIdMirror = vMillings[nCurrentMirrorMilling]
|
||||
EgtSetCurrMachining( nOperIdMirror)
|
||||
local nClIdMirror = EgtGetFirstNameInGroup( nOperIdMirror, 'CL')
|
||||
local nPathIdMirror = EgtGetFirstInGroup( nClIdMirror or GDB_ID.NULL)
|
||||
-- vettore direzione utensile lavorazione mirror
|
||||
-- vettore direzione utensile e somma normali facce per lavorazione mirror
|
||||
local vtToolMirror = EgtGetInfo( nPathIdMirror, 'EXTR', 'v')
|
||||
local vtNormSumMirror = EgtGetInfo( nOperIdMirror, 'NORM_SUM', 'v')
|
||||
local ptMinMirror = EgtGetInfo( nClIdMirror, 'MMIN', 'p')
|
||||
local ptMaxMirror = EgtGetInfo( nClIdMirror, 'MMAX', 'p')
|
||||
-- box percorso lavorazione mirror
|
||||
local b3OperationMirror = BBox3d( ptMinMirror, ptMaxMirror)
|
||||
-- utensile originale lavorazione specchiata
|
||||
local sOriginalMirrorToolName = EgtGetMachiningParam( MCH_MP.TOOL)
|
||||
local bIsOriginalMirrorToolSameSize = WM.IsToolDoubleOk( sToolMasterName, sOriginalMirrorToolName)
|
||||
-- lavorazione mirror adatta alla specchiatura
|
||||
local bIsMirrorMachiningOk = ( EgtGetMachiningParam( MCH_MP.TYPE) == MCH_OY.MILLING) and EgtGetOperationMode( nOperIdMirror) and nOperIdMaster ~= nOperIdMirror
|
||||
local bIsMirrorMachiningOk = EgtGetOperationMode( nOperIdMirror) and nOperIdMaster ~= nOperIdMirror
|
||||
-- lavorazione master più a sinistra
|
||||
local bIsMirrorSideOk = ( b3OperationMirror:getCenter():getY() - b3Operation:getCenter():getY()) > ( WD.DOUBLE_HEAD_POCKET_TOLERANCE or 0.5)
|
||||
-- box delle stesse dimensioni
|
||||
@@ -906,13 +992,27 @@ local function SetMirroredOperations()
|
||||
-- box che non si intersecano
|
||||
local bIsNotMirrorBoxOverlapping = not OverlapsXY( b3Operation, b3OperationMirror)
|
||||
-- distanza minima tra le feature
|
||||
local dTipToPivotProjectionOnY = dTipToPivot * vtTool:getY()
|
||||
local dTipToPivotProjectionOnYDouble = dTipToPivotDouble * vtToolMirror:getY()
|
||||
local dYMinDistance = max( b3Operation:getMin():getY(), b3OperationMirror:getMin():getY()) - min( b3Operation:getMax():getY(), b3OperationMirror:getMax():getY())
|
||||
local bIsMirrorOperationDistanceOk = dYMinDistance > dMinimumDistanceMirroredOperations + 10 * GEO.EPS_SMALL
|
||||
-- vettori utensile specchiati
|
||||
vtTool:mirror( Y_AX())
|
||||
local bIsMirrorVectorOk = AreSameVectorApprox( vtTool, vtToolMirror)
|
||||
local bIsMirrorOperationDistanceOk = dYMinDistance > dMinimumDistanceMirroredOperations + dTipToPivotProjectionOnY - dTipToPivotProjectionOnYDouble + 10 * GEO.EPS_SMALL
|
||||
-- vettori utensile e somma normali facce specchiati
|
||||
local vtToolMirrored = Vector3d( vtTool)
|
||||
vtToolMirrored:mirror( Y_AX())
|
||||
local bIsMirrorVectorOk = false
|
||||
if AreSameVectorApprox( vtToolMirrored, vtToolMirror) then
|
||||
if AreSameVectorApprox(vtTool, vtToolMirror) then
|
||||
if vtNormSum and vtNormSumMirror then
|
||||
local vtNormSumMirrored = Vector3d( vtNormSum)
|
||||
vtNormSumMirrored:mirror( Y_AX())
|
||||
bIsMirrorVectorOk = AreSameVectorApprox( vtNormSumMirrored, vtNormSumMirror)
|
||||
end
|
||||
else
|
||||
bIsMirrorVectorOk = true
|
||||
end
|
||||
end
|
||||
-- se condizioni corrette, scrivo le note e cancello la specchiata
|
||||
if bIsMirrorMachiningOk and bIsMirrorSideOk and bIsMirrorOperationSameDimension and bIsMirrorBoxXAligned and bIsNotMirrorBoxOverlapping and bIsMirrorOperationDistanceOk and bIsMirrorVectorOk then
|
||||
if bIsOriginalMirrorToolSameSize and bIsMirrorMachiningOk and bIsMirrorSideOk and bIsMirrorOperationSameDimension and bIsMirrorBoxXAligned and bIsNotMirrorBoxOverlapping and bIsMirrorOperationDistanceOk and bIsMirrorVectorOk then
|
||||
-- calcolo asse di specchiatura
|
||||
local dYMirrorAx
|
||||
local b3Tab = EgtGetTableArea()
|
||||
@@ -928,12 +1028,19 @@ local function SetMirroredOperations()
|
||||
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
||||
-- cancello l'operazione specchiata
|
||||
EgtRemoveOperation( nOperIdMirror)
|
||||
-- rimuovo dalla lista le fresature già assegnate
|
||||
local nCurrentMirrorMillingOldId = nCurrentMirrorMilling
|
||||
table.remove( vMillings, nCurrentMilling)
|
||||
-- avendo rimosso un elemento dall'array, potrebbe essere cambiato l'elemento nCurrentMirrorPocket
|
||||
if nCurrentMirrorMilling > #vMillings or ( vMillings[nCurrentMirrorMilling] ~= nCurrentMirrorMillingOldId) then nCurrentMirrorMilling = nCurrentMirrorMilling - 1 end
|
||||
table.remove( vMillings, nCurrentMirrorMilling)
|
||||
nCurrentMilling = 0
|
||||
break
|
||||
end
|
||||
nOperIdMirror = EgtGetNextOperation( nOperIdMirror)
|
||||
nCurrentMirrorMilling = nCurrentMirrorMilling + 1
|
||||
end
|
||||
end
|
||||
nOperIdMaster = EgtGetNextOperation( nOperIdMaster)
|
||||
nCurrentMilling = nCurrentMilling + 1
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user