Feature/FindMirroredFeatures:
- aggiunta gestione mortise L050/L051 in doppio
This commit is contained in:
+106
-4
@@ -39,6 +39,7 @@
|
||||
-- 2022/09/29 Aggiunta la ricerca di feature specchiate, al momento solo per DtMortise, con le relative funzioni.
|
||||
-- 2022/12/23 Corrette rotazioni 90 deg per macchine con carico da destra.
|
||||
-- 2022/12/28 Implementata gestione forature e code di rondine in doppio.
|
||||
-- 2023/01/31 Implementata gestione mortase in doppio.
|
||||
|
||||
|
||||
-- Tabella per definizione modulo
|
||||
@@ -1378,8 +1379,8 @@ local function MoveDrillsOnTenon( vProc)
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
-- Controlla se la feature ProcMirror è la specchiata di Proc, per feature di tipo DtMortise
|
||||
local function CheckMirrorDtMortise( Proc, ProcMirror, b3Raw, AuxId)
|
||||
-- Controlla se la feature ProcMirror è la specchiata di Proc, per feature di tipo Mortise o DtMortise
|
||||
local function CheckMirrorMortise( Proc, ProcMirror, b3Raw, AuxId)
|
||||
|
||||
-- recupero i dati geometrici della curva Proc
|
||||
local vtExtr = EgtCurveExtrusion( AuxId, GDB_RT.GLOB)
|
||||
@@ -1395,6 +1396,10 @@ local function CheckMirrorDtMortise( Proc, ProcMirror, b3Raw, AuxId)
|
||||
if not AuxIdMirror or ( EgtGetType( AuxIdMirror) & GDB_FY.GEO_CURVE) == 0 then
|
||||
return false
|
||||
end
|
||||
-- se Mortise, se curva di contorno aperta la rendo chiusa
|
||||
if Mortise.SideIdentify( Proc) then
|
||||
BL.ConvertToClosedCurve( AuxIdMirror)
|
||||
end
|
||||
-- recupero i dati geometrici della curva ProcMirror
|
||||
local vtExtrMirror = EgtCurveExtrusion( AuxIdMirror, GDB_RT.GLOB)
|
||||
local ptBCMirror = EgtGP( AuxIdMirror, GDB_RT.GLOB)
|
||||
@@ -1424,6 +1429,101 @@ local function CheckMirrorDtMortise( Proc, ProcMirror, b3Raw, AuxId)
|
||||
return bIsMirror
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
-- Verifica se Proc (mortasa) è lavorabile in doppio e nel caso ne imposta i dati.
|
||||
local function VerifyMortiseMirrored( Proc, vProc, b3Raw)
|
||||
-- recupero e verifico l'entità curva
|
||||
local AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i')
|
||||
if AuxId then
|
||||
AuxId = AuxId + Proc.Id
|
||||
end
|
||||
if not AuxId or ( EgtGetType( AuxId) & GDB_FY.GEO_CURVE) == 0 then
|
||||
local sErr = 'Error : missing profile geometry'
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
-- recupero versore estrusione della curva supplementare
|
||||
local vtExtr = EgtCurveExtrusion( AuxId, GDB_ID.ROOT)
|
||||
-- Se curva di contorno aperta la converto in curva chiusa
|
||||
BL.ConvertToClosedCurve( AuxId)
|
||||
-- recupero i dati della faccia di fondo
|
||||
local frMor, dL, dW = EgtSurfTmFacetMinAreaRectangle( Proc.Id, 0, GDB_ID.ROOT)
|
||||
-- determino larghezza della mortasa
|
||||
if dL < dW then dL, dW = dW, dL end
|
||||
local ptC = ORIG()
|
||||
local vtN = V_NULL()
|
||||
if frMor then
|
||||
ptC = frMor:getOrigin()
|
||||
vtN = frMor:getVersZ()
|
||||
end
|
||||
-- se mortasa passante esco
|
||||
local bOpenBtm = not AreSameVectorApprox( vtExtr, vtN)
|
||||
if bOpenBtm then
|
||||
return
|
||||
end
|
||||
-- determino altezza della mortasa
|
||||
local b3Mor = EgtGetBBoxRef( Proc.Id, GDB_BB.STANDARD, frMor)
|
||||
local dMorH = b3Mor:getDimZ()
|
||||
-- elevazione del punto centrale
|
||||
local _, dCenElev = BL.GetPointDirDepth( nPartId, ptC, vtN)
|
||||
dMorH = max( dMorH, dCenElev or 0)
|
||||
-- se non è lavorabile da sopra esco
|
||||
local bPockUp = ( BD.DOWN_HEAD and vtExtr:getZ() > -0.259)
|
||||
if not bPockUp then
|
||||
return
|
||||
end
|
||||
-- recupero lavorazione adatta
|
||||
local sPockType = 'Mortise'
|
||||
local sPocketing
|
||||
if Proc.Prc ~= 53 then
|
||||
sPocketing = Mortise.VerifyMortiseOrPocket( Proc, dW, dMorH, nil, sPockType, false)
|
||||
end
|
||||
if not sPocketing then
|
||||
sPockType = 'Pocket'
|
||||
sPocketing = Mortise.VerifyMortiseOrPocket( Proc, dW, dMorH, nil, sPockType, false)
|
||||
end
|
||||
if not sPocketing or not EgtMdbSetCurrMachining( sPocketing) then
|
||||
return
|
||||
end
|
||||
-- recupero il suo utensile
|
||||
if not EgtTdbSetCurrTool( EgtMdbGetCurrMachiningParam( MCH_MP.TOOL) or '') then
|
||||
return
|
||||
end
|
||||
-- recupero eventuale utensile in doppio e suo diametro
|
||||
local sToolDoubleName = EgtTdbGetCurrToolValInNotes( MCH_TP.USERNOTES, 'DOUBLE', 's')
|
||||
if not sToolDoubleName or not EgtTdbSetCurrTool( sToolDoubleName) or not EgtTdbGetCurrToolParam( MCH_TP.ACTIVE) then
|
||||
return
|
||||
end
|
||||
local dToolDoubleDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM, 'd')
|
||||
-- verifico se possibile in doppio (diametro utensile e direzione feature)
|
||||
if dToolDoubleDiam < dW + GEO.EPS_SMALL and ( AreSameOrOppositeVectorApprox( vtExtr, Y_AX()) or AreSameVectorApprox( vtExtr, Z_AX())) then
|
||||
for i = 1, #vProc do
|
||||
local ProcMirror = vProc[i]
|
||||
if Mortise.SideIdentify( ProcMirror) and ProcMirror.Id ~= Proc.Id and ProcMirror.Flg ~= 0 then
|
||||
if CheckMirrorMortise( Proc, ProcMirror, b3Raw, AuxId) then
|
||||
if ( not BD.DOWN_HEAD and AreSameVectorApprox( vtExtr, Y_AX())) or
|
||||
( BD.DOWN_HEAD and AreOppositeVectorApprox( vtExtr, Y_AX())) then
|
||||
Proc.Double = 2
|
||||
Proc.MirrorId = ProcMirror.Id
|
||||
Proc.MirrorCutId = ProcMirror.CutId
|
||||
Proc.MirrorTaskId = ProcMirror.TaskId
|
||||
ProcMirror.Flg = 0
|
||||
ProcMirror.Double = 0
|
||||
elseif BD.DOWN_HEAD and AreSameVectorApprox( vtExtr, Z_AX()) then
|
||||
Proc.Double = 3
|
||||
Proc.MirrorId = ProcMirror.Id
|
||||
Proc.MirrorCutId = ProcMirror.CutId
|
||||
Proc.MirrorTaskId = ProcMirror.TaskId
|
||||
ProcMirror.Flg = 0
|
||||
ProcMirror.Double = 0
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
-- Verifica se Proc (mortasa a coda di rondine) è lavorabile in doppio e nel caso ne imposta i dati.
|
||||
local function VerifyDtMortiseMirrored( Proc, vProc, b3Raw)
|
||||
@@ -1464,12 +1564,12 @@ local function VerifyDtMortiseMirrored( Proc, vProc, b3Raw)
|
||||
return
|
||||
end
|
||||
local dToolDoubleDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM, 'd')
|
||||
-- verifico se possibile in doppio (diametro utensile e direzione feaure)
|
||||
-- verifico se possibile in doppio (diametro utensile e direzione feature)
|
||||
if dToolDoubleDiam < dMaxDiam + GEO.EPS_SMALL and ( AreSameOrOppositeVectorApprox( vtExtr, Y_AX()) or AreSameVectorApprox( vtExtr, Z_AX())) then
|
||||
for i = 1, #vProc do
|
||||
local ProcMirror = vProc[i]
|
||||
if DtMortise.SideIdentify( ProcMirror) and ProcMirror.Id ~= Proc.Id and ProcMirror.Flg ~= 0 then
|
||||
if CheckMirrorDtMortise( Proc, ProcMirror, b3Raw, AuxId) then
|
||||
if CheckMirrorMortise( Proc, ProcMirror, b3Raw, AuxId) then
|
||||
if ( not BD.DOWN_HEAD and AreSameVectorApprox( vtExtr, Y_AX())) or
|
||||
( BD.DOWN_HEAD and AreOppositeVectorApprox( vtExtr, Y_AX())) then
|
||||
Proc.Double = 2
|
||||
@@ -1572,6 +1672,8 @@ local function SetMirroredFeatures( vProc, b3Raw)
|
||||
-- Proc.MirrorId -> Id della feature mirrorata
|
||||
if DtMortise.SideIdentify( Proc) and BD.DOUBLE_HEAD_DOVETAIL then
|
||||
VerifyDtMortiseMirrored( Proc, vProc, b3Raw)
|
||||
elseif Mortise.SideIdentify( Proc) and BD.DOUBLE_HEAD_MORTISE then
|
||||
VerifyMortiseMirrored( Proc, vProc, b3Raw)
|
||||
elseif Drill.Identify( Proc) and BD.DOUBLE_HEAD_DRILLING then
|
||||
VerifyDrillMirrored( Proc, vProc, b3Raw)
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user