diff --git a/ShowBuilding.lua b/ShowBuilding.lua index 1f372f7..b0d68f5 100644 --- a/ShowBuilding.lua +++ b/ShowBuilding.lua @@ -1,4 +1,4 @@ --- ShowBuilding.lua by Egaltech s.r.l. 2018/11/21 +-- ShowBuilding.lua by Egaltech s.r.l. 2020/12/12 -- Gestione visualizzazione travi come struttura -- Intestazioni @@ -6,57 +6,11 @@ require( 'EgtBase') _ENV = EgtProtectGlobal() EgtEnableDebug( false) --- recupero il gruppo di assemblaggio -local AsseBaseId = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'AsseBase') -if not AsseBaseId then return end +-- Recupero l'attivazione dell'assemblaggio +local bOn = EgtBeamGetBuildingIsOn() --- recupero il primo oggetto nel gruppo e verifico se devo assemblare o disassemblare -local AsseId = EgtGetFirstInGroup( AsseBaseId) -if not AsseId then return end -local bMake = ( EgtGetGroupObjs( AsseId) == 0) - --- ciclo sul gruppo di assemblaggio -while AsseId do - -- salvo il successivo nel gruppo dell'assemblato - local NextId = EgtGetNext( AsseId) - -- costruisco l'assemblato - if bMake then - -- recupero il pezzo sorgente - local SouId = EgtGetInfo( AsseId, GDB_SI.SOURCE, 'i') - if SouId then - EgtSetMode( SouId, GDB_MD.STD) - EgtSetStatus( SouId, GDB_ST.ON) - -- se già utilizzato, ne faccio una copia - if not EgtIsPart( SouId) then - local CopyId = EgtCopy( SouId, GDB_ID.ROOT) - if CopyId then - EgtRemoveInfo( CopyId, GDB_SI.BASE) - EgtRemoveInfo( CopyId, GDB_SI.LIST) - EgtSetInfo( CopyId, GDB_SI.COPY, SouId) - SouId = CopyId - EgtSetInfo( AsseId, GDB_SI.SOURCE, SouId) - end - end - EgtSetStatus( EgtGetFirstNameInGroup( SouId, 'Box') or GDB_ID.NULL, GDB_ST.OFF) - EgtGroupSwap( SouId, AsseId, true, true) - end - -- ritorno ai pezzi - else - local BasId = EgtGetInfo( AsseId, GDB_SI.BASE, 'i') - if BasId then - EgtGroupSwap( AsseId, BasId, true, true) - local CopId = EgtGetInfo( AsseId, GDB_SI.COPY, 'i') - if CopId then - EgtErase( AsseId) - EgtSetInfo( BasId, GDB_SI.SOURCE, CopId) - else - EgtSetStatus( EgtGetFirstNameInGroup( AsseId, 'Box') or GDB_ID.NULL, GDB_ST.ON) - end - end - end - -- passo al successivo - AsseId = NextId -end +-- Modifico lo stato dell'assemblaggio +EgtBeamShowBuilding( not bOn) EgtZoom( SCE_ZM.ALL) diff --git a/ShowSolid.lua b/ShowSolid.lua index d0983f0..944a6c8 100644 --- a/ShowSolid.lua +++ b/ShowSolid.lua @@ -1,69 +1,10 @@ --- ShowSolid.lua by Egaltech s.r.l. 2020/10/06 +-- ShowSolid.lua by Egaltech s.r.l. 2020/12/12 -- 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 (max 100) - local nFacetCnt = EgtSurfTmFacetCount( SurfId) - if nFacetCnt > 100 then - return SurfId - end - -- box della superficie - local b3Surf = EgtGetBBox( SurfId, GDB_BB.STANDARD) - if not b3Surf or b3Surf:isEmpty() or b3Surf:getDimX() < 4 * 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 - GEO.EPS_SMALL and b3Fac:getMax():getX() > dX1 + GEO.EPS_SMALL 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) - if LoopId then - 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 - 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() @@ -74,60 +15,17 @@ if not PartId or not EgtIsPart( PartId) then 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( 255, 160, 32)) - Show( PartId, true) -else - Show( PartId, ( EgtGetStatus( SolidLy) == GDB_ST.OFF)) +-- Se il solido già esiste, ne aggiorno lo stato di visualizzazione +local SolidId = EgtBeamGetSolid( PartId) +if SolidId and EgtGetInfo( SolidId, 'VALID') then + EgtBeamShowSolid( PartId, ( EgtGetCalcStatus( SolidId) == 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 su outline e aperture -local OutLy = EgtGetFirstNameInGroup( PartId, 'Outline') -local OutId = EgtGetFirstInGroup( OutLy) -while OutId do - if EgtGetInfo( OutId, 'DO', 'i') ~= 0 and EgtGetType( OutId) == GDB_TY.SRF_MESH then - local NewSurfId = RegularizeTriMesh( OutId, SolidLy, dStep) - EgtSurfTmIntersect( SolidId, NewSurfId, true) - if NewSurfId ~= OutId then - EgtErase( NewSurfId) - end - end - OutId = EgtGetNext( OutId) -end - --- 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, true) - if NewSurfId ~= ProcId then - EgtErase( NewSurfId) - end - end - ProcId = EgtGetNext( ProcId) -end +-- Creazione e visualizzazione del solido +EgtBeamCalcSolid( PartId, true) +EgtBeamShowSolid( PartId, true) EgtDraw() + +-- end \ No newline at end of file