-- -- EEEEEEEEEE GGGGGG wwww wwww -- EEEEEEEEEE GGGGGGGGGG wwww wwww -- EEEE GGGG GGGG wwww wwww wwww -- EEEE GGGG wwww wwww wwww -- EEEEEEE GGGG GGGGGGG wwww wwwwww wwww -- EEEEEEE GGGG GGGGGGG wwww wwwwww wwww -- EEEE GGGG GGGG wwww wwwwwwww wwww -- EEEE GGGG GGGG wwww wwww wwww wwww -- EEEEEEEEEE GGGGGGGGGG wwwwwwww wwwwwwww -- EEEEEEEEEE GGGGGG wwwwwww wwwwwww -- -- Pivot.lua by EgalWare s.r.l. 2016.07.14 -- Autore: Filippo Monchi -- Pivot -- 2016.09.21 V1.011 FM Add warning messages -- 2016.09.21 V1.012 FM not use reverse geometries '_R' on calculate tool diameter, it must have same diameter than not reverse geometries -- 2017.12.08 V1.013 FM Manage offset position on probe geometry and duplicate it for manage probe when door is placed on left or right position -- 2017.12.22 V1.014 FM Manage new backset application point -- 2018.01.08 V1.015 FM Manage new R1 parameter to add a fillet on single corner -- 2018.01.12 V1.016 FM Manage new anti splint position path when side pivot correspond to side door (on offset and offsetintermediate type) -- 2018.02.22 V1.017 FM fix problem on calculate side distance: before into calculation was ignored the offset parameter tMhPar.D_XE define into model lua file -- 2018.04.06 V1.018 FM Manage info (KeepBackSet) for adjust probe on Z -- 2018.05.23 V1.019 FM Manage disposition reference point by .rp parameter for Offsetintermediate pivot -- 2018.10.17 V1.01a FM Add parameter to show into message 402 -- 2018.10.19 V1.01b FM Manage T shape also for Offset Pivot -- 2018.10.19 V1.01b FM Manage disposition reference point by .rp parameter also for Offset pivot -- 2018.10.22 V1.01c FM Manage better the big radius fillet parameter -- 2019.07.29 V1.01d FM Manage new differents pivot models and submodels: Centerhung pivot with submodel (1), Offset pivot with submodel (1) 2 3 4, -- OffsetInpermediate with submodel (1) 3 4 -- the defalult and old one is submodel (1) for all model -- For new Intermediate submodel 4 use _PivotL component instead of _Mortise component -- Manage better the probe geometry disposition: calculate when there is not enough space to insert probe geometry -- 2019.08.27 V1.01e FM Manage new parameter HB to not rotate the horizontal bore of Intermediate Pivot -- 2019.08.27 V1.01e FM Modify the bore depth in case edge is bevel and HB parameter is true -- 2019.09.16 V1.01f FM Fix set wrong parameter into call CheckTool for chisel tool -- 2019.09.30 V1.020 FM Manage Rectangular shape on standard intermediate pivot (by L3 = 0) -- 2019.10.01 V1.021 FM Manage better the position in Z when backset is set to 0 (into center door thickness) -- 2019.10.07 V1.022 FM Allow machine convex profile only with intermediate pivot subtype 1 -- 2019.10.08 V1.023 FM Manage steel option (disable to generate pocket paths, mortise and not horizontal bore) -- 2019.10.18 V2.000 FM Manage use Materials -- 2019.10.21 V2.001 FM Modify the closed path start point for steel material -- 2019.10.25 V2.002 FM Add clean corner geometries -- 2019.12.06 V2.003 FM fix a bug to assign to variable H instead of tMhPar.H at CenterHung section -- 2019.12.18 V2.004 FM Use new parameter DGC.Eah that allow insert template also on bullnose ans convex profiles -- 2019.12.20 V2.005 FM fix a bug on clean corner direction path in case main path turn reverse -- 2020.04.29 V2.006 FM Update for aluminum material -- 2020.05.04 V2.006 FM Manage extra bores on type 1, 2, 3 and only subtype 1 (standard model) -- 2020.05.25 V2.007 FM Manage geometries for calculate region when frame(jamb) is disposed on wide side -- 2020.07.01 V2.008 FM Disable Warning message on frames if parameter DGD.Spd is <= 0 -- 2020.10.14 V2.009 FM Fix error on missing parameter for CheckTool function -- 2021.01.22 V3.000 FM Manage better checking error on tools and dimension when produce flag is false -- 2021.01.25 V3.001 FM Fix error when variable posp is not defined (disabled from hardware manager) -- 2021.03.12 V3.002 FM Manage rotation parameters on extra bores/buttonhole -- 2021.03.12 V3.002 FM Add missing functions DrawLocAddLineDrawCircle and DrawLocAddCircleDrawCircle -- 2021.08.26 V3.003 FM Compare better the wide knuckle (L3) with face tool diameter and anti-splint tool diameter -- 2021.11.24 V3.004 FM Manage side probe option if variable DGC.Pms > 2 -- 2022.07.27 V3.005 FM Modification to use compiled code -- 2023.03.31 V3.006 FM Manage better knuckle disabling, now it checks if L3 = 0 or H3 = 0 too -- 2024.04.29 V3.007 FM Allow mortise to be bigger than face, but join (jn) parameter (to join face and mortise) will se to false -- 2024.07.19 V3.008 FM Set note 'NotCheckDir' to pocketing, antisplint and buttonhole pocketing paths -- 2024.10.29 V3.009 FM Manage new DGC.Fpd CurrDoorCustomData variable to force shuttle probe geometry to stay horizontal -- Tavola per definizione modulo (serve ma non usata) local Pivot = {} -- Intestazioni require( 'EgtBase') EgtEnableDebug( false) -- per messaggi -- EgtAddToPackagePath( EgtGetSourceDir() .. '?.lua') EgtAddToPackagePath( DGD.BASEDIR .. '?.lua') -- Valori limite local DgMin = 4. -- valore minimo diametro utensile local PtMin = 0.1 local PtMax = 1.0 local bShiftBackSetPos = true -- da richiesta MDC local dMinDistIntpiv = 0.762 local dMinDistOffspiv = 0.5 local MB = require( 'MachiningBase') local dExtraH = 0.5 local function DrawLocAddLineDrawCircle( pInitial, pFinal, nGroup, idTable, bPrev, nGroupCirc, nRad, bDrawFirst, bDrawLast, cColor1, cColor2) local nLine = EgtLine(nGroup, pInitial, pFinal, GDB_RT.LOC) if idTable then table.insert( idTable, nLine) end if bPrev then if bDrawFirst then local nCircle1 = EgtCircle( nGroupCirc, pInitial, nRad , GDB_RT.LOC) EgtSetColor( nCircle1, cColor1) end if bDrawLast then local nCircle2 = EgtCircle( nGroupCirc, pFinal, nRad , GDB_RT.LOC) EgtSetColor( nCircle2, cColor2) end end return nLine end local function DrawLocAddCircleDrawCircle( pCenter, dRadius, dAngIni, dAngCen, nGroup, idTable, bPrev, nGroupCirc, nRad, bDrawFirst, bDrawLast, cColor1, cColor2, sMVar) local nCircle = EgtArc( nGroup, pCenter, dRadius, dAngIni, dAngCen, 0, GDB_RT.LOC) local nNumCircle if idTable then table.insert( idTable, nCircle) -- se devo inserire una variazione nell'entità if sMVar then nNumCircle = #idTable end end if bPrev then if bDrawFirst then local nCircle1 = EgtCircle( nGroupCirc, EgtSP( nCircle), nRad , GDB_RT.LOC) EgtSetColor( nCircle1, cColor1) end if bDrawLast then local nCircle2 = EgtCircle( nGroupCirc, EgtEP( nCircle), nRad , GDB_RT.LOC) EgtSetColor( nCircle2, cColor2) end end return nCircle, nNumCircle, sMVar end local function GetMachToolErrorMessage( nErrorId, sGeomName, dIdMach, dOriDiamTool, nIdLogErr, sMchngName) local EgtDoorsMsg = require( 'EgtDoorsMsg') local sMessage = '' if dOriDiamTool then if nErrorId == -1 then -- lavorazione non presente in tabella sMessage = string.format(EgtDoorsMsg[466], nIdLogErr, dIdMach, sGeomName, EgtToUiUnits( dOriDiamTool)) elseif nErrorId == -2 then -- errore nel settare la lavorazione, lavorazione non presente in libreria sMessage = string.format(EgtDoorsMsg[467], nIdLogErr, sMchngName, dIdMach, sGeomName, EgtToUiUnits( dOriDiamTool)) elseif nErrorId == -3 then -- errore nell'acquisire parametri lavorazione sMessage = string.format(EgtDoorsMsg[468], nIdLogErr, sMchngName, dIdMach, sGeomName, EgtToUiUnits( dOriDiamTool)) elseif nErrorId == -4 then -- errore nell'acquisire parametri lavorazione sMessage = string.format(EgtDoorsMsg[469], nIdLogErr, sMchngName, dIdMach, sGeomName, EgtToUiUnits( dOriDiamTool)) elseif nErrorId == -5 then -- diametro utensile non trovato sMessage = string.format(EgtDoorsMsg[470], nIdLogErr, sMchngName, dIdMach, sGeomName, EgtToUiUnits( dOriDiamTool)) elseif nErrorId == -6 then -- nome geometria non presente in tabella sMessage = string.format(EgtDoorsMsg[471], nIdLogErr, sGeomName, EgtToUiUnits( dOriDiamTool)) elseif nErrorId == -7 then -- altezza massima utensile non trovata sMessage = string.format(EgtDoorsMsg[472], nIdLogErr, sMchngName, dIdMach, sGeomName, EgtToUiUnits( dOriDiamTool)) elseif nErrorId == -8 then -- tabella non presente nelle note sMessage = string.format(EgtDoorsMsg[509], nIdLogErr) end elseif nErrorId == -1 then -- lavorazione non presente in tabella sMessage = string.format(EgtDoorsMsg[504], nIdLogErr, dIdMach, sGeomName) elseif nErrorId == -2 then -- errore nel settare la lavorazione sMessage = string.format(EgtDoorsMsg[505], nIdLogErr, sMchngName, dIdMach, sGeomName) elseif nErrorId == -3 then -- errore nell'acquisire parametri lavorazione sMessage = string.format(EgtDoorsMsg[506], nIdLogErr, sMchngName, dIdMach, sGeomName) elseif nErrorId == -4 then -- errore nell'acquisire parametri lavorazione sMessage = string.format(EgtDoorsMsg[507], nIdLogErr, sMchngName, dIdMach, sGeomName) elseif nErrorId == -5 then -- diametro utensile non trovato sMessage = string.format(EgtDoorsMsg[508], nIdLogErr, sMchngName, dIdMach, sGeomName) elseif nErrorId == -6 then -- nome geometria non presente in tabella sMessage = string.format(EgtDoorsMsg[503], nIdLogErr, sGeomName) elseif nErrorId == -7 then -- altezza massima utensile non trovata sMessage = string.format(EgtDoorsMsg[473], nIdLogErr, sMchngName, dIdMach, sGeomName) elseif nErrorId == -8 then -- tabella non presente nelle note sMessage = string.format(EgtDoorsMsg[509], nIdLogErr) end return sMessage end -- Funzione creazione foro o asola o rampa per asola local function MakeBoreOrButtoHole( Lg, bPreview, Dm, nDrawMach, IY10, EBH10, EB10, PX10, Int10, D10, dParH, PY10, T10, RP10, AR10, RCI10, kbs, HB10, ptype, dws, pbs) local pIni, pEnd, pCen local hint3, hint5 local tPath = {} local tPathPok = {} if IY10 > 0 and EBH10 ~= '' then -- se parametri asola presenti pIni = Point3d((PX10+Int10+(D10/2)),(dParH+PY10),0) pEnd = Point3d((PX10+Int10+(D10/2)),(dParH+PY10-(IY10/2)),0) DrawLocAddLineDrawCircle( pIni, pEnd, Lg, tPath, bPreview, Dm, 0, false, false, RED(), RED()) pIni = pEnd pEnd = Point3d((PX10+Int10-(D10/2)),(dParH+PY10-(IY10/2)),0) pCen = Point3d((PX10+Int10),(dParH+PY10-(IY10/2)),0) DrawLocAddCircleDrawCircle( pCen, (D10/2), 0,-180, Lg, tPath, bPreview, Dm, 0, false, false, RED(), RED()) pIni = pEnd pEnd = Point3d((PX10+Int10-(D10/2)),(dParH+PY10+(IY10/2)),0) DrawLocAddLineDrawCircle( pIni, pEnd, Lg, tPath, bPreview, Dm, 0, false, false, RED(), RED()) pIni = pEnd pEnd = Point3d((PX10+Int10+(D10/2)),(dParH+PY10+(IY10/2)),0) pCen = Point3d((PX10+Int10),(dParH+PY10+(IY10/2)),0) DrawLocAddCircleDrawCircle( pCen, (D10/2), 180,-180, Lg, tPath, bPreview, Dm, 0, false, false, RED(), RED()) pIni = pEnd pEnd = Point3d((PX10+Int10+(D10/2)),(dParH+PY10),0) DrawLocAddLineDrawCircle( pIni, pEnd, Lg, tPath, bPreview, Dm, 0, false, false, RED(), RED()) pIni = pEnd hint3 = EgtCurveCompo( Lg, tPath, true) EgtModifyCurveThickness( hint3, -T10) -- se rotazione attiva if AR10 ~= 0 then -- rotazione in centro all'interasse if RCI10 then EgtRotate( hint3, Point3d((PX10),(dParH+PY10),0), Z_AX(), AR10, GDB_RT.LOC) -- ruoto -- rotazione in centro all'asola else EgtRotate( hint3, Point3d((PX10+Int10),(dParH+PY10),0), Z_AX(), AR10, GDB_RT.LOC) -- ruoto end end if nDrawMach > 0 and RP10 and RP10 > 0 and (RP10/2) < T10 then --se parametro step è valido, creao il percorso a zig-zag centrale EgtSetName( hint3,'_'..EBH10) -- aggiungo _ per disabilitare lavorazione local nStep = ceil(T10/RP10) -- numero di passate local dStep = (T10/nStep) -- passo ricalcolato local nPass = 1 local dZedStart = 0 local dZedWork local nInv = 1 pIni = Point3d((PX10+Int10),(dParH+PY10+((IY10/2)*nInv)),dZedStart) while nPass <= nStep do dZedWork = dZedStart - (dStep/2) nInv = -nInv pEnd = Point3d((PX10+Int10),(dParH+PY10+((IY10/2)*nInv)),dZedWork) DrawLocAddLineDrawCircle( pIni, pEnd, Lg, tPathPok, bPreview, Dm, 0, false, false, RED(), RED()) pIni = pEnd dZedWork = dZedStart - dStep nInv = -nInv pEnd = Point3d((PX10+Int10),(dParH+PY10+((IY10/2)*nInv)),dZedWork) DrawLocAddLineDrawCircle( pIni, pEnd, Lg, tPathPok, bPreview, Dm, 0, false, false, RED(), RED()) pIni = pEnd -- se ho altri passi scendo in z if nPass < nStep then dZedStart = dZedWork end nPass = nPass + 1 end -- faccio passata di ritorno nInv = -nInv pEnd = Point3d((PX10+Int10),(dParH+PY10+((IY10/2)*nInv)),-T10) DrawLocAddLineDrawCircle( pIni, pEnd, Lg, tPathPok, bPreview, Dm, 0, false, false, RED(), RED()) hint5 = EgtCurveCompo( Lg, tPathPok, true) EgtModifyCurveThickness( hint5, 0) EgtSetName( hint5, EBH10) EgtSetInfo( hint5, 'NotCheckDir', '1') -- se rotazione attiva if AR10 ~= 0 then -- rotazione in centro all'interasse if RCI10 then EgtRotate( hint5, Point3d((PX10),(dParH+PY10),0), Z_AX(), AR10, GDB_RT.LOC) -- ruoto -- rotazione in centro all'asola else EgtRotate( hint5, Point3d((PX10+Int10),(dParH+PY10),0), Z_AX(), AR10, GDB_RT.LOC) -- ruoto end end else EgtSetName( hint3, EBH10) end elseif EB10 ~= '' then hint3 = EgtCircle( Lg, Point3d((PX10+Int10),(dParH+PY10),0), D10/2 , GDB_RT.LOC) EgtModifyCurveThickness( hint3, -T10) EgtSetName( hint3, EB10) -- se rotazione in centro all'interasse (sono questo caso perchè non ha senso ruotare un foro in centro a se stesso) if AR10 ~= 0 and RCI10 then EgtRotate( hint3, Point3d((PX10),(dParH+PY10),0), Z_AX(), AR10, GDB_RT.LOC) -- ruoto end end -- se mantiene backset if kbs and kbs > 0 then local sKeepMode = 'c' -- setto di default per mantenere il centro spessore if ptype ~= 3 then -- se pivot a L setto 'w' per mantenere il backset su wideside sKeepMode = 'w' end EgtSetInfo( hint3, 'KeepBackSet', sKeepMode) if hint5 then EgtSetInfo( hint5, 'KeepBackSet', sKeepMode) end end if pbs and pbs > 0 and DGC.Pms and DGC.Pms > 2 then EgtSetInfo( hint3, 'ProbeSide', '1') if hint5 then EgtSetInfo( hint5, 'ProbeSide', '1') end end if HB10 then EgtSetInfo( hint3, 'SideDoor', 'LockLH') if hint5 then EgtSetInfo( hint5, 'SideDoor', 'LockLH') end else EgtSetInfo (hint3, 'SideDoor', 'SideLH') if hint5 then EgtSetInfo( hint5, 'SideDoor', 'SideLH') end end if dws then local nIdSideBoxUp = EgtCopyGlob( hint3, Lg) EgtSetName( nIdSideBoxUp, 'upper') EgtSetInfo( nIdSideBoxUp, 'SideDoor', 'upper') if hint5 then nIdSideBoxUp = EgtCopyGlob( hint5, Lg) EgtSetName( nIdSideBoxUp, 'upper') EgtSetInfo( nIdSideBoxUp, 'SideDoor', 'upper') end end end local function CheckTool( bCheck1, bJoinCheck, nTypeCompare, dDiamTool, sNamePar, nCodePar, sLocalMess, dThick, nNumMsg, nNumWrng, bSetAsMaxMat, n2ndTypeCompare, dNumLog, dMaxMat, bCheck2, sName, EgtDoorsMsg) local nTempT1 local dMaxMat1 local sMchngName1 local nLocalLog = 0 local dDiamReturn = dDiamTool if bCheck1 then nTempT1, dMaxMat1, sMchngName1 = MB.GetToolDataFromAttrib( sNamePar, nCodePar) if nTypeCompare == 1 then if dDiamTool and nTempT1 <= 0 then if DGD.bProoduce and bJoinCheck then nLocalLog = -2192 sLocalMess = sLocalMess .. '\n'.. GetMachToolErrorMessage( nTempT1, sNamePar, nCodePar, dDiamTool, nLocalLog, sMchngName1) end else dDiamReturn = nTempT1 end elseif nTypeCompare == 2 then if DGD.bProoduce and not dMaxMat1 then nLocalLog = -2191 sLocalMess = sLocalMess .. '\n'.. GetMachToolErrorMessage( nTempT1, sNamePar, nCodePar, nil, nLocalLog, sMchngName1) end end end if n2ndTypeCompare == 1 then -- se la profondità è maggiore della capacità utensile limito la profondità ed emetto un warning if dThick and dMaxMat1 and dThick > dMaxMat1 then nLocalLog = nNumWrng dNumMessage = nNumMsg sLocalMess = sLocalMess .. '\n'.. string.format(EgtDoorsMsg[dNumMessage], nLocalLog, sName, EgtToUiUnits(dThick), EgtToUiUnits(dMaxMat1)) if bSetAsMaxMat then dThick = dMaxMat1 else dThick = dMaxMat1 - 0.02 -- tolgo 0.02 per permettere la lavorazione dMaxMat = dMaxMat1 end end elseif n2ndTypeCompare == 2 then -- se foro abilitato e la profondità è maggiore della capacità utensile, -- limito la profondità ed emetto un warning if bCheck2 and dThick and dMaxMat1 and dThick > dMaxMat1 then nLocalLog = nNumWrng dNumMessage = nNumMsg sLocalMess = sLocalMess .. '\n'.. string.format(EgtDoorsMsg[dNumMessage], nLocalLog, sName, EgtToUiUnits(dThick), EgtToUiUnits(dMaxMat1)) if bSetAsMaxMat then dThick = dMaxMat1 else dThick = dMaxMat1 - 0.02 -- tolgo 0.02 per permettere la lavorazione dMaxMat = dMaxMat1 end end end if nLocalLog == 0 and dNumLog ~= 0 then nLocalLog = dNumLog end return dDiamReturn, nLocalLog, sLocalMess, dThick, dMaxMat end -- Funzione di sistemazione parametri function Pivot.AdjustParams( tMhPar) local EgtDoorsMsg = require( 'EgtDoorsMsg') local dMaxMat local dMaxMat0 local nTempT0 local dNumLog = 0 local sMessToOut = '' -- se non è definito setto tipo setto per default la forma standard a L if not tMhPar.stype then tMhPar.stype = 1 end tMhPar.back = DGD.BACK_SET tMhPar.oriback = DGD.BACK_SET tMhPar.posiz = DGD.POSITION tMhPar.rad = DGD.RADIUS tMhPar.dhei = DGD.dOH or DGD.dH tMhPar.invG = 1 tMhPar.fht = 0 -- setto il face h top a 0 tMhPar.fhb = 0 -- setto il face h bottom a 0 tMhPar.mkrev = false tMhPar.stn = false -- setto il flag di pivot tangente bordo porta tMhPar.bETh = false -- extra thickness per i sottotipi dove il knuckle è passante sullo spessore porta -- setto parametro riferimento profondità pivot tMhPar.drf = DGD.dT/6 if DGD.sFrame then -- se è un assemblato tMhPar.drf = 0.1 -- in questo modo crea semre la regione da togliere relativa al materiale asportato end if DGD.DEPTH_F then if string.lower(DGD.TYPE) ~= 'centerhung' then if tMhPar.stype == 1 then tMhPar.T = DGD.DEPTH_F end else tMhPar.T = DGD.DEPTH_F end end -- parametro disposizione frame su lato wide (se = nil è sulla porta, se true dispsizione frame sul lato wide, se false dispsozione su lato narrow) tMhPar.Dws = DGD.Dws local sPieceName if tMhPar.Dws then if DGD.nTypePz == 3 or DGD.nTypePz == 4 then tMhPar.dThD = DGD.dW elseif DGD.nTypePz == 5 or DGD.nTypePz == 6 then tMhPar.dThD = DGD.dH end -- setto un valore di poco inferiore allo spessore per non fresare le ventose tMhPar.TTP = tMhPar.dThD - DGD.Spd if DGD.nTypePz == 3 then sPieceName = 'left Jamb' elseif DGD.nTypePz == 4 then sPieceName = 'right Jamb' elseif DGD.nTypePz == 5 then sPieceName = 'Frame header' else sPieceName = 'Threshold' end end -- controllo se le profondità delle geometrie non superano lo spessore frame if tMhPar.Dws and DGD.Spd > 0 and tMhPar.stype == 1 and tMhPar.T and abs(tMhPar.T) > tMhPar.TTP then dNumLog = -2186 dNumMessage = 681 sMessToOut = sMessToOut .. '\n'.. string.format(EgtDoorsMsg[dNumMessage], dNumLog, tMhPar.Nome, sPieceName, 'T', EgtToUiUnits(tMhPar.T), EgtToUiUnits(tMhPar.TTP), EgtToUiUnits(tMhPar.dThD)) tMhPar.T = tMhPar.TTP end if tMhPar.Dws and DGD.Spd > 0 and tMhPar.stype == 1 and tMhPar.T2 and abs(tMhPar.T2) > tMhPar.TTP then dNumLog = -2186 dNumMessage = 681 sMessToOut = sMessToOut .. '\n'.. string.format(EgtDoorsMsg[dNumMessage], dNumLog, tMhPar.Nome, sPieceName, 'T2', EgtToUiUnits(tMhPar.T2), EgtToUiUnits(tMhPar.TTP), EgtToUiUnits(tMhPar.dThD)) tMhPar.T2 = tMhPar.TTP end if tMhPar.tb and tMhPar.mh then tMhPar.T2 = tMhPar.T end -- se non ho il parametro radius lo setto a 0 if not tMhPar.rad then tMhPar.rad = 0 end -- se non ho il parametro raccordo su singolo angolo lo setto a 0 if not tMhPar.R1 then -- tMhPar.R1 = tMhPar.rad tMhPar.R1 = 0 end -- per face con knuckle in centro assegno il valore del raggio alla variabile di raggio interno tMhPar.R1i = tMhPar.R1 -- se non esiste il valore della distanza del knuckle la setto a 0 if not tMhPar.D_SK then tMhPar.D_SK = 0 end -- prendo il valore assoluto tMhPar.D_SK = abs(tMhPar.D_SK) -- se non ho parametro step o è 0 lo assegno uguale allo spessore cava if not tMhPar.sf or abs(tMhPar.sf) < GEO.EPS_SMALL then tMhPar.sf = tMhPar.T end -- se non ho il parametro D_X lo setto a 0 if not tMhPar.D_X then tMhPar.D_X = 0 end -- se non ho il parametro D_XE lo setto a 0 if not tMhPar.D_XE then tMhPar.D_XE = 0 end -- se ho il raggio disabilito eventuale chiseling if not tMhPar.ech or tMhPar.rad > 0 then tMhPar.ech = false end -- se non c'è la variabile suffisso if not tMhPar.CH then tMhPar.CH = '_Chisel' end -- Assegno parametri da dati utensili in macchina local sLM local nLMi = 1 local sLA local nLAi = 1 local sLG local nLGi = 1 local sLMM local nLMMi = 1 local sLGH local nLGHi = 1 local sLGV local nLGVi = 1 local sLMV local nLMVi = 1 local sLAV local nLAVi = 1 -- se porta steel o aluminum disabilito l'antischeggia, la svuotatura, il chisel e modifico il nome geometria if FindMaterial( DGD.Material, 'steel') or FindMaterial( DGD.Material, 'aluminum') then tMhPar.LM = nil tMhPar.LA = nil tMhPar.LMM = nil tMhPar.LGV = nil tMhPar.LMV = nil tMhPar.LAV = nil tMhPar.ech = false tMhPar.CH = nil tMhPar.est = true tMhPar.d2 = nil if string.lower(DGD.TYPE) == 'offsetintermediate' and tMhPar.mh and not tMhPar.HB then tMhPar.d3 = nil tMhPar.mh = false end else tMhPar.est = nil end if tMhPar.stype == 1 then -- se sottotipo standard if tMhPar.est and tMhPar.LG then sLG = tMhPar.LG end if tMhPar.ech and tMhPar.LG then -- se chisel abilitato sLG = tMhPar.LG .. tMhPar.CH tMhPar.d0 = 0 end if tMhPar.LM then sLM = tMhPar.LM end if tMhPar.LA then sLA = tMhPar.LA end if tMhPar.LMM then sLMM = tMhPar.LMM end if tMhPar.LGH then sLGH = tMhPar.LGH end else -- atri sottotipi -- elimino il cleancorner tMhPar.clc = nil tMhPar.ccr = nil tMhPar.CLC = nil tMhPar.CLH = nil if string.lower(DGD.TYPE) == 'offset' then if tMhPar.est and tMhPar.LG then sLG = tMhPar.LG end if tMhPar.stype == 4 then if tMhPar.ech and tMhPar.LG then -- se chisel abilitato sLG = tMhPar.LG .. tMhPar.CH tMhPar.d0 = 0 end end if tMhPar.LM then sLM = tMhPar.LM end if tMhPar.LA then sLA = tMhPar.LA end if tMhPar.ech and tMhPar.LGV then -- se chisel abilitato sLGV = tMhPar.LGV .. tMhPar.CH tMhPar.d0 = 0 end if tMhPar.LMV then sLMV = tMhPar.LMV end if tMhPar.LAV then sLAV = tMhPar.LAV end elseif string.lower(DGD.TYPE) == 'offsetintermediate' then if tMhPar.est and tMhPar.LG then sLG = tMhPar.LG end if tMhPar.stype == 4 then if tMhPar.ech and tMhPar.LG then -- se chisel abilitato sLG = tMhPar.LG .. tMhPar.CH tMhPar.d0 = 0 end end if tMhPar.LM then sLM = tMhPar.LM end if tMhPar.LA then sLA = tMhPar.LA end if tMhPar.LMM then sLMM = tMhPar.LMM end if tMhPar.LMV then sLMV = tMhPar.LMV end if tMhPar.LAV then sLAV = tMhPar.LAV end if tMhPar.stype == 3 then if tMhPar.ech and tMhPar.LGV then -- se chisel abilitato sLGV = tMhPar.LGV .. tMhPar.CH tMhPar.d0 = 0 end end end end if string.lower(DGD.TYPE) == 'centerhung' then -- do errore se profilo tipo bevel if DGD.tProfs.hingeedge.trimming == 'BD' or DGD.tProfs.hingeedge.trimming == 'BU' or DGD.tProfs.hingeedge.trimming == 'BDEB' or DGD.tProfs.hingeedge.trimming == 'BUEB' then return tMhPar, 2199, string.format(EgtDoorsMsg[464], tMhPar.Nome, DGD.tProfs.hingeedge.trimming) end if bShiftBackSetPos and tMhPar.H then tMhPar.H3 = tMhPar.back + tMhPar.H - ( DGC.Ew / 2) -- new MDC request 22/12/2017 elseif tMhPar.H then tMhPar.H3 = tMhPar.back + ( tMhPar.H /2) end if not tMhPar.rf then tMhPar.rf = 0 if tMhPar.H then tMhPar.rf = tMhPar.H/2 end end if tMhPar.rf > tMhPar.H/2 then tMhPar.rf = tMhPar.H/2 end tMhPar.type = 3 -- 1: offset type, 2: intermediate type, 3: center hung if tMhPar.cl and ( tMhPar.cl == 2 or tMhPar.cl == 1) then tMhPar.D_XT = -( tMhPar.L-(tMhPar.rf))/2 -- calcolo per spostare la geometria in modo che il centro del semicerchio sia sullo 0 elseif tMhPar.cl and tMhPar.cl == 0 then tMhPar.D_XT = -( tMhPar.L/2) -- calcolo per spostare la geometria, bordo dx a 0 else tMhPar.cl = 3 tMhPar.D_XT = -( tMhPar.L-tMhPar.H)/2 -- calcolo per spostare la geometria in modo che il centro del semicerchio sia sullo 0 end -- se raggio su tutti gli angoli e raggio esistente annullo il clean corner if tMhPar.cl == 3 and tMhPar.rf > 0 then tMhPar.clc = 0 end -- trovo se invertire il senso di lavorazione if string.lower(DGD.SIDE) == 'bottom' then tMhPar.invG = -tMhPar.invG end if DGD.Lock == 'R' then tMhPar.invG = -tMhPar.invG end if not DGD.Push then tMhPar.invG = -tMhPar.invG end elseif string.lower(DGD.TYPE) == 'offsetintermediate' then if tMhPar.T and tMhPar.T > 0 then tMhPar.fht = tMhPar.T end -- 2019.12.18 inserito controllo che permette di mettere il pivot di tipo 1 su qualsiasi tipo di profilo -- 2019.10.07 tolto dal confronto il profilo convex ma solo se è di sottotipo 1 -- -- do errore se profilo tipo bullnose e convesso -- if DGD.tProfs.hingeedge.trimming == '1B' or DGD.tProfs.hingeedge.trimming == '2B' or -- DGD.tProfs.hingeedge.trimming == '3B' or DGD.tProfs.hingeedge.trimming == '4B' or -- DGD.tProfs.hingeedge.trimming == '5B' or DGD.tProfs.hingeedge.trimming == '6B' or -- DGD.tProfs.hingeedge.trimming == '7B' or DGD.tProfs.hingeedge.trimming == '8B' or -- DGD.tProfs.hingeedge.trimming == 'CV' then -- do errore se profilo tipo bullnose e convesso e non è ammesso if not DGC.Eah and ( DGD.tProfs.hingeedge.trimming == 'CV' or DGD.tProfs.hingeedge.trimming == '1B' or DGD.tProfs.hingeedge.trimming == '2B' or DGD.tProfs.hingeedge.trimming == '3B' or DGD.tProfs.hingeedge.trimming == '4B' or DGD.tProfs.hingeedge.trimming == '5B' or DGD.tProfs.hingeedge.trimming == '6B' or DGD.tProfs.hingeedge.trimming == '7B' or DGD.tProfs.hingeedge.trimming == '8B') then if tMhPar.stype == 1 then if tMhPar.stype == 1 then return tMhPar, 2198, string.format(EgtDoorsMsg[669], tMhPar.Nome, DGD.tProfs.hingeedge.trimming) else return tMhPar, 2198, string.format(EgtDoorsMsg[465], tMhPar.Nome, DGD.tProfs.hingeedge.trimming) end end elseif DGD.tProfs.hingeedge.trimming == 'BD' or DGD.tProfs.hingeedge.trimming == 'BU' or DGD.tProfs.hingeedge.trimming == 'BDEB' or DGD.tProfs.hingeedge.trimming == 'BUEB' then if tMhPar.stype > 2 then return tMhPar, 2199, string.format(EgtDoorsMsg[658], tMhPar.Nome, DGD.TYPE, tMhPar.stype, DGD.tProfs.hingeedge.trimming) else tMhPar.mkrev = true -- assegno flag per creare percorso inverso -- se profilo cerniere bevel up if DGD.tProfs.hingeedge.trimming == 'BU' or DGD.tProfs.hingeedge.trimming == 'BUEB' then nLMi = 2 nLAi = 2 -- l'antischeggia avrà le tre lavorazioni identiche perché l'utensile è su aggregato orizzontale nLMMi = 2 if tMhPar.ech then nLGi = 2 end elseif DGD.tProfs.hingeedge.trimming == 'BD' or DGD.tProfs.hingeedge.trimming == 'BDEB' then -- se profilo cerniere bevel down -- sLM = sLM ..'_R' -- disattivati perché si utilizza sempre la lavorazione oraria e non quella inversa nLMi = 3 -- sLA = sLA ..'_R' -- disattivati perché si utilizza sempre la lavorazione oraria e non quella inversa nLAi = 3 -- l'antischeggia avrà le tre lavorazioni identiche perché l'utensile è su aggregato orizzontale nLMMi = 3 if tMhPar.ech then nLGi = 3 end end end if tMhPar.T and tMhPar.T > 0 then tMhPar.fht = tMhPar.T / cos(3) end tMhPar.bev = true end tMhPar.fhb = tMhPar.fht tMhPar.type = 2 -- 1: offset type, 2: intermediate type, 3: center hung tMhPar.D_XT = 0 -- setto a 0 il parametro per spostare la geometria in modo che il centro del semicerchio sia sullo 0 tMhPar.cl = 0 -- corners without fillet, not necessary on this type -- se manca il parametro che definisce il riferimento del pivot da posizionare if not tMhPar.rp then tMhPar.rp = 's' -- setto il valore di default ('s'=knuckle side, 'c'=knuckle center, 'f'= face side) end local dDistToSub = 0 if not tMhPar.B_SK then tMhPar.B_SK = false end if tMhPar.B_SK then -- se knuckle sulla faccia opposta tMhPar.D_SK2 = tMhPar.D_SK tMhPar.D_SK = tMhPar.L - tMhPar.L3 - tMhPar.D_SK else if tMhPar.D_SK > 0 then tMhPar.D_SK2 = tMhPar.L - tMhPar.L3 - tMhPar.D_SK end end if tMhPar.L3 then if tMhPar.rp == 'c' then -- se riferimento in centro al knuckle if tMhPar.B_SK then -- se knuckle sulla faccia opposta dDistToSub = tMhPar.L3/2 + tMhPar.D_SK2 else dDistToSub = tMhPar.L3/2 + tMhPar.D_SK end elseif tMhPar.rp == 's' then -- se riferimento sul bordo knuckle if tMhPar.B_SK then -- se knuckle sulla faccia opposta dDistToSub = tMhPar.D_SK2 else dDistToSub = tMhPar.D_SK end end end -- se pivot è adiacente al fianco top porta annullo il valore del raggio singolo -- e setto il flag per modifica geometria pivot if not tMhPar.B_SK then if ( DGD.POSITION - dDistToSub - tMhPar.D_XE) <= dMinDistIntpiv then tMhPar.R1 = 0 tMhPar.stn = true end else -- se è opposto if ( DGD.dH - (DGD.POSITION + dDistToSub + tMhPar.D_XE)) <= dMinDistIntpiv then tMhPar.R1 = 0 tMhPar.stn = true end end if tMhPar.stype == 1 or tMhPar.stype == 4 then if bShiftBackSetPos and tMhPar.H then -- se backset nullo o negativo lo ricalcolo per ottenere il centro spessore if tMhPar.back <= 0 then tMhPar.back = ( DGD.dT - tMhPar.H) /2 DGD.BACK_SET = tMhPar.back end tMhPar.H3 = tMhPar.back + tMhPar.H - ( DGC.Ew / 2) -- new MDC request 22/12/2017 elseif tMhPar.H then if tMhPar.back <= 0 then tMhPar.back = DGD.dT/2 DGD.BACK_SET = tMhPar.back end tMhPar.H3 = tMhPar.back + ( tMhPar.H /2) end end if tMhPar.stype == 4 then tMhPar.R1 = 0 -- forzo in ogni caso il R1 a 0 -- calcolo lo spostamento in X local dExtraDim = 0 if tMhPar.B_SK then tPiPar.D_X = -(tPiPar.L - tPiPar.L3 + dExtraDim) / 2 else tPiPar.D_X = (tPiPar.L - tPiPar.L3 + dExtraDim) / 2 end -- calcolo l'altezza della mortasa e lo spostamento in Y tMhPar.D = (tMhPar.H2 - tMhPar.H)/2 -- se non ho parametro step o è 0 lo assegno uguale allo spessore cava if not tMhPar.s or abs(tMhPar.s) < GEO.EPS_SMALL then tMhPar.s = tMhPar.T2 end elseif tMhPar.stype == 3 then tMhPar.R1 = 0 -- forzo in ogni caso il R1 a 0 tMhPar.jn = false -- forzo di non collegare il face con la mortasa tMhPar.H3 = DGD.dT/2 -- setto H3 come spessore porta tMhPar.bETh = true -- setto spessore passante tMhPar.stnb = tMhPar.stn -- se non ho parametro step o è 0 lo assegno uguale allo spessore cava if not tMhPar.s3 or abs(tMhPar.s3) < GEO.EPS_SMALL then tMhPar.s3 = tMhPar.T3 end end -- calcolo la posizione del centro foro sullo spessore porta if bShiftBackSetPos then if tMhPar.stype == 3 then -- se sottotipo 3 tMhPar.posh = 0 -- 27/12/2017 New MDC request elseif tMhPar.H then if abs(tMhPar.oriback) <= 0.001 then -- se non ruota su profilo bevel o non è bevel if DGC.Fpd or not tMhPar.bev then tMhPar.posh = tMhPar.back + ( tMhPar.H/2) - (DGD.dT/2) -- 27/12/2017 New MDC request else tMhPar.posh = ( ( tMhPar.back + ( tMhPar.H/2)) * cos( 3)) - (DGD.dT/2) -- 27/12/2017 New MDC request end else -- se non ruota su profilo bevel o non è bevel if DGC.Fpd or not tMhPar.bev then tMhPar.posh = tMhPar.back + (( tMhPar.H - DGC.Ew) / 2) - (DGD.dT/2) -- 27/12/2017 New MDC request else tMhPar.posh = ( (tMhPar.back + (( tMhPar.H - DGC.Ew) / 2)) * cos( 3)) - (DGD.dT/2) -- 27/12/2017 New MDC request end end end else if tMhPar.stype == 3 then -- se sottotipo 3 tMhPar.posh = 0 else -- se non ruota su profilo bevel o non è bevel if DGC.Fpd or not tMhPar.bev then tMhPar.posh = tMhPar.back - (DGD.dT/2) else tMhPar.posh = ( tMhPar.back * cos( 3)) - (DGD.dT/2) end end end -- trovo se invertire il senso di lavorazione if DGD.Lock == 'R' then tMhPar.invG = -tMhPar.invG end if DGD.Push then tMhPar.invG = -tMhPar.invG end else -- tipo offset tMhPar.type = 1 -- 1: offset type, 2: intermediate type, 3: center hung tMhPar.D_XT = 0 -- setto a 0 il parametro per spostare la geometria in modo che il centro del semicerchio sia sullo 0 tMhPar.cl = 0 -- corners without fillet, not necessary on this type -- se sottotipo 1:top/bottom door o 2:top/bottom-back door if tMhPar.stype == 1 or tMhPar.stype == 2 then if tMhPar.T and tMhPar.T > 0 then tMhPar.fht = tMhPar.T end if ( DGD.tProfs.hingeedge.trimming == 'BD' or DGD.tProfs.hingeedge.trimming == 'BU' or DGD.tProfs.hingeedge.trimming == 'BDEB' or DGD.tProfs.hingeedge.trimming == 'BUEB') and tMhPar.T and tMhPar.T > 0 then tMhPar.fht = tMhPar.T / cos(3) end -- se manca il parametro che definisce il riferimento del pivot da posizionare if not tMhPar.rp then tMhPar.rp = 'c' -- setto il valore di default ('s'=knuckle side, 'c'=knuckle center, 'f'= face side) end tMhPar.fhb = tMhPar.fht local dDistToSub = 0 if tMhPar.L3 then if tMhPar.rp == 'c' then -- se riferimento in centro al knuckle dDistToSub = tMhPar.L3/2 + tMhPar.D_SK elseif tMhPar.rp == 's' then -- se riferimento sul bordo knuckle dDistToSub = tMhPar.D_SK end end -- se pivot è adiacente al fianco porta annullo il valore del raggio singolo -- e setto il flag per modifica geometria pivot if ( DGD.POSITION - dDistToSub - tMhPar.D_XE) <= dMinDistOffspiv then tMhPar.R1 = 0 tMhPar.stn = true end if tMhPar.stype == 2 then tMhPar.R1 = 0 -- forzo in ogni caso il R1 a 0 tMhPar.jn = false -- forzo di non collegare il face con la mortasa tMhPar.H3 = DGD.dT/2 -- setto H3 come spessore porta tMhPar.bETh = true -- setto spessore passante tMhPar.stnb = tMhPar.stn if not tMhPar.T3 then tMhPar.T3 = tMhPar.T end -- se non ho parametro step o è 0 lo assegno uguale allo spessore cava if not tMhPar.s3 or abs(tMhPar.s3) < GEO.EPS_SMALL then tMhPar.s3 = tMhPar.T3 end else if tMhPar.D_SK > 0 then tMhPar.D_SK2 = tMhPar.L - tMhPar.L3 - tMhPar.D_SK end if bShiftBackSetPos and tMhPar.H then -- se backset nullo o negativo lo ricalcolo per ottenere il centro spessore if tMhPar.back <= 0 then tMhPar.back = ( DGD.dT - tMhPar.H) /2 DGD.BACK_SET = tMhPar.back end tMhPar.H3 = tMhPar.back + tMhPar.H - ( DGC.Ew / 2) -- new MDC request 22/12/2017 elseif tMhPar.H then if tMhPar.back <= 0 then tMhPar.back = DGD.dT/2 DGD.BACK_SET = tMhPar.back end tMhPar.H3 = tMhPar.back + ( tMhPar.H /2) end end -- trovo se invertire il senso di lavorazione if string.lower(DGD.SIDE) == 'bottom' then tMhPar.invG = -tMhPar.invG end if DGD.Lock == 'R' then tMhPar.invG = -tMhPar.invG end if not DGD.Push then tMhPar.invG = -tMhPar.invG end elseif tMhPar.stype == 3 then -- se sotto tipo 3 top/bottom-back door -- se manca il parametro che definisce il riferimento del pivot da posizionare if not tMhPar.rp then tMhPar.rp = 'c' -- setto il valore di default ('s'=knuckle side, 'c'=knuckle center, 'f'= face side) end local dDistToSub = 0 if tMhPar.L3 then if tMhPar.rp == 'c' then -- se riferimento in centro al knuckle dDistToSub = tMhPar.L3/2 + tMhPar.D_SK elseif tMhPar.rp == 's' then -- se riferimento sul bordo knuckle dDistToSub = tMhPar.D_SK end end -- se pivot è adiacente al fianco porta annullo il valore del raggio singolo -- e setto il flag per modifica geometria pivot if ( DGD.POSITION - dDistToSub - tMhPar.D_XE) <= dMinDistOffspiv then tMhPar.stn = true end -- controlli e settaggi aggiuntivi se larghezza corpo pivot è differente -- Se larghezza dDistToSub = 0 if tMhPar.AsKn then -- se larghezza body come knuckle, verifico se c'è -- se non c'è o lunghezza nulla prendo la misura locale if not tMhPar.L3 or ( tMhPar.L3 and abs(tMhPar.L3) < GEO.EPS_SMALL) then if tMhPar.H then if tMhPar.rp == 'c' then -- se riferimento in centro al knuckle dDistToSub = tMhPar.H/2 + tMhPar.D_SK elseif tMhPar.rp == 's' then -- se riferimento sul bordo knuckle dDistToSub = tMhPar.D_SK end end -- se pivot è adiacente al fianco porta annullo il valore del raggio singolo -- e setto il flag per modifica geometria pivot if ( DGD.POSITION - dDistToSub - tMhPar.D_XE) <= dMinDistOffspiv then tMhPar.stnb = true end else -- se larghezza valida tMhPar.H = tMhPar.L3 tMhPar.stnb = tMhPar.stn end else -- se larghezza diversa if tMhPar.H then if tMhPar.rp == 'c' then -- se riferimento in centro al knuckle dDistToSub = tMhPar.H/2 + tMhPar.D_SK elseif tMhPar.rp == 's' then -- se riferimento sul bordo knuckle if tMhPar.L3 then dDistToSub = tMhPar.D_SK+((tMhPar.H-tMhPar.L3)/2) else dDistToSub = tMhPar.D_SK end end end -- se pivot è adiacente al fianco porta annullo il valore del raggio singolo -- e setto il flag per modifica geometria pivot if ( DGD.POSITION - dDistToSub - tMhPar.D_XE) <= dMinDistOffspiv then tMhPar.stnb = true end end tMhPar.R1 = 0 -- forzo in ogni caso il R1 a 0 tMhPar.jn = false -- forzo di non collegare il face con la mortasa tMhPar.H3 = DGD.dT/2 -- setto H3 come spessore porta tMhPar.bETh = true -- setto spessore passante if not tMhPar.T3 then tMhPar.T3 = tMhPar.T end -- se non ho parametro step o è 0 lo assegno uguale allo spessore cava if not tMhPar.s3 or abs(tMhPar.s3) < GEO.EPS_SMALL then tMhPar.s3 = tMhPar.T3 end -- trovo se invertire il senso di lavorazione if string.lower(DGD.SIDE) == 'bottom' then tMhPar.invG = -tMhPar.invG end if DGD.Lock == 'R' then tMhPar.invG = -tMhPar.invG end if not DGD.Push then tMhPar.invG = -tMhPar.invG end elseif tMhPar.stype == 4 then -- se sotto tipo 4 top/bottom-side door -- do errore se profilo tipo bevel if DGD.tProfs.hingeedge.trimming == 'BD' or DGD.tProfs.hingeedge.trimming == 'BU' or DGD.tProfs.hingeedge.trimming == 'BDEB' or DGD.tProfs.hingeedge.trimming == 'BUEB' then return tMhPar, 2199, string.format(EgtDoorsMsg[658], tMhPar.Nome, DGD.TYPE, tMhPar.stype, DGD.tProfs.hingeedge.trimming) end -- forzo il tipo ad essere adiacente al bordo porta tMhPar.stn = true tMhPar.R1 = 0 -- forzo in ogni caso il R1 a 0 tMhPar.rp = 's' -- forzo il valore di default ('s'=knuckle side, 'c'=knuckle center, 'f'= face side) tMhPar.jn = false -- forzo di non collegare il face con la mortasa if not tMhPar.T3 then tMhPar.T3 = tMhPar.T end -- se non ho parametro step o è 0 lo assegno uguale allo spessore cava if not tMhPar.s3 or abs(tMhPar.s3) < GEO.EPS_SMALL then tMhPar.s3 = tMhPar.T3 end if bShiftBackSetPos and tMhPar.H then -- se backset è nullo o negativo ricalcolo per far stare la parte body in centro allo spessore if tMhPar.back <= 0 then tMhPar.back = ( DGD.dT - tMhPar.H) /2 DGD.BACK_SET = tMhPar.back end tMhPar.H3 = tMhPar.back + tMhPar.H -- new MDC request 22/12/2017 if tMhPar.back <= dMinDistOffspiv then tMhPar.stnb = true end elseif tMhPar.H then -- se backset è nullo o negativo ricalcolo per far stare la parte body in centro allo spessore if tMhPar.back <= 0 then tMhPar.back = DGD.dT/2 DGD.BACK_SET = tMhPar.back end tMhPar.H3 = tMhPar.back + ( tMhPar.H /2) if tMhPar.back - ( tMhPar.H /2) <= dMinDistOffspiv then tMhPar.stnb = true end end -- trovo se invertire il senso di lavorazione if string.lower(DGD.SIDE) == 'bottom' then tMhPar.invG = -tMhPar.invG end if DGD.Lock == 'R' then tMhPar.invG = -tMhPar.invG end if not DGD.Push then tMhPar.invG = -tMhPar.invG end end end -- se arrotondo entrambe le estremità disabilito il chisel if tMhPar.cl == 3 then tMhPar.ech = false end -- se raggio nullo lo azzero if not tMhPar.rf then tMhPar.rf = 0 end -- se devo disegnare le geometrie di lavorazione if DGD.MachEn > 0 then if ( tMhPar.CLC or tMhPar.CLH) and tMhPar.clc and tMhPar.clc > 0 and ( tMhPar.clc >= tMhPar.H or tMhPar.clc >= tMhPar.L) then tMhPar.clc = nil elseif not tMhPar.CLC and not tMhPar.CLH then tMhPar.clc = nil end -- se sono pivot standard if ( tMhPar.type <= 2 and tMhPar.stype == 1) or tMhPar.type == 3 then -- geometria face if tMhPar.est then tMhPar.d, dNumLog, sMessToOut, tMhPar.T, dMaxMat = CheckTool( tMhPar.d, true, 1, tMhPar.d, sLG, nLGi, sMessToOut, tMhPar.T, 460, -2197, false, 1, dNumLog, dMaxMat, nil, tMhPar.Nome, EgtDoorsMsg) end -- svuotatura face if not tMhPar.est then tMhPar.d, dNumLog, sMessToOut, tMhPar.T, dMaxMat = CheckTool( tMhPar.d, true, 1, tMhPar.d, sLM, nLMi, sMessToOut, tMhPar.T, 460, -2197, false, 1, dNumLog, dMaxMat, nil, tMhPar.Nome, EgtDoorsMsg) end -- antisplint face if not tMhPar.est then tMhPar.d2, dNumLog, sMessToOut, tMhPar.T, dMaxMat = CheckTool( tMhPar.d2, true, 1, tMhPar.d2, sLA, nLAi, sMessToOut, tMhPar.T, 462, -2196, false, 1, dNumLog, dMaxMat, nil, tMhPar.Nome, EgtDoorsMsg) end -- svuotatura mortise concatenata if not tMhPar.est then tMhPar.d, dNumLog, sMessToOut, tMhPar.T2, dMaxMat = CheckTool( tMhPar.d, (not tMhPar.jn), 1, tMhPar.d, sLM, nLMi, sMessToOut, tMhPar.T2, 461, -2194, true, 2, dNumLog, dMaxMat, (tMhPar.jn and not tMhPar.mh), tMhPar.Nome, EgtDoorsMsg) end -- foro (solo controllo profondità) if not tMhPar.est or ( tMhPar.est and tMhPar.HB) then _, dNumLog, sMessToOut, tMhPar.T2, dMaxMat = CheckTool( (tMhPar.mh and tMhPar.LGH), true, 2, tMhPar.d3, sLGH, nLGHi, sMessToOut, tMhPar.T2, 463, -2195, true, 2, dNumLog, dMaxMat, tMhPar.mh, tMhPar.Nome, EgtDoorsMsg) end -- svuotatura mortise disgiunta if not tMhPar.est then tMhPar.d3, dNumLog, sMessToOut, tMhPar.T2, dMaxMat = CheckTool( tMhPar.d3, true, 1, tMhPar.d3, sLMM, nLMMi, sMessToOut, tMhPar.T2, 461, -2193, true, 2, dNumLog, dMaxMat, (not tMhPar.jn and not tMhPar.mh), tMhPar.Nome, EgtDoorsMsg) end -- chisel (solo controllo diametro utensile) if not tMhPar.est then tMhPar.d0, dNumLog, sMessToOut, dMaxMat0, dMaxMat = CheckTool( (tMhPar.ech and tMhPar.d0), false, 1, tMhPar.d0, sLG, nLGi, sMessToOut, tMhPar.T, 460, -2192, false, 3, dNumLog, dMaxMat, nil, tMhPar.Nome, EgtDoorsMsg) end -- se ho altro materiale modifico i raccordi se sono più piccoli del raggio utensile if tMhPar.est then if tMhPar.type == 3 then -- tipo centerhung if tMhPar.rf and tMhPar.rf > 0 and tMhPar.cl > 0 and tMhPar.d and tMhPar.rf < ((tMhPar.d/2)+0.02) then tMhPar.rf = 0 end elseif tMhPar.type == 2 then -- tipo intermediate if tMhPar.D_SK > 0 and tMhPar.D_SK2 > 0 then -- se ho knuckle centrato azzero solo i raggi interni if tMhPar.rad and tMhPar.rad > 0 and tMhPar.d and tMhPar.rad < ((tMhPar.d/2)+0.02) then tMhPar.rad = 0 end else if tMhPar.L3 and tMhPar.L3 > 0 then -- se a forma di L if tMhPar.R1 and tMhPar.R1 > 0 and tMhPar.d and tMhPar.R1 < ((tMhPar.d/2)+0.02) then tMhPar.R1 = 0 tMhPar.R1i = 0 end end if tMhPar.rad and tMhPar.rad > 0 and tMhPar.d and tMhPar.rad < ((tMhPar.d/2)+0.02) then tMhPar.rad = 0 end end elseif tMhPar.type == 1 then -- tipo offset if tMhPar.D_SK == 0 or tMhPar.D_SK2 == 0 then -- se a forma di L if tMhPar.R1 and tMhPar.R1 > 0 and tMhPar.d and tMhPar.R1 < ((tMhPar.d/2)+0.02) then tMhPar.R1 = 0 tMhPar.R1i = 0 end end if tMhPar.rad and tMhPar.rad > 0 and tMhPar.d and tMhPar.rad < ((tMhPar.d/2)+0.02) then tMhPar.rad = 0 end end end -- vecchio controllo --[[ local dMaxMat1 local dMaxMat2 local dMaxMat3 local nTempT0 local nTempT1 local nTempT2 local nTempT3 local nTempT4 local sMchngName0 local sMchngName1 local sMchngName2 local sMchngName3 local sMchngName4 local dNumMessage if tMhPar.d then nTempT1, dMaxMat1, sMchngName1 = MB.GetToolDataFromAttrib( sLM, nLMi) end -- svuotatura face if tMhPar.d2 then nTempT2, dMaxMat2, sMchngName2 = MB.GetToolDataFromAttrib( sLA, nLAi) end -- antischeggia if tMhPar.d3 then nTempT3, dMaxMat3, sMchngName3 = MB.GetToolDataFromAttrib( sLMM, nLMMi) end -- svuotatura mortise if tMhPar.mh and tMhPar.LGH then nTempT4, dMaxMat3, sMchngName4 = MB.GetToolDataFromAttrib( sLGH, nLGHi) end -- foro if tMhPar.ech and tMhPar.d0 then nTempT0, dMaxMat0, sMchngName0 = MB.GetToolDataFromAttrib( sLG, nLGi) end -- chisel su face -- gestisco il risultato della lettura utensili if DGD.bProoduce and tMhPar.d and nTempT1 <= 0 then dNumLog = -2192 sMessToOut = sMessToOut .. '\n'.. GetMachToolErrorMessage( nTempT1, sLM, nLMi, tMhPar.d, dNumLog, sMchngName1) elseif DGD.bProoduce then tMhPar.d = nTempT1 end if DGD.bProoduce and tMhPar.d2 and nTempT2 <= 0 then dNumLog = -2192 sMessToOut = sMessToOut .. '\n'.. GetMachToolErrorMessage( nTempT2, sLA, nLAi, tMhPar.d2, dNumLog, sMchngName2) elseif DGD.bProoduce then tMhPar.d2 = nTempT2 end if tMhPar.d3 and nTempT3 <= 0 then if DGD.bProoduce and not tMhPar.jn then -- se non si concatenano i due percorsi dNumLog = -2192 sMessToOut = sMessToOut .. '\n'.. GetMachToolErrorMessage( nTempT3, sLMM, nLMMi, tMhPar.d3, dNumLog, sMchngName3) end else tMhPar.d3 = nTempT3 end if DGD.bProoduce and tMhPar.mh and tMhPar.LGH and not dMaxMat3 then dNumLog = -2191 sMessToOut = sMessToOut .. '\n'.. GetMachToolErrorMessage( nTempT4, sLGH, nLGHi, nil, dNumLog, sMchngName4) end -- chiseling -- if tMhPar.ech and tMhPar.d0 and nTempT0 > 0 then -- tMhPar.d0 = nTempT0 -- end -- se la profondità della face è maggiore della capacità utensile limito la profondità ed emetto un warning if tMhPar.T and dMaxMat1 and tMhPar.T > dMaxMat1 then dNumLog = -2197 dNumMessage = 460 sMessToOut = sMessToOut .. '\n'.. string.format(EgtDoorsMsg[dNumMessage], dNumLog, tMhPar.Nome, EgtToUiUnits(tMhPar.T), EgtToUiUnits(dMaxMat1)) tMhPar.T = dMaxMat1 - 0.02 -- tolgo 0.02 per permettere la lavorazione dMaxMat = dMaxMat1 end -- se la profondità antischeggia della face è maggiore della capacità utensile limito la profondità ed emetto un warning -- if not tMhPar.mh and tMhPar.T and dMaxMat2 and tMhPar.T > dMaxMat2 then if tMhPar.T and dMaxMat2 and tMhPar.T > dMaxMat2 then dNumLog = -2196 dNumMessage = 462 sMessToOut = sMessToOut .. '\n'.. string.format(EgtDoorsMsg[dNumMessage], dNumLog, tMhPar.Nome, EgtToUiUnits(tMhPar.T), EgtToUiUnits(dMaxMat2)) tMhPar.T = dMaxMat2 - 0.02 -- tolgo 0.02 per permettere la lavorazione dMaxMat = dMaxMat2 end -- se foro abilitato e la profondità è maggiore della capacità utensile, -- limito la profondità ed emetto un warning if tMhPar.mh and tMhPar.T2 and dMaxMat3 and tMhPar.T2 > dMaxMat3 then dNumLog = -2195 dNumMessage = 463 sMessToOut = sMessToOut .. '\n'.. string.format(EgtDoorsMsg[dNumMessage], dNumLog, tMhPar.Nome, EgtToUiUnits(tMhPar.T2), EgtToUiUnits(dMaxMat3)) tMhPar.T2 = dMaxMat3 end -- se mortise concatenata a face e la profondità della mortise è maggiore della capacità utensile, -- limito la profondità ed emetto un warning if tMhPar.jn and not tMhPar.mh and tMhPar.T2 and dMaxMat and tMhPar.T2 > dMaxMat then dNumLog = -2194 dNumMessage = 461 sMessToOut = sMessToOut .. '\n'.. string.format(EgtDoorsMsg[dNumMessage], dNumLog, tMhPar.Nome, EgtToUiUnits(tMhPar.T2), EgtToUiUnits(dMaxMat)) tMhPar.T2 = dMaxMat end -- se la mortise non è concatenate a face e la profondità della mortise è maggiore della capacità utensile, -- limito la profondità ed emetto un warning if not tMhPar.jn and not tMhPar.mh and tMhPar.T2 and dMaxMat3 and tMhPar.T2 > dMaxMat3 then dNumLog = -2193 dNumMessage = 461 sMessToOut = sMessToOut .. '\n'.. string.format(EgtDoorsMsg[dNumMessage], dNumLog, tMhPar.Nome, EgtToUiUnits(tMhPar.T2), EgtToUiUnits(dMaxMat3)) tMhPar.T2 = dMaxMat3 end ]]-- -- pivot offset speciale elseif tMhPar.type == 1 then -- tipo offset -- check utensile svuotatura knuckle if not tMhPar.est then tMhPar.d3, dNumLog, sMessToOut, tMhPar.T3 = CheckTool( tMhPar.d3, true, 1, tMhPar.d3, sLM, nLMi, sMessToOut, tMhPar.T3, 654, -2191, true, 1, dNumLog, nil, nil, tMhPar.Nome, EgtDoorsMsg) end -- check utensile antischeggia knuckle if not tMhPar.est then tMhPar.d4, dNumLog, sMessToOut, tMhPar.T3 = CheckTool( tMhPar.d4, true, 1, tMhPar.d4, sLA, nLAi, sMessToOut, tMhPar.T3, 656, -2190, true, 1, dNumLog, nil, nil, tMhPar.Nome, EgtDoorsMsg) end if tMhPar.stype == 4 then -- chisel (solo controllo diametro utensile) if not tMhPar.est then tMhPar.d0, dNumLog, sMessToOut, dMaxMat0 = CheckTool( (tMhPar.ech and tMhPar.d0), false, 1, tMhPar.d0, sLG, nLGi, sMessToOut, tMhPar.T3, 460, -2187, false, 3, dNumLog, dMaxMat, nil, tMhPar.Nome, EgtDoorsMsg) end end -- check utensile svuotatura body if not tMhPar.est then tMhPar.d, dNumLog, sMessToOut, tMhPar.T = CheckTool( tMhPar.d, true, 1, tMhPar.d, sLMV, nLMVi, sMessToOut, tMhPar.T, 655, -2189, true, 1, dNumLog, nil, nil, tMhPar.Nome, EgtDoorsMsg) end -- check utensile antischeggia body if not tMhPar.est then tMhPar.d2, dNumLog, sMessToOut, tMhPar.T = CheckTool( tMhPar.d2, true, 1, tMhPar.d2, sLAV, nLAVi, sMessToOut, tMhPar.T, 657, -2190, true, 1, dNumLog, nil, nil, tMhPar.Nome, EgtDoorsMsg) end -- chisel (solo controllo diametro utensile) if not tMhPar.est then tMhPar.d0, dNumLog, sMessToOut, dMaxMat0 = CheckTool( (tMhPar.ech and tMhPar.d0), false, 1, tMhPar.d0, sLGV, nLGVi, sMessToOut, tMhPar.T, 460, -2188, false, 3, dNumLog, dMaxMat, nil, tMhPar.Nome, EgtDoorsMsg) end -- pivot intermediate speciale elseif tMhPar.type == 2 then -- tipo OffsetIntermediate if tMhPar.stype == 4 then -- geometria simile al sottotipo 1 -- svuotatura mortise concatenata if not tMhPar.est then tMhPar.d, dNumLog, sMessToOut, tMhPar.T2, dMaxMat = CheckTool( tMhPar.d, (not tMhPar.jn), 1, tMhPar.d, sLM, nLMi, sMessToOut, tMhPar.T2, 461, -2194, true, 2, dNumLog, dMaxMat, tMhPar.jn, tMhPar.Nome, EgtDoorsMsg) end -- svuotatura mortise disgiunta if not tMhPar.est then tMhPar.d3, dNumLog, sMessToOut, tMhPar.T2, dMaxMat = CheckTool( tMhPar.d3, true, 1, tMhPar.d3, sLMM, nLMMi, sMessToOut, tMhPar.T2, 461, -2193, true, 2, dNumLog, dMaxMat, (not tMhPar.jn), tMhPar.Nome, EgtDoorsMsg) end -- check utensile antischeggia face concatenato a mortise if not tMhPar.est then tMhPar.d2, dNumLog, sMessToOut, tMhPar.T2, dMaxMat = CheckTool( tMhPar.d2, (not tMhPar.jn), 1, tMhPar.d2, sLA, nLAi, sMessToOut, tMhPar.T2, 462, -2196, true, 1, dNumLog, dMaxMat, tMhPar.jn, tMhPar.Nome, EgtDoorsMsg) end -- check utensile antischeggia face disgiunto a mortise if not tMhPar.est then tMhPar.d2, dNumLog, sMessToOut, tMhPar.T2, dMaxMat = CheckTool( tMhPar.d2, true, 1, tMhPar.d2, sLA, nLAi, sMessToOut, tMhPar.T2, 462, -2196, true, 1, dNumLog, dMaxMat, (not tMhPar.jn), tMhPar.Nome, EgtDoorsMsg) end -- check utensile svuotatura face if not tMhPar.est then tMhPar.d, dNumLog, sMessToOut, tMhPar.T, dMaxMat = CheckTool( tMhPar.d, true, 1, tMhPar.d, sLM, nLMi, sMessToOut, tMhPar.T, 460, -2197, true, 1, dNumLog, dMaxMat, nil, tMhPar.Nome, EgtDoorsMsg) end -- chisel (solo controllo diametro utensile) if not tMhPar.est then tMhPar.d0, dNumLog, sMessToOut, dMaxMat0, dMaxMat = CheckTool( (tMhPar.ech and tMhPar.d0), false, 1, tMhPar.d0, sLG, nLGi, sMessToOut, tMhPar.T, 460, -2192, false, 3, dNumLog, dMaxMat, nil, tMhPar.Nome, EgtDoorsMsg) end else -- sottotipo 3 simile al sottotipo 2 del tipo Offset -- check utensile svuotatura knuckle if not tMhPar.est then tMhPar.d3, dNumLog, sMessToOut, tMhPar.T3 = CheckTool( tMhPar.d3, true, 1, tMhPar.d3, sLM, nLMi, sMessToOut, tMhPar.T3, 654, -2191, true, 1, dNumLog, nil, nil, tMhPar.Nome, EgtDoorsMsg) end -- check utensile antischeggia knuckle if not tMhPar.est then tMhPar.d4, dNumLog, sMessToOut, tMhPar.T3 = CheckTool( tMhPar.d4, true, 1, tMhPar.d4, sLA, nLAi, sMessToOut, tMhPar.T3, 656, -2190, true, 1, dNumLog, nil, nil, tMhPar.Nome, EgtDoorsMsg) end -- check utensile svuotatura body if not tMhPar.est then tMhPar.d, dNumLog, sMessToOut, tMhPar.T = CheckTool( tMhPar.d, true, 1, tMhPar.d, sLMV, nLMVi, sMessToOut, tMhPar.T, 655, -2189, true, 1, dNumLog, nil, nil, tMhPar.Nome, EgtDoorsMsg) end -- check utensile antischeggia body if not tMhPar.est then tMhPar.d2, dNumLog, sMessToOut, tMhPar.T = CheckTool( tMhPar.d2, true, 1, tMhPar.d2, sLAV, nLAVi, sMessToOut, tMhPar.T, 657, -2190, true, 1, dNumLog, nil, nil, tMhPar.Nome, EgtDoorsMsg) end -- chisel (solo controllo diametro utensile) if not tMhPar.est then tMhPar.d0, dNumLog, sMessToOut, dMaxMat0 = CheckTool( (tMhPar.ech and tMhPar.d0), false, 1, tMhPar.d0, sLGV, nLGVi, sMessToOut, tMhPar.T, 460, -2188, false, 3, dNumLog, dMaxMat, nil, tMhPar.Nome, EgtDoorsMsg) end end end end if dNumLog ~= 0 then return tMhPar, dNumLog, sMessToOut end return tMhPar, 0, '' end -- Funzione di disegno function Pivot.Draw( tPivotParam, bPreview, bRunByCompo, nDrawMach, dThickDoor) -- Assegno le dimensioni, parametri utensili e settaggi local L = tPivotParam.L -- lunghezza face local H = tPivotParam.H -- larghezza face local T = tPivotParam.T -- spessore face local L3 = tPivotParam.L3 -- lunghezza Knuckle a forma di L local H3 = tPivotParam.H3 -- altezza Knuckle a forma di L local T3 = tPivotParam.T3 -- spessore Knuckle disgiunto local radius = tPivotParam.rad -- raggio arrotondamento face a forma di L local R1 = tPivotParam.R1 -- raggio arrotondamento face su singolo corner local R1i = tPivotParam.R1i -- raggio interno per face con knockle centrale local D_SK = tPivotParam.D_SK -- distanza partenza knuckle local D_SK2 = tPivotParam.D_SK2 -- distanza rimanente da knuckle local B_SK = tPivotParam.B_SK -- flag che indica il knuckle è opposto ( D_SK risulta già modificato) local mkrev = tPivotParam.mkrev -- flag che indica se devono essere fatti anche percorsi inversi (cioè quando intermediate pivot è applicato su profilo bevel) local d = tPivotParam.d -- diametro utensile face local p = tPivotParam.p -- percentuale uso utensile face local sf = tPivotParam.sf -- passo affondamento per face local cl = tPivotParam.cl -- arrotondamento per face non a forma di L local rf = tPivotParam.rf -- raggio arrotondamento per face non a forma di L local clc = tPivotParam.clc -- lunghezza lato clean corner local ccr = tPivotParam.ccr -- raggio su angolo cleancorner local d2 = tPivotParam.d2 -- diametro utensile antischeggia per face local mh = tPivotParam.mh -- abilitazione creazione mortasa/foro local HB = tPivotParam.HB -- forzo foro a rimanere orizzontale local stn = tPivotParam.stn -- pivot tipo offset adiacente al bordo porta local stnb = tPivotParam.stnb -- pivot tipo offset adiacente al bordo porta local tb = tPivotParam.tb -- abilitazione forza profondità foro come spessore face local L2 = tPivotParam.L2 -- lunghezza mortise local H2 = tPivotParam.H2 -- larghezza mortise local T2 = tPivotParam.T2 -- spessore mortise local d3 = tPivotParam.d3 -- diametro utensile per mortise o per knuckle singolo local p3 = tPivotParam.p3 -- percentuale uso utensile per mortise local s = tPivotParam.s -- passo affondamento per mortise local posh = tPivotParam.posh -- posizione in Y del foro di tastatura local posp = tPivotParam.posp -- posizione in X del foro di tastatura local ptype = tPivotParam.type -- type of Pivot local subtype = tPivotParam.stype -- sub type Pivot (1:top/bottom door, 2:top/bottom-back door, 3:top/bottom-back door, 4:top/bottom-side door) local jn = tPivotParam.jn -- flag join paths, means use 'same tool' for face and mortise local D = tPivotParam.D -- distance to edge per mortise, usato con face a forma di L local D_X = tPivotParam.D_X -- delta on X pos on mortaise rispetto al centro face local D_XT = tPivotParam.D_XT -- delta on X pos for all geometries local D_XE = tPivotParam.D_XE -- Extra delta on X pos for all geometries local invG = tPivotParam.invG -- flag per invertire il senso dei percorsi di lavorazione local ech = tPivotParam.ech -- abilitazione chisel local est = tPivotParam.est -- abilitazione materiale steel local kbs = tPivotParam.kbs -- keep backset/thicknesss (0: none, 1: only face, 2: all) local pbs = tPivotParam.pbs local rp = tPivotParam.rp -- reference pivot local backset = tPivotParam.back -- valore backset da ddf local oribackset = tPivotParam.oriback local posiz = tPivotParam.posiz -- valore posizione da ddf local dhei = tPivotParam.dhei -- altezza porta local fht = tPivotParam.fht local fhb = tPivotParam.fhb local drf = tPivotParam.drf local dws = tPivotParam.Dws local dthd = tPivotParam.dThD local ttp = tPivotParam.TTP local tExtraBore = {} table.insert( tExtraBore, { tPivotParam.D4, tPivotParam.T4, tPivotParam.I4, tPivotParam.PX4, tPivotParam.PY4, tPivotParam.EB4, tPivotParam.HB4}) table.insert( tExtraBore, { tPivotParam.D5, tPivotParam.IY5, tPivotParam.T5, tPivotParam.I5, tPivotParam.PX5, tPivotParam.PY5, tPivotParam.RP5, tPivotParam.EB5, tPivotParam.EBH5, tPivotParam.HB5, tPivotParam.AR5, tPivotParam.RCI5}) table.insert( tExtraBore, { tPivotParam.D6, tPivotParam.IY6, tPivotParam.T6, tPivotParam.I6, tPivotParam.PX6, tPivotParam.PY6, tPivotParam.RP6, tPivotParam.EB6, tPivotParam.EBH6, tPivotParam.HB6, tPivotParam.AR6, tPivotParam.RCI6}) table.insert( tExtraBore, { tPivotParam.D7, tPivotParam.IY7, tPivotParam.T7, tPivotParam.I7, tPivotParam.PX7, tPivotParam.PY7, tPivotParam.RP7, tPivotParam.EB7, tPivotParam.EBH7, tPivotParam.HB7, tPivotParam.AR7, tPivotParam.RCI7}) -- Assegno i nomi geometrie local LG = tPivotParam.LG -- nome geometria face local LM = tPivotParam.LM -- nome lavorazione face local LA = tPivotParam.LA -- nome geometria antischeggia local LGM = tPivotParam.LGM -- nome geometria mortise local LMM = tPivotParam.LMM -- nome lavorazione mortise local LGH = tPivotParam.LGH -- nome geometria foro profondo local LH = 'Pivot_Probe' local DM = 'DUMMY' local CH = tPivotParam.CH -- nome suffisso lavorazione chisel local CLH = tPivotParam.CLH -- nome geometria clean corner su lato cerniera local CLC = tPivotParam.CLC -- nome geometria clean corner su altri lati -- variabili per messaggi e settaggi vari local sCompoName = tPivotParam.Nome local nCompoNpar = tPivotParam.Npar local sCompoPath = tPivotParam.Path -- eventuale messaggio errore rilevato nell'adjust local nCodAdj = tPivotParam.nCod local sCodAdj = tPivotParam.sCod -- variabili per messaggi di errore local sNamePar1 = tPivotParam.N1 or 'L' local sNamePar2 = tPivotParam.N2 or 'H' local sNamePar3 = tPivotParam.N3 or 'T' local sNamePar4 = tPivotParam.N4 or 'd' local sNamePar5 = tPivotParam.N5 or 'p' local sNamePar7 = tPivotParam.N7 or 'd2' local sNamePar8 = tPivotParam.N8 or 'L2' local sNamePar9 = tPivotParam.N9 or 'H2' local sNamePar10 = tPivotParam.N10 or 'T2' local sNamePar11 = tPivotParam.N11 or 'd3' local sNamePar12 = tPivotParam.N12 or 'p3' local sNamePar13 = tPivotParam.N13 or 's' local sNamePar22 = tPivotParam.N22 or 'D' local sNamePar23 = tPivotParam.N23 or 'DX' local sNamePar24 = tPivotParam.N24 or 'L3' local sNamePar25 = tPivotParam.N25 or 'H3' local sNamePar26 = tPivotParam.N26 or 'radius' local sNamePar27 = tPivotParam.N27 or 'sf' local sNamePar28 = tPivotParam.N28 or 'rf' local sNamePar29 = tPivotParam.N26 or 'R1' local sNamePar30 = tPivotParam.N27 or 'D_SK' local sNamePar31 = tPivotParam.N28 or 's3' local sNamePar32 = tPivotParam.N29 or 'd4' local sNamePar33 = tPivotParam.N30 or 'T3' local sNamePar34 = tPivotParam.N31 or 'Backset' local sNamePar35 = tPivotParam.N35 or 'clc' local sNamePar36 = tPivotParam.N36 or 'ccr' -- RunByComponetInterface local RC = true -- Messaggi codice errori local EM = ' ' local EC = 0 local ErrorBase = 2100 -- variabili che abilitano la creazione della geometria local bMakeFaceGeom = true local bMakeMortGeom = true local bMakeKnuckle = true local bMakeBody = true -- variabili dei percorsi geometrici local nGeom1, nAS1, nAS2, nAS3, nAS4, nAS5 local nPkToJoin1, nPkToJoin3 local nGeom2b, nAS1b, nAS2b, nAS3b, nAS4b local nPkToJoin2b, nPkToJoin4b local nGeom2 local nPkToJoin2, nPkToJoin4 local nPkToJoin, nPkToJoin_rev local dPosMortise = D_X if not bRunByCompo then -- controllo se lanciato da componente RC = false end if subtype == 1 and ( not L or not H) then bMakeFaceGeom = false bMakeKnuckle = false bMakeBody = false clc = nil CLC = nil CLH = nil elseif (not L or not H) and (not L3 or not H3) then bMakeFaceGeom = false bMakeKnuckle = false bMakeBody = false else if (not L or not H) then -- se non è presente il body bMakeBody = false elseif not L3 or not H3 or L3 <= 0 or H3 <= 0 then -- se non è presente il knuckle o ha valori nulli bMakeKnuckle = false end end if est then bMakeMortGeom = false bMakeKnuckle = false end -- verifico se dei parametri sono nulli e in qual caso assegno dei valori sostitutivi if not T then T = 0 end if not T3 then T3 = 0 tPivotParam.T3 = T3 end -- se tipo intermediate standard e L3 nullo setto i parametri dei raccordi if ptype == 2 and subtype == 1 and L3 == 0 then D_SK = 0 tPivotParam.D_Y = D rf = radius tPivotParam.rf = rf tPivotParam.cl = 3 cl = 3 end -- se le dimensioni del raccordo sono eccessive le riconduco a valori accettabili if bMakeFaceGeom and bMakeBody and cl > 0 then if L >= H then if rf > (H/2) then rf = (H/2) tPivotParam.rf = rf end else if rf > (L/2) then rf = (L/2) tPivotParam.rf = rf end end end if not L2 or not H2 then -- se non ci sono i parametri dimensionali disabilito la mortasa e il foro bMakeMortGeom = false end if not H2 and not T2 then -- se non ci sono i parametri dimensionali per il foro lo disabilito bMakeMortGeom = false mh = false end if mh then -- se abilitato il foro disabilito la mortasa bMakeMortGeom = false end if ptype == 1 and subtype > 1 then -- se tipo offset e sottotipo diverso da 1 disabilito mortasa e foro bMakeMortGeom = false mh = false elseif ptype == 2 and subtype == 3 then -- se tipo offsetIntermediate e sottotipo diverso da 1 disabilito mortasa e foro bMakeMortGeom = false mh = false end if not T2 then T2 = 0 end -- 0 solo geom esterna, 1 solo geom mach, 2 entrambe if not nDrawMach then -- se non definita la setto per non creare geometria di lavorazione nDrawMach = 0 end local nForceMakeFace = nDrawMach -- se ho abilitato il chiseling modifico il nome geometria if ech then LG = LG .. CH tPivotParam.LG = LG -- se ho abilitato solo le geometrie di lavorazione, abilito la generazione di entrambe per il contorno chisel if nDrawMach == 1 then nForceMakeFace = 2 end end local EgtDoorsMsg = require( 'EgtDoorsMsg') -- Verifica delle dimensioni, le condizioni vengono verificate in base a quale geometria deve essere creata if bMakeFaceGeom and bMakeMortGeom and (cl == 1 or cl == 2) and (L-rf) < (L2+(2*abs(D_X))) then jn = false tPivotParam.jn = false -- EC = 25 -- EM = string.format(EgtDoorsMsg[423],sNamePar23,EgtToUiUnits(D_X),EgtToUiUnits((L-rf-L2)/2), sCompoPath) -- il parametro 'D_X' é troppo grande, max valore: -- D_X = 0 elseif bMakeFaceGeom and bMakeMortGeom and subtype < 2 and H2 > H then jn = false tPivotParam.jn = false -- EC = 28 -- EM = string.format(EgtDoorsMsg[422],sNamePar2,EgtToUiUnits(H),sNamePar9,EgtToUiUnits(H2), sCompoPath) -- il parametro 'T2' deve essere > del parametro 'T' -- H2 = H elseif bMakeBody and nDrawMach > 0 and d < DgMin then EC = 1 EM = string.format(EgtDoorsMsg[400],sNamePar4,EgtToUiUnits(d),EgtToUiUnits(DgMin)) -- il diametro utensile deve essere >= di d = DgMin elseif bMakeBody and nDrawMach > 0 and d2 and d2 < DgMin then EC = 2 EM = string.format(EgtDoorsMsg[400],sNamePar7,EgtToUiUnits(d2),EgtToUiUnits(DgMin)) -- il diametro utensile deve essere >= di d2 = DgMin elseif bMakeMortGeom and nDrawMach > 0 and not jn and d3 and d3 < DgMin then EC = 3 EM = string.format(EgtDoorsMsg[400],sNamePar11,EgtToUiUnits(d3),EgtToUiUnits(DgMin)) -- il diametro utensile deve essere >= di d3 = DgMin elseif bMakeBody and H <= 0 then EC = 4 EM = string.format(EgtDoorsMsg[401],sNamePar2,EgtToUiUnits(H), sCompoPath) -- il parametro 'H' deve essere > 0 H = d/2 elseif bMakeBody and nDrawMach > 0 and H < d then if DGD.bProoduce then EC = 5 EM = string.format(EgtDoorsMsg[405],sNamePar2,EgtToUiUnits(H),EgtToUiUnits(d), sCompoPath) -- il parametro 'H' deve essere maggiore o uguale del diametro utensile H = d else d = H - 0.002 end elseif bMakeMortGeom and nDrawMach > 0 and jn and H2 < d then if DGD.bProoduce then EC = 6 EM = string.format(EgtDoorsMsg[405],sNamePar9,EgtToUiUnits(H2),EgtToUiUnits(d), sCompoPath) -- il parametro 'H2' deve essere maggiore o uguale del diametro utensile H2 = d else d = H2 - 0.002 end elseif bMakeMortGeom and nDrawMach > 0 and not jn and H2 < d3 then if DGD.bProoduce then EC = 7 EM = string.format(EgtDoorsMsg[405],sNamePar9,EgtToUiUnits(H2),EgtToUiUnits(d3), sCompoPath) -- il parametro 'H2' deve essere maggiore o uguale del diametro utensile H2 = d3 else d3 = H2 - 0.002 end elseif bMakeBody and L <= 0 then EC = 8 EM = string.format(EgtDoorsMsg[401],sNamePar1,EgtToUiUnits(L), sCompoPath) -- il parametro 'L' deve essere > 0 L = d elseif bMakeBody and nDrawMach > 0 and L <= d then if DGD.bProoduce then EC = 9 EM = string.format(EgtDoorsMsg[402],sNamePar1,EgtToUiUnits(L),sNamePar4,EgtToUiUnits(d), sCompoPath) -- il parametro 'L' deve essere maggiore del diametro utensile L = d + 0.002 else d = L - 0.002 end elseif bMakeBody and nDrawMach > 0 and d2 and L <= d2 then if DGD.bProoduce then EC = 10 EM = string.format(EgtDoorsMsg[402],sNamePar1,EgtToUiUnits(L),sNamePar7,EgtToUiUnits(d2), sCompoPath) -- il parametro 'L' deve essere maggiore del diametro utensile L = d2 + 0.002 else d2 = L - 0.002 end elseif bMakeMortGeom and nDrawMach > 0 and jn and L2 <= d then if DGD.bProoduce then EC = 11 EM = string.format(EgtDoorsMsg[402],sNamePar8,EgtToUiUnits(L2),sNamePar4,EgtToUiUnits(d), sCompoPath) -- il parametro 'L2' deve essere maggiore del diametro utensile L2 = d + 0.002 else d = L2 - 0.002 end elseif bMakeMortGeom and nDrawMach > 0 and not jn and L2 <= d3 then if DGD.bProoduce then EC = 12 EM = string.format(EgtDoorsMsg[402],sNamePar8,EgtToUiUnits(L2),sNamePar11,EgtToUiUnits(d3), sCompoPath) -- il parametro 'L2' deve essere maggiore del diametro utensile L2 = d3 + 0.002 else d3 = L2 - 0.002 end elseif bMakeMortGeom and nDrawMach > 0 and s and s <= 0 then EC = 13 EM = string.format(EgtDoorsMsg[401],sNamePar13,EgtToUiUnits(s), sCompoPath) -- il parametro 's' deve essere > 0 s = d elseif bMakeBody and nDrawMach > 0 and ( p < PtMin or p > PtMax) then EC = 14 EM = string.format(EgtDoorsMsg[403],sNamePar5,p,PtMin,PtMax, sCompoPath) -- il parametro 'p' deve essere compreso tra p = 0.8 elseif bMakeKnuckle and nDrawMach > 0 and p3 and ( p3 < PtMin or p3 > PtMax) then EC = 15 EM = string.format(EgtDoorsMsg[403],sNamePar12,p3,PtMin,PtMax, sCompoPath) -- il parametro 'p3' deve essere compreso tra p3 = 0.8 elseif bMakeMortGeom and nDrawMach > 0 and not jn and ( p3 < PtMin or p3 > PtMax) then EC = 16 EM = string.format(EgtDoorsMsg[403],sNamePar12,p3,PtMin,PtMax, sCompoPath) -- il parametro 'p3' deve essere compreso tra p3 = 0.8 elseif bMakeBody and T < 0 then EC = 17 EM = string.format(EgtDoorsMsg[404],sNamePar3,EgtToUiUnits(T), sCompoPath) -- il parametro 'T' deve essere >= 0 T = 0 elseif bMakeMortGeom and not dws and T2 <= T then EC = 18 EM = string.format(EgtDoorsMsg[407],sNamePar10,EgtToUiUnits(T2),sNamePar3,EgtToUiUnits(T), sCompoPath) -- il parametro 'T2' deve essere > del parametro 'T' T2 = T + 0.01 elseif bMakeFaceGeom and cl > 0 and rf < 0 then EM = string.format(EgtDoorsMsg[404],sNamePar28,EgtToUiUnits(rf), sCompoPath) -- il parametro 'rf' deve essere >= 0 EC = 19 rf = H/2 elseif bMakeBody and cl > 0 and abs(rf - (H/2)) < GEO.EPS_SMALL and L <= H then EC = 20 EM = string.format(EgtDoorsMsg[407],sNamePar1,EgtToUiUnits(L),sNamePar2,EgtToUiUnits(H), sCompoPath) -- il parametro 'L' deve essere > 'H' L = H+5 elseif bMakeBody and cl > 0 and rf < (H/2) and L <= (rf*2) then EC = 21 EM = string.format(EgtDoorsMsg[407],sNamePar1,EgtToUiUnits(L),sNamePar28..'*2',EgtToUiUnits(rf)*2, sCompoPath) -- il parametro 'L' deve essere > 'rf*2' L = (rf*2)+5 elseif bMakeFaceGeom and bMakeMortGeom and (cl == 1 or cl == 2) and (L-rf) < L2 then EC = 22 EM = string.format(EgtDoorsMsg[410],sNamePar1,EgtToUiUnits(L),sNamePar8,sNamePar28,EgtToUiUnits(L2+rf), sCompoPath) -- il parametro 'L' deve essere >= 'L2' + 'rf' L = rf+L2+5 elseif bMakeFaceGeom and bMakeMortGeom and cl == 3 and (L-(rf*2)) < L2 then EC = 23 EM = string.format(EgtDoorsMsg[410],sNamePar1,EgtToUiUnits(L),sNamePar8,sNamePar28..'*2',EgtToUiUnits(L2+(rf*2)), sCompoPath) -- il parametro 'L' deve essere >= 'L2' + 'rf*2' L = (rf*2)+L2+5 elseif bMakeFaceGeom and bMakeMortGeom and cl == 3 and (L-(rf*2)) < (L2+(2*abs(D_X))) then EC = 24 EM = string.format(EgtDoorsMsg[423],sNamePar23,EgtToUiUnits(D_X),EgtToUiUnits((L-(rf*2)-L2)/2), sCompoPath) -- il parametro 'D_X' é troppo grande, max valore: D_X = 0 elseif bMakeFaceGeom and bMakeMortGeom and cl == 0 and L < L2 then EC = 26 EM = string.format(EgtDoorsMsg[407],sNamePar1,EgtToUiUnits(L),sNamePar8,EgtToUiUnits(L2), sCompoPath) -- il parametro 'L' deve essere > 'L2' L = L2+5 elseif bMakeFaceGeom and bMakeMortGeom and cl == 0 and subtype < 2 and L < (L2+(2*abs(D_X))) then EC = 27 EM = string.format(EgtDoorsMsg[423],sNamePar23,EgtToUiUnits(D_X),EgtToUiUnits((L-L2)/2), sCompoPath) -- il parametro 'D_X' é troppo grande, max valore: D_X = 0 elseif bMakeFaceGeom and bMakeMortGeom and ptype ~= 3 and subtype < 2 then if not D then EC = 29 EM = string.format(EgtDoorsMsg[591],sNamePar22, sCompoPath) -- il parametro 'D' non è definito D = 0 elseif (H-H2) < 2*D then EC = 30 EM = string.format(EgtDoorsMsg[423],sNamePar22,EgtToUiUnits(D),EgtToUiUnits((H-H2)/2), sCompoPath) -- il parametro 'D' é troppo grande, max valore: D = 0 end elseif ptype ~= 3 then if bMakeBody and subtype < 2 and bShiftBackSetPos and backset <= 0 then EC = 31 EM = string.format(EgtDoorsMsg[401],sNamePar34,EgtToUiUnits(backset), sCompoPath) -- il parametro 'Backset' deve essere > 0 backset = d/2 elseif bMakeBody and subtype < 2 and not bShiftBackSetPos and backset <= H/2 then EC = 32 EM = string.format(EgtDoorsMsg[407],sNamePar34,EgtToUiUnits(backset),'H/2',EgtToUiUnits(H/2), sCompoPath) -- il parametro 'Backset' deve essere > 'H/2' backset = H elseif bMakeFaceGeom then if bMakeKnuckle and not H3 then EC = 33 EM = string.format(EgtDoorsMsg[591],sNamePar25, sCompoPath) -- il parametro 'H3' non è definito H3 = H*1.5 elseif bMakeKnuckle and not L3 then EC = 34 EM = string.format(EgtDoorsMsg[591],sNamePar24, sCompoPath) -- il parametro 'L3' non è definito L3 = L/2 elseif bMakeBody and not radius then EC = 35 EM = string.format(EgtDoorsMsg[592],sNamePar26) -- il parametro 'Radius' non è definito radius = H/2 elseif ( subtype < 2 or subtype > 3) and bMakeKnuckle and bMakeBody and H3 <= H then EC = 36 EM = string.format(EgtDoorsMsg[407],sNamePar25,EgtToUiUnits(H3),sNamePar2,EgtToUiUnits(H), sCompoPath) -- il parametro 'H3' deve essere > 'H' H3 = H*1.5 elseif bMakeKnuckle and bMakeBody and subtype < 3 and L3 >= L then EC = 37 EM = string.format(EgtDoorsMsg[406],sNamePar24,EgtToUiUnits(L3),sNamePar1,EgtToUiUnits(L), sCompoPath) -- il parametro 'L3' deve essere < 'L' L3 = L/2 elseif bMakeBody and subtype ~= 2 and radius > H/2 then EC = 38 EM = string.format(EgtDoorsMsg[406],sNamePar26,EgtToUiUnits(radius),'H/2',EgtToUiUnits(H/2), sCompoPath) -- il parametro 'radius' deve essere < 'H/2' radius = H/2 elseif bMakeBody and subtype == 2 and radius >= H then EC = 39 EM = string.format(EgtDoorsMsg[406],sNamePar26,EgtToUiUnits(radius),sNamePar2,EgtToUiUnits(H), sCompoPath) -- il parametro 'radius' deve essere < 'H/2' radius = H elseif bMakeKnuckle and bMakeBody and subtype < 3 and L-L3 < radius then EC = 40 EM = string.format(EgtDoorsMsg[407],sNamePar1,EgtToUiUnits(L),'L3+Radius',EgtToUiUnits(L3+radius), sCompoPath) -- il parametro 'L' deve essere > 'L3+R' L = L3+radius elseif bMakeBody and R1 >= L-radius then EC = 41 EM = string.format(EgtDoorsMsg[456],sNamePar29,EgtToUiUnits(R1),'L-Radius',EgtToUiUnits(L-radius), sCompoPath) -- il parametro 'R1' deve essere <= 'L-radius' R1 = L-radius-1.5 elseif subtype < 2 and R1 >= H3 then EC = 42 EM = string.format(EgtDoorsMsg[406],sNamePar29,EgtToUiUnits(R1),'H3',EgtToUiUnits(H3), sCompoPath) -- il parametro 'R1' deve essere < 'H3' R1 = H3-1.5 elseif bMakeBody and ( subtype == 1 or (ptype == 2 and subtype == 4)) and D_SK ~= 0 and not B_SK and D_SK2 ~= 0 and ( (R1i + radius) - (L-D_SK-L3)) > GEO.EPS_SMALL then EC = 43 EM = string.format(EgtDoorsMsg[407],sNamePar1,EgtToUiUnits(L),'D_SK+L3+Radius+R1',EgtToUiUnits(D_SK+L3+radius+R1i), sCompoPath) -- il parametro 'L' deve essere > 'D_SK+L3+Radius+R1' L = D_SK+L3+radius+R1+0.1 elseif bMakeBody and ( subtype == 1 or (ptype == 2 and subtype == 4)) and D_SK > 0 and (R1i + radius) > D_SK then EC = 44 EM = string.format(EgtDoorsMsg[407],sNamePar30,EgtToUiUnits(D_SK),'Radius+R1',EgtToUiUnits(radius+R1i), sCompoPath) -- il parametro 'D_SK' deve essere > 'Radius+R1' D_SK = radius+R1+0.1 elseif bMakeKnuckle and bMakeBody and ( subtype == 1 or (ptype == 2 and subtype == 4)) and D_SK > 0 and R1i > (H3-H) then EC = 45 EM = string.format(EgtDoorsMsg[406],sNamePar29,EgtToUiUnits(R1i),'H3-H (Backset)',EgtToUiUnits(H3-H), sCompoPath) -- il parametro 'R1' deve essere < 'H3-H' R1i = 0 R1 = 0 elseif bMakeKnuckle and nDrawMach > 0 and subtype == 4 and L3 and d3 and L3 < (d3/2) then EC = 46 EM = string.format(EgtDoorsMsg[407],sNamePar24,EgtToUiUnits(L3),'d3/2',EgtToUiUnits(d3/2), sCompoPath) -- il parametro 'L3' deve essere > 'd3/2' L3 = d3/2+0.1 elseif bMakeKnuckle and nDrawMach > 0 and subtype < 4 and L3 and d3 and L3 <= d3 then EC = 47 EM = string.format(EgtDoorsMsg[407],sNamePar24,EgtToUiUnits(L3),sNamePar11,EgtToUiUnits(d3), sCompoPath) -- il parametro 'L3' deve essere > 'd3' L3 = d3+0.1 elseif bMakeKnuckle and nDrawMach > 0 and subtype < 4 and not( stn or stnb) and L3 and d and L3 <= d then EC = 48 EM = string.format(EgtDoorsMsg[407],sNamePar24,EgtToUiUnits(L3),sNamePar4,EgtToUiUnits(d), sCompoPath) -- il parametro 'L3' deve essere > 'd' L3 = d+0.1 elseif bMakeKnuckle and nDrawMach > 0 and subtype < 4 and not( stn or stnb) and L3 and d2 and L3 <= ( d2 + 0.2 + ((d2/8)/tan(30))) then EC = 49 EM = string.format(EgtDoorsMsg[407],sNamePar24,EgtToUiUnits(L3),'min large',EgtToUiUnits( d2 + 0.2 + ((d2/8)/tan(30))), sCompoPath) -- il parametro 'L3' deve essere > della componente minima L3 = ( d2 + 0.2 + ((d2/8)/tan(30))) + 0.1 end end elseif bMakeBody and nDrawMach > 0 and sf and sf <= 0 then EC = 50 EM = string.format(EgtDoorsMsg[401],sNamePar27,EgtToUiUnits(sf), sCompoPath) -- il parametro 'sf' deve essere > 0 sf = T elseif bMakeKnuckle and T3 and T3 < 0 then EC = 51 EM = string.format(EgtDoorsMsg[404],sNamePar33,EgtToUiUnits(T3), sCompoPath) -- il parametro 'T3' deve essere >= 0 T3 = 0 elseif bMakeKnuckle and nDrawMach > 0 and s3 and s3 <= 0 then EC = 52 EM = string.format(EgtDoorsMsg[401],sNamePar31,EgtToUiUnits(s3), sCompoPath) -- il parametro 's3' deve essere > 0 s3 = T3 elseif bMakeKnuckle and nDrawMach > 0 and d4 and d4 < DgMin then EC = 53 EM = string.format(EgtDoorsMsg[400],sNamePar32,EgtToUiUnits(d4),EgtToUiUnits(DgMin)) -- il diametro utensile deve essere >= di d4 = DgMin elseif bMakeFaceGeom and ( CLH or CLC) and clc and ccr and clc > 0 and ccr > 0 and (2*(ccr*sin(45))) >= clc then EC = 54 EM = string.format(EgtDoorsMsg[407],sNamePar35,EgtToUiUnits(clc),'',EgtToUiUnits(2*(ccr*sin(45))), sCompoPath) -- il parametro 'clc' deve essere > 'crc' clc = (2*(ccr*sin(45)))+0.2 end if not bPreview and EC ~= 0 then return (ErrorBase+EC), EM end -- Se Preview cancello tutto if bPreview then EgtNewFile() EgtSetDefaultMaterial( BLACK()) end -- Pezzo e Layer local Pz if bPreview then Pz = EgtGroup(GDB_ID.ROOT,GDB_RT.LOC) -- nuovo pezzo else if not RC then Pz = EgtGetCurrPart() -- pezzo corrente end if not Pz then Pz = EgtGroup(GDB_ID.ROOT,GDB_RT.LOC) -- nuovo pezzo end end local Lg, Dm local sRequireCompoName local hint_2 local nSubType = tPivotParam.stype local dAsDiam = tPivotParam.d2 Lg = EgtGroup(Pz,GDB_RT.LOC) -- layer della figura principale EgtSetName(Lg,sCompoName) if nDrawMach > 0 then -- se abilitata geometria lavorazione Dm = EgtGroup( Pz, GDB_RT.LOC) -- layer disegni cerchi rappresentante il diametro utensile EgtSetName( Dm, DM) end if ptype ~= 3 then -- se non è center hung if subtype == 1 then -- se sottotipo 1 dei tipi rimanenti if ptype == 2 and L3 == 0 then -- se intermediate con knuckle nullo lancio il componente usato per center hung sRequireCompoName = '_Latch' else sRequireCompoName = '_PivotL' end else if ptype == 2 then -- se tipo intermediate if subtype == 4 then tPivotParam.stype = 1 tPivotParam.d2 = nil sRequireCompoName = '_PivotL' else sRequireCompoName = '_OPivot' end tPivotParam.nextSub = subtype else -- altrimenti tipo offset sRequireCompoName = '_OPivot' end end else -- altrimenti è center hung, lancio componete tipo concealed hinge sRequireCompoName = '_Latch' end if bMakeFaceGeom then if mh then tPivotParam.jn = false end tPivotParam.D_X = dPosMortise + D_SK -- lancio il primo componente base MHgen = require( sRequireCompoName) nGeom1, nPkToJoin1, nAS1, nAS2, nPkToJoin3, nAS3, nAS4, nGeom2b, nPkToJoin2b, nAS1b, nAS2b, nPkToJoin4b, nAS3b, nAS4b = MHgen.Draw( EC, EM, tPivotParam, bPreview, bRunByCompo, nForceMakeFace, Pz, Lg, dThickDoor) tPivotParam.stype = nSubType tPivotParam.d2 = dAsDiam -- Clean corner if nDrawMach >= 0 then -- se abilitata geometria local CLC1 if sRequireCompoName == '_Latch' then -- se center hung o intermediate chiuso if ptype == 3 then -- se è center hung if cl ~= 3 or ( cl == 3 and rf > 0) then -- se c'è almeno un raccordo if CLC and clc and clc > 0 and clc < H and clc < L then CLC1 = MakeClcPath(clc, ccr, CLC, Lg, -T, (invG == -1)) if CLC1 then -- se mantiene backset anche su face if kbs and kbs > 0 then local sKeepMode = 'c' -- setto di default per mantenere il centro spessore EgtSetInfo( CLC1, 'KeepBackSet', sKeepMode) end if pbs and pbs > 0 and DGC.Pms and DGC.Pms > 2 then EgtSetInfo( CLC1, 'ProbeSide', '1') end if cl == 1 then -- cava arrotondata a sinistra -- angolo x+y+ local CLC2 = EgtCopyGlob( CLC1, Lg) EgtRotate( CLC1, Point3d(0,0,0), Z_AX(), -90) EgtMove( CLC1, Point3d((L/2)-(rf/2),(H/2),0) - ORIG()) -- angolo x+y- EgtRotate( CLC2, Point3d(0,0,0), Z_AX(), 180) EgtMove( CLC2, Point3d((L/2)-(rf/2),-(H/2),0) - ORIG()) --[[ if rf <= 0 then -- angolo x-y- local CLC3 = EgtCopyGlob( CLC1, Lg) EgtMove( CLC3, Point3d(-(L/2)+(rf/2),-(H/2),0) - ORIG()) -- mi porto in posizione originaria EgtRotate( CLC3, Point3d(0,0,0), Z_AX(), 180) EgtMove( CLC3, Point3d(-(L/2)-(rf/2),-(H/2),0) - ORIG()) -- angolo x-y+ local CLC4 = EgtCopyGlob( CLC1, Lg) EgtMove( CLC4, Point3d(-(L/2)+(rf/2),-(H/2),0) - ORIG()) -- mi porto in posizione originaria EgtRotate( CLC4, Point3d(0,0,0), Z_AX(), 90) EgtMove( CLC4, Point3d(-(L/2)-(rf/2),(H/2),0) - ORIG()) end ]]-- elseif cl == 2 then -- cava arrotondata a destra -- angolo x-y- local CLC2 = EgtCopyGlob( CLC1, Lg) EgtRotate( CLC1, Point3d(0,0,0), Z_AX(), 90) EgtMove( CLC1, Point3d(-(L/2)+(rf/2),-(H/2),0) - ORIG()) -- angolo x-y+ EgtMove( CLC2, Point3d(-(L/2)+(rf/2),(H/2),0) - ORIG()) --[[ if rf <= 0 then -- angolo x+y+ local CLC3 = EgtCopyGlob( CLC1, Lg) EgtMove( CLC3, Point3d((L/2)-(rf/2),(H/2),0) - ORIG()) -- mi porto in posizione originaria EgtRotate( CLC3, Point3d(0,0,0), Z_AX(), 180) EgtMove( CLC3, Point3d((L/2)+(rf/2),(H/2),0) - ORIG()) -- angolo x+y- local CLC4 = EgtCopyGlob( CLC1, Lg) EgtMove( CLC4, Point3d((L/2)-(rf/2),(H/2),0) - ORIG()) -- mi porto in posizione originaria EgtRotate( CLC4, Point3d(0,0,0), Z_AX(), 90) EgtMove( CLC4, Point3d((L/2)+(rf/2),-(H/2),0) - ORIG()) end ]]-- else -- angolo x+y+ local CLC2 = EgtCopyGlob( CLC1, Lg) EgtRotate( CLC2, Point3d(0,0,0), Z_AX(), -90) EgtMove( CLC2, Point3d((L/2),(H/2),0) - ORIG()) -- angolo x+y- local CLC3 = EgtCopyGlob( CLC1, Lg) EgtRotate( CLC3, Point3d(0,0,0), Z_AX(), 180) EgtMove( CLC3, Point3d((L/2),-(H/2),0) - ORIG()) -- angolo x-y- local CLC4 = EgtCopyGlob( CLC1, Lg) EgtRotate( CLC4, Point3d(0,0,0), Z_AX(), 90) EgtMove( CLC4, Point3d(-(L/2),-(H/2),0) - ORIG()) -- angolo x-y+ EgtMove( CLC1, Point3d(-(L/2),(H/2),0) - ORIG()) end end end end else -- altrimenti è intermediate chiuso if radius <= 0 then -- se non c'è un raccordo if CLH and clc and clc > 0 and clc < H and clc < L then CLC1 = MakeClcPath(clc, ccr, CLH, Lg, -T, (invG == -1)) if CLC1 then -- se mantiene backset anche su face if kbs and kbs > 0 then local sKeepMode = 'w' -- se pivot a L setto 'w' per mantenere il backset su wide side EgtSetInfo( CLC1, 'KeepBackSet', sKeepMode) end if pbs and pbs > 0 and DGC.Pms and DGC.Pms > 2 then EgtSetInfo( CLC1, 'ProbeSide', '1') end -- angolo x+y+ local CLC2 = EgtCopyGlob( CLC1, Lg) EgtRotate( CLC2, Point3d(0,0,0), Z_AX(), -90) EgtMove( CLC2, Point3d((L/2),(H/2),0) - ORIG()) -- angolo x+y- local CLC3 = EgtCopyGlob( CLC1, Lg) EgtRotate( CLC3, Point3d(0,0,0), Z_AX(), 180) EgtMove( CLC3, Point3d((L/2),-(H/2),0) - ORIG()) -- angolo x-y- local CLC4 = EgtCopyGlob( CLC1, Lg) EgtRotate( CLC4, Point3d(0,0,0), Z_AX(), 90) EgtMove( CLC4, Point3d(-(L/2),-(H/2),0) - ORIG()) -- angolo x-y+ EgtMove( CLC1, Point3d(-(L/2),(H/2),0) - ORIG()) end end end end elseif sRequireCompoName == '_PivotL' then -- se offset o intermediate if ( CLC or CLH) and clc and clc > 0 and clc < H and clc < L then local sLblGeom if ptype == 1 then -- se è offset sLblGeom = CLC else -- altrimenti è intermediate sLblGeom = CLH end if sLblGeom then if radius <= 0 then -- se non c'è un raccordo da ddf CLC1 = MakeClcPath(clc, ccr, sLblGeom, Lg, -T, (invG == -1)) if CLC1 then -- se mantiene backset anche su face if kbs and kbs > 0 then local sKeepMode = 'w' -- se pivot a L setto 'w' per mantenere il backset su wide side EgtSetInfo( CLC1, 'KeepBackSet', sKeepMode) end if pbs and pbs > 0 and DGC.Pms and DGC.Pms > 2 then EgtSetInfo( CLC1, 'ProbeSide', '1') end if D_SK > 0 and D_SK2 > 0 then -- se ho knuckle centrato -- angolo x+y+ local CLC2 = EgtCopyGlob( CLC1, Lg) EgtRotate( CLC2, Point3d(0,0,0), Z_AX(), -90) EgtMove( CLC2, Point3d((L3/2)+D_SK,(H/2),0) - ORIG()) -- angolo x+y- local CLC3 = EgtCopyGlob( CLC1, Lg) EgtRotate( CLC3, Point3d(0,0,0), Z_AX(), 180) EgtMove( CLC3, Point3d((L3/2)+D_SK,-(H/2),0) - ORIG()) -- angolo x-y- local CLC4 = EgtCopyGlob( CLC1, Lg) EgtRotate( CLC4, Point3d(0,0,0), Z_AX(), 90) EgtMove( CLC4, Point3d(-(L-(L3/2)-D_SK),-(H/2),0) - ORIG()) -- angolo x-y+ EgtMove( CLC1, Point3d(-(L-(L3/2)-D_SK),(H/2),0) - ORIG()) elseif D_SK > 0 then -- se knuckle opposto -- angolo x+y+ local CLC2 = EgtCopyGlob( CLC1, Lg) EgtRotate( CLC2, Point3d(0,0,0), Z_AX(), -90) EgtMove( CLC2, Point3d((L-(L3/2)),(H/2),0) - ORIG()) -- angolo x+y- EgtRotate( CLC1, Point3d(0,0,0), Z_AX(), 180) EgtMove( CLC1, Point3d((L-(L3/2)),-(H/2),0) - ORIG()) elseif D_SK == 0 then -- se forma L classica local CLC4 = EgtCopyGlob( CLC1, Lg) -- angolo x-y- EgtRotate( CLC1, Point3d(0,0,0), Z_AX(), 90) EgtMove( CLC1, Point3d(-(L-(L3/2)),-(H/2),0) - ORIG()) -- angolo x-y+ EgtMove( CLC4, Point3d(-(L-(L3/2)),(H/2),0) - ORIG()) end end end if R1 <= 0 and ( D_SK == 0 or D_SK2 == 0) then -- se non c'è raccordo angolo singolo CLC1 = MakeClcPath(clc, ccr, sLblGeom, Lg, -T, (invG == -1)) if CLC1 then -- se mantiene backset anche su face if kbs and kbs > 0 then local sKeepMode = 'w' -- se pivot a L setto 'w' per mantenere il backset su wide side EgtSetInfo( CLC1, 'KeepBackSet', sKeepMode) end if pbs and pbs > 0 and DGC.Pms and DGC.Pms > 2 then EgtSetInfo( CLC1, 'ProbeSide', '1') end if D_SK == 0 then -- se forma L classica -- angolo x+y- EgtRotate( CLC1, Point3d(0,0,0), Z_AX(), 180) EgtMove( CLC1, Point3d((L3/2),-(H/2),0) - ORIG()) else -- se L opposta -- angolo x-y- EgtRotate( CLC1, Point3d(0,0,0), Z_AX(), 90) EgtMove( CLC1, Point3d(-(L3/2),-(H/2),0) - ORIG()) end end end end end end end else -- disattivo il join dei percorsi jn = false tPivotParam.jn = false end if bMakeMortGeom then tPivotParam.D_X = dPosMortise -- lancio il secondo componente base if ptype == 2 and subtype == 4 then -- se tipo intermediate sottotipo 4 sRequireCompoName = '_PivotL' tPivotParam.nextSub = 1 else tLocalTb = tPivotParam sRequireCompoName = '_Mortise' end MHgen = require( sRequireCompoName) nGeom2, nPkToJoin2, nPkToJoin4 = MHgen.Draw( EC, EM, tPivotParam, bPreview, bRunByCompo, nDrawMach, Pz, Lg, dThickDoor) if ptype == 2 and subtype == 4 then -- se tipo intermediate sottotipo 4 nAS5 = nPkToJoin4 nPkToJoin4 = nil end elseif mh and LGH then -- se devo fare il foro -- disattivo il join dei percorsi jn = false tPivotParam.jn = false local dExtraDepth = 0 nGeom2 = EgtCircle( Lg, Point3d(0,0,0), H2/2 , GDB_RT.LOC) -- se foro deve rimanere orizzontale ed è applicato su fianco bevel, calcolo la profondità aggiuntiva if HB and mkrev then if bMakeFaceGeom then -- se esiste face if not DGC.Bwd or DGC.Bwd <= 1 then -- se backset non parto dalla dimensione wide dExtraDepth = H/2 * TAN3 end end end EgtModifyCurveThickness( nGeom2, -(T2+dExtraDepth)) EgtSetName( nGeom2, LGH) -- se mantiene backset anche su mortise if kbs and kbs > 1 then local sKeepMode = 'c' -- setto di default per mantenere il centro spessore if ptype ~= 3 then -- se pivot a L setto 'w' per mantenere il backset su wide side sKeepMode = 'w' end EgtSetInfo( nGeom2, 'KeepBackSet', sKeepMode) end if pbs and pbs > 0 and DGC.Pms and DGC.Pms > 2 then EgtSetInfo( nGeom2, 'ProbeSide', '1') end if HB then EgtSetInfo( nGeom2,'SideDoor','LockLH') end end -- se ci sono i percorsi antischeggia if EC == 0 and ( nAS1 or nAS2 or nAS3 or nAS4 or nAS5) then -- se mantiene backset anche su face if kbs and kbs > 0 then local sKeepMode = 'c' -- setto di default per mantenere il centro spessore if ptype ~= 3 then -- se pivot a L setto 'w' per mantenere il backset su wide side sKeepMode = 'w' end if nAS1 then EgtSetInfo( nAS1, 'KeepBackSet', sKeepMode) end if nAS2 then EgtSetInfo( nAS2, 'KeepBackSet', sKeepMode) end if nAS3 then EgtSetInfo( nAS3, 'KeepBackSet', sKeepMode) end if nAS4 then EgtSetInfo( nAS4, 'KeepBackSet', sKeepMode) end if nAS5 then EgtSetInfo( nAS5, 'KeepBackSet', sKeepMode) end end if pbs and pbs > 0 and DGC.Pms and DGC.Pms > 2 then if nAS1 then EgtSetInfo( nAS1, 'ProbeSide', '1') end if nAS2 then EgtSetInfo( nAS2, 'ProbeSide', '1') end if nAS3 then EgtSetInfo( nAS3, 'ProbeSide', '1') end if nAS4 then EgtSetInfo( nAS4, 'ProbeSide', '1') end if nAS5 then EgtSetInfo( nAS5, 'ProbeSide', '1') end end end -- se ci sono i percorsi della mortasa li sposto nella posizione predefinita if EC == 0 and ( nGeom2 or nPkToJoin2 or nPkToJoin4) then if ptype ~= 3 then -- se pivot a L muovo i percorsi della mortasa in X e Y if not( ptype == 2 and subtype == 4) then if nGeom2 then if L3 == 0 then EgtMove( nGeom2, Point3d(D_X,D,0) - ORIG()) else EgtMove( nGeom2, Point3d((-(((L or 0)-(L3 or 0))/2)+D_SK+D_X),D,0) - ORIG()) end end if nPkToJoin2 then if L3 == 0 then EgtMove( nPkToJoin2, Point3d(D_X,D,0) - ORIG()) else EgtMove( nPkToJoin2, Point3d((-((L-L3)/2)+D_SK+D_X),D,0) - ORIG()) end end if nPkToJoin4 then if L3 == 0 then EgtMove( nPkToJoin4, Point3d(D_X,D,0) - ORIG()) else EgtMove( nPkToJoin4, Point3d((-((L-L3)/2)+D_SK+D_X),D,0) - ORIG()) end end end else -- altrimenti se pivot centerhung sposto i percorsi mortasa solo sulla X if nGeom2 then EgtMove( nGeom2, Point3d(D_X,0,0) - ORIG()) end if nPkToJoin2 then EgtMove( nPkToJoin2, Point3d(D_X,0,0) - ORIG()) end if nPkToJoin4 then EgtMove( nPkToJoin4, Point3d(D_X,0,0) - ORIG()) end end end -- se entrambe i percorsi presenti e da lavorare con lo stesso utensile, li concateno if jn and EC == 0 and nPkToJoin1 and nPkToJoin2 then -- recupero la nota delle variazioni dalla geometria del face local sVarNote = EgtGetInfo( nPkToJoin1, 'MVar') nPkToJoin = EgtCurveCompo( Lg, {nPkToJoin1,nPkToJoin2}, true) if nPkToJoin then EgtSetName( nPkToJoin, LM) EgtSetInfo( nPkToJoin, 'NotCheckDir', '1') if sVarNote then EgtSetInfo( nPkToJoin, 'MVar', sVarNote) end -- se mantiene backset anche su face if kbs and kbs > 0 then local sKeepMode = 'c' -- setto di default per mantenere il centro spessore if ptype ~= 3 then -- se pivot a L setto 'w' per mantenere il backset su wideside sKeepMode = 'w' end EgtSetInfo( nPkToJoin, 'KeepBackSet', sKeepMode) EgtSetInfo( nGeom1, 'KeepBackSet', sKeepMode) EgtSetInfo( nGeom2, 'KeepBackSet', sKeepMode) end if pbs and pbs > 0 and DGC.Pms and DGC.Pms > 2 then EgtSetInfo( nPkToJoin, 'ProbeSide', '1') EgtSetInfo( nGeom1, 'ProbeSide', '1') EgtSetInfo( nGeom2, 'ProbeSide', '1') end else EC = ErrorBase + 55 EM = string.format( EgtDoorsMsg[426], sCompoPath) end elseif not jn and EC == 0 then -- altrimenti se non devo concatenare -- se mantiene backset su face if kbs and kbs == 1 and nPkToJoin1 then local sKeepMode = 'c' -- setto di default per mantenere il centro spessore if ptype ~= 3 then -- se pivot a L setto 'w' per mantenere il backset su wideside sKeepMode = 'w' end EgtSetInfo( nPkToJoin1, 'KeepBackSet', sKeepMode) EgtSetInfo( nGeom1, 'KeepBackSet', sKeepMode) -- se mantiene backset su face e mortise elseif kbs and kbs > 0 then local sKeepMode = 'c' -- setto di default per mantenere il centro spessore if ptype ~= 3 then -- se pivot a L setto 'w' per mantenere il backset su wideside sKeepMode = 'w' end if nPkToJoin1 then EgtSetInfo( nPkToJoin1, 'KeepBackSet', sKeepMode) EgtSetInfo( nGeom1, 'KeepBackSet', sKeepMode) end if nPkToJoin2 then EgtSetInfo( nPkToJoin2, 'KeepBackSet', sKeepMode) EgtSetInfo( nGeom2, 'KeepBackSet', sKeepMode) end end if pbs and pbs > 0 and nPkToJoin1 and DGC.Pms and DGC.Pms > 2 then EgtSetInfo( nPkToJoin1, 'ProbeSide', '1') EgtSetInfo( nGeom1, 'ProbeSide', '1') elseif pbs and pbs > 0 and DGC.Pms and DGC.Pms > 2 then if nPkToJoin1 then EgtSetInfo( nPkToJoin1, 'ProbeSide', '1') EgtSetInfo( nGeom1, 'ProbeSide', '1') end if nPkToJoin2 then EgtSetInfo( nPkToJoin2, 'ProbeSide', '1') EgtSetInfo( nGeom2, 'ProbeSide', '1') end end end -- se entrambe i percorsi inversi presenti e da lavorare con lo stesso utensile, li concateno if jn and EC == 0 and nPkToJoin3 and nPkToJoin4 then -- recupero la nota delle variazioni dalla geometria del face local sVarNote = EgtGetInfo( nPkToJoin3, 'MVar') nPkToJoin_rev = EgtCurveCompo( Lg, {nPkToJoin3,nPkToJoin4}, true) if nPkToJoin_rev then EgtSetName( nPkToJoin_rev, (LM..'_R')) EgtSetInfo( nPkToJoin_rev, 'NotCheckDir', '1') if sVarNote then EgtSetInfo( nPkToJoin_rev, 'MVar', sVarNote) end -- se mantiene backset anche su face if kbs and kbs > 0 then local sKeepMode = 'c' -- setto di default per mantenere il centro spessore if ptype ~= 3 then -- se pivot a L setto 'w' per mantenere il backset su wideside sKeepMode = 'w' end EgtSetInfo( nPkToJoin_rev, 'KeepBackSet', sKeepMode) end if pbs and pbs > 0 and DGC.Pms and DGC.Pms > 2 then EgtSetInfo( nPkToJoin_rev, 'ProbeSide', '1') end else EC = ErrorBase + 56 EM = string.format( EgtDoorsMsg[425], sCompoPath) end elseif not jn and EC == 0 then -- altrimenti se non devo concatenare -- se mantiene backset su face if kbs and kbs == 1 and nPkToJoin3 then local sKeepMode = 'c' -- setto di default per mantenere il centro spessore if ptype ~= 3 then -- se pivot a L setto 'w' per mantenere il backset su wideside sKeepMode = 'w' end EgtSetInfo( nPkToJoin3, 'KeepBackSet', sKeepMode) -- se mantiene backset su face e mortise elseif kbs and kbs > 0 then local sKeepMode = 'c' -- setto di default per mantenere il centro spessore if ptype ~= 3 then -- se pivot a L setto 'w' per mantenere il backset su wideside sKeepMode = 'w' end if nPkToJoin3 then EgtSetInfo( nPkToJoin3, 'KeepBackSet', sKeepMode) end if nPkToJoin4 then EgtSetInfo( nPkToJoin4, 'KeepBackSet', sKeepMode) end end if pbs and pbs > 0 and nPkToJoin3 and DGC.Pms and DGC.Pms > 2 then EgtSetInfo( nPkToJoin3, 'ProbeSide', '1') elseif pbs and pbs > 0 and DGC.Pms and DGC.Pms > 2 then if nPkToJoin3 then EgtSetInfo( nPkToJoin3, 'ProbeSide', '1') end if nPkToJoin4 then EgtSetInfo( nPkToJoin4, 'ProbeSide', '1') end end end if EC == 0 and ( nPkToJoin2b or nPkToJoin4b) then -- se mantiene backset anche su face if kbs and kbs > 0 then local sKeepMode = 'c' -- setto di default per mantenere il centro spessore if ptype ~= 3 then -- se pivot a L setto 'w' per mantenere il backset su wideside sKeepMode = 'w' end if nPkToJoin2b then EgtSetInfo( nPkToJoin2b, 'KeepBackSet', sKeepMode) end if nPkToJoin4b then EgtSetInfo( nPkToJoin4b, 'KeepBackSet', sKeepMode) end EgtSetInfo( nGeom2b, 'KeepBackSet', sKeepMode) end if pbs and pbs > 0 and DGC.Pms and DGC.Pms > 2 then if nPkToJoin2b then EgtSetInfo( nPkToJoin2b, 'ProbeSide', '1') end if nPkToJoin4b then EgtSetInfo( nPkToJoin4b, 'ProbeSide', '1') end EgtSetInfo( nGeom2b, 'ProbeSide', '1') end end -- se ci sono i percorsi antischegia geometria body if EC == 0 and ( nAS1b or nAS2b or nAS3b or nAS4b) then -- se mantiene backset anche su face if kbs and kbs > 0 then local sKeepMode = 'c' -- setto di default per mantenere il centro spessore if ptype ~= 3 then -- se pivot a L setto 'w' per mantenere il backset su wideside sKeepMode = 'w' end if nAS1b then EgtSetInfo( nAS1b, 'KeepBackSet', sKeepMode) end if nAS2b then EgtSetInfo( nAS2b, 'KeepBackSet', sKeepMode) end if nAS3b then EgtSetInfo( nAS3b, 'KeepBackSet', sKeepMode) end if nAS4b then EgtSetInfo( nAS4b, 'KeepBackSet', sKeepMode) end end if pbs and pbs > 0 and DGC.Pms and DGC.Pms > 2 then if nAS1b then EgtSetInfo( nAS1b, 'ProbeSide', '1') end if nAS2b then EgtSetInfo( nAS2b, 'ProbeSide', '1') end if nAS3b then EgtSetInfo( nAS3b, 'ProbeSide', '1') end if nAS4b then EgtSetInfo( nAS4b, 'ProbeSide', '1') end end end -- aggiungo fori extra if EC == 0 and nDrawMach >= 0 and subtype == 1 then -- fori ( viti o passaggio filo elettrico) for k = 1, 4 do local D10 local IY10 local T10 local I10 local PX10 local PY10 local RP10 local EB10 local EBH10 local HB10 local AR10 local RCI10 if k == 1 then D10 = tExtraBore[k][1] T10 = tExtraBore[k][2] I10 = tExtraBore[k][3] PX10 = tExtraBore[k][4] PY10 = tExtraBore[k][5] EB10 = tExtraBore[k][6] HB10 = tExtraBore[k][7] else D10 = tExtraBore[k][1] IY10 = tExtraBore[k][2] T10 = tExtraBore[k][3] I10 = tExtraBore[k][4] PX10 = tExtraBore[k][5] PY10 = tExtraBore[k][6] RP10 = tExtraBore[k][7] EB10 = tExtraBore[k][8] EBH10 = tExtraBore[k][9] HB10 = tExtraBore[k][10] AR10 = tExtraBore[k][11] RCI10 = tExtraBore[k][12] end if dws and T10 and abs(T10) > ttp then T10 = ttp end if D10 and T10 and ( EB10 or EBH10) then if D10 > 0 and T10 ~= 0 and ( EB10 ~= '' or EBH10 ~= '') then if not IY10 then IY10 = 0 end if not I10 then I10 = 0 end if not PX10 then PX10 = 0 end if not PY10 then PY10 = 0 end if not AR10 then AR10 = 0 end local dInt10 = (I10/2) local dPosX10 if ptype ~= 3 then if L3 and L3 > 0 then dPosX10 = -((L-L3)/2) + D_SK - PX10 else dPosX10 = -PX10 end else dPosX10 = -PX10 end if abs(AR10) >= 360 then while abs(AR10) >= 360 do AR10 = AR10 + EgtIf( AR10 > 0, -360, 360) end end -- creo foro o asola con eventuale svuotatura a rampa MakeBoreOrButtoHole( Lg, bPreview, Dm, nDrawMach, IY10, EBH10, EB10, dPosX10, dInt10, D10, 0, -PY10, T10, RP10, AR10, RCI10, kbs, HB10, ptype, dws, pbs) -- se l'interasse è valido if abs(I10) > GEO.EPS_SMALL then -- creo foro o asola con eventuale svuotatura a rampa MakeBoreOrButtoHole( Lg, bPreview, Dm, nDrawMach, IY10, EBH10, EB10, dPosX10, -dInt10, D10, 0, -PY10, T10, RP10, AR10, RCI10, kbs, HB10, ptype, dws, pbs) end end end end end -- aggiungo foro probe if EC == 0 and nDrawMach > 0 and posh then local dPosProbe = ((L3-L)/2)+D_SK if L3 == 0 then dPosProbe = 0 end if ptype == 2 and subtype == 3 then -- se tipo intermediate e sottotipo 3 dPosProbe = 0 end local sPositiveSuffixProbe = '' local sNegativeSuffixProbe = '' local dHalfLen = 0 if posp and posp > 0 then if ptype == 2 and subtype == 3 then -- se tipo intermediate e sottotipo 3 dHalfLen = (L3/2) else dHalfLen = (L/2) end dPosProbe = dPosProbe + dHalfLen + posp sPositiveSuffixProbe = '_POS' sNegativeSuffixProbe = '_NEG' end -- foro positivo local pCentr = Point3d( dPosProbe,posh,0) local hintPr -- verifico se devo forzare direzione orizzontale o seguire il profilo local sSideDoorInfo if DGC.Fpd then sSideDoorInfo = 'LockLH' else sSideDoorInfo = EgtIf( dl, 'LockLH', 'SideLH') end if not B_SK then -- se knuckle non è opposto if rp == 'c' then dHalfLen = 0 elseif rp == 'f' then dHalfLen = (L3/2)+D_SK else -- se tipo 's' dHalfLen = (L3/2) end if (posiz - (dPosProbe-dHalfLen+1)) > 0 then -- se il foro ci sta hintPr = EgtArc( Lg, pCentr, 1, 0, -360, 0, GDB_RT.LOC) else -- se non sta lo metto assieme al negativo if ptype == 2 and subtype == 3 then -- se tipo intermediate e sottotipo 3 pCentr = Point3d( -dPosProbe,posh,0) else pCentr = Point3d( ((L3/2)+D_SK-L-( posp or 0)),posh,0) end hintPr = EgtArc( Lg, pCentr, 1, 0, -360, 0, GDB_RT.LOC) end else -- altrimenti è opposto e posso metterlo hintPr = EgtArc( Lg, pCentr, 1, 0, -360, 0, GDB_RT.LOC) end if hintPr then EgtModifyCurveThickness( hintPr, -10) EgtSetName( hintPr, LH..sPositiveSuffixProbe) EgtSetInfo( hintPr, 'SideDoor', sSideDoorInfo) end -- foro negativo local dCompare = ((L3-L)/2)+D_SK if L3 == 0 then dCompare = 0 end dHalfLen = 0 if ptype == 2 and subtype == 3 then -- se tipo intermediate e sottotipo 3 dCompare = 0 -- D_SK end if dPosProbe ~= dCompare then if ptype == 2 and subtype == 3 then -- se tipo intermediate e sottotipo 3 dHalfLen = (L3/2) else dHalfLen = (L/2) end pCentr = Point3d((dCompare-dHalfLen-( posp or 0)) ,posh,0) if B_SK then -- se knuckle è opposto if rp == 's' then dHalfLen = 0 end if ( posiz - (dCompare-dHalfLen-( posp or 0)-1)) < dhei then -- se il foro ci sta hintPr = EgtArc( Lg, pCentr, 1, 0, -360, 0, GDB_RT.LOC) else -- altrimenti non ci sta e lo metto assieme al positivo pCentr = Point3d(((L3/2)+( posp or 0)) ,posh,0) hintPr = EgtArc( Lg, pCentr, 1, 0, -360, 0, GDB_RT.LOC) end else if rp == 'f' then dHalfLen = dHalfLen + L3/2 + D_SK elseif rp == 's' then dHalfLen = dHalfLen + L3/2 end if ptype == 2 and subtype == 1 then if ( posiz - (dCompare-dHalfLen-( posp or 0)-1)) < dhei then -- se il foro ci sta hintPr = EgtArc( Lg, pCentr, 1, 0, -360, 0, GDB_RT.LOC) else -- altrimenti non ci sta e lo metto assieme al positivo pCentr = Point3d(((L3/2)+D_SK+( posp or 0)),posh,0) hintPr = EgtArc( Lg, pCentr, 1, 0, -360, 0, GDB_RT.LOC) end else hintPr = EgtArc( Lg, pCentr, 1, 0, -360, 0, GDB_RT.LOC) end end if hintPr then EgtModifyCurveThickness( hintPr, -10) EgtSetName( hintPr, LH..sNegativeSuffixProbe) EgtSetInfo( hintPr, 'SideDoor', sSideDoorInfo) end end end if EC == 0 and nDrawMach > 0 and subtype == 1 then -- se abilitata geometria lavorazione if not dws then -- se viene disposto sul lato narrow o è sulla porta(disposto sul lato stretto) -- se la sezione strike supera 1/6 dello spessore porta (se è un frame drf vale 0.1 e crea sempre regione) -- disegno sezione ribasso su faccia superiore/inferiore porta if fhb > drf then -- 1: offset type, 2: intermediate type, 3: center hung if ptype ~= 2 then -- setto griglia dietro per l'ingombro sicuramente esistente EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.BACK)) local nIdSideBoxUp if L3 > 0 then nIdSideBoxUp = EgtRectangle2P( Lg, Point3d( (L3/2),0,H3-(H/2)), Point3d(-(L3/2),-fhb,H3-(H/2)), GDB_RT.GRID) end if nIdSideBoxUp then EgtModifyCurveThickness(nIdSideBoxUp, -H3) EgtSetName( nIdSideBoxUp, 'upper') EgtSetInfo( nIdSideBoxUp, 'SideDoor', 'upper') end EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.TOP)) else -- setto griglia dietro per l'ingombro sicuramente esistente EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.BACK)) local nIdSideBoxUp if L3 > 0 then nIdSideBoxUp = EgtRectangle2P( Lg, Point3d(-(L3/2)+(H/2),0,0), Point3d((L3/2)+(H/2),fhb,0), GDB_RT.LOC) end if nIdSideBoxUp then EgtModifyCurveThickness(nIdSideBoxUp, -H3) EgtSetName( nIdSideBoxUp, 'upper') EgtSetInfo( nIdSideBoxUp, 'SideDoor', 'upper') end EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.TOP)) end end else -- altrimenti viene lavorato disposto sul lato wide local nIdSideBoxUp if nGeom1 then nIdSideBoxUp = EgtCopyGlob( nGeom1, Lg) EgtSetName( nIdSideBoxUp, 'upper') EgtSetInfo( nIdSideBoxUp, 'SideDoor', 'upper') end if nGeom2 then nIdSideBoxUp = EgtCopyGlob( nGeom2, Lg) EgtSetName( nIdSideBoxUp, 'upper') EgtSetInfo( nIdSideBoxUp, 'SideDoor', 'upper') end end end if EC == 0 and D_XT and D_XT ~= 0 then EgtMove( Lg, Point3d(D_XT,0,0) - ORIG()) end if EC == 0 and D_XE and D_XE ~= 0 then EgtMove( Lg, Point3d(D_XE,0,0) - ORIG()) end -- 27/12/2017 New MDC request if EC == 0 and ptype ~= 3 then -- se tipo a L sposto in Y per avere il backset corretto local dHeighVal = 0 local dLongVal = 0 if bShiftBackSetPos then if ptype == 1 then -- se tipo offset if subtype == 1 then -- se sottotipo 1 if bMakeBody then if abs(oribackset) <= 0.001 and H then dHeighVal = H/2 elseif H then dHeighVal = (H - DGC.Ew)/2 end end elseif subtype > 1 and subtype < 4 then -- se sottotipi 2 e 3 dHeighVal = (DGD.dT/2) - backset else -- se quarto tipo if bMakeKnuckle then if H then dHeighVal = (H/2) end else dHeighVal = (DGD.dT/2) - backset end dLongVal = posiz end EgtMove( Lg, Point3d(dLongVal,-dHeighVal,0) - ORIG()) else -- se tipo offset intermediate if subtype == 1 or subtype == 4 then -- se sottotipo 1 o 4 if abs(oribackset) <= 0.001 and H then dHeighVal = H/2 elseif H then dHeighVal = (H - DGC.Ew)/2 end else -- sottotipo 3 dHeighVal = (DGD.dT/2) - backset end EgtMove( Lg, Point3d(0,-dHeighVal,0) - ORIG()) end else -- se backset applicato in centro a body if ptype == 1 then -- se tipo offset if subtype > 1 and subtype < 4 then -- se sottotipi 2 e 3 dHeighVal = (DGD.dT/2) - backset elseif subtype == 4 then -- se sottotipo 4 if bMakeKnuckle then dHeighVal = 0 else dHeighVal = (DGD.dT/2) - backset end dLongVal = posiz end EgtMove( Lg, Point3d(dLongVal,-dHeighVal,0) - ORIG()) else -- se tipo offset intermediate if subtype == 3 then -- se sottotipo 3 dHeighVal = (DGD.dT/2) - backset end EgtMove( Lg, Point3d(dLongVal,-dHeighVal,0) - ORIG()) end end end -- Se non Preview if not bPreview and EC == 0 then if bRunByCompo then -- scrivo i parametri nelle info del pezzo WriteCompoDataToPart(Pz,sCompoName,nCompoNpar) end -- scrivo note nel layer della cerniera EgtSetInfo(Lg,'Type' ,'Pivot') EgtSetInfo(Lg,'L' ,L) EgtSetInfo(Lg,'H' ,H) EgtSetInfo(Lg,'T' ,T) EgtSetInfo(Lg,'L3' ,L3) EgtSetInfo(Lg,'H3' ,H3) EgtSetInfo(Lg,'T3' ,T3) EgtSetInfo(Lg,'radius' ,radius) EgtSetInfo(Lg,'R1' ,R1) EgtSetInfo(Lg,'D_SK' ,D_SK) EgtSetInfo(Lg,'D_SK2' ,D_SK2) EgtSetInfo(Lg,'d' ,d) EgtSetInfo(Lg,'p' ,p) EgtSetInfo(Lg,'sf' ,sf) EgtSetInfo(Lg,'sf3' ,sf3) EgtSetInfo(Lg,'cl' ,cl) EgtSetInfo(Lg,'rf' ,rf) EgtSetInfo(Lg,'clc' ,clc) EgtSetInfo(Lg,'ccr' ,ccr) EgtSetInfo(Lg,'d2' ,d2) EgtSetInfo(Lg,'mh' ,mh) EgtSetInfo(Lg,'HB' ,HB) EgtSetInfo(Lg,'mkrev' ,mkrev) EgtSetInfo(Lg,'stn' ,stn) EgtSetInfo(Lg,'stnb' ,stnb) EgtSetInfo(Lg,'tb' ,tb) EgtSetInfo(Lg,'L2' ,L2) EgtSetInfo(Lg,'H2' ,H2) EgtSetInfo(Lg,'T2' ,T2) EgtSetInfo(Lg,'d3' ,d3) EgtSetInfo(Lg,'p3' ,p3) EgtSetInfo(Lg,'s' ,s) EgtSetInfo(Lg,'invG' ,invG) EgtSetInfo(Lg,'ech' ,ech) EgtSetInfo(Lg,'est' ,est) EgtSetInfo(Lg,'kbs' ,kbs) EgtSetInfo(Lg,'pbs' ,pbs) EgtSetInfo(Lg,'ptype' ,ptype) EgtSetInfo(Lg,'subtype' ,subtype) EgtSetInfo(Lg,'B_SK' ,B_SK) EgtSetInfo(Lg,'posh' ,posh) EgtSetInfo(Lg,'posp' ,posp) EgtSetInfo(Lg,'rp' ,rp) EgtSetInfo(Lg,'drf' ,drf) EgtSetInfo(Lg,'dws' ,dws) EgtSetInfo(Lg,'dthd' ,dthd) EgtSetInfo(Lg,'ttp' ,ttp) EgtSetInfo(Lg,'D_XE' ,D_XE) EgtSetInfo(Lg,'LG' ,LG) EgtSetInfo(Lg,'LG3' ,LG3) EgtSetInfo(Lg,'LM' ,LM) EgtSetInfo(Lg,'LM3' ,LM3) EgtSetInfo(Lg,'LA' ,LA) EgtSetInfo(Lg,'LA3' ,LA3) EgtSetInfo(Lg,'CLC' ,CLC) EgtSetInfo(Lg,'CLH' ,CLH) EgtSetInfo(Lg,'LGM' ,LGM) EgtSetInfo(Lg,'LMM' ,LMM) EgtSetInfo(Lg,'LGH' ,LGH) EgtSetInfo(Lg,'LH' ,LH) EgtSetInfo(Lg,'CH' ,CH) EgtSetInfo(Lg,'backset' ,backset) EgtSetInfo(Lg,'oribackset' ,oribackset) EgtSetInfo(Lg,'Path' ,sCompoPath) if ptype ~= 3 then -- se pivot a L local dValueDelta = 0 if rp == 'f' then -- se riferito a face side if L3 == 0 and L then dValueDelta = (L/2) elseif L3 then dValueDelta = (L3/2)+D_SK end elseif rp == 'c' then -- se riferito a center knuckle dValueDelta = 0 else -- se riferito a knuckle top side if B_SK then if L3 == 0 and L then dValueDelta = -(L/2) elseif L3 then dValueDelta = -(L3/2) end else if L3 == 0 and L then dValueDelta = (L/2) elseif L3 then dValueDelta = (L3/2) end end end EgtSetInfo( Lg, 'DeltaPos' , dValueDelta) EgtSetInfo( Lg, 'AppPoint', 'Wide') -- setto una nota per indicare da quale lato far partire il punto di riferimento EgtSetInfo( Lg, 'InserPoint', 'Edge') -- setto una nota per indicare quale punto di riferimento prendere else EgtSetInfo( Lg, 'AppPoint', 'Wide') -- setto una nota per indicare da quale lato far partire il punto di riferimento EgtSetInfo( Lg, 'InserPoint', 'Center') -- setto una nota per indicare quale punto di riferimento prendere end -- cancello le parti ausiliarie se disegnate if Dm then EgtErase( Dm) end elseif not bPreview then -- cancello le parti ausiliarie se disegnate if Dm then EgtErase( Dm) end end if EC == 0 and nCodAdj and nCodAdj < 0 then EC = nCodAdj EM = sCodAdj end return EC, EM, Lg end return Pivot