Files
DataBeam/ShowSolid.lua
T
Dario Sassi 17870b5dee DataBeam :
- correzioni varie.
2020-04-05 22:21:45 +00:00

118 lines
4.4 KiB
Lua

-- 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()