DataBeam :

- migliorie e correzioni varie.
This commit is contained in:
Dario Sassi
2019-04-15 06:35:45 +00:00
parent 055968ca9f
commit 03e256a2f2
6 changed files with 167 additions and 43 deletions
+20 -16
View File
@@ -1,4 +1,4 @@
-- DiceCut.lua by Egaltech s.r.l. 2018/11/26
-- DiceCut.lua by Egaltech s.r.l. 2019/04/13
-- Gestione dei piano paralleli nei tagli lunghi
-- Tabella per definizione modulo
@@ -131,7 +131,8 @@ local function GetOrtoCutCenter( FacetId, ptC, vtN, vtO, dOffsetEff)
local dLen = Box:getDimX()
local dWidth = Box:getDimY()
if dLen < dOffsetEff + 1.0 or dWidth < dOffsetEff + 1.0 then
-- 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
return nil, nil, nil
end
@@ -231,43 +232,46 @@ local function SortOrtoCutsByNormalMethod( TabParallelPlanes, TabOrtoPlanes)
end
----------------------------------------------------------------------------------------------------------------------------------------------------
-- GetSurfSum:
-- VerifyFirstOrthoCut :
-- CutTable: tabella dei tagli
-- OffsetP: offset della distanza dal punto centrale
-- BBoxRawPart: il grezzo della barra
-- Verifica se l'asse X del box costruito sopra le 2 facce è più piccolo di un certo offset e quindi la faccia 12 è superflua
local function GetSurfSum( CutTable, OffsetP, BBoxRawPart)
-- Verifica se l'asse X del box costruito sopra le 2 facce è più piccolo di un certo offset e quindi la faccia O è superflua
local function VerifyFirstOrthoCut( CutTable, OffsetP, BBoxRawPart)
if not CutTable[1] or not CutTable[2] then return end
local CutOId = CutTable[1][1]
local Cut1Id = CutTable[2][1]
local Cut2Id = CutTable[2][2]
local Cut12Id = CutTable[1][1]
if Cut1Id and Cut2Id and Cut12Id then
if CutOId and Cut1Id and Cut2Id then
-- centri e normali delle due semifacce
local ptC1, vtN1 = EgtSurfTmFacetCenter( Cut1Id, 0, GDB_ID.ROOT)
local _, vtO = EgtSurfTmFacetCenter( Cut12Id, 0, GDB_ID.ROOT)
local ptC2, vtN2 = EgtSurfTmFacetCenter( Cut2Id, 0, GDB_ID.ROOT)
-- normale alla faccia ortogonale
local _, vtO = EgtSurfTmFacetCenter( CutOId, 0, GDB_ID.ROOT)
vtO = vtO - vtO * vtN1 * vtN1 ; vtO:normalize()
-- calcolo lunghezza prima semi-faccia
local asseX1 = vtO
local asseY1 = vtN1 ^ asseX1
local Frame1 = Frame3d( ptC1, ptC1+asseX1, ptC1+asseY1)
local Box1 = EgtGetBBoxRef( Cut1Id, GDB_BB.STANDARD, Frame1)
local x1 = Box1:getDimX()
local ptC2, vtN2 = EgtSurfTmFacetCenter( Cut2Id, 0, GDB_ID.ROOT)
-- calcolo lunghezza seconda semi-faccia
local asseX2 = vtO
local asseY2 = vtN2 ^ asseX2
local Frame2 = Frame3d( ptC2, ptC2+asseX2, ptC2+asseY2)
local Box2 = EgtGetBBoxRef( Cut2Id, GDB_BB.STANDARD, Frame2)
local x2 = Box2:getDimX()
-- lunghezza totale faccia
local dLongSize = x1 + x2
if dLongSize <= OffsetP + 1.0 then
-- se faccia piccola e non orientata verso il basso, elimino ortogonale e unisco le due parti
if dLongSize <= OffsetP + 1.0 and vtN1:getZ() > -0.5 then
local nParent = EgtGetParent( Cut1Id)
local SurfId = EgtSurfTmBySewing( nParent, { Cut1Id, Cut2Id})
EgtSetColor( SurfId, Color3d( FUCHSIA(), 60))
EgtErase( Cut12Id)
EgtErase( CutOId)
table.remove( CutTable[1], 1)
table.remove( CutTable[2], 1)
table.remove( CutTable[2], 1)
@@ -296,7 +300,7 @@ function DiceCut.GetDice( nParent, BBoxRawPart, ptCPlanes, vtNPlanes, bGetOrtoPl
-- se normali senza componenti in Y, uso per offset i limiti dei tagli di testa e coda
if abs( vtNPlanes:getY()) < 0.1 and ( not vtNBond or abs( vtNBond:getY()) < 0.1) then
OffsetP = BD.MAX_DIM_HTCUT
--OffsetP = BD.MAX_DIM_HTCUT
OffsetO = BD.MAX_DIM_HTCUT
end
@@ -409,7 +413,7 @@ function DiceCut.GetDice( nParent, BBoxRawPart, ptCPlanes, vtNPlanes, bGetOrtoPl
-- Se esiste la superficie limitante (nFacet == 2) verifica se il taglio più esterno è superfluo e quindi viene eliminato
if not bGetOrtoPlanes then
GetSurfSum( UltimateTable, originalOffsetP, BBoxRawPart)
VerifyFirstOrthoCut( UltimateTable, originalOffsetP, BBoxRawPart)
end
return UltimateTable