-- -- 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 -- -- MachiningBase.lua by EgalWare s.r.l. 2016.07.10 -- Machining Base library -- 2017.06.30 V1.013 FM Add function for optimization paths with same machining -- 2017.11.17 V1.014 FM Add manage parameter dExtraThruDepth from CurrCamInfo into functions AdjustThrouIsle and AdjustVertHole -- 2018.08.22 V1.015 FM Add parameter dBevelOffs on MakeRoughPaths function -- 2018.08.22 V1.016 FM add parameter nForceUseShuttle on AdjustHead function to set only the forced shuttle -- 2019.01.11 V1.017 FM Manage note Mach2nd into function FindEntitiesCompMach -- 2019.01.14 V1.018 FM Manage note Mach2nd into functions AdjustThrouIsle and AdjustVertHole -- 2019.01.21 V1.019 FM Add output of variable nTypeGeom on function AdjustVertHole -- 2019.01.24 V1.01a FM Fix error into FindEntitiesCompMach on compare with sKeepProbe -- 2019.01.24 V1.01b FM Extend cases on AdjustHeadChisel function -- 2019.04.08 V1.01c FM Add common functions ModifyLiLo (used into AddAndDelMachining) and AdjustBladeVertCurve -- to manage blade lead-in and lead-out -- 2019.04.30 V1.01d FM Add functions AdjustASplintWithBlade to manage anti-splint paths when groove by blade -- 2019.04.08 V1.01d FM Add functions AdjustHeadOnASplint to manage anti-splint path on hinge side when groove by blade -- 2019.04.08 V1.01d FM Add common functions DefineASplint (used into AdjustHeadOnASplint and AdjustASplintWithBlade) -- 2019.07.17 V1.01e FM Manage better the delta angle when probemode is active on function AdjustHorizDrillX and AdjustHorizDrillY -- 2019.08.27 V1.01f FM Release Notes info on exit of AddAndDelMachining function -- 2019.08.27 V1.01f FM Add FindGeomWithNote function -- 2019.10.01 V1.020 FM Delete function FindProperties (already present into EgtDoorBase as FindProperty) -- 2019.10.01 V1.021 FM Add AdjPrfThrouCurveNew function -- 2019.10.17 V1.023 FM Manage note for blade into AdjustThrouIsle -- 2019.10.18 V2.000 FM Manage use Materials -- 2019.10.21 V2.001 FM Add function ModifyLiLoToExt to modify lead-in and lead-out for strike steel machining -- 2019.11.11 V2.002 FM Into function MakeRoughPaths manage also Top chamfer shape -- 2019.12.02 V2.003 FM Modify function ModifyLiLoToExt to disable also oscillation parameters -- 2020.12.22 V2.004 FM Manage Open Paths into TestThrouIsle and AdjustThrouIsle functions -- 2021.04.02 V2.005 FM Manage Closed paths with no area into TestThrouIsle and AdjustThrouIsle functions -- 2021.05.25 V2.006 FM Manage Closed paths with no area into TestVertHole and AdjustVertHole functions -- 2021.11.24 V2.007 FM Add functions AdjustProbeMill to manage probe paths -- 2022.02.21 V2.008 FM Manage machining note CUT_LENGTH=xxx to machine only distance defined by value (in mm) -- 2023.05.24 V2.009 FM Add function AdjustVertAsOnHeads to modify anti split paths (of door heads) to be vertical on bevelled sides -- 2023.07.26 V2.00a FM Fix error on calculate area on closed curved into AdjustThrouIsle function -- 2023.09.16 V2.00b FM Manage to invert path also with Zpositive direction path into AdjustThrouCurve function -- 2023.10.25 V2.00c FM Manage add extra leadout length into AddAndDelMachining -- 2023.10.25 V2.00d FM Manage new input interface parameter nModeOrder into OrderEnt function -- to have head machining ordered from X pos to X neg -- 2023.10.25 V2.00d FM Manage new input interface parameter bNoModifyPath into AdjustBevel function -- to manage 5 axis head and 3 axis head ( that machine bevel profile) on same machine -- 2023.11.13 V2.00e FM into AddAndDelMachining function let to Outpuut the machining note also when 'not generation machining' flag is enable -- 2024.01.19 V2.010 FM Fix error into InsZedByTool when use max function with a paarameter at nil value -- 2024.05.31 V2.011 FM Add to function interface (and manage) the bNarrowDoor parameter into AddAndDelMachining function let to manage narrow doors -- Add to function interface (and manage) the bSkipOnSecCol parameter into AdjustBevel function -- Add to function interface (and manage) the bSkipOnSecCol parameter into AdjustThrouCurve function -- 2024.06.21 V2.012 FM Manage to set clockwise direction on closed path into Adjusthead (by new parameter: bCheckDirection) -- 2024.10.30 V2.013 FM into GetToolDataFromAttrib function, if force read thicknnes is enabled get the mill max thickness as blade thickness -- in case mill is used instead blade -- 2024.11.14 V2.014 FM Manage the flipping geometry into AdjustConeCleanPaths from solid layer than geometry -- 2025.01.13 V2.015 FM Initialize DGD.GHT to be compatible with old Machining_xxx -- 2025.01.17 V2.016 FM Set infos (Parent and LinkCode) to ghost paths (into MakeGhostCopy function) -- and disable the machining that has info LinkCode with negative value ( into AddAndDelMachining function) -- 2025.01.20 V2.017 FM Manage new info type 'InvDir' from groove compo into funtion ModifyLiLo require( 'EgtBase') require( 'EgtConst') local EgtDoorsMsg = require( 'EgtDoorsMsg') -- Tavola per definizione modulo local MachiningBase = {} print( 'MachiningBase started') DoorOutLog( ' MachiningBase started', 1) -- set the DGD with old value to be compatible with old Machining_x files if not DGD.GHT then DGD.GHT = '_HIDE' end ----------------------------------------------------------------- -- *** Disposition Functions *** ----------------------------------------------------------------- -------------------------------------------------------------------------------- function MachiningBase.AdjustXFixture( dX) -- per non trovarsi tra i due tavoli if dX > 2360 and dX < 2570 then dX = 2570 end return dX end -------------------------------------------------------------------------------- function MachiningBase.AdjustXReference( dX, HintList) local DX_ENG = 200 dX = MachiningBase.AdjustXFixture( dX) --for i = 1, #HintList, 2 do -- if dX > HintList[i] - DX_ENG and dX < HintList[i+1] + DX_ENG then -- dX = HintList[i] - DX_ENG -- end --end return dX end ----------------------------------------------------------------- -- *** Make Ghost copy of entity *** ----------------------------------------------------------------- function MachiningBase.MakeGhostCopy( EntId, bCheckDirection) local sParnt = EgtGetParent( EntId) local EntName = EgtGetName( EntId) local nNewEntId = EgtCopyGlob( EntId, sParnt) EgtSetName( nNewEntId, EntName..DGD.GHT) EgtSetStatus( nNewEntId, GDB_ST.OFF) -- Se ottimizzazione lavorazioni macchine in linea if DGD.OML then EgtSetInfo( nNewEntId, 'Parent', EntId) end -- assegno nota con valore il campo Link della Mtable if DGD.LVL and abs(DGD.LVL) > 0 then EgtSetInfo( nNewEntId, 'LinkCode', DGD.LVL) end -- se check per verifica direzione percorso if bCheckDirection then -- verifico se ho la nota per non fare il controllo di direzione percorso ( per esempio le svuotature in centro utensile) local nNotCheck = EgtGetInfo( nNewEntId, 'NotCheckDir', 'i') or 0 -- se la nota vale 0 o non ho la nota faccio la verifica if nNotCheck == 0 then -- recupero versore estrusione local vtExtr = EgtCurveExtrusion( nNewEntId, GDB_ID.ROOT) local vtMPlane, dDist, dArea -- verifico se il percorso è chiuso if EgtCurveIsClosed( nNewEntId) then -- impongo senso di rotazione orario visto da sopra vtMPlane, dDist, dArea = EgtCurveArea( nNewEntId) if abs( dArea) < 1 then -- Rimando il valore originario in caso avessi skippato la lavorazione return nNewEntId end -- altrimenti non è chiuso else -- faccio una copia del percorso local nNewEntId2 = EgtCopyGlob( nNewEntId, sParnt) -- chiudo il percorso if EgtCloseCurveCompo( nNewEntId2) then -- impongo senso di rotazione orario visto da sopra vtMPlane, dDist, dArea = EgtCurveArea( nNewEntId2) EgtErase(nNewEntId2) if dArea and abs( dArea) < 1 then -- Rimando il valore originario in caso avessi skippato la lavorazione return nNewEntId end else EgtErase(nNewEntId2) -- impongo senso di rotazione orario visto da sopra vtMPlane, dDist, dArea = EgtCurveArea( nNewEntId) if not dArea or abs( dArea) < 1 then -- Rimando il valore originario in caso avessi skippato la lavorazione return nNewEntId end end end local frEnt = EgtGetGlobFrame( nNewEntId) if vtMPlane then vtMPlane:toGlob(frEnt) if dArea and dArea * ( vtMPlane * vtExtr) > 0 then EgtInvertCurve( nNewEntId) end end end end return nNewEntId end ----------------------------------------------------------------- -- *** Seeking Functions *** ----------------------------------------------------------------- -------------------------------------------------------------------------------- function MachiningBase.FindEntitiesCompMach( nEntId, tEntList, sMachining, nJoinGeomInMach, nMaxDist, bSameLayer, bSameSecMach) local List = {} -- inserisco per prima l'entità passata table.insert( List, nEntId) -- acquisisco il padre dell'entità passata local nParendId = EgtGetParent(nEntId) -- punto iniziale entità passata local pIni1 = EgtSP( nEntId, GDB_ID.ROOT) -- nota correzione in Z per probe local sKeepProbe = EgtGetInfo( nEntId, 'KeepBackSet') or '0' local sNoteProbes = EgtGetInfo( nEntId, 'ProbeSide') or '0' -- se direzione fresa da sotto esco subito local vtExtr = EgtCurveExtrusion( nEntId, GDB_ID.ROOT) -- recupero versore estrusione -- parametro link local nCheckLink = EgtGetInfo( nEntId, 'LinkCode', 'i') or 0 local bEnablekinkCheck = DGD.OML -- -------------------------------------------------------------------------------------- -- provvisoriamente lascio attiva la gestione del Join anche se ho il parametro LinkCode -- nel caso si voglia disabilitare il join commentare la linea bEnablekinkCheck = false -- -------------------------------------------------------------------------------------- bEnablekinkCheck = false -- se non ha codice link, non abilitato, con distanza valida e non diretto verso il basso if ( nCheckLink == 0 or not bEnablekinkCheck) and nJoinGeomInMach and nJoinGeomInMach > 0 and nMaxDist and nMaxDist > 0 and vtExtr:getZ() > - 0.1 then for i = 1, #tEntList do if tEntList[i] and tEntList[i] ~= nEntId then -- se sono nello stesso layer if not bSameLayer or EgtGetParent( tEntList[i]) == nParendId then -- se non ha parametro link nCheckLink = EgtGetInfo( tEntList[i], 'LinkCode', 'i') or 0 if ( nCheckLink == 0 or not bEnablekinkCheck) then local sMachNote = EgtGetInfo( tEntList[i], 'Machining') -- se hanno la stessa lavorazione if sMachNote and sMachNote == sMachining then -- se non è già stata lavorata local nSecMach = EgtGetInfo( tEntList[i], 'Mach2nd', 'i') or 0 if bSameSecMach or nSecMach == 0 then local vtExtr1 = EgtCurveExtrusion( tEntList[i], GDB_ID.ROOT) -- recupero versore estrusione if AreSameVectorApprox( vtExtr1, vtExtr) then -- se direzioni uguali local pIni2 = EgtSP( tEntList[i], GDB_ID.ROOT) local sKeepProbe2 = EgtGetInfo( tEntList[i], 'KeepBackSet') or '0' local sNoteProbes2 = EgtGetInfo( tEntList[i], 'ProbeSide') or '0' -- se la distanza tra loro è inferiore della massima if dist( pIni1, pIni2) <= nMaxDist then -- se hanno note uguali if sKeepProbe == sKeepProbe2 or sNoteProbes == sNoteProbes2 then table.insert( List, tEntList[i]) -- pIni1 = pIni2 -- diventa il nuovo punto end end end end end end end end end end return List end -------------------------------------------------------------------------------- function MachiningBase.FindEntitiesWithNameFromTab( ListPrev, sName) local List = {} if ListPrev then for i = 1, #ListPrev do local sEntName = EgtGetName( ListPrev[i]) if sEntName and sEntName == sName then table.insert( List, ListPrev[i]) end end end return List end -------------------------------------------------------------------------------- function MachiningBase.FindEntitiesWithName( Pz, sName, ListPrev) local List = {} local PzIsTab = type(Pz) == 'table' if ListPrev then for i = 1, #ListPrev do table.insert( List, ListPrev[i]) end end local nMaxPz = 1 if PzIsTab then nMaxPz = #Pz end for i = 1, nMaxPz do local nIdPz if PzIsTab then nIdPz = Pz[i] else nIdPz = Pz end local Ly = EgtGetFirstGroupInGroup( nIdPz) while Ly do local Ent = EgtGetFirstNameInGroup( Ly, sName) while Ent do table.insert( List, Ent) Ent = EgtGetNextName( Ent, sName) end Ly = EgtGetNextGroup( Ly) end end return List end -------------------------------------------------------------------------------- function MachiningBase.FindGroupWithPartName( Pz, sNameFind, ListPrev) local List = {} local PzIsTab = type(Pz) == 'table' if ListPrev then for i = 1, #ListPrev do table.insert( List, ListPrev[i]) end end local nMaxPz = 1 if PzIsTab then nMaxPz = #Pz end for i = 1, nMaxPz do local nIdPz if PzIsTab then nIdPz = Pz[i] else nIdPz = Pz end local Ent = EgtGetFirstInGroup( nIdPz) while Ent do local sNameEnt = EgtGetName(Ent) if sNameEnt and string.find( sNameEnt, sNameFind) then table.insert( List, Ent) end Ent = EgtGetNext( Ent) end end return List end -------------------------------------------------------------------------------- function MachiningBase.FindEntitiesWithPartName( Pz, sNameFind, ListPrev, sInfoName, nInfoValue) local List = {} local ListTwo = {} local PzIsTab = type(Pz) == 'table' if ListPrev then for i = 1, #ListPrev do table.insert( List, ListPrev[i]) end end local nMaxPz = 1 if PzIsTab then nMaxPz = #Pz end for i = 1, nMaxPz do local nIdPz if PzIsTab then nIdPz = Pz[i] else nIdPz = Pz end local Ly = EgtGetFirstGroupInGroup( nIdPz) while Ly do local Ent = EgtGetFirstInGroup( Ly) while Ent do local sNameEnt = EgtGetName(Ent) if sNameEnt and string.find( sNameEnt, sNameFind) then -- se note da ricercare if sInfoName and nInfoValue and #sInfoName > 0 and nInfoValue > 0 then -- se nota corrisponde if EgtGetInfo( Ent, sInfoName, 'i') == nInfoValue then table.insert( ListTwo, Ent) else table.insert( List, Ent) end else table.insert( List, Ent) end end Ent = EgtGetNext( Ent) end Ly = EgtGetNextGroup( Ly) end end return List, ListTwo end -------------------------------------------------------------------------------- function MachiningBase.FindEntities( Pz, bSingle) local List = {} local Ly = EgtGetFirstInGroup( Pz) while Ly do if bSingle then return Ly -- esco appena ha trovato il primo trovato else table.insert( List, Ly) -- inserisco a tabella end Ly = EgtGetNext( Ly) end if bSingle then return nil else return List end end -------------------------------------------------------------------------------- function MachiningBase.FindGeomWithName( Pz, sName, bSingle, ListPrev) local List = {} if ListPrev and not bSingle then for i = 1, #ListPrev do table.insert( List, ListPrev[i]) end end local Ly = EgtGetFirstInGroup( Pz) while Ly do local Ent = EgtGetName( Ly) if Ent == sName then if bSingle then return Ly -- esco appena ha trovato il primo elemento else table.insert( List, Ly) -- inserisco a tabella end end Ly = EgtGetNext( Ly) end if bSingle then return nil else return List end end -------------------------------------------------------------------------------- function MachiningBase.FindGeomWithNote( Pz, sNote, sTypeNote, NoteToFind, ListPrev) local List = {} if ListPrev then for i = 1, #ListPrev do table.insert( List, ListPrev[i]) end end local Ly = EgtGetFirstInGroup( Pz) -- ottengo il primo layer while Ly do -- ottengo la prima entità del layer local Lx = EgtGetFirstInGroup( Ly) while Lx do local Ent = EgtGetInfo( Lx, sNote, sTypeNote) if sTypeNote == 'b' then -- se nota booleana if Ent then -- se trovata nota boolena table.insert( List, Lx) -- inserisco a tabella end else if Ent == NoteToFind then table.insert( List, Lx) -- inserisco a tabella end end Lx = EgtGetNext( Lx) end Ly = EgtGetNext( Ly) end return List end -------------------------------------------------------------------------------- function MachiningBase.GetHingesBoxes( Pz, tabOriX) local List = {} local Ly = EgtGetFirstGroupInGroup( Pz) while Ly do local sName = EgtGetName( Ly) if sName and string.find( sName, 'Hinge', 1, true) then local b3Box = EgtGetBBoxGlob( Ly, GDB_BB.STANDARD) if b3Box then table.insert( List, b3Box:getMin():getX() - tabOriX) table.insert( List, b3Box:getMax():getX() - tabOriX) end end Ly = EgtGetNextGroup( Ly) end return List end -------------------------------------------------------------------------------- function MachiningBase.ReorderGroup( EntId, tOrderGrp, nDirToIns) local nParendId = EgtGetParent(EntId) local b3Grp = EgtGetBBoxGlob( nParendId, GDB_BB.STANDARD) local dRefGrp = EgtIf( nDirToIns > 0, b3Grp:getMin():getX(), b3Grp:getMax():getX()) -- controllo dalla nota se non è già stata lavorata prima local nSetSide = EgtGetInfo( EntId, 'Mach', 'i') or 0 -- se già lavorata annullo valore disabilitante if nSetSide >= 10 then EgtSetInfo( EntId, 'Mach', 0) end -- se trovato minimo lo assegno in testa if #tOrderGrp == 0 then table.insert( tOrderGrp, { nParendId, dRefGrp}) else local bInsert = false local bfoundGroup = false for i = 1, #tOrderGrp do -- se trovato minimo lo inserisco in tabella e ne riloco il gruppo nell'albero local nIdParTab = tOrderGrp[i] if nDirToIns > 0 then if dRefGrp < nIdParTab[2] then table.insert( tOrderGrp, i,{ nParendId, dRefGrp}) EgtRelocateGlob( nParendId, nIdParTab[1], GDB_IN.BEFORE) bInsert = true break elseif nParendId == nIdParTab[1] then -- se gruppo già presente esco bfoundGroup = true break end else if dRefGrp > nIdParTab[2] then table.insert( tOrderGrp, i,{ nParendId, dRefGrp}) EgtRelocateGlob( nParendId, nIdParTab[1], GDB_IN.BEFORE) bInsert = true break elseif nParendId == nIdParTab[1] then -- se gruppo già presente esco bfoundGroup = true break end end end -- se non inserito lo inserisco in coda senza rilocamento if not bInsert and not bfoundGroup then table.insert( tOrderGrp, { nParendId, dRefGrp}) end end end -------------------------------------------------------------------------------- function MachiningBase.GetGroup( tLocMachOrd, ind, nNumGroup, sProperty) local tSubGroup = {} local nIdt = ind if sProperty and #sProperty > 0 then -- acquisisco tutto il gruppo for j = ind, #tLocMachOrd do if tLocMachOrd[j].Group == nNumGroup then table.insert( tSubGroup, tLocMachOrd[j]) nIdt = j else -- se non è più lo stesso gruppo esco break end end else table.insert( tSubGroup, tLocMachOrd[nIdt]) -- restituisco solo una linea della tabella end return tSubGroup, nIdt end -------------------------------------------------------------------------------- function MachiningBase.LoadEntitiesFromGroup( tGroup, Pz, sSuffix) local EntList for j = 1, #tGroup do EntList = MachiningBase.FindEntitiesWithName( Pz, tGroup[j].Name..sSuffix, EntList) end return EntList end -------------------------------------------------------------------------------- function MachiningBase.InsZedByTool( TabZMach, tMachining, nInd) local bFind = false local nMaxVal = 0 for i = 1, nInd-1 do if tMachining[nInd][2] == tMachining[i][2] then -- se utensile uguale assegno identico valore table.insert( TabZMach, TabZMach[i]) -- inserisco lo stesso valore bFind = true break -- esco dal ciclo else nMaxVal = max( nMaxVal, (TabZMach[i] or 0)) end end if not bFind then -- se non ho trovato aggiungo nuovo valore alla Z utensile table.insert( TabZMach, ( nMaxVal+10000)) end end -------------------------------------------------------------------------------- function MachiningBase.OrderEnt( tListEntSameMach, EndLastMach, nModeOrder) -- Tavole per fresature da ordinare local TabMill = {} local TabMStEnP = {} local TabResult = {} local dStart = -2000 if nModeOrder and nModeOrder == 1 then dStart = 10000 end for m = 1, #tListEntSameMach do local ptStart = EgtSP( tListEntSameMach[m], GDB_ID.ROOT ) if ptStart then table.insert( TabMill, tListEntSameMach[m]) table.insert( TabMStEnP, ptStart) end end -- calcolo ordinamento EgtSpInit() for m = 1, #TabMill do EgtSpAddPoint( TabMStEnP[m]:getX(), TabMStEnP[m]:getY(), TabMStEnP[m]:getZ(), 0, 0, TabMStEnP[m]:getX(), TabMStEnP[m]:getY(), TabMStEnP[m]:getZ(), 0, 0) end if EndLastMach then EgtSpSetOpenBound(true,SHP_OB.NEAR_PNT,EndLastMach:getX(),EndLastMach:getY(),0,90,90) else EgtSpSetOpenBound(true,SHP_OB.NEAR_PNT,dStart,0,0,90,90) end local vMillOrd if not nModeOrder or nModeOrder == 0 then vMillOrd = EgtSpCalculate(SHP_TY.OPEN) elseif nModeOrder == 1 then vMillOrd = EgtSpCalculate(SHP_TY.ONEWAY_XP) else vMillOrd = EgtSpCalculate(SHP_TY.OPEN) end EgtSpTerminate() -- applico ordinamento calcolato if vMillOrd and #vMillOrd == #tListEntSameMach then for m = 1, #vMillOrd do table.insert( TabResult, TabMill[vMillOrd[m]]) end tListEntSameMach = TabResult end return tListEntSameMach end -------------------------------------------------------------------------------- function MachiningBase.DefineASplint( EntId, nDispType, bFlipDoor, nMaxNum) -- recupero note percorso local bCutByBlade = EgtGetInfo( EntId, 'UseBlade', 'b') local bCutByTwiceBlade = EgtGetInfo( EntId, 'UseTwiceBl', 'b') -- se utilizzata lama if bCutByBlade then -- se uso doppia lama assegno la seconda lavorazione if bCutByTwiceBlade then -- lavorazione 2nd EgtSetInfo( EntId, 'Mach', nMaxNum) return nMaxNum else -- altrimenti leggo altre note local sSideApp = EgtGetInfo( EntId, 'SideApp', 's') local nTypePath = EgtGetInfo( EntId, 'TypePath', 'i') if sSideApp and nTypePath then if sSideApp == 'hinge' or sSideApp == 'lock' then if bFlipDoor then -- se porta ribaltata if nTypePath == 1 then -- se percorso antisplint 1 EgtSetInfo( EntId, 'Mach', nMaxNum) -- eventualmente lo disabilito return nMaxNum else -- percorso antisplint 2 EgtRemoveInfo( EntId, 'Mach') return 0 end else -- non ribaltata if nTypePath == 1 then -- se percorso antisplint 1 EgtRemoveInfo( EntId, 'Mach') return 0 else -- percorso antisplint 2 EgtSetInfo( EntId, 'Mach', nMaxNum) -- eventualmente lo disabilito return nMaxNum end end else if ( sSideApp == 'top' and nDispType > 0) or ( sSideApp == 'bottom' and nDispType < 0 ) then if nTypePath == 1 then -- se percorso lato hinge EgtRemoveInfo( EntId, 'Mach') return 0 else -- se percorso lato lock EgtSetInfo( EntId, 'Mach', nMaxNum) -- eventualmente lo disabilito return nMaxNum end else if nTypePath == 1 then -- se percorso lato hinge EgtSetInfo( EntId, 'Mach', nMaxNum) -- eventualmente lo disabilito return nMaxNum else -- se percorso lato lock EgtRemoveInfo( EntId, 'Mach') return 0 end end end end end else -- lavorazione standard EgtRemoveInfo( EntId, 'Mach') end return 0 end ----------------------------------------------------------------- -- *** Machining Functions *** ----------------------------------------------------------------- ----------------------------------------------------------------- function MachiningBase.ModifyLiLoToExt() -- leggo il parametro di lunghezza perpendicolare di ingresso local dLenIniPerp = EgtGetMachiningParam( MCH_MP.LIPERP) local sTuuid = EgtGetMachiningParam( MCH_MP.TUUID) local sTool = EgtTdbGetToolFromUUID( sTuuid) EgtTdbSetCurrTool( sTool) local dDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) if dLenIniPerp then if dLenIniPerp > 0 then dLenIniPerp = -dLenIniPerp else -- altrimenti è a 0 dLenIniPerp = -(dDiam*0.55) end else -- altrimenti lo calcolo dall'utensile dLenIniPerp = -(dDiam*0.55) end -- cambio il lead-in a lineare EgtSetMachiningParam( MCH_MP.LEADINTYPE, MCH_MILL_LI.LINEAR) -- setto a 0 l'allungamento iniziale EgtSetMachiningParam( MCH_MP.STARTADDLEN, 0.762) -- setto a 0 la lunghezza tangente ingresso EgtSetMachiningParam( MCH_MP.LITANG, 0) -- setto il valore di distanza perpendicolare uscita come quella dell'ingresso EgtSetMachiningParam( MCH_MP.LIPERP, dLenIniPerp) -- setto a 0 l'elevazione iniziale EgtSetMachiningParam( MCH_MP.LIELEV, 0) -- setto a 0 l'inserimento correttore attacco EgtSetMachiningParam( MCH_MP.LICOMPLEN , 0) -- cambio il lead-out a lineare EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, MCH_MILL_LI.LINEAR) -- 2019/12/20 setto a -0.6 il valore di distanza perpendicolare -- 2020/05/18 setto a 0 il valore di distanza perpendicolare EgtSetMachiningParam( MCH_MP.ENDADDLEN, 0) -- setto a 0 l'allungamento finale -- EgtSetMachiningParam( MCH_MP.ENDADDLEN, 0) -- setto a 0 il valore tangente finale EgtSetMachiningParam( MCH_MP.LOTANG, 0) -- 2019/12/20 setto a 0 il valore di distanza perpendicolare EgtSetMachiningParam( MCH_MP.LOPERP, 0) -- setto il valore di distanza perpendicolare uscita come quella dell'ingresso -- EgtSetMachiningParam( MCH_MP.LOPERP, dLenIniPerp) -- setto a 0 l'elevazione EgtSetMachiningParam( MCH_MP.LOELEV, 0) -- setto a 0 l'inserimento correttore uscita EgtSetMachiningParam( MCH_MP.LOCOMPLEN , 0) -- disabilito eventuale oscillazione EgtSetMachiningParam( MCH_MP.OSCENABLE, false) -- setto a 0 la sovrapposizione 2019/12/20 EgtSetMachiningParam( MCH_MP.OVERL , 0) end ----------------------------------------------------------------- function MachiningBase.ModifyLiLo( sLeadCode, bRevCode, sPathType, sToolUse, dCalcLead, dPercFeedVal, sDirType) -- leggo il parametro di lunghezza perpendicolare di ingresso local dLenIniPerp = EgtGetMachiningParam( MCH_MP.LIPERP) -- leggo il parametro feed per moltiplicarlo con il fattore di riduzione per l'ingresso nel pieno local dFeedVal = EgtGetMachiningParam( MCH_MP.FEED) -- cambio il lead-in a lineare EgtSetMachiningParam( MCH_MP.LEADINTYPE, MCH_MILL_LI.LINEAR) if bRevCode and ( sLeadCode == '_NLI' or sLeadCode == '_NLO') then if sPathType and sPathType == 'NR' and sToolUse then -- setto a 0 l'allungamento iniziale EgtSetMachiningParam( MCH_MP.STARTADDLEN, 0) -- cambio la feed di ingresso con la Feed ricalcolata con il parametro EgtSetMachiningParam( MCH_MP.STARTFEED, (dFeedVal*dPercFeedVal)) else if sDirType == 'INV' then -- setto a 0 l'allungamento iniziale EgtSetMachiningParam( MCH_MP.STARTADDLEN, 0) -- cambio la feed di ingresso con la Feed ricalcolata con il parametro EgtSetMachiningParam( MCH_MP.STARTFEED, (dFeedVal*dPercFeedVal)) else -- setto al valore l'allungamento iniziale EgtSetMachiningParam( MCH_MP.STARTADDLEN, dCalcLead) end end elseif ( not bRevCode and sLeadCode == '_NLO') then if sPathType and sPathType == 'NR' and sToolUse then -- setto a 0 l'allungamento iniziale EgtSetMachiningParam( MCH_MP.STARTADDLEN, 0) -- cambio la feed di ingresso con la Feed ricalcolata con il parametro EgtSetMachiningParam( MCH_MP.STARTFEED, (dFeedVal*dPercFeedVal)) else -- setto al valore l'allungamento iniziale EgtSetMachiningParam( MCH_MP.STARTADDLEN, dCalcLead) end elseif ( not bRevCode and sLeadCode == '_NLI') then if sDirType == 'INV' then -- setto al valore l'allungamento iniziale EgtSetMachiningParam( MCH_MP.STARTADDLEN, dCalcLead) else -- setto a 0 l'allungamento iniziale EgtSetMachiningParam( MCH_MP.STARTADDLEN, 0) -- cambio la feed di ingresso con la Feed ricalcolata con il parametro EgtSetMachiningParam( MCH_MP.STARTFEED, (dFeedVal*dPercFeedVal)) end else -- setto a 0 l'allungamento iniziale EgtSetMachiningParam( MCH_MP.STARTADDLEN, 0) -- cambio la feed di ingresso con la Feed ricalcolata con il parametro EgtSetMachiningParam( MCH_MP.STARTFEED, (dFeedVal*dPercFeedVal)) end -- setto a 0 la lunghezza tangente ingresso EgtSetMachiningParam( MCH_MP.LITANG, 0) -- cambio il lead-out a lineare EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, MCH_MILL_LI.LINEAR) if ( bRevCode and sLeadCode == '_NLO') then -- Se percorso REV con niente uscita if sPathType and sPathType == 'NR' then -- se percorso di andata -- setto al valore l'allungamento finale EgtSetMachiningParam( MCH_MP.ENDADDLEN, dCalcLead) else -- setto a 0 l'allungamento finale EgtSetMachiningParam( MCH_MP.ENDADDLEN, 0) end elseif ( bRevCode and sLeadCode == '_NLI') then -- Se percorso REV con niente ingresso if sPathType and sPathType == 'NR' then -- se percorso di andata if sDirType == 'INV' then -- setto al valore l'allungamento finale EgtSetMachiningParam( MCH_MP.ENDADDLEN, dCalcLead) else -- setto a 0 l'allungamento finale EgtSetMachiningParam( MCH_MP.ENDADDLEN, 0) end else -- setto al valore l'allungamento finale EgtSetMachiningParam( MCH_MP.ENDADDLEN, dCalcLead) end elseif ( not bRevCode and sLeadCode == '_NLI') then if sPathType and sPathType == 'NR' and sToolUse then -- setto a 0 l'allungamento finale EgtSetMachiningParam( MCH_MP.ENDADDLEN, 0) else if sDirType == 'INV' then -- setto a 0 l'allungamento finale EgtSetMachiningParam( MCH_MP.ENDADDLEN, 0) else -- setto al valore l'allungamento finale EgtSetMachiningParam( MCH_MP.ENDADDLEN, dCalcLead) end end elseif ( not bRevCode and sLeadCode == '_NLO') then if sPathType and sPathType == 'NR' and sToolUse then -- setto al valore l'allungamento finale EgtSetMachiningParam( MCH_MP.ENDADDLEN, dCalcLead) else -- setto a 0 l'allungamento finale EgtSetMachiningParam( MCH_MP.ENDADDLEN, 0) end else -- setto a 0 l'allungamento finale EgtSetMachiningParam( MCH_MP.ENDADDLEN, 0) end -- setto a 0 il valore tangente finale EgtSetMachiningParam( MCH_MP.LOTANG, 0) -- setto il valore di distanza perpendicolare uscita come quella dell'ingresso EgtSetMachiningParam( MCH_MP.LOPERP, dLenIniPerp) end ----------------------------------------------------------------- function MachiningBase.AddAndDelMachining( sName, sMach, tEntId, dOverL, sOriName, bNotGenMachining, sCodeKeepBackSet, dBladePerpLeadIn, dPercRedFeed, sCodeProbeSide, sActiveStop, sSetMaxElev, dOverR, bSandFound, dAddLength, dAddSandLength, bNarrowDoor) local sEntId = '' local tParentId = {} local sNotesMach local nCheckLink for t = 1, #tEntId do if tEntId[t] then if not bNotGenMachining then -- load the Link value if exists if not nCheckLink or nCheckLink == 0 then nCheckLink = EgtGetInfo( tEntId[t], 'LinkCode', 'i') or 0 end -- acquisisco le note Parent delle entità table.insert( tParentId, EgtGetInfo( tEntId[t], 'Parent', 'i')) end sEntId = sEntId .. tEntId[t] .. ',' end end if not sMach or ( sMach and #sMach == 0) then DGD.ERM = DGD.ERM .. string.format( EgtDoorsMsg[483], sOriName, sEntId) return 0 -- nome lavorazione vuoto end local nMach = EgtAddMachining( sName, sMach) local sTool if not nMach then DGD.EMC = DGD.EMC .. '\n' .. string.format( EgtDoorsMsg[484], sMach, sOriName, sEntId) return -1 -- lavorazione mancante o errata end if dOverL then -- se c'è un valore, assegno sovramateriale in lunghezza EgtSetMachiningParam( MCH_MP.OFFSL, dOverL) end if dOverR and dOverR > 0 then -- se c'è un valore, assegno offset sul raggio EgtSetMachiningParam( MCH_MP.OFFSR, dOverR) end if sCodeKeepBackSet then -- se c'è un valore, assegno codice correzione in Z sNotesMach = EgtGetMachiningParam( MCH_MP.USERNOTES) if not sNotesMach or #sNotesMach == 0 then -- se la nota è vuota aggiungo il codice EgtSetMachiningParam( MCH_MP.USERNOTES, sCodeKeepBackSet..';') else -- altrimenti se non è vuota verifico se c'è o no -- verifico se c'é già parte iniziale del codice 'CORR_Z_PROBE' settato nel Machining_xvx nella funzione InsertMachiningByMachNum local sFirst = string.sub( sCodeKeepBackSet, 1, 12) local nPosFind, _ = sNotesMach:find( sFirst, 1, true) if nPosFind then -- se ho già la prima parte if not sNotesMach:find( sCodeKeepBackSet, 1, true) then -- se non ho la stessa nota la sostituisco sNotesMach = string.gsub( sNotesMach, string.sub( sNotesMach, nPosFind, 14), sCodeKeepBackSet) end else -- se non ho la prima parte la aggiungo sNotesMach = sNotesMach..sCodeKeepBackSet..';' EgtSetMachiningParam( MCH_MP.USERNOTES, sNotesMach) end end end if sCodeProbeSide then sNotesMach = EgtGetMachiningParam( MCH_MP.USERNOTES) if not sNotesMach or #sNotesMach == 0 then -- se la nota è vuota aggiungo il codice EgtSetMachiningParam( MCH_MP.USERNOTES, sCodeProbeSide..';') else -- altrimenti se non è vuota verifico se c'è o no -- verifico se c'é già parte iniziale del codice 'CPBP' settato nel Machining_xvx nella funzione InsertMachiningByMachNum local sFirst = string.sub( sCodeProbeSide, 1, 4) local nPosFind, _ = sNotesMach:find( sFirst, 1, true) if nPosFind then -- se ho già la prima parte if not sNotesMach:find( sCodeProbeSide, 1, true) then -- se non ho la stessa nota la sostituisco sNotesMach = string.gsub( sNotesMach, string.sub( sNotesMach, nPosFind, 4), sCodeProbeSide) end else -- se non ho la prima parte la aggiungo sNotesMach = sNotesMach..sCodeProbeSide..';' EgtSetMachiningParam( MCH_MP.USERNOTES, sNotesMach) end end end if sActiveStop then sNotesMach = EgtGetMachiningParam( MCH_MP.USERNOTES) if not sNotesMach or #sNotesMach == 0 then -- se la nota è vuota aggiungo il codice EgtSetMachiningParam( MCH_MP.USERNOTES, sActiveStop..';') else -- altrimenti se non è vuota verifico se c'è o no -- verifico se c'é già parte iniziale del codice 'ActiveStopMach' settato nel Machining_xvx nella funzione InsertMachiningByMachNum local sFirst = string.sub( sActiveStop, 1, 14) local nPosFind, _ = sNotesMach:find( sFirst, 1, true) if nPosFind then -- se ho già la prima parte if not sNotesMach:find( sActiveStop, 1, true) then -- se non ho la stessa nota la sostituisco sNotesMach = string.gsub( sNotesMach, string.sub( sNotesMach, nPosFind, 16), sActiveStop) end else -- se non ho la prima parte la aggiungo sNotesMach = sNotesMach..sActiveStop..';' EgtSetMachiningParam( MCH_MP.USERNOTES, sNotesMach) end end end if sSetMaxElev then sNotesMach = EgtGetMachiningParam( MCH_MP.USERNOTES) if not sNotesMach or #sNotesMach == 0 then -- se la nota è vuota aggiungo il codice EgtSetMachiningParam( MCH_MP.USERNOTES, sSetMaxElev..';') else -- altrimenti se non è vuota verifico se c'è o no -- verifico se c'é già parte iniziale del codice 'MaxElev' settato nel Machining_xvx nella funzione InsertMachiningByMachNum local sFirst = string.sub( sSetMaxElev, 1, 7) local nPosFind, _ = sNotesMach:find( sFirst, 1, true) if nPosFind then -- se ho già la prima parte if not sNotesMach:find( sSetMaxElev, 1, true) then -- se non ho la stessa nota la sostituisco sNotesMach = string.gsub( sNotesMach, string.sub( sNotesMach, nPosFind, 11), sSetMaxElev) end else -- se non ho la prima parte la aggiungo sNotesMach = sNotesMach..sSetMaxElev..';' EgtSetMachiningParam( MCH_MP.USERNOTES, sNotesMach) end end end if bSandFound and dAddLength and dAddLength > 0 then sNotesMach = EgtGetMachiningParam( MCH_MP.USERNOTES) if sNotesMach and #sNotesMach > 0 then -- se la nota non è vuota cerco la lavorazione di profilatura local sProfFind_LK, _ = sNotesMach:find( 'TRIM_LK', 1, true) local sProfFind, _ = sNotesMach:find( 'TRIM_', 1, true) local sProfAdded, _ = sNotesMach:find( 'ADD_EXTENDED', 1, true) -- se trovata lavorazione trim e non è stata ancora allungata (nella parte finale) if sProfFind and not sProfAdded then EgtSetMachiningParam( MCH_MP.USERNOTES, sNotesMach .. 'ADD_EXTENDED'..';') -- applico l'allungamento se non è percorso lock e non è una porta stretta if not (sProfFind_LK and bNarrowDoor) then EgtSetMachiningParam( MCH_MP.ENDADDLEN, dAddLength) end end end end if bSandFound and dAddSandLength and dAddSandLength > 0 then sNotesMach = EgtGetMachiningParam( MCH_MP.USERNOTES) if sNotesMach and #sNotesMach > 0 then -- se la nota non è vuota cerco la lavorazione di profilatura local sSandFind, _ = sNotesMach:find( 'SAND_', 1, true) local sProfAdded, _ = sNotesMach:find( 'ADD_EXTENDED', 1, true) -- se trovata lavorazione sand e non è stata ancora allungata (nella parte iniziale) if sSandFind and not sProfAdded then EgtSetMachiningParam( MCH_MP.USERNOTES, sNotesMach .. 'ADD_EXTENDED'..';') EgtSetMachiningParam( MCH_MP.STARTADDLEN, dAddSandLength) end end end local bSetMach = EgtSetMachiningGeometry( tEntId) -- se creo effettivamente la lavorazione controllo se ho le note per la modifica degli attacchi if not bNotGenMachining then sNotesMach = EgtGetMachiningParam( MCH_MP.USERNOTES) for t = 1, #tEntId do if tEntId[t] then local sPathType = EgtGetInfo( tEntId[t], 'PathType', 's') local sToolUse = EgtGetInfo( tEntId[t], 'ToolsUse', 's') local sTypeLead = EgtGetInfo( tEntId[t], 'LeadType', 's') local sInvDir = EgtGetInfo( tEntId[t], 'InvDir', 's') local nDirType = EgtGetInfo( tEntId[t], 'RevMach', 'i') local nStFromExt = EgtGetInfo( tEntId[t], 'StartFromExt', 'i') if nDirType and sPathType and sPathType == 'NR' and not sToolUse then -- se percorso REV singolo -- leggo il lato di lavoro -- local nWorkSide = EgtGetMachiningParam( MCH_MP.WORKSIDE) -- if nWorkSide and nWorkSide == MCH_MILL_WS.LEFT then -- se lato sinistro -- EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.RIGHT) -- elseif nWorkSide and nWorkSide == MCH_MILL_WS.RIGHT then -- se lato destro -- EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.LEFT) -- end --inverto il percorso di lavoro EgtSetMachiningParam( MCH_MP.INVERT, true) end if sTypeLead then -- se ho una nota di lead-in/out MachiningBase.ModifyLiLo( sTypeLead, nDirType, sPathType, sToolUse, dBladePerpLeadIn, dPercRedFeed, sInvDir) end if nStFromExt then -- se ho una nota di lead-in/out dall'esterno MachiningBase.ModifyLiLoToExt() end -- fermo il ciclo break end end -- se lavorazione ha le note opportune, -- rifaccio il ciclo sulle entità/lavorazione per applicare la riduzione della lunghezza lavorata if string.find( sNotesMach, 'HALF_LENGTH') then for t = 1, #tEntId do if tEntId[t] then local dPathLen = EgtCurveLength( tEntId[t]) or 0.0 if dPathLen > 0 then -- se nelle note trovata la nota di ridurre il percorso -- setto il valore di riduzione allungamento finale EgtSetMachiningParam( MCH_MP.ENDADDLEN, -(( dPathLen/2)-1)) end end end end local nPosFound = string.find( sNotesMach, 'CUT_LENGTH') if nPosFound then local sParz = string.sub( sNotesMach, nPosFound) nPosFound = string.find( sParz, ';') local sTrimmed if nPosFound then sTrimmed = string.sub( sParz, 1, nPosFound-1) else sTrimmed = sParz end if sTrimmed and #sTrimmed > 0 then local sValue = string.sub( sTrimmed, 12) if sValue and #sTrimmed > 0 then local dVal = tonumber( sValue) if dVal and abs(dVal) > GEO.EPS_SMALL then for t = 1, #tEntId do if tEntId[t] then local dPathLen = EgtCurveLength( tEntId[t]) or 0.0 if dPathLen > 0 then -- se nelle note trovata la nota di ridurre il percorso -- setto il valore di riduzione allungamento finale EgtSetMachiningParam( MCH_MP.ENDADDLEN, -( dPathLen - abs(dVal))) end end end end end end end -- se non genero la lavorazione leggo comunque le note else sNotesMach = EgtGetMachiningParam( MCH_MP.USERNOTES) end local bApplyMach = EgtApplyMachining() if not bNotGenMachining and ( not bSetMach or not bApplyMach) then if not bSetMach or not bApplyMach then local nIdErr, sIdErr = EgtGetLastMachMgrError() DGD.EMC = DGD.EMC .. '\n' .. string.format( EgtDoorsMsg[598], sMach, sOriName, sEntId, nIdErr, sIdErr) else DGD.EMC = DGD.EMC .. '\n' .. string.format( EgtDoorsMsg[485], sMach, sOriName, sEntId) end return -1 end if bNotGenMachining then EgtRemoveOperation( nMach) -- ripristino ultima lavorazione rimasta local nOper = EgtGetLastActiveOperation() or GDB_ID.NULL local nType = EgtGetOperationType( nOper) if nType ~= MCH_OY.NONE and nType ~= MCH_OY.DISP then EgtSetCurrMachining( nOper) EgtApplyMachining() end nMach = nil else sTool = EgtGetMachiningParam( MCH_MP.TOOL ) -- if link value different than 0 write info to machining if abs(nCheckLink) > 0 then EgtSetInfo( nMach, 'Link', nCheckLink) if #tParentId > 0 and tParentId[1] then EgtSetInfo( nMach, 'Parent', tParentId[1]) end -- if link value is negative disable the machining if nCheckLink < 0 then EgtSetOperationMode( nMach, false) end end -- sNotesMach = EgtGetMachiningParam( MCH_MP.USERNOTES) end return 1, nMach, sTool, sNotesMach end -------------------------------------------------------------------------------- function MachiningBase.AddMachining( sName, sMach, tEntId, dOverL, sOriName) local sEntId = '' local sNotesMach for t = 1, #tEntId do sEntId = sEntId .. tEntId[t] .. ',' end if not sMach or ( sMach and #sMach == 0) then DGD.ERM = DGD.ERM .. string.format( EgtDoorsMsg[483], sOriName, sEntId) return true end local nMach = EgtAddMachining( sName, sMach) if not nMach then DGD.EMC = DGD.EMC .. '\n' .. string.format( EgtDoorsMsg[484], sMach, sOriName, sEntId) return false end if dOverL then EgtSetMachiningParam( MCH_MP.OFFSL, dOverL) end if not EgtSetMachiningGeometry( tEntId) or not EgtApplyMachining() then local nIdErr, sIdErr = EgtGetLastMachMgrError() DGD.EMC = DGD.EMC .. '\n' .. string.format( EgtDoorsMsg[598], sMach, sOriName, sEntId, nIdErr, sIdErr) return false end -- ottengo le note lavorazione sNotesMach = EgtGetMachiningParam( MCH_MP.USERNOTES) if string.find( sNotesMach, 'HALF_LENGTH') then for t = 1, #tEntId do if tEntId[t] then local dPathLen = EgtCurveLength( tEntId[t]) or 0.0 if dPathLen > 0 then -- se nelle note trovata la nota di ridurre il percorso -- setto il valore di riduzione allungamento finale EgtSetMachiningParam( MCH_MP.ENDADDLEN, -(( dPathLen/2)-1)) end end end end return true end -------------------------------------------------------------------------------- function MachiningBase.MakeRoughPaths ( dSideOverMat, dMaxOverMat, dStepOverMat, nIdEnt, bTopBottPart, bFlip, bAlreadyMachSide, dBevelOffs, nScrapMode) local bMadeMach = bAlreadyMachSide if not bAlreadyMachSide and dMaxOverMat and dSideOverMat > dMaxOverMat then -- creo passate di sgrossatura local nHorStep = ceil(dSideOverMat / dStepOverMat) -- se modalità remove scrap abilitata setto una sola passata if nScrapMode and nScrapMode == 1 then nHorStep = 1 end local dHorStep = dStepOverMat local nPassHor = 1 local nSideOffs = EgtIf( bFlip, -1, 1) local nNumEnt1, nNumEnt2 = EgtCurveDomain( nIdEnt) local bSimpleLine = (nNumEnt2 - nNumEnt1) == 1 local pIni = EgtSP( nIdEnt) local pMid = EgtMP( nIdEnt) local pEnd = EgtEP( nIdEnt) local nParId = EgtGetParent(nIdEnt) local dOffsBevel = 0 if dBevelOffs and dBevelOffs > 0 then -- se profilo bevel dOffsBevel = dBevelOffs * nSideOffs end while nPassHor <= nHorStep do local nLine if bSimpleLine then nLine = EgtArc3P( nParId, pIni, pMid, pEnd, GDB_RT.LOC) else -- faccio la copia del percorso nLine = EgtCopy( nIdEnt, nParId, GDB_RT.LOC) EgtModifyCurveExtrusion( nLine, Z_AX(), GDB_RT.LOC) end EgtOffsetCurve( nLine, ( dOffsBevel + ( dHorStep * ( nPassHor-1) * nSideOffs))) EgtModifyCurveExtrusion( nLine, Z_AX(), GDB_RT.GLOB) if nLine then bMadeMach = true if bTopBottPart then EgtSetName( nLine, 'ROUGH_H_' .. EgtNumToString(nPassHor,0)) else EgtSetName( nLine, 'ROUGH_' .. EgtNumToString(nPassHor,0)) end end nPassHor = nPassHor + 1 end -- end while end return bMadeMach end ----------------------------------------------------------------- -- *** Adjust Geometries Functions (Operations) *** ----------------------------------------------------------------- -------------------------------------------------------------------------------- function MachiningBase.AdjustBevel( EntId, EntName, bFirstStep, bNoVertCurve, bMakeGhostGeom, bNoModifyPath, bSkipOnSecCol) if bMakeGhostGeom then EntId = MachiningBase.MakeGhostCopy( EntId) end -- recupero versore estrusione local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) -- recupero flag di lavorazione local nLocMach = EgtGetInfo( EntId, 'Mach', 'i') or 1 local sNewName = EntName -- se diretto verso il basso if vtExtr:getZ() < 0 then -- sposto la curva, inverto l'estrusione local dTh = EgtCurveThickness( EntId) -- sposto la curva in basso lungo il versore EgtMove( EntId, vtExtr * dTh, GDB_RT.GLOB) if not bNoVertCurve then if not bNoModifyPath then -- rendo l'estrusione verticale e aggiusto lo spessore di conseguenza EgtModifyCurveThickness( EntId, - dTh * vtExtr:getZ()) EgtModifyCurveExtrusion( EntId, Z_AX(), GDB_RT.GLOB) end else -- sistemo l'estrusione e aggiusto lo spessore di conseguenza EgtModifyCurveThickness( EntId, dTh) EgtModifyCurveExtrusion( EntId, -vtExtr, GDB_RT.GLOB) end -- inverto la curva EgtInvertCurve( EntId) -- cambio il nome if EntName == 'BU' then if bMakeGhostGeom or not bFirstStep then EgtSetName( EntId, 'BD'..DGD.GHT) else EgtSetName( EntId, 'BD') end sNewName = 'BD' elseif EntName == 'BU_H' then if bMakeGhostGeom or not bFirstStep then EgtSetName( EntId, 'BD_H'..DGD.GHT) else EgtSetName( EntId, 'BD_H') end sNewName = 'BD' elseif EntName == 'BU_LK' then if bMakeGhostGeom or not bFirstStep then EgtSetName( EntId, 'BD_LK'..DGD.GHT) else EgtSetName( EntId, 'BD_LK') end sNewName = 'BD' elseif EntName == 'BD' then if bMakeGhostGeom or not bFirstStep then EgtSetName( EntId, 'BU'..DGD.GHT) else EgtSetName( EntId, 'BU') end sNewName = 'BU' elseif EntName == 'BD_H' then if bMakeGhostGeom or not bFirstStep then EgtSetName( EntId, 'BU_H'..DGD.GHT) else EgtSetName( EntId, 'BU_H') end sNewName = 'BU' elseif EntName == 'BD_LK' then if bMakeGhostGeom or not bFirstStep then EgtSetName( EntId, 'BU_LK'..DGD.GHT) else EgtSetName( EntId, 'BU_LK') end sNewName = 'BU' elseif EntName then if string.find( EntName, 'BU_Mach') then if bMakeGhostGeom or not bFirstStep then EgtSetName( EntId, string.gsub( EntName, 'BU_Mach', 'BD'..DGD.GHT..'_Mach')) else EgtSetName( EntId, string.gsub( EntName, 'BU_Mach', 'BD_Mach')) end sNewName = 'BD' elseif string.find( EntName,'BUEB') then -- bevel con edge break lato serratura if bMakeGhostGeom or not bFirstStep then EgtSetName( EntId, string.gsub( EntName, 'BUEB', 'BDEB') .. DGD.GHT) else EgtSetName( EntId, string.gsub( EntName, 'BUEB', 'BDEB')) end sNewName = 'BD' elseif string.find( EntName, 'BD_Mach') then if bMakeGhostGeom or not bFirstStep then EgtSetName( EntId, string.gsub( EntName, 'BD_Mach', 'BU'..DGD.GHT..'_Mach')) else EgtSetName( EntId, string.gsub( EntName, 'BD_Mach', 'BU_Mach')) end sNewName = 'BU' elseif string.find( EntName,'BDEB') then if bMakeGhostGeom or not bFirstStep then EgtSetName( EntId, string.gsub( EntName, 'BDEB', 'BUEB') .. DGD.GHT) else EgtSetName( EntId, string.gsub( EntName, 'BDEB', 'BUEB')) end sNewName = 'BU' end end -- in seconda fase controllo la nota mach se devo ristabilirla o escluderla if not bFirstStep then if nLocMach >= 10 then nLocMach = nLocMach - 10 elseif nLocMach > 0 then -- se è una che non avevo escluso la escludo nLocMach = nLocMach + 10 else -- altrimenti la escludo perché è già stata fatta nella fase precedente nLocMach = 11 end EgtSetInfo( EntId, 'Mach', nLocMach) else -- se devo utilizzare seconda colonna if bSkipOnSecCol then -- nota seconda colonna EgtSetInfo( EntId, 'Mach', 2) end end else if not bNoVertCurve and not bNoModifyPath then -- rendo l'estrusione verticale e aggiusto lo spessore di conseguenza local dTh = EgtCurveThickness( EntId) EgtModifyCurveThickness( EntId, dTh * vtExtr:getZ()) EgtModifyCurveExtrusion( EntId, Z_AX(), GDB_RT.GLOB) end -- in seconda fase controllo la nota mach se devo ristabilirla o escluderla if not bFirstStep then if nLocMach >= 10 then nLocMach = nLocMach - 10 elseif nLocMach > 0 then -- se è una che non avevo scluso la escludo nLocMach = nLocMach + 10 else -- altrimenti la escludo perché è già stata fatta nella fase precedente nLocMach = 11 end EgtSetInfo( EntId, 'Mach', nLocMach) else -- se devo utilizzare seconda colonna if bSkipOnSecCol then -- nota seconda colonna EgtSetInfo( EntId, 'Mach', 2) end end end return true, sNewName, EntId end -------------------------------------------------------------------------------- function MachiningBase.AdjustConeCleanPaths( EntId, bMakeGhostGeom, bKeepDir, nSolidLayer) if bMakeGhostGeom then EntId = MachiningBase.MakeGhostCopy( EntId) end -- recupero versore estrusione local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) -- se diretto verso il basso if vtExtr:getZ() < 0 then -- prendo il punto medio in Z dall'id del solido passato o dalla geometria stessa local b3Solid if not nSolidLayer then b3Solid = EgtGetBBoxGlob( EntId, GDB_BB.STANDARD) else b3Solid = EgtGetBBoxGlob( nSolidLayer, GDB_BB.STANDARD) end local ptMidZ = ( b3Solid:getMin():getZ() + b3Solid:getMax():getZ()) /2 EgtMirror( EntId, Point3d(0,0,ptMidZ), Z_AX(), GDB_ID.ROOT) -- faccio il mirror su asse Z end return true, EntId end -------------------------------------------------------------------------------- function MachiningBase.AdjustThrouCurve( EntId, bMakeGhostGeom, bKeepDir, bKeepDirZPos, bSkipOnSecCol) if bMakeGhostGeom then EntId = MachiningBase.MakeGhostCopy( EntId) end -- recupero versore estrusione local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) -- se diretto verso il basso if vtExtr:getZ() < 0 then local dTh = EgtCurveThickness( EntId) EgtMove( EntId, vtExtr * dTh, GDB_RT.GLOB) EgtModifyCurveThickness( EntId, - dTh * vtExtr:getZ()) EgtModifyCurveExtrusion( EntId, Z_AX(), GDB_RT.GLOB) if not bKeepDir then EgtInvertCurve( EntId) end else if bKeepDirZPos then EgtInvertCurve( EntId) end end -- se devo utilizzare seconda colonna if bSkipOnSecCol then -- nota seconda colonna EgtSetInfo( EntId, 'Mach', 2) else -- nessuna nota EgtRemoveInfo( EntId, 'Mach') end return true, EntId end -------------------------------------------------------------------------------- function MachiningBase.AdjPrfThrouCurveNew( EntId, bMakeGhostGeom, bFoundProperty, bNoVertCurve, bFirstStep, EntName) if bMakeGhostGeom then EntId = MachiningBase.MakeGhostCopy( EntId) end -- recupero versore estrusione local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) local sNewName = EntName -- se diretto verso il basso if vtExtr:getZ() < 0 then -- sposto la curva, inverto l'estrusione local dTh = EgtCurveThickness( EntId) -- sposto la curva in basso lungo il versore EgtMove( EntId, vtExtr * dTh, GDB_RT.GLOB) if not bNoVertCurve then -- rendo l'estrusione verticale e aggiusto lo spessore di conseguenza EgtModifyCurveThickness( EntId, - dTh * vtExtr:getZ()) EgtModifyCurveExtrusion( EntId, Z_AX(), GDB_RT.GLOB) else -- sistemo l'estrusione e aggiusto lo spessore di conseguenza EgtModifyCurveThickness( EntId, dTh) EgtModifyCurveExtrusion( EntId, -vtExtr, GDB_RT.GLOB) end -- inverto la curva EgtInvertCurve( EntId) -- cambio il nome if EntName == 'BU' then if bMakeGhostGeom or not bFirstStep then EgtSetName( EntId, 'BD'..DGD.GHT) else EgtSetName( EntId, 'BD') end sNewName = 'BD' elseif EntName == 'BD' then if bMakeGhostGeom or not bFirstStep then EgtSetName( EntId, 'BU'..DGD.GHT) else EgtSetName( EntId, 'BU') end sNewName = 'BU' elseif EntName then if string.find( EntName, 'BU_Mach') then if bMakeGhostGeom or not bFirstStep then EgtSetName( EntId, string.gsub( EntName, 'BU_Mach', 'BD'..DGD.GHT..'_Mach')) else EgtSetName( EntId, string.gsub( EntName, 'BU_Mach', 'BD_Mach')) end sNewName = 'BD' elseif string.find( EntName, 'BD_Mach') then if bMakeGhostGeom or not bFirstStep then EgtSetName( EntId, string.gsub( EntName, 'BD_Mach', 'BU'..DGD.GHT..'_Mach')) else EgtSetName( EntId, string.gsub( EntName, 'BD_Mach', 'BU_Mach')) end sNewName = 'BU' end end else -- se diretto verso l'alto if not bNoVertCurve then -- rendo l'estrusione verticale e aggiusto lo spessore di conseguenza local dTh = EgtCurveThickness( EntId) EgtModifyCurveThickness( EntId, dTh * vtExtr:getZ()) EgtModifyCurveExtrusion( EntId, Z_AX(), GDB_RT.GLOB) end end -- cerco se nella tabella c'è la chiave find, se c'è assegno la nota mach a 2 -- disabilito la ricerca perché ho già passato la variabile che indica se è stata trovata la proprietà local bMatchProp = bFoundProperty -- se ho trovato corrispondenza di proprietà if bMatchProp then -- nota seconda colonna EgtSetInfo( EntId, 'Mach', 2) else -- nessuna nota EgtRemoveInfo( EntId, 'Mach') end return true, EntId, sNewName end -------------------------------------------------------------------------------- function MachiningBase.AdjPrfThrouCurve( EntId, bMakeGhostGeom, tsProperties, sFind, bNoVertCurve, bFirstStep, EntName) if bMakeGhostGeom then EntId = MachiningBase.MakeGhostCopy( EntId) end -- recupero versore estrusione local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) local sNewName = EntName -- se diretto verso il basso if vtExtr:getZ() < 0 then -- sposto la curva, inverto l'estrusione local dTh = EgtCurveThickness( EntId) -- sposto la curva in basso lungo il versore EgtMove( EntId, vtExtr * dTh, GDB_RT.GLOB) if not bNoVertCurve then -- rendo l'estrusione verticale e aggiusto lo spessore di conseguenza EgtModifyCurveThickness( EntId, - dTh * vtExtr:getZ()) EgtModifyCurveExtrusion( EntId, Z_AX(), GDB_RT.GLOB) else -- sistemo l'estrusione e aggiusto lo spessore di conseguenza EgtModifyCurveThickness( EntId, dTh) EgtModifyCurveExtrusion( EntId, -vtExtr, GDB_RT.GLOB) end -- inverto la curva EgtInvertCurve( EntId) -- cambio il nome if EntName == 'BU' then if bMakeGhostGeom or not bFirstStep then EgtSetName( EntId, 'BD'..DGD.GHT) else EgtSetName( EntId, 'BD') end sNewName = 'BD' elseif EntName == 'BD' then if bMakeGhostGeom or not bFirstStep then EgtSetName( EntId, 'BU'..DGD.GHT) else EgtSetName( EntId, 'BU') end sNewName = 'BU' elseif EntName then if string.find( EntName, 'BU_Mach') then if bMakeGhostGeom or not bFirstStep then EgtSetName( EntId, string.gsub( EntName, 'BU_Mach', 'BD'..DGD.GHT..'_Mach')) else EgtSetName( EntId, string.gsub( EntName, 'BU_Mach', 'BD_Mach')) end sNewName = 'BD' elseif string.find( EntName, 'BD_Mach') then if bMakeGhostGeom or not bFirstStep then EgtSetName( EntId, string.gsub( EntName, 'BD_Mach', 'BU'..DGD.GHT..'_Mach')) else EgtSetName( EntId, string.gsub( EntName, 'BD_Mach', 'BU_Mach')) end sNewName = 'BU' end end else -- se diretto verso l'alto if not bNoVertCurve then -- rendo l'estrusione verticale e aggiusto lo spessore di conseguenza local dTh = EgtCurveThickness( EntId) EgtModifyCurveThickness( EntId, dTh * vtExtr:getZ()) EgtModifyCurveExtrusion( EntId, Z_AX(), GDB_RT.GLOB) end end -- cerco se nella tabella c'è la chiave find, se c'è assegno la nota mach a 2 local bMatchProp = FindProperty( tsProperties, sFind) -- se ho trovato corrispondenza di proprietà if bMatchProp then -- nota seconda colonna EgtSetInfo( EntId, 'Mach', 2) else -- nessuna nota EgtRemoveInfo( EntId, 'Mach') end return true, EntId, sNewName end -------------------------------------------------------------------------------- function MachiningBase.AdjustVertCurve( EntId, bMakeGhostGeom) if bMakeGhostGeom then EntId = MachiningBase.MakeGhostCopy( EntId) end -- recupero versore estrusione local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) -- se diretto verso il basso if vtExtr:getZ() < 0 then local dTh = EgtCurveThickness( EntId) EgtModifyCurveExtrusion( EntId, Z_AX(), GDB_RT.GLOB) -- lavorazione 2nd EgtSetInfo( EntId, 'Mach', 2) else -- lavorazione standard EgtRemoveInfo( EntId, 'Mach') end return true, EntId end -------------------------------------------------------------------------------- function MachiningBase.AdjustBladeVertCurve( EntId, bMakeGhostGeom) if bMakeGhostGeom then EntId = MachiningBase.MakeGhostCopy( EntId) end -- recupero versore estrusione local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) -- se diretto verso il basso if vtExtr:getZ() < 0 then local dTh = EgtCurveThickness( EntId) EgtModifyCurveExtrusion( EntId, Z_AX(), GDB_RT.GLOB) local sPathInfo = EgtGetInfo( EntId, 'PathType', 's') local sToolsUse = EgtGetInfo( EntId, 'ToolsUse', 's') if sPathInfo and sPathInfo == 'NR' and not sToolsUse then -- se percorso singolo genero prima colonna -- lavorazione standard EgtRemoveInfo( EntId, 'Mach') else -- lavorazione 2nd EgtSetInfo( EntId, 'Mach', 2) end -- setto una nota aggiuntiva del parametro mach EgtSetInfo( EntId, 'RevMach', 1) else -- lavorazione standard EgtRemoveInfo( EntId, 'Mach') end return true, EntId end -------------------------------------------------------------------------------- function MachiningBase.AdjustASplintWithBlade( EntId, bMakeGhostGeom, nDispType, bFlipDoor) if bMakeGhostGeom then EntId = MachiningBase.MakeGhostCopy( EntId) end MachiningBase.DefineASplint( EntId, nDispType, bFlipDoor, 2) return true, EntId end -------------------------------------------------------------------------------- function MachiningBase.AdjustThrouIsle( EntId, DimZ, ptMin, ptMax, nNumMachSkip, bFirstStep, bWorkUnder, bMakeGhostGeom, dExtraThruDepth) if bMakeGhostGeom then EntId = MachiningBase.MakeGhostCopy( EntId) end -- contatore disabilitazione lavorazione local nNumSkip = nNumMachSkip -- recupero spessore e verifico se passante local dTh = EgtCurveThickness( EntId) local bTrhu = ( abs( dTh) > DimZ - GEO.EPS_SMALL) -- se passante, aggiunto affondamento if bTrhu then -- acquisisco nota per vedere se viene fatta da lama local bBladeNote = EgtGetInfo( EntId, 'ByBlade', 'b') or false local dOl = -2 -- valore in mm if dExtraThruDepth then dOl = -abs(dExtraThruDepth) end if not bBladeNote then -- assegno nota se non ha taglio di lama EgtSetInfo( EntId, 'OL', dOl) end end -- recupero versore estrusione local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) -- recupero flag di lavorazione local nLocMach = EgtGetInfo( EntId, 'Mach', 'i') or 1 -- se versore fresa diretto come Z-, if vtExtr:getZ() < 0 then -- se passante, lo cambio in Z+ if bTrhu then vtExtr = - vtExtr local pIni = EgtSP( EntId, GDB_ID.ROOT) if abs( pIni:getZ() - ptMin:getZ()) < GEO.EPS_SMALL then -- se geometria è sulla faccia sotto -- in seconda fase controllo la nota mach se devo ristabilirla o escluderla if not bFirstStep then -- leggo la nota Mach2nd che indica se l'entità è già stata lavorata local nMach2nd = EgtGetInfo( EntId, 'Mach2nd', 'i') or 0 if nMach2nd == 0 then if nLocMach >= 10 then nLocMach = nLocMach - 10 elseif nLocMach > 0 then -- se è una che non avevo escluso la escludo nLocMach = nLocMach + 10 else -- altrimenti la escludo perché è già stata fatta nella fase precedente nLocMach = 11 end EgtSetInfo( EntId, 'Mach', nLocMach) end end -- se da lavorare ora if nLocMach > 0 and nLocMach < 10 then EgtMove( EntId, vtExtr * abs(dTh), GDB_RT.GLOB) EgtModifyCurveExtrusion( EntId, vtExtr, GDB_RT.GLOB) end elseif abs( pIni:getZ() - ptMax:getZ()) < GEO.EPS_SMALL then -- se geometria è sulla faccia sopra -- in seconda fase controllo la nota mach se devo ristabilirla o escluderla if not bFirstStep then -- leggo la nota Mach2nd che indica se l'entità è già stata lavorata local nMach2nd = EgtGetInfo( EntId, 'Mach2nd', 'i') or 0 if nMach2nd == 0 then if nLocMach >= 10 then nLocMach = nLocMach - 10 elseif nLocMach > 0 then -- se è una che non avevo scluso la escludo nLocMach = nLocMach + 10 else -- altrimenti la escludo perché è già stata fatta nella fase precedente nLocMach = 11 end EgtSetInfo( EntId, 'Mach', nLocMach) end end -- se da lavorare ora if nLocMach > 0 and nLocMach < 10 then EgtMove( EntId, -vtExtr * abs(dTh), GDB_RT.GLOB) EgtModifyCurveExtrusion( EntId, vtExtr, GDB_RT.GLOB) end else -- altrimenti lo salto perché è in una Z diversa da sopra o sotto EgtSetInfo( EntId, 'Mach', 0) end -- altrimenti lo salto else -- se non posso lavorare da sotto if not bWorkUnder then -- se non era ancora stato escluso, lo escludo sommando 10 al valore if nLocMach < 10 then nLocMach = nLocMach + 10 end EgtSetInfo( EntId, 'Mach', nLocMach) nNumSkip = nNumSkip + 1 else nLocMach = 2 EgtSetInfo( EntId, 'Mach', nLocMach) end end else -- in seconda fase controllo la nota mach se devo ristabilirla o escluderla if not bFirstStep then -- leggo la nota Mach2nd che indica se l'entità è già stata lavorata local nMach2nd = EgtGetInfo( EntId, 'Mach2nd', 'i') or 0 if nMach2nd == 0 then if nLocMach >= 10 then if nLocMach <= 21 then nLocMach = nLocMach - 10 end elseif nLocMach > 0 then -- se è una che non avevo escluso la escludo nLocMach = nLocMach + 10 else -- altrimenti la escludo perché è già stata fatta nella fase precedente nLocMach = 11 end EgtSetInfo( EntId, 'Mach', nLocMach) end end end -- se da lavorare ora if nLocMach > 0 and nLocMach < 10 then local vtMPlane, dDist, dArea -- verifico se il percorso è chiuso if EgtCurveIsClosed( EntId) then -- impongo senso di rotazione orario visto da sopra vtMPlane, dDist, dArea = EgtCurveArea( EntId) if abs( dArea) < 1 then -- verifico se il percroso ha la nota che identifica una doubleline cioè un percorso composto da due linee sovrapposte if not ( EgtGetInfo( EntId, 'DoubleLine', 'i') == 1) then -- Rimando il valore originario in caso avessi skippato la lavorazione return false, nNumMachSkip, EntId end end -- altrimenti è aperto else -- faccio una copia del percorso local sParnt = EgtGetParent( EntId) local nNewEntId = EgtCopyGlob( EntId, sParnt) -- chiudo il percorso if EgtCloseCurveCompo( nNewEntId) then -- impongo senso di rotazione orario visto da sopra vtMPlane, dDist, dArea = EgtCurveArea( nNewEntId) EgtErase(nNewEntId) if dArea and abs( dArea) < 1 then -- verifico se il percorso originario è una curvecompo if EgtGetType( EntId) == GDB_TY.CRV_COMPO then local _, nLast = EgtCurveDomain( EntId) -- se è composto da una sola entità if nLast == 1 then -- rifaccio la copia nNewEntId = EgtCopyGlob( EntId, sParnt) -- esplodo e verifico che sia una linea local nLocalGeom, nLast = EgtExplodeCurveCompo( nNewEntId) if nLocalGeom and ( nLast > 1 or EgtGetType( nLocalGeom) ~= GDB_TY.CRV_LINE) then if nLast > 1 then for i = 1, nLast do EgtErase( nLocalGeom + i - 1) end else EgtErase( nLocalGeom) end -- Rimando il valore originario in caso avessi skippato la lavorazione return false, nNumMachSkip, EntId else EgtErase( nLocalGeom) return true, nNumSkip, EntId end else -- Rimando il valore originario in caso avessi skippato la lavorazione return false, nNumMachSkip, EntId end elseif EgtGetType( EntId) == GDB_TY.CRV_LINE then return true, nNumSkip, EntId else -- Rimando il valore originario in caso avessi skippato la lavorazione return false, nNumMachSkip, EntId end end else EgtErase(nNewEntId) -- impongo senso di rotazione orario visto da sopra vtMPlane, dDist, dArea = EgtCurveArea( EntId) if dArea and abs( dArea) < 1 then -- Rimando il valore originario in caso avessi skippato la lavorazione return false, nNumMachSkip, EntId end end end local frEnt = EgtGetGlobFrame( EntId) if vtMPlane then vtMPlane:toGlob(frEnt) if nLocMach ~= 2 then if dArea and dArea * ( vtMPlane * vtExtr) > 0 then EgtInvertCurve( EntId) -- cerco se ho la nota OPEN che definisce quale entità è quella aperta per le svuotature local sNumOpen = EgtGetInfo( EntId, 'OPEN', 'i') if sNumOpen then if sNumOpen > 0 then EgtSetInfo( EntId, 'OPEN', 0) else local nNumEnt1, nNumEnt2 = EgtCurveDomain( EntId) if nNumEnt2 > 1 then EgtSetInfo( nHint, 'OPEN', nNumEnt2-1) end end end end else if dArea and dArea * ( vtMPlane * vtExtr) < 0 then EgtInvertCurve( EntId) -- cerco se ho la nota OPEN che definisce quale entità è quella aperta per le svuotature local sNumOpen = EgtGetInfo( EntId, 'OPEN', 'i') if sNumOpen then if sNumOpen > 0 then EgtSetInfo( EntId, 'OPEN', 0) else local nNumEnt1, nNumEnt2 = EgtCurveDomain( EntId) if nNumEnt2 > 1 then EgtSetInfo( nHint, 'OPEN', nNumEnt2-1) end end end end end end --[[ local dAreaXY = EgtCurveAreaXY( EntId) if dAreaXY and abs( dAreaXY) < 1 then -- provo con EgtCurveArea local vtV1, dDist, dArea = EgtCurveArea( EntId) if dArea and abs( dArea) < 1 then -- Rimando il valore originario in caso avessi skippato la lavorazione return false, nNumMachSkip, EntId else dAreaXY = dArea end end local frEnt = EgtFR( EgtGetParent( EntId), GDB_ID.ROOT) if nLocMach ~= 2 then if dAreaXY and dAreaXY * frEnt:getVersZ():getZ() > 0 then EgtInvertCurve( EntId) end else if dAreaXY and dAreaXY * frEnt:getVersZ():getZ() < 0 then EgtInvertCurve( EntId) end end ]]-- end return true, nNumSkip, EntId end -------------------------------------------------------------------------------- function MachiningBase.AdjustHole( EntId, bMakeGhostGeom, bForceHorizontalDir) if bMakeGhostGeom then EntId = MachiningBase.MakeGhostCopy( EntId) end -- recupero versore estrusione local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) local vtMPlane, dDist, dArea = EgtCurveArea( EntId) if bForceHorizontalDir then -- se c'è forzatura orizzontale vtExtr:setZ( 0) EgtModifyCurveExtrusion( EntId, vtExtr, GDB_RT.GLOB) -- EgtSetInfo( EntId, 'OL', 0.16) -- lavorazione standard EgtRemoveInfo( EntId, 'Mach') end -- impongo senso di rotazione orario relativo alla normale del versore if abs( dArea) < 1 then return false end local frEnt = EgtGetGlobFrame( EntId) vtMPlane:toGlob(frEnt) if dArea * ( vtMPlane * vtExtr) > 0 then EgtInvertCurve( EntId) end return true, EntId end -------------------------------------------------------------------------------- function MachiningBase.AdjPreHoleAndPocket( EntId, bMakeGhostGeom, tsProperties, tsFind, bFoundProperty) if bMakeGhostGeom then EntId = MachiningBase.MakeGhostCopy( EntId) end -- recupero versore estrusione local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) local vtMPlane, dDist, dArea = EgtCurveArea( EntId) -- impongo senso di rotazione orario relativo alla normale del versore if abs( dArea) < 1 then return false end local frEnt = EgtGetGlobFrame( EntId) vtMPlane:toGlob(frEnt) if dArea * ( vtMPlane * vtExtr) > 0 then EgtInvertCurve( EntId) end -- cerco se nella tabella c'è la chiave find, se c'è assegno la nota mach a 2 local bMatchProp if tsFind and tsProperties then for g = 1, #tsFind do for h = 1, #tsProperties do if string.lower(tsProperties[h]) == string.lower(tsFind[g]) then bMatchProp = true end end end end -- verifico se la proprietà è già stata trovata (nuovo metodo), -- è mutuamente esclusivo della ricerca nella tabella proprietà appena qua sopra if bFoundProperty then bMatchProp = true end -- se ho trovato corrispondenza di proprietà if bMatchProp then -- nota seconda colonna EgtSetInfo( EntId, 'Mach', 2) else -- nessuna nota EgtRemoveInfo( EntId, 'Mach') end return true, EntId end -------------------------------------------------------------------------------- function MachiningBase.AdjustHead( EntId, nNumTopGeom, nNumBottomGeom, dPosShuttleChange, nForceUseShuttle) -- controllo dalla nota se non è già stata lavorata prima local nSetSide = EgtGetInfo( EntId, 'Mach', 'i') or 0 if nSetSide < 10 then -- recupero il minimo e massimo valore in X e decido in base ai range dove metterlo local b3Ent = EgtGetBBoxGlob( EntId, GDB_BB.STANDARD) local dMin = b3Ent:getMin():getX() local dMax = b3Ent:getMax():getX() -- se ho forzato ad usare uno shuttle, setto a tutte le geometrie lo shuttle disponibile if nForceUseShuttle and nForceUseShuttle > 0 then if nForceUseShuttle == 1 then -- se forzo uso shuttle 1 (il valore assegnato a 3 è l'id della MTABLE) nSetSide = 3 -- setto lower nNumBottomGeom = nNumBottomGeom + 1 else -- altrimenti lo shuttle 2 nSetSide = 2 -- setto upper nNumTopGeom = nNumTopGeom + 1 end else -- se il minimo geometria è tutto con lo shuttle superiore ( di destra) if dMin >= dPosShuttleChange then nSetSide = 2 -- setto upper nNumTopGeom = nNumTopGeom + 1 else -- altrimenti sfora o è completamente nella parte dello shuttle inferiore ( di sinistra) -- se il massimo è oltre il limite lo setto neutro if dMax > dPosShuttleChange then nSetSide = 0 -- setto neutro else nSetSide = 3 -- setto lower nNumBottomGeom = nNumBottomGeom + 1 end end end -- se neutro decido da che parte stare in base al numero delle rispettive parti if nSetSide == 0 then if nNumTopGeom == 0 then -- se shuttle alto senza assegnazioni lo assegno alto nSetSide = 2 nNumTopGeom = nNumTopGeom + 1 else -- altrimenti shuttle alto ha già assegnazioni if nNumBottomGeom == 0 then -- se shuttle basso senza assegnazioni lo assegno basso nSetSide = 3 -- setto lower nNumBottomGeom = nNumBottomGeom + 1 else -- altrimenti shuttle basso con già assegnazioni -- confronto tra quale dei due ha più assegnazioni if nNumBottomGeom >= nNumTopGeom then -- se shuttle basso ne ha uguali o di più lo assegno alto nSetSide = 2 nNumTopGeom = nNumTopGeom + 1 else -- altrimenti shuttle basso ne ha di meno, assegno basso nSetSide = 3 -- setto lower nNumBottomGeom = nNumBottomGeom + 1 end end end end EgtSetInfo( EntId, 'Mach', nSetSide) end return true, nNumTopGeom, nNumBottomGeom, EntId end -------------------------------------------------------------------------------- function MachiningBase.AdjustHeadOnASplint( EntId, nNumTopGeom, nNumBottomGeom, dPosShuttleChange, nForceUseShuttle, nDispType, bFlipDoor, nMaxMach) -- controllo dalla nota se non è già stata lavorata prima local nSetSide = EgtGetInfo( EntId, 'Mach', 'i') or 0 if nSetSide < 10 then -- verifico se è possibile lavorarla nSetSide = MachiningBase.DefineASplint( EntId, nDispType, bFlipDoor, nMaxMach) if nSetSide < 4 then nSetSide = 0 -- recupero il minimo e massimo valore in X e decido in base ai range dove metterlo local b3Ent = EgtGetBBoxGlob( EntId, GDB_BB.STANDARD) local dMin = b3Ent:getMin():getX() local dMax = b3Ent:getMax():getX() -- se ho forzato ad usare uno shuttle, setto a tutte le geometrie lo shuttle disponibile if nForceUseShuttle and nForceUseShuttle > 0 then if nForceUseShuttle == 1 then -- se forzo uso shuttle 1 (il valore assegnato a 3 è l'id della MTABLE) nSetSide = 3 -- setto lower nNumBottomGeom = nNumBottomGeom + 1 else -- altrimenti lo shuttle 2 nSetSide = 2 -- setto upper nNumTopGeom = nNumTopGeom + 1 end else -- se il minimo geometria è tutto con lo shuttle superiore ( di destra) if dMin >= dPosShuttleChange then nSetSide = 2 -- setto upper nNumTopGeom = nNumTopGeom + 1 else -- altrimenti sfora o è completamente nella parte dello shuttle inferiore ( di sinistra) -- se il massimo è oltre il limite lo setto neutro if dMax > dPosShuttleChange then nSetSide = 0 -- setto neutro else nSetSide = 3 -- setto lower nNumBottomGeom = nNumBottomGeom + 1 end end end -- se neutro decido da che parte stare in base al numero delle rispettive parti if nSetSide == 0 then if nNumTopGeom == 0 then -- se shuttle alto senza assegnazioni lo assegno alto nSetSide = 2 nNumTopGeom = nNumTopGeom + 1 else -- altrimenti shuttle alto ha già assegnazioni if nNumBottomGeom == 0 then -- se shuttle basso senza assegnazioni lo assegno basso nSetSide = 3 -- setto lower nNumBottomGeom = nNumBottomGeom + 1 else -- altrimenti shuttle basso con già assegnazioni -- confronto tra quale dei due ha più assegnazioni if nNumBottomGeom >= nNumTopGeom then -- se shuttle basso ne ha uguali o di più lo assegno alto nSetSide = 2 nNumTopGeom = nNumTopGeom + 1 else -- altrimenti shuttle basso ne ha di meno, assegno basso nSetSide = 3 -- setto lower nNumBottomGeom = nNumBottomGeom + 1 end end end end EgtSetInfo( EntId, 'Mach', nSetSide) end end return true, nNumTopGeom, nNumBottomGeom, EntId end -------------------------------------------------------------------------------- function MachiningBase.AdjustHorizDrillX( EntId, bMakeGhostGeom, bSelecExit, nProbeMode) if bMakeGhostGeom then EntId = MachiningBase.MakeGhostCopy( EntId) end -- recupero versore estrusione/fresa local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) -- impongo versore fresa orizzontale if abs( vtExtr:getZ()) > GEO.EPS_ZERO then vtExtr:setZ( 0) EgtModifyCurveExtrusion( EntId, vtExtr, GDB_RT.GLOB) EgtSetInfo( EntId, 'OL', 0.16) end if bSelecExit then local bLetExit -- lavorazione frontale (destra o sinistra) -- se probemode disabilitato confronto con valore quasi o nullo if nProbeMode < 2 and abs( vtExtr:getY()) < GEO.EPS_ZERO then bLetExit = true -- se ha fallito l'orientamento e sono in probe mode 2 confronto con un valore più grande elseif nProbeMode == 2 and abs( vtExtr:getY()) < 2 then bLetExit = true -- impongo versore Y a 0 vtExtr:setY( 0) EgtModifyCurveExtrusion( EntId, vtExtr, GDB_RT.GLOB) end if bLetExit then -- se diretto verso SX if vtExtr:getX() < GEO.EPS_ZERO then EgtRemoveInfo( EntId, 'Mach') else -- lavorazione diretta verso DX EgtSetInfo( EntId, 'Mach', 2) end end end return true, EntId end -------------------------------------------------------------------------------- function MachiningBase.AdjustHorizDrillY( EntId, bMakeGhostGeom, bSelecExit, nProbeMode) if bMakeGhostGeom then EntId = MachiningBase.MakeGhostCopy( EntId) end -- recupero versore estrusione/fresa local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) -- impongo versore fresa orizzontale if abs( vtExtr:getZ()) > GEO.EPS_ZERO then vtExtr:setZ( 0) EgtModifyCurveExtrusion( EntId, vtExtr, GDB_RT.GLOB) EgtSetInfo( EntId, 'OL', 0.16) end if bSelecExit then local bLetExit -- lavorazione frontale (dietro o davanti) -- se probemode disabilitato confronto con valore quasi o nullo if nProbeMode < 2 and abs( vtExtr:getX()) < GEO.EPS_ZERO then bLetExit = true -- se ha fallito l'orientamento e sono in probe mode 2 confronto con un valore più grande elseif nProbeMode == 2 and abs( vtExtr:getX()) < 2 then bLetExit = true -- impongo versore X a 0 vtExtr:setX( 0) EgtModifyCurveExtrusion( EntId, vtExtr, GDB_RT.GLOB) end if bLetExit then -- se diretto verso davanti if vtExtr:getY() < GEO.EPS_ZERO then EgtRemoveInfo( EntId, 'Mach') else -- lavorazione Dietro EgtSetInfo( EntId, 'Mach', 2) end end end return true, EntId end -------------------------------------------------------------------------------- function MachiningBase.AdjustHorizAS( EntId, bMakeGhostGeom) if bMakeGhostGeom then EntId = MachiningBase.MakeGhostCopy( EntId) end -- recupero versore estrusione/fresa local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) -- se orizzontale if abs( vtExtr:getZ()) < GEO.EPS_ZERO then -- lavorazione standard EgtRemoveInfo( EntId, 'Mach') -- se diretto in su elseif vtExtr:getZ() > 0 then -- lavorazione Up EgtSetInfo( EntId, 'Mach', 2) -- altrimenti diretto in giù else -- lavorazione Dw EgtSetInfo( EntId, 'Mach', 3) end -- impongo versore fresa orizzontale if abs( vtExtr:getZ()) > GEO.EPS_ZERO then vtExtr:setZ( 0) EgtModifyCurveExtrusion( EntId, vtExtr, GDB_RT.GLOB) EgtSetInfo( EntId, 'OL', 0.16) end return true, EntId end -------------------------------------------------------------------------------- function MachiningBase.AdjustHorNegativeAS( EntId, bMakeGhostGeom) if bMakeGhostGeom then EntId = MachiningBase.MakeGhostCopy( EntId) end -- recupero versore estrusione/fresa local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) -- se orizzontale if abs( vtExtr:getZ()) < GEO.EPS_ZERO then -- lavorazione standard EgtRemoveInfo( EntId, 'Mach') -- se diretto in su elseif vtExtr:getZ() > 0 then -- lavorazione Up EgtSetInfo( EntId, 'Mach', 2) -- altrimenti diretto in giù else -- lavorazione Dw EgtSetInfo( EntId, 'Mach', 3) end -- se è negativo impongo versore fresa orizzontale if vtExtr:getZ() < GEO.EPS_ZERO then vtExtr:setZ( 0) EgtModifyCurveExtrusion( EntId, vtExtr, GDB_RT.GLOB) EgtSetInfo( EntId, 'OL', 0.16) end return true, EntId end -------------------------------------------------------------------------------- function MachiningBase.AdjustMortise( EntId, nNumMachSkip, bNoWorkUnderSquare, bMakeGhostGeom, bNoWorkUpSquare, bForceHorizontalDir) if bMakeGhostGeom then EntId = MachiningBase.MakeGhostCopy( EntId) end -- contatore disabilitazione lavorazione local nNumSkip = nNumMachSkip -- recupero versore estrusione local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) local vtMPlane, dDist, dArea = EgtCurveArea( EntId) -- se orizzontale if abs( vtExtr:getZ()) < GEO.EPS_ZERO then -- lavorazione standard EgtRemoveInfo( EntId, 'Mach') -- se diretto in su elseif vtExtr:getZ() > 0 then -- lavorazione Up a meno che c'è la forzatura orizzontale if bForceHorizontalDir then -- se c'è forzatura orizzontale vtExtr:setZ( 0) EgtModifyCurveExtrusion( EntId, vtExtr, GDB_RT.GLOB) EgtSetInfo( EntId, 'OL', 0.16) -- lavorazione standard EgtRemoveInfo( EntId, 'Mach') else if bNoWorkUpSquare then -- se non è possibile lavorare soprasquadra EgtSetInfo( EntId, 'Mach', 12) nNumSkip = nNumSkip + 1 else EgtSetInfo( EntId, 'Mach', 2) end end -- altrimenti diretto in giù else -- lavorazione Dw a meno che c'è la forzatura orizzontale if bForceHorizontalDir then -- se c'è forzatura orizzontale vtExtr:setZ( 0) EgtModifyCurveExtrusion( EntId, vtExtr, GDB_RT.GLOB) EgtSetInfo( EntId, 'OL', 0.16) -- lavorazione standard EgtRemoveInfo( EntId, 'Mach') else if bNoWorkUnderSquare then -- se non è possibile lavorare sottosquadra EgtSetInfo( EntId, 'Mach', 13) nNumSkip = nNumSkip + 1 else EgtSetInfo( EntId, 'Mach', 3) end end end if vtMPlane then local frEnt = EgtGetGlobFrame( EntId) vtMPlane:toGlob(frEnt) if dArea * ( vtMPlane * vtExtr) > 0 then EgtInvertCurve( EntId) end end return true, nNumSkip, EntId end -------------------------------------------------------------------------------- function MachiningBase.AdjustBevelChisel( EntId, nNumMachSkip, bNoWorkUnderSquare, bMakeGhostGeom, bNoWorkUpSquare, bForceChiselHoriz) if bMakeGhostGeom then EntId = MachiningBase.MakeGhostCopy( EntId) end -- contatore disabilitazione lavorazione local nNumSkip = nNumMachSkip -- recupero versore estrusione local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) local vtMPlane, dDist, dArea = EgtCurveArea( EntId) -- se orizzontale if abs( vtExtr:getZ()) < GEO.EPS_ZERO then -- lavorazione standard EgtRemoveInfo( EntId, 'Mach') -- se diretto in su elseif vtExtr:getZ() > 0 then -- lavorazione Up if bNoWorkUpSquare then -- se non è possibile lavorare soprasquadra EgtSetInfo( EntId, 'Mach', 12) nNumSkip = nNumSkip + 1 else EgtSetInfo( EntId, 'Mach', 2) if bForceChiselHoriz then EgtRemoveInfo( EntId, 'Mach') vtExtr:setZ( 0) EgtModifyCurveExtrusion( EntId, vtExtr, GDB_RT.GLOB) -- EgtSetInfo( EntId, 'OL', 0.16) end end -- altrimenti diretto in giù else -- lavorazione Dw if bNoWorkUnderSquare then -- se non è possibile lavorare sottosquadra EgtSetInfo( EntId, 'Mach', 13) nNumSkip = nNumSkip + 1 else EgtSetInfo( EntId, 'Mach', 3) if bForceChiselHoriz then EgtRemoveInfo( EntId, 'Mach') vtExtr:setZ( 0) EgtModifyCurveExtrusion( EntId, vtExtr, GDB_RT.GLOB) -- EgtSetInfo( EntId, 'OL', 0.16) end end end if vtMPlane then local frEnt = EgtGetGlobFrame( EntId) vtMPlane:toGlob(frEnt) if dArea * ( vtMPlane * vtExtr) > 0 then EgtInvertCurve( EntId) end end return true, nNumSkip, EntId end -------------------------------------------------------------------------------- function MachiningBase.AdjustHeadChisel( EntId, bMakeGhostGeom, bWorkOnlyHoriz, nNumMachSkip, bNoWorkUpSquare, bNoWorkUnderSquare) if bMakeGhostGeom then EntId = MachiningBase.MakeGhostCopy( EntId) end -- contatore disabilitazione lavorazione local nNumSkip = nNumMachSkip -- recupero versore estrusione local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) local vtMPlane, dDist, dArea = EgtCurveArea( EntId) -- se area piccola esco if dArea and abs( dArea) < 1 then return false end -- se valore quasi o nullo if abs( vtExtr:getX()) < GEO.EPS_ZERO then -- lavorazione frontale (dietro o davanti) EgtRemoveInfo( EntId, 'Mach') -- se abilitata verifica e modifica versore z per lavorazione orizzontale ( non segue il bevel) if bWorkOnlyHoriz then -- se non orizzontale impongo versore fresa orizzontale if abs( vtExtr:getZ()) > GEO.EPS_ZERO then vtExtr:setZ( 0) EgtModifyCurveExtrusion( EntId, vtExtr, GDB_RT.GLOB) -- EgtSetInfo( EntId, 'OL', 0.16) end else -- se diretto in su if vtExtr:getZ() > 0 then -- lavorazione Up if bNoWorkUpSquare then -- se non è possibile lavorare soprasquadra EgtSetInfo( EntId, 'Mach', 11) nNumSkip = nNumSkip + 1 else EgtSetInfo( EntId, 'Mach', 1) end -- altrimenti diretto in giù elseif vtExtr:getZ() < 0 then -- lavorazione Dw if bNoWorkUnderSquare then -- se non è possibile lavorare sottosquadra EgtSetInfo( EntId, 'Mach', 11) nNumSkip = nNumSkip + 1 else EgtSetInfo( EntId, 'Mach', 1) end end end -- se diretto verso DX elseif vtExtr:getX() > 0 then -- lavorazione DX EgtSetInfo( EntId, 'Mach', 2) -- altrimenti diretto s SX else -- lavorazione SX EgtSetInfo( EntId, 'Mach', 3) end -- impongo senso di rotazione orario relativo alla normale del versore if vtMPlane then local frEnt = EgtGetGlobFrame( EntId) vtMPlane:toGlob(frEnt) if dArea * ( vtMPlane * vtExtr) > 0 then EgtInvertCurve( EntId) end end return true, EntId, nNumSkip end -------------------------------------------------------------------------------- function MachiningBase.AdjustVertHole( EntId, DimZ, ptMin, ptMax, nNumMachSkip, bFirstStep, bWorkUnder, bMakeGhostGeom, dExtraThruDepth) if bMakeGhostGeom then EntId = MachiningBase.MakeGhostCopy( EntId) end -- contatore disabilitazione lavorazione local nNumSkip = nNumMachSkip local nTypeGeom = 0 -- 1: passante up, 2: passante dw, 3: cieca up, 4: cieca dw -- recupero spessore e verifico se passante local dTh = EgtCurveThickness( EntId) local bTrhu = ( abs( dTh) > DimZ - GEO.EPS_SMALL) -- se passante, aggiunto affondamento if bTrhu then local dOl = -2 -- valore in mm if dExtraThruDepth then dOl = -abs(dExtraThruDepth) end EgtSetInfo( EntId, 'OL', dOl) end -- recupero versore estrusione local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) -- recupero flag di lavorazione local nLocMach = EgtGetInfo( EntId, 'Mach', 'i') or 1 -- se versore fresa diretto come Z- (da sotto) if vtExtr:getZ() < 0 then -- se passante, lo cambio in Z+ if bTrhu then vtExtr = - vtExtr local pIni = EgtSP( EntId, GDB_ID.ROOT) if abs( pIni:getZ() - ptMin:getZ()) < GEO.EPS_SMALL then -- se il foro parte sulla faccia sotto -- in seconda fase controllo la nota mach se devo ristabilirla o escluderla if not bFirstStep then -- leggo la nota Mach2nd che indica se l'entità è già stata lavorata local nMach2nd = EgtGetInfo( EntId, 'Mach2nd', 'i') or 0 if nMach2nd == 0 then -- se è una geometria che avevo escluso la riabilito if nLocMach >= 10 then nLocMach = nLocMach - 10 elseif nLocMach > 0 then -- se è una che non avevo scluso la escludo nLocMach = nLocMach + 10 else -- altrimenti la escludo perché è già stata fatta nella fase precedente nLocMach = 11 end EgtSetInfo( EntId, 'Mach', nLocMach) end end -- se da lavorare ora if nLocMach > 0 and nLocMach < 10 then EgtMove( EntId, vtExtr * abs(dTh), GDB_RT.GLOB) EgtModifyCurveExtrusion( EntId, vtExtr, GDB_RT.GLOB) end nTypeGeom = 2 elseif abs( pIni:getZ() - ptMax:getZ()) < GEO.EPS_SMALL then -- se il foro parte sulla faccia sopra -- in seconda fase controllo la nota mach se devo ristabilirla o escluderla if not bFirstStep then -- leggo la nota Mach2nd che indica se l'entità è già stata lavorata local nMach2nd = EgtGetInfo( EntId, 'Mach2nd', 'i') or 0 if nMach2nd == 0 then if nLocMach >= 10 then if nLocMach <= 21 then nLocMach = nLocMach - 10 end elseif nLocMach > 0 then -- se è una che non avevo escluso la escludo nLocMach = nLocMach + 10 else -- altrimenti la escludo perché è già stata fatta nella fase precedente nLocMach = 11 end EgtSetInfo( EntId, 'Mach', nLocMach) end end -- se da lavorare ora if nLocMach > 0 and nLocMach < 10 then EgtMove( EntId, -vtExtr * abs(dTh), GDB_RT.GLOB) EgtModifyCurveExtrusion( EntId, vtExtr, GDB_RT.GLOB) end nTypeGeom = 2 else -- altrimenti lo salto perché è in una Z diversa da sopra o sotto EgtSetInfo( EntId, 'Mach', 0) end -- altrimenti non passante else -- se non posso lavorare da sotto if not bWorkUnder then -- se non era ancora stato escluso, lo escludo sommando 10 al valore if nLocMach < 10 then nLocMach = nLocMach + 10 end EgtSetInfo( EntId, 'Mach', nLocMach) nNumSkip = nNumSkip + 1 else nLocMach = 2 EgtSetInfo( EntId, 'Mach', nLocMach) end nTypeGeom = 4 end else -- versore Z diretto in Z+ -- in seconda fase controllo la nota mach se devo ristabilirla o escluderla if not bFirstStep then -- leggo la nota Mach2nd che indica se l'entità è già stata lavorata local nMach2nd = EgtGetInfo( EntId, 'Mach2nd', 'i') or 0 if nMach2nd == 0 then if nLocMach >= 10 then if nLocMach <= 21 then nLocMach = nLocMach - 10 end elseif nLocMach > 0 then -- se è una che non avevo scluso la escludo nLocMach = nLocMach + 10 else -- altrimenti la escludo perché è già stata fatta nella fase precedente nLocMach = 11 end EgtSetInfo( EntId, 'Mach', nLocMach) end end if bTrhu then nTypeGeom = 1 else nTypeGeom = 3 end end -- se da lavorare ora if nLocMach > 0 and nLocMach < 10 then local vtMPlane, dDist, dArea -- verifico se il percorso è chiuso if EgtCurveIsClosed( EntId) then -- impongo senso di rotazione orario visto da sopra vtMPlane, dDist, dArea = EgtCurveArea( EntId) if abs( dArea) < 1 then -- Rimando il valore originario in caso avessi skippato la lavorazione return false, nNumMachSkip, EntId end -- altrimenti è aperto else -- faccio una copia del percorso local sParnt = EgtGetParent( EntId) local nNewEntId = EgtCopyGlob( EntId, sParnt) -- chiudo il percorso if EgtCloseCurveCompo( nNewEntId) then -- impongo senso di rotazione orario visto da sopra vtMPlane, dDist, dArea = EgtCurveArea( nNewEntId) EgtErase(nNewEntId) if dArea and abs( dArea) < 1 then -- Rimando il valore originario in caso avessi skippato la lavorazione return false, nNumMachSkip, EntId end else EgtErase(nNewEntId) -- impongo senso di rotazione orario visto da sopra vtMPlane, dDist, dArea = EgtCurveArea( EntId) if not dArea or abs( dArea) < 1 then -- Rimando il valore originario in caso avessi skippato la lavorazione return false, nNumMachSkip, EntId end end end local frEnt = EgtGetGlobFrame( EntId) if vtMPlane then vtMPlane:toGlob(frEnt) if nLocMach ~= 2 then if dArea and dArea * ( vtMPlane * vtExtr) > 0 then EgtInvertCurve( EntId) end else if dArea and dArea * ( vtMPlane * vtExtr) < 0 then EgtInvertCurve( EntId) end end end --[[ -- impongo senso di rotazione orario visto da sopra local vtMPlane, dDist, dArea = EgtCurveArea( EntId) if not dArea or abs( dArea) < 1 then -- Rimando il valore originario in caso avessi skippato la lavorazione return false, nNumMachSkip, EntId end local frEnt = EgtGetGlobFrame( EntId) vtMPlane:toGlob(frEnt) if nLocMach ~= 2 then if dArea * ( vtMPlane * vtExtr) > 0 then EgtInvertCurve( EntId) end else if dArea * ( vtMPlane * vtExtr) < 0 then EgtInvertCurve( EntId) end end ]]-- --[[ local dAreaXY = EgtCurveAreaXY( EntId) if dAreaXY and abs( dAreaXY) < 1 then -- provo con EgtCurveArea local vtV1, dDist, dArea = EgtCurveArea( EntId) if dArea and abs( dArea) < 1 then -- Rimando il valore originario in caso avessi skippato la lavorazione return false, nNumMachSkip, EntId else dAreaXY = dArea end end local frEnt = EgtFR( EgtGetParent( EntId), GDB_ID.ROOT) if nLocMach ~= 2 then if dAreaXY and dAreaXY * frEnt:getVersZ():getZ() > 0 then EgtInvertCurve( EntId) end else if dAreaXY and dAreaXY * frEnt:getVersZ():getZ() < 0 then EgtInvertCurve( EntId) end end ]]-- end return true, nNumSkip, EntId, nTypeGeom end -------------------------------------------------------------------------------- function MachiningBase.AdjustProbeHole( EntId, DimZ, ptMin, ptMax, nNumMachSkip, bFirstStep, bWorkUnder, bMakeGhostGeom) if bMakeGhostGeom then EntId = MachiningBase.MakeGhostCopy( EntId) end -- contatore disabilitazione lavorazione local nNumSkip = nNumMachSkip -- recupero spessore e verifico se passante local dTh = EgtCurveThickness( EntId) local bTrhu = ( abs( dTh) > DimZ - GEO.EPS_SMALL) -- se passante, aggiunto affondamento -- recupero versore estrusione local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) -- recupero flag di lavorazione local nLocMach = EgtGetInfo( EntId, 'Mach', 'i') or 1 -- se versore fresa diretto come Z-, if vtExtr:getZ() < 0 then -- se passante, lo cambio in Z+ if bTrhu then vtExtr = - vtExtr local pIni = EgtSP( EntId, GDB_ID.ROOT) if abs( pIni:getZ() - ptMin:getZ()) < GEO.EPS_SMALL then -- se il foro parte sulla faccia sotto -- in seconda fase controllo la nota mach se devo ristabilirla o escluderla if not bFirstStep then -- se è una geometria che avevo escluso la riabilito if nLocMach >= 10 then nLocMach = nLocMach - 10 elseif nLocMach > 0 then -- se è una che non avevo escluso la escludo nLocMach = nLocMach + 10 else -- altrimenti la escludo perché è già stata fatta nella fase precedente nLocMach = 11 end EgtSetInfo( EntId, 'Mach', nLocMach) end -- se da lavorare ora if nLocMach > 0 and nLocMach < 10 then EgtMove( EntId, vtExtr * abs(dTh), GDB_RT.GLOB) EgtModifyCurveExtrusion( EntId, vtExtr, GDB_RT.GLOB) end elseif abs( pIni:getZ() - ptMax:getZ()) < GEO.EPS_SMALL then -- se il foro parte sulla faccia sopra -- in seconda fase controllo la nota mach se devo ristabilirla o escluderla if not bFirstStep then if nLocMach >= 10 then nLocMach = nLocMach - 10 elseif nLocMach > 0 then -- se è una che non avevo scluso la escludo nLocMach = nLocMach + 10 else -- altrimenti la escludo perché è già stata fatta nella fase precedente nLocMach = 11 end EgtSetInfo( EntId, 'Mach', nLocMach) end -- se da lavorare ora if nLocMach > 0 and nLocMach < 10 then EgtMove( EntId, -vtExtr * abs(dTh), GDB_RT.GLOB) EgtModifyCurveExtrusion( EntId, vtExtr, GDB_RT.GLOB) end else -- altrimenti lo salto perché è in una Z diversa da sopra o sotto EgtSetInfo( EntId, 'Mach', 0) end -- altrimenti lo salto else -- se non posso lavorare da sotto if not bWorkUnder then -- se non era ancora stato escluso, lo escludo sommando 10 al valore if nLocMach < 10 then nLocMach = nLocMach + 10 end EgtSetInfo( EntId, 'Mach', nLocMach) nNumSkip = nNumSkip + 1 else nLocMach = 2 EgtSetInfo( EntId, 'Mach', nLocMach) end end else -- in seconda fase controllo la nota mach se devo ristabilirla o escluderla if not bFirstStep then if nLocMach >= 10 then nLocMach = nLocMach - 10 elseif nLocMach > 0 then -- se è una che non avevo scluso la escludo nLocMach = nLocMach + 10 else -- altrimenti la escludo perché è già stata fatta nella fase precedente nLocMach = 11 end EgtSetInfo( EntId, 'Mach', nLocMach) end end -- se da lavorare ora if nLocMach > 0 and nLocMach < 10 then -- impongo senso di rotazione orario visto da sopra local dAreaXY _ , _ , dAreaXY = EgtCurveArea( EntId) if dAreaXY and abs( dAreaXY) < 0.1 then -- Rimando il valore originario in caso avessi skippato la lavorazione return false, nNumMachSkip end local frEnt = EgtFR( EgtGetParent( EntId), GDB_ID.ROOT) if nLocMach ~= 2 then if dAreaXY and dAreaXY * frEnt:getVersZ():getZ() > 0 then EgtInvertCurve( EntId) end else if dAreaXY and dAreaXY * frEnt:getVersZ():getZ() < 0 then EgtInvertCurve( EntId) end end EgtSetInfo( EntId, 'ProbeMachZ', 3) end return true, nNumSkip, EntId end -------------------------------------------------------------------------------- function MachiningBase.AdjustProbeMill( EntId, DimZ, ptMin, ptMax, nNumMachSkip, bFirstStep, bNoWorkUnderSquare, bMakeGhostGeom, bNoWorkUpSquare, dThickPrb, dDepthPrb) -- recupero versore estrusione local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) -- se versore fresa diretto come Z-, if vtExtr:getZ() < 0 then EgtModifyCurveExtrusion( EntId, Z_AX(), GDB_RT.GLOB) end if bMakeGhostGeom then EntId = MachiningBase.MakeGhostCopy( EntId) end -- contatore disabilitazione lavorazione local nNumSkip = nNumMachSkip -- recupero spessore e verifico se passante local dTh = EgtCurveThickness( EntId) local bTrhu = ( abs( dTh) > DimZ - GEO.EPS_SMALL) -- recupero flag di lavorazione local nLocMach = EgtGetInfo( EntId, 'Mach', 'i') or 1 local sProfile = EgtGetInfo( EntId, 'ProfSide', 's') or '' -- verifico direzione lavorazione local pt1 = EgtSP( EntId, GDB_ID.ROOT) local pt2 = EgtEP( EntId, GDB_ID.ROOT) -- calcolo direzione entrante vtExtr = pt2 - pt1; vtExtr:normalize() -- se si trova a Z0 lo sposto a quota spessore porta if abs( pt1:getZ() - ptMin:getZ()) < GEO.EPS_SMALL then EgtMove( EntId, Point3d( 0, 0, ( ptMax:getZ()-ptMin:getZ())), GDB_RT.GLOB) end -- se vettore estrusione è all'interno della tangente di 3° proseguo con la verifica if abs(vtExtr:getZ()) < 0.0525 then -- se non sono al primo giro setto profili bevel invertiti if not bFirstStep and sProfile == 'BD' then sProfile = 'BU' elseif not bFirstStep and sProfile == 'BU' then sProfile = 'BD' end if sProfile == 'BD' then if bNoWorkUnderSquare then -- se non è possibile lavorare sottosquadra EgtSetInfo( EntId, 'Mach', 13) nNumSkip = nNumSkip + 1 EgtModifyCurveThickness( EntId, 0) else EgtSetInfo( EntId, 'Mach', 3) EgtModifyCurveThickness( EntId, -( dThickPrb + dDepthPrb)) end elseif sProfile == 'BU' then if bNoWorkUpSquare then -- se non è possibile lavorare soprasquadra EgtSetInfo( EntId, 'Mach', 12) nNumSkip = nNumSkip + 1 EgtModifyCurveThickness( EntId, 0) else EgtSetInfo( EntId, 'Mach', 2) EgtModifyCurveThickness( EntId, -dDepthPrb) end else -- lavorazione standard EgtRemoveInfo( EntId, 'Mach') -- -- elimino il percorso ProbeSidePoint_ per non lavorarlo in un a fase successiva -- if bFirstStep then -- local nPar = EgtGetParent(EntId) -- local tEnt = MachiningBase.FindGroupWithPartName( nPar, sParzName..'_secure') -- if tEnt and #tEnt > 0 then -- for i = 1, #tEnt do -- EgtErase(tEnt[i]) -- end -- end -- tEnt = MachiningBase.FindGroupWithPartName( nPar, sParzName..'_keyway') -- if tEnt and #tEnt > 0 then -- for i = 1, #tEnt do -- EgtErase(tEnt[i]) -- end -- end -- end end -- se diretto verso X+ if vtExtr:getX() > 0.98 then EgtSetInfo( EntId, 'ProbeMachXY', 1) -- E101 = 1 -- altrimenti se diretto verso X- elseif vtExtr:getX() < -0.98 then EgtSetInfo( EntId, 'ProbeMachXY', -1) -- E101 = 4 -- altrimenti se diretto verso Y+ elseif vtExtr:getY() > 0.98 then EgtSetInfo( EntId, 'ProbeMachXY', 2) -- E101 = 2 -- altrimenti se diretto verso Y- elseif vtExtr:getY() < -0.98 then EgtSetInfo( EntId, 'ProbeMachXY', -2) -- E101 = 6 else EgtSetInfo( EntId, 'Mach', nLocMach + 20) return false, nNumSkip, EntId end else EgtSetInfo( EntId, 'Mach', nLocMach + 20) return false, nNumSkip, EntId end return true, nNumSkip, EntId end -------------------------------------------------------------------------------- function MachiningBase.AdjustVertAsOnHeads( EntId, bMakeGhostGeom) if bMakeGhostGeom then EntId = MachiningBase.MakeGhostCopy( EntId) end -- recupero versore estrusione/fresa local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) -- recupero punti inziale e finale local pIni = EgtSP( EntId, GDB_ID.ROOT) local pNewIni = Point3d( pIni) local pEnd = EgtEP( EntId, GDB_ID.ROOT) local pNewEnd = Point3d( pEnd) local bExit = true -- se punti diversi if dist( pIni, pEnd) > GEO.EPS_SMALL then -- se versore Y verso Y+ (faccia dietro) if vtExtr:getY() > 0.99 then -- se punto iniziale ha Y verso Y- if pIni:getY() < ( pEnd:getY() - GEO.EPS_SMALL) then -- ricostruisco il percorso tenendo la posizione di Y più interno pNewEnd = Point3d( pEnd:getX(), pIni:getY(), pEnd:getZ()) -- se punto iniziale ha Y verso Y+ elseif pIni:getY() > ( pEnd:getY() + GEO.EPS_SMALL) then -- ricostruisco il percorso tenendo la posizione di Y più interno pNewIni = Point3d( pIni:getX(), pEnd:getY(), pIni:getZ()) end -- se versore Y verso Y+ (faccia dietro) elseif vtExtr:getY() < -0.99 then -- se punto iniziale ha Y verso Y- if pIni:getY() < ( pEnd:getY() - GEO.EPS_SMALL) then -- ricostruisco il percorso tenendo la posizione di Y più interno pNewIni = Point3d( pIni:getX(), pEnd:getY(), pIni:getZ()) -- se punto iniziale ha Y verso Y+ elseif pIni:getY() > ( pEnd:getY() + GEO.EPS_SMALL) then -- ricostruisco il percorso tenendo la posizione di Y più interno pNewEnd = Point3d( pEnd:getX(), pIni:getY(), pEnd:getZ()) end end -- se ho cambiato almeno 1 punto ricotruisco il percorso if not AreSamePointExact( pIni, pNewIni) or not AreSamePointExact( pEnd, pNewEnd) then nParent = EgtGetParent( EntId) local sName = EgtGetName( EntId) EgtErase (EntId) EntId = EgtLine( nParent, pNewIni, pNewEnd, GDB_RT.GLOB) EgtSetName( EntId, sName) EgtModifyCurveThickness( EntId, 0) EgtModifyCurveExtrusion( EntId, vtExtr, GDB_ID.ROOT) EgtSetStatus( EntId, GDB_ST.OFF) end else bExit = false end -- lavorazione standard EgtRemoveInfo( EntId, 'Mach') return bExit, EntId end -------------------------------------------------------------------------------- function MachiningBase.InvertGeom( EntId) -- recupero spessore e verifico se passante local dTh = EgtCurveThickness( EntId) -- recupero versore estrusione local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) -- recupero flag di lavorazione local nLocMach = EgtGetInfo( EntId, 'Mach', 'i') or 1 vtExtr = - vtExtr -- se da lavorare ora if nLocMach > 0 and nLocMach < 10 then EgtMove( EntId, vtExtr * abs(dTh), GDB_RT.GLOB) EgtModifyCurveExtrusion( EntId, vtExtr, GDB_RT.GLOB) if nLocMach == 1 then -- nLocMach = nLocMach + 10 + 1 nLocMach = 2 elseif nLocMach == 2 then -- nLocMach = nLocMach + 10 - 1 nLocMach = 1 -- else -- altrimenti la escludo perché è già stata fatta nella fase precedente -- nLocMach = nLocMach + 10 end EgtSetInfo( EntId, 'Mach', nLocMach) end return true end ----------------------------------------------------------------- -- *** Test Functions *** ----------------------------------------------------------------- -------------------------------------------------------------------------------- function MachiningBase.TestThrouIsle( EntId, DimZ, ptMin, ptMax, bWorkUnder) -- skip geometria, con spessore passante e geometria valida restituisce 0 perché è neutro -- restituisce +1 se è sotto, restituisce -1 se è sopra local nSkipGeom local nTypeGeom = 0 -- 1: passante up, 2: passante dw, 3: cieca up, 4: cieca dw -- recupero spessore e verifico se passante local dTh = EgtCurveThickness( EntId) local bTrhu = ( abs( dTh) > DimZ - GEO.EPS_SMALL) -- recupero versore estrusione local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) -- se versore fresa diretto come Z-, if vtExtr:getZ() < 0 then -- se passante, lo cambio in Z+ if bTrhu then local pIni = EgtSP( EntId, GDB_ID.ROOT) if abs( pIni:getZ() - ptMin:getZ()) < GEO.EPS_SMALL then -- se geometria è sulla faccia sotto nSkipGeom = 0 nTypeGeom = 2 elseif abs( pIni:getZ() - ptMax:getZ()) < GEO.EPS_SMALL then -- se geometria è sulla faccia sopra nSkipGeom = 0 nTypeGeom = 2 end -- altrimenti lo salto else if not bWorkUnder then nSkipGeom = 1 else nSkipGeom = 0 end nTypeGeom = 4 end else -- altrimenti versore fresa diretto come Z+ if bTrhu then local pIni = EgtSP( EntId, GDB_ID.ROOT) if abs( pIni:getZ() - ptMin:getZ()) < GEO.EPS_SMALL then -- se geometria è sulla faccia sotto nSkipGeom = 0 nTypeGeom = 1 elseif abs( pIni:getZ() - ptMax:getZ()) < GEO.EPS_SMALL then -- se geometria è sulla faccia sopra nSkipGeom = 0 nTypeGeom = 1 end -- altrimenti lo salto else nSkipGeom = -1 nTypeGeom = 3 end end -- verifico se il percorso è chiuso if EgtCurveIsClosed( EntId) then -- verifico se area è troppo piccola local vtMPlane, dDist, dArea = EgtCurveArea( EntId) if abs( dArea) < 1 then return false end -- altrimenti è aperto else -- faccio una copia del percorso local sParnt = EgtGetParent( EntId) local nNewEntId = EgtCopyGlob( EntId, sParnt) -- chiudo il percorso if EgtCloseCurveCompo( nNewEntId) then local vtMPlane, dDist, dArea = EgtCurveArea( nNewEntId) -- cancello percorso copia EgtErase(nNewEntId) if dArea and abs( dArea) < 1 then return false end else -- cancello percorso copia EgtErase(nNewEntId) -- verifico se area è troppo piccola local vtMPlane, dDist, dArea = EgtCurveArea( EntId) if dArea and abs( dArea) < 1 then return false end end end --[[ local dAreaXY = EgtCurveAreaXY( EntId) if dAreaXY and abs( dAreaXY) < 1 then -- provo con EgtCurveArea local vtV1, dDist, dArea = EgtCurveArea( EntId) if dArea and abs( dArea) < 1 then return false else dAreaXY = dArea end end ]]-- return true, nSkipGeom, nTypeGeom end -------------------------------------------------------------------------------- function MachiningBase.TestVertHole( EntId, DimZ, ptMin, ptMax, bWorkUnder) -- skip geometria, con spessore passante e geometria valida restituisce 0 perché è neutro -- restituisce +1 se è sotto, restituisce -1 se è sopra local nSkipGeom local nTypeGeom = 0 -- 1: passante up, 2: passante dw, 3: cieca up, 4: cieca dw -- recupero spessore e verifico se passante local dTh = EgtCurveThickness( EntId) local bTrhu = ( abs( dTh) > DimZ - GEO.EPS_SMALL) -- recupero versore estrusione local vtExtr = EgtCurveExtrusion( EntId, GDB_ID.ROOT) -- se versore fresa diretto come Z-, if vtExtr:getZ() < 0 then -- se passante, lo cambio in Z+ if bTrhu then local pIni = EgtSP( EntId, GDB_ID.ROOT) if abs( pIni:getZ() - ptMin:getZ()) < GEO.EPS_SMALL then -- se il foro parte sulla faccia sotto nSkipGeom = 0 nTypeGeom = 2 elseif abs( pIni:getZ() - ptMax:getZ()) < GEO.EPS_SMALL then -- se il foro parte sulla faccia sopra nSkipGeom = 0 nTypeGeom = 2 end -- altrimenti lo salto else if not bWorkUnder then nSkipGeom = 1 else nSkipGeom = 0 end nTypeGeom = 4 end else -- altrimenti versore fresa diretto come Z+ if bTrhu then local pIni = EgtSP( EntId, GDB_ID.ROOT) if abs( pIni:getZ() - ptMin:getZ()) < GEO.EPS_SMALL then -- se geometria è sulla faccia sotto nSkipGeom = 0 nTypeGeom = 1 elseif abs( pIni:getZ() - ptMax:getZ()) < GEO.EPS_SMALL then -- se geometria è sulla faccia sopra nSkipGeom = 0 nTypeGeom = 1 end -- altrimenti lo salto else nSkipGeom = -1 nTypeGeom = 3 end end -- verifico se il percorso è chiuso if EgtCurveIsClosed( EntId) then -- verifico se area è troppo piccola local vtMPlane, dDist, dArea = EgtCurveArea( EntId) if abs( dArea) < 1 then return false end -- altrimenti è aperto else -- faccio una copia del percorso local sParnt = EgtGetParent( EntId) local nNewEntId = EgtCopyGlob( EntId, sParnt) -- chiudo il percorso if EgtCloseCurveCompo( nNewEntId) then local vtMPlane, dDist, dArea = EgtCurveArea( nNewEntId) -- cancello percorso copia EgtErase(nNewEntId) if dArea and abs( dArea) < 1 then return false end else -- cancello percorso copia EgtErase(nNewEntId) -- verifico se area è troppo piccola local vtMPlane, dDist, dArea = EgtCurveArea( EntId) if not dArea or abs( dArea) < 1 then return false end end end --[[ -- verifico se area è troppo piccola local vtMPlane, dDist, dArea = EgtCurveArea( EntId) if not dArea or abs( dArea) < 1 then return false end ]]-- --[[ local dAreaXY = EgtCurveAreaXY( EntId) if dAreaXY and abs( dAreaXY) < 1 then -- provo con EgtCurveArea local vtV1, dDist, dArea = EgtCurveArea( EntId) if dArea and abs( dArea) < 1 then return false else dAreaXY = dArea end end ]]-- return true, nSkipGeom, nTypeGeom end -------------------------------------------------------------------------------- function MachiningBase.TestMachining( sMach, EntId, bCheckPos) -- verifico inserimento e applicazione della lavorazione alla geometria if not sMach or ( sMach and #sMach == 0) then return false, sMach end local nMach = EgtAddMachining( 'Dummy', sMach) if not nMach then return false end local bOk = EgtSetMachiningGeometry( EntId) and EgtApplyMachining() local bBoxMach if bOk and bCheckPos then bBoxMach = EgtGetBBoxGlob ( nMach, GDB_BB.STANDARD) end EgtRemoveOperation( nMach) -- ripristino ultima lavorazione rimasta local nOper = EgtGetLastActiveOperation() or GDB_ID.NULL local nType = EgtGetOperationType( nOper) if nType ~= MCH_OY.NONE and nType ~= MCH_OY.DISP then EgtSetCurrMachining( nOper) EgtApplyMachining() end return bOk, sMach, bBoxMach end ----------------------------------------------------------------- -- *** MachTable Functions *** ----------------------------------------------------------------- -------------------------------------------------------------------------------- function MachiningBase.GetToolDiamFromAttrib( sName, nInd) --[[ local sCamData = 'CurrCamInfo' local mCamData = require( sCamData) local MachiningsTable = mCamData[DGD.MCC].MachiningsTable local MachName = mCamData[DGD.MCC].MachName local sLocMachname local MTable = require( MachiningsTable) ]]-- -- prendo dalle note il nome tabella e poi da questa le macchine indicate -- devo cercare per ogni macchina, che esiste -- cerco nella tabella le associazioni che siano abilitate, che abbiano la macchina compatibile, -- che ci sia il nome geometria corrispondente local MachiningsTable = EgtGetInfo( DGD.PZ, 'MTable') local MachiningsPath = EgtGetInfo( DGD.PZ, 'MTablePath') -- se tavola non trovata esco subito if not MachiningsTable or not MachiningsPath then return -8 end local M = dofile( MachiningsPath..MachiningsTable..'.mtl') local MTable = M.MTable local MachinesName = M.MMachineData local sLocMachId local sMachine -- per ogni macchina faccio il giro della tabella for j = 1, #MachinesName do sMachine = MachinesName[j].MachName -- imposto la macchina corrente if sMachine and EgtSetCurrMachine( sMachine) then for i = 1, #MTable do if MTable[i].On ~= 0 then -- se non presente il nome macchina di default setto l'associazione per la macchina 1 sLocMachId = MTable[i].MachId if not sLocMachId then sLocMachId = 1 end if string.lower(MTable[i].Name) == string.lower(sName) and sLocMachId == j then -- recupero il nome della lavorazione local sMach if nInd == 2 then sMach = MTable[i].MachUp elseif nInd == 3 then sMach = MTable[i].MachDw else sMach = MTable[i].Mach end if not sMach then return -1 end -- errore su lavorazione non trovata -- imposto la lavorazione come corrente if not EgtMdbSetCurrMachining( sMach) then return -2, nil, sMach end -- recupero l'utensile della lavorazione local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) if not sTuuid then return -3, nil, sMach end local sTool = EgtTdbGetToolFromUUID( sTuuid) if not sTool then return -4, nil, sMach end EgtTdbSetCurrTool( sTool) local dDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) if not dDiam then return -5, nil, sMach end return dDiam, nil, sMach end end end end end return - 6 end -------------------------------------------------------------------------------- function MachiningBase.GetToolDataFromAttrib( sName, nInd, bReadNotes, bForceReadThick) -- prendo dalle note il nome tabella e poi da questa le macchine indicate -- devo cercare per ogni macchina, che esiste -- cerco nella tabella le associazioni che siano abilitate, che abbiano la macchina compatibile, -- che ci sia il nome geometria corrispondente local MachiningsTable = EgtGetInfo( DGD.PZ, 'MTable') local MachiningsPath = EgtGetInfo( DGD.PZ, 'MTablePath') -- se tavola non trovata esco subito if not MachiningsTable or not MachiningsPath then return -8 end local M = dofile( MachiningsPath..MachiningsTable..'.mtl') local MTable = M.MTable local MachinesName = M.MMachineData local sLocMachId local sMachine -- per ogni macchina faccio il giro della tabella for j = 1, #MachinesName do sMachine = MachinesName[j].MachName -- imposto la macchina corrente if sMachine and EgtSetCurrMachine( sMachine) then for i = 1, #MTable do if MTable[i].On ~= 0 then -- se non presente il nome macchina di default setto l'associazione per la macchina 1 sLocMachId = MTable[i].MachId if not sLocMachId then sLocMachId = 1 end if string.lower(MTable[i].Name) == string.lower(sName) and sLocMachId == j then -- recupero il nome della lavorazione local sMach if nInd == 2 then sMach = MTable[i].MachUp elseif nInd == 3 then sMach = MTable[i].MachDw else sMach = MTable[i].Mach end if not sMach then return -1 end -- imposto la lavorazione come corrente if not EgtMdbSetCurrMachining( sMach) then return -2, nil, sMach end -- recupero l'eventuale nota local sMachNotes = '' if bReadNotes then sMachNotes = EgtMdbGetCurrMachiningParam( MCH_MP.USERNOTES) end -- recupero l'utensile della lavorazione local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) if not sTuuid then return -3, nil, sMach end local sTool = EgtTdbGetToolFromUUID( sTuuid) if not sTool then return -4, nil, sMach end EgtTdbSetCurrTool( sTool) local dDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) if not dDiam then return -5, nil, sMach end -- se non trovato diametro esco local dHWork = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT) if not dHWork then return -7, nil, sMach end -- se non trovato massimo materiale esco local dHType = EgtTdbGetCurrToolParam( MCH_TP.TYPE) local dThBlade -- se forzata lettura spessore lama if bForceReadThick then -- se tipo utensile lama if dHType == MCH_TY.SAW_STD or dHType == MCH_TY.SAW_FLAT then dThBlade = EgtTdbGetCurrToolParam( MCH_TP.THICK) -- se è tipo fresa allaora lo spessore lama setto uguale all'altezza tagliente elseif dHType == MCH_TY.MILL_STD or dHType == MCH_TY.MILL_NOTIP then dThBlade = dHWork end -- se utensile lama elseif dHType == MCH_TY.SAW_STD or dHType == MCH_TY.SAW_FLAT then dThBlade = EgtTdbGetCurrToolParam( MCH_TP.THICK) end -- ritorno i valori diametro utensile e lunghezza massima return dDiam, dHWork, sMach, dThBlade, sMachNotes end end end end end return - 6 end return MachiningBase