-- ShowSolid.lua by Egaltech s.r.l. 2020/01/03 -- Gestione calcolo solido di una Trave require( 'EgtBase') _ENV = EgtProtectGlobal() EgtEnableDebug( false) -- Funzione per visualizzazione del solido o standard local function Show( PartId, bSolid) local BoxLy = EgtGetFirstNameInGroup( PartId, 'Box') EgtSetStatus( BoxLy or GDB_ID.NULL, EgtIf( bSolid, GDB_ST.OFF, GDB_ST.ON)) local OutlineLy = EgtGetFirstNameInGroup( PartId, 'Outline') EgtSetStatus( OutlineLy or GDB_ID.NULL, EgtIf( bSolid, GDB_ST.OFF, GDB_ST.ON)) local ProcessingsLy = EgtGetFirstNameInGroup( PartId, 'Processings') EgtSetStatus( ProcessingsLy or GDB_ID.NULL, EgtIf( bSolid, GDB_ST.OFF, GDB_ST.ON)) local SolidLy = EgtGetFirstNameInGroup( PartId, 'Solid') 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 not b3Surf or b3Surf:isEmpty() or 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) EgtMergeCurvesInCurveCompo( LoopId, 0.001) 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) if not PartId or not EgtIsPart( PartId) then EgtOutBox( 'Nessuna trave selezionata', 'Show Solid', 'ERROR') return end EgtDeselectAll() -- Recupero il Box local BoxLy = EgtGetFirstNameInGroup( PartId, 'Box') local BoxId = EgtGetFirstNameInGroup( BoxLy or GDB_ID.NULL, 'Box') if not BoxId then EgtOutBox( 'Trave senza Box', 'Show Solid', 'ERROR') return end -- Verifico esistenza del solido local SolidLy = EgtGetFirstNameInGroup( PartId, 'Solid') if not SolidLy then SolidLy = EgtGroup( PartId) EgtSetName( SolidLy, 'Solid') end local SolidId = EgtGetFirstNameInGroup( SolidLy, 'Solid') if not SolidId then SolidId = EgtSurfTmBBox( SolidLy, EgtGetBBoxGlob( BoxId, GDB_BB.STANDARD), true, GDB_RT.GLOB) EgtSetName( SolidId, 'Solid') EgtSetColor( SolidId, Color3d( 228, 196, 64)) Show( PartId, true) else Show( PartId, ( EgtGetStatus( SolidLy) == GDB_ST.OFF)) 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 EgtGetInfo( ProcId, 'TRIM', 'i') ~= 0 and EgtGetType( ProcId) == GDB_TY.SRF_MESH then local NewSurfId = RegularizeTriMesh( ProcId, SolidLy, dStep) EgtSurfTmIntersect( SolidId, NewSurfId) if NewSurfId ~= ProcId then EgtErase( NewSurfId) end end ProcId = EgtGetNext( ProcId) end EgtDraw()