diff --git a/LuaLibs/ProcessCut.lua b/LuaLibs/ProcessCut.lua index 969dd2b..a23a3e5 100644 --- a/LuaLibs/ProcessCut.lua +++ b/LuaLibs/ProcessCut.lua @@ -1,4 +1,4 @@ --- ProcessCut.lua by Egaltech s.r.l. 2019/11/26 +-- ProcessCut.lua by Egaltech s.r.l. 2020/01/07 -- Gestione calcolo singoli tagli di lama per Travi -- Tabella per definizione modulo @@ -167,9 +167,9 @@ function ProcessCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bFromBottom) vtOrthoO = -Z_AX() elseif bHorizCut then vtOrthoO = Z_AX() - elseif abs( vtN:getY()) > 0.02 and Proc.Head then + elseif Proc.Head and b3Solid:getDimX() < BD.LEN_SHORT_PART and abs( vtN:getY()) > 0.02 and dCutV < dMaxDepth + 10 * GEO.EPS_SMALL then vtOrthoO = X_AX() - elseif abs( vtN:getY()) > 0.02 and Proc.Tail then + elseif Proc.Tail and b3Solid:getDimX() < BD.LEN_SHORT_PART and abs( vtN:getY()) > 0.02 and dCutV < dMaxDepth + 10 * GEO.EPS_SMALL then vtOrthoO = -X_AX() elseif vtN:getY() > -0.02 then vtOrthoO = Y_AX() diff --git a/ShowSolid.lua b/ShowSolid.lua index d3cf516..9d3e42f 100644 --- a/ShowSolid.lua +++ b/ShowSolid.lua @@ -1,4 +1,4 @@ --- ShowSolid.lua by Egaltech s.r.l. 2019/11/22 +-- ShowSolid.lua by Egaltech s.r.l. 2020/01/03 -- Gestione calcolo solido di una Trave require( 'EgtBase') @@ -17,6 +17,52 @@ local function Show( PartId, bSolid) EgtSetStatus( SolidLy or GDB_ID.NULL, EgtIf( bSolid, GDB_ST.ON, GDB_ST.OFF)) end +-- Funzione per regolarizzare, se necessario, la superficie della feature +local function RegularizeTriMesh( SurfId, DestGrpId, dStep) + -- solo per superfici trimesh con poche facce (max4) + local nFacetCnt = EgtSurfTmFacetCount( SurfId) + if nFacetCnt > 4 then + return SurfId + end + -- box della superficie + local b3Surf = EgtGetBBox( SurfId, GDB_BB.STANDARD) + if b3Surf:getDimX() < 2 * dStep then + return SurfId + end + -- recupero le facce e le divido in X + local dXmin = b3Surf:getMin():getX() - 1 + local dXmax = b3Surf:getMax():getX() + 1 + local nStep = floor( ( dXmax - dXmin) / dStep + 0.9) + dStep = ( dXmax - dXmin) / nStep + local NewSurfId + for nF = 0, nFacetCnt - 1 do + local FacId = EgtCopySurfTmFacet( SurfId, nF, DestGrpId) + local b3Fac = EgtGetBBox( FacId, GDB_BB.STANDARD) + local dX2 = dXmin + for nI = 1, nStep do + local dX1 = dX2 + dX2 = dX2 + dStep + if b3Fac:getMin():getX() < dX2 and b3Fac:getMax():getX() > dX1 then + EgtCutSurfTmPlane( FacId, Point3d( dX1, 0, 0), -X_AX(), true) + EgtCutSurfTmPlane( FacId, Point3d( dX2, 0, 0), X_AX(), false) + local LoopId = EgtExtractSurfTmFacetLoops( FacId, 0, DestGrpId) + EgtApproxCurve( LoopId, GDB_CA.LINES , 0.01) + local TmpSurfId = EgtSurfTmByFlatContour( DestGrpId, LoopId, 0.01) + EgtErase( LoopId) + if NewSurfId then + NewSurfId = EgtSurfTmBySewing( DestGrpId, {NewSurfId, TmpSurfId}) + else + NewSurfId = TmpSurfId + end + EgtErase( FacId) + FacId = EgtCopySurfTmFacet( SurfId, nF, DestGrpId) + end + end + EgtErase( FacId) + end + return NewSurfId +end + -- Recupero il pezzo del primo oggetto selezionato local ObjId = EgtGetFirstSelectedObj() local PartId = EgtGetParent( EgtGetParent( ObjId or GDB_ID.NULL) or GDB_ID.NULL) @@ -42,7 +88,8 @@ if not SolidLy then end local SolidId = EgtGetFirstNameInGroup( SolidLy, 'Solid') if not SolidId then - SolidId = EgtCopyGlob( BoxId, SolidLy) + --SolidId = EgtCopyGlob( BoxId, SolidLy) + SolidId = EgtSurfTmBBox( SolidLy, EgtGetBBoxGlob( BoxId, GDB_BB.STANDARD), true, GDB_RT.GLOB) EgtSetName( SolidId, 'Solid') EgtSetColor( SolidId, Color3d( 228, 196, 64)) Show( PartId, true) @@ -51,13 +98,19 @@ else EgtDraw() return end +local b3Solid = EgtGetBBox( SolidId, GDB_BB.STANDARD) +local dStep = 1.23 * min( max( b3Solid:getDimY(), b3Solid:getDimZ()), 2 * min( b3Solid:getDimY(), b3Solid:getDimZ())) -- Ciclo sulle features local ProcLy = EgtGetFirstNameInGroup( PartId, 'Processings') local ProcId = EgtGetFirstInGroup( ProcLy) while ProcId do if EgtGetInfo( ProcId, 'DO', 'i') ~= 0 and EgtGetType( ProcId) == GDB_TY.SRF_MESH then - EgtSurfTmIntersect( SolidId, ProcId) + local NewSurfId = RegularizeTriMesh( ProcId, SolidLy, dStep) + EgtSurfTmIntersect( SolidId, NewSurfId) + if NewSurfId ~= ProcId then + EgtErase( NewSurfId) + end end ProcId = EgtGetNext( ProcId) end