diff --git a/LuaLibs/DiceCut.lua b/LuaLibs/DiceCut.lua index 268f2a3..a37b381 100644 --- a/LuaLibs/DiceCut.lua +++ b/LuaLibs/DiceCut.lua @@ -1,5 +1,5 @@ --- DiceCut.lua by Egaltech s.r.l. 2019/10/17 --- Gestione dei piano paralleli nei tagli lunghi +-- DiceCut.lua by Egaltech s.r.l. 2019/10/03 +-- Gestione dei piano paralleli nei tagli lunghi: equidistanziamento dei piani paralleli -- Tabella per definizione modulo local DiceCut = {} @@ -132,7 +132,7 @@ local function GetOrtoCutCenter( FacetId, ptC, vtN, vtO, dOffsetEff) local dWidth = Box:getDimY() -- se faccia con un lato piccolo e non diretta troppo verso il basso, non servono dice - if ( dLen < dOffsetEff + 1.0 or dWidth < dOffsetEff + 1.0) and vtN:getZ() > -0.5 then + if ( dLen < dOffsetEff + 1.0 or dWidth < dOffsetEff + 1.0) and vtN:getZ() > -0.5 then return nil, nil, nil end @@ -154,6 +154,13 @@ local function GetOrtoCutCenter( FacetId, ptC, vtN, vtO, dOffsetEff) dCopyPlane = 0.5 end end + + -- Restituisco il punto centrale del Box come centro delle facce + local IdAux = EgtGroup( EgtGetParent( FacetId), Frame) + EgtSetName( IdAux, "Aux") + ptC = EgtSurfTmFacetCenter( EgtSurfTmBBox( IdAux, Box, GDB_RT.LOC), 0, GDB_ID.ROOT) + EgtErase( IdAux) + return dOffsetRel, dCopyPlane, dCenOffs end @@ -280,6 +287,68 @@ local function VerifyFirstOrthoCut( CutTable, OffsetP, BBoxRawPart) end end +---------------------------------------------------------------------------------------------------------------------------------------------------- +-- ricavo i vertici del box +local function CalcolaPuntiEstremiBox( BBoxRawPart) + local ptMin = BBoxRawPart:getMin() + local ptMax = BBoxRawPart:getMax() + local TBoxPoint = {} + table.insert( TBoxPoint, { P = Point3d( ptMin:getX(), ptMin:getY(), ptMin:getZ()), On = true}) + table.insert( TBoxPoint, { P = Point3d( ptMax:getX(), ptMin:getY(), ptMin:getZ()), On = true}) + table.insert( TBoxPoint, { P = Point3d( ptMin:getX(), ptMax:getY(), ptMin:getZ()), On = true}) + table.insert( TBoxPoint, { P = Point3d( ptMax:getX(), ptMax:getY(), ptMin:getZ()), On = true}) + table.insert( TBoxPoint, { P = Point3d( ptMin:getX(), ptMin:getY(), ptMax:getZ()), On = true}) + table.insert( TBoxPoint, { P = Point3d( ptMax:getX(), ptMin:getY(), ptMax:getZ()), On = true}) + table.insert( TBoxPoint, { P = Point3d( ptMin:getX(), ptMax:getY(), ptMax:getZ()), On = true}) + table.insert( TBoxPoint, { P = Point3d( ptMax:getX(), ptMax:getY(), ptMax:getZ()), On = true}) + return TBoxPoint +end + +---------------------------------------------------------------------------------------------------------------------------------------------------- +-- restituisce i punti che devono essere presi in considerazione per la costruzione del BoundingBox +local function VerificaEstremiGrezzo( ptC, vtN, TPoint) + for i = 1, #TPoint do + if ( TPoint[i].P - ptC) * vtN < 0 then + TPoint[i].On = false + end + end + return TPoint +end + +---------------------------------------------------------------------------------------------------------------------------------------------------- +-- ricavo l'altezza del BoundingBox assegnati gli estremi del grezzo e la feature +-- le funzioni commentate permettono di vedere la creazione di BoundingBox +local function DistanzaMassima( nParent, ptC1, vtN1, ptC2, vtN2, BBoxRawPart, TPoint) + -- calcolo il riferimento nel piano 1 + local Frame1 = Frame3d( ptC1, vtN1) + -- determino l'ingombro in questo riferimento della parte di trave compresa nel o nei piani + local BB1 = BBox3d() + -- punti di vertice della trave compresi + for i = 1, #TPoint do + if TPoint[i].On then + local ptP = Point3d( TPoint[i].P) + ptP:toLoc( Frame1) + BB1:Add( ptP) + end + end + -- eventuale altra faccia + if ptC2 and vtN2 then + local IdAux = EgtGroup( nParent) + local IdSurf2 = EgtSurfTmPlaneInBBox( IdAux, ptC2, vtN2, BBoxRawPart, GDB_RT.GLOB) + EgtCutSurfTmPlane( IdSurf2, ptC1, -vtN1, false, GDB_RT.GLOB) + if IdSurf2 then + local BB2 = EgtGetBBoxRef( IdSurf2, GDB_BB.STANDARD, Frame1) + BB1:Add( BB2) + end + EgtErase( IdAux) + end + if not BB1:isEmpty() then + return ( BB1:getMax():getZ() + 0.1) + end + + return 0 +end + ---------------------------------------------------------------------------------------------------------------------------------------------------- -- DiceCut.GetDice : -- nParent: il layer @@ -298,6 +367,18 @@ function DiceCut.GetDice( nParent, BBoxRawPart, ptCPlanes, vtNPlanes, bGetOrtoPl local OffsetO = BD.MAX_DIM_DICE -- distanza tra i piani ortogonali local StepO = 20 -- numero massimo di piani ortogonali da generare + --Ricavo le altezze dei BoundingBox contenente feature e estremi del grezzo + local TBoxPoint = CalcolaPuntiEstremiBox( BBoxRawPart) + TBoxPoint = VerificaEstremiGrezzo( ptCPlanes, vtNPlanes, TBoxPoint) + if ptCBond and vtNBond then + TBoxPoint = VerificaEstremiGrezzo( ptCBond, vtNBond, TBoxPoint) + end + local dElevP = DistanzaMassima( nParent, ptCPlanes, vtNPlanes, ptCBond, vtNBond, BBoxRawPart, TBoxPoint) + local dElevO + if ptCBond and vtNBond then + dElevO = DistanzaMassima( nParent, ptCBond, vtNBond, ptCPlanes, vtNPlanes, BBoxRawPart, TBoxPoint) + end + -- se normali senza componenti in Y con faccia quasi verticale e trave non alta, uso per offset i limiti dei tagli di testa e coda if abs( vtNPlanes:getY()) < 0.1 and vtNPlanes:getZ() < 0.7071 and ( not vtNBond or abs( vtNBond:getY()) < 0.1) and BBoxRawPart:getDimZ() < BD.MIN_DIM_HBEAM then --OffsetP = BD.MAX_DIM_HTCUT @@ -321,6 +402,13 @@ function DiceCut.GetDice( nParent, BBoxRawPart, ptCPlanes, vtNPlanes, bGetOrtoPl OffsetO = OffsetO * dCoeff end + local n = ceil( dElevP / OffsetP) + OffsetP = dElevP / n + if dElevO then + local m = ceil( dElevO / OffsetO) + OffsetO = dElevO / m + end + -- elenco di tutte le superfici generate dai tagli local TabFUCHSIA = {} local TabGREEN = {} diff --git a/LuaLibs/ProcessFreeContour.lua b/LuaLibs/ProcessFreeContour.lua index 5a5d55f..7d45a4b 100644 --- a/LuaLibs/ProcessFreeContour.lua +++ b/LuaLibs/ProcessFreeContour.lua @@ -150,7 +150,7 @@ local function MakeByMill( Proc, nPhase, nRawId, nPartId, dOvmHead) -- ne verifico la lunghezza per eventuale spezzatura e lavorazione in doppio local nStep = 1 local dStep = 0 - local dLenMax = min( BD.LONGCUT_MAXLEN, 0.5 * b3Raw:getDimX()) + local dLenMax = BD.LONGCUT_MAXLEN local b3Aux = EgtGetBBoxGlob( AuxId, GDB_BB.STANDARD) if b3Aux:getDimX() > dLenMax then local dCrvLen = EgtCurveLength( AuxId) diff --git a/LuaLibs/ProcessLapJoint.lua b/LuaLibs/ProcessLapJoint.lua index 99b1b5f..c71cb96 100644 --- a/LuaLibs/ProcessLapJoint.lua +++ b/LuaLibs/ProcessLapJoint.lua @@ -733,7 +733,7 @@ local function MakeLongMoreFaces( Proc, nPhase, nRawId, nPartId) local b3Raw = EgtGetRawPartBBox( nRawId) -- la divido in parti lungo X local vAddId = {} - local nPart = ceil( Proc.Box:getDimX() / min( BD.LONGCUT_MAXLEN, 0.5 * b3Raw:getDimX())) + local nPart = ceil( Proc.Box:getDimX() / BD.LONGCUT_MAXLEN) local dPartLen = Proc.Box:getDimX() / nPart local Xmin = Proc.Box:getMin():getX() for i = 1, nPart do @@ -774,7 +774,7 @@ function ProcessLapJoint.Make( Proc, nPhase, nRawId, nPartId, dOvmHead) local b3Raw = EgtGetRawPartBBox( nRawId) -- se lunghezza richiede spezzatura - if Proc.Box:getDimX() > min( BD.LONGCUT_MAXLEN, 0.5 * b3Raw:getDimX()) then + if Proc.Box:getDimX() > BD.LONGCUT_MAXLEN then -- una faccia if Proc.Fct == 1 then return LongCut.Make( Proc, nPhase, nRawId, nPartId) diff --git a/LuaLibs/ProcessRoundArch.lua b/LuaLibs/ProcessRoundArch.lua index 22ae7d9..be1633f 100644 --- a/LuaLibs/ProcessRoundArch.lua +++ b/LuaLibs/ProcessRoundArch.lua @@ -120,7 +120,7 @@ function ProcessRoundArch.Make( Proc, nPhase, nRawId, nPartId, dOvmHead) -- se non di testa o coda ne verifico la lunghezza per eventuale spezzatura local nStep = 1 local dStep = 0 - local dLenMax = min( BD.LONGCUT_MAXLEN, 0.5 * b3Raw:getDimX()) + local dLenMax = BD.LONGCUT_MAXLEN local b3Aux = EgtGetBBoxGlob( AuxId, GDB_BB.STANDARD) if b3Aux:getDimX() > dLenMax then local dCrvLen = EgtCurveLength( AuxId)