17870b5dee
- correzioni varie.
118 lines
4.4 KiB
Lua
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()
|