-- 2025/03/16 -- Parti solide gestite come travi BTL -- Intestazioni require( 'EgtBase') _ENV = EgtProtectGlobal() EgtEnableDebug( false) -- calcolo del riferimento del minimo box local function SolidMinBox( nId, dMinFaceArea) -- parto con orientamento corrente local refMin = Frame3d() local b3Min = EgtGetBBoxRef( nId, GDB_BB.STANDARD, refMin) local dVolMin = 0.98 * b3Min:getDimX() * b3Min:getDimY() * b3Min:getDimZ() -- ciclo sulle facce della superficie local nFacCnt = EgtSurfTmFacetCount( nId) for i = 1, nFacCnt do local refFace, dL, dW = EgtSurfTmFacetMinAreaRectangle( nId, i - 1, GDB_ID.ROOT) if refFace and ( not dMinFaceArea or dL * dW > dMinFaceArea) then local b3Box = EgtGetBBoxRef( nId, GDB_BB.STANDARD, refFace) if b3Box then local dVol = b3Box:getDimX() * b3Box:getDimY() * b3Box:getDimZ() if not dVolMin or dVol < dVolMin then dVolMin = dVol refMin = refFace b3Min = b3Box end end end end return refMin, b3Min end -- Trasformazione di un oggetto solido local function ProcessOneSolid( nId, ptPos, bFullLayer) -- Calcolo il riferimento del suo box minimo local refMin, b3Min = SolidMinBox( nId, 100) if not refMin then refMin, b3Min = SolidMinBox( nId) end if not refMin then EgtOutText( 'Errore nel calcolo del box minimo della superficie (' .. tostring( nId) .. ')') EgtPause( 1000) return false, 0 end -- Se tutto il layer ricalcolo il box minimo sul layer e determino tutti i suoi oggetti local LayId local vAllId = { nId} if bFullLayer then LayId = EgtGetParent( nId) vAllId = EgtGetAllInGroup( LayId) b3Min = EgtGetBBoxRef( LayId, GDB_BB.STANDARD, refMin) end -- Modifico il riferimento in modo che X sia sul più lungo local dDimX = b3Min:getDimX() local dDimY = b3Min:getDimY() local dDimZ = b3Min:getDimZ() if dDimX < dDimY then refMin:rotate( refMin:getOrigin(), refMin:getVersZ(), 90) dDimX, dDimY = dDimY, dDimX end if dDimX < dDimZ then refMin:rotate( refMin:getOrigin(), refMin:getVersY(), 90) dDimX, dDimZ = dDimZ, dDimX end -- Porto il solido nell'origine refMin:invert() EgtTransform( vAllId, refMin, GDB_RT.GLOB) local b3Box = EgtGetBBoxGlob( LayId or nId, GDB_BB.STANDARD) local vtMove = ORIG() - b3Box:getMin() EgtMove( vAllId, vtMove, GDB_RT.GLOB) b3Box:move( vtMove) -- Creo un nuovo pezzo local PzId = EgtGroup( GDB_ID.ROOT) local PartId = EgtGroup( PzId) EgtSetName( PartId or GDB_ID.NULL, 'Part') local BoxId = EgtGroup( PzId) EgtSetName( BoxId or GDB_ID.NULL, 'Box') local ProcId = EgtGroup( PzId) EgtSetName( ProcId or GDB_ID.NULL, 'Proc') -- Sposto il solido nel pezzo for i = 1, #vAllId do EgtRelocate( vAllId[i], ProcId) end -- Calcolo il box local SboxId = EgtSurfTmBBox( BoxId, b3Box) EgtSetColor( SboxId or GDB_ID.NULL, {206,199,113,30}) -- Assegno il nome local sText = string.format( '%.0f x %.0f x %.0f', dDimX, dDimY, dDimZ) local ptText = b3Box:getCenter() + Vector3d( 0, 0, dDimZ / 2) local TxtId = EgtTextAdv( PartId, ptText, 0, sText, '', 100, 'S', dDimY / 4, 1, 0, GDB_TI.MC) EgtSetColor( TxtId or GDB_ID.NULL, {0,0,0,100}) -- Sposto il pezzo if ptPos then EgtMove( PzId, ptPos - ORIG()) end return true, dDimY end ------------------------------------------------------------------- -- Chiedo se spostare tutti gli oggetti del layer degli oggetti local vsVal = EgtDialogBox( 'SolidProcess', { 'Full Layer', ' CB:*true,false'}) if not vsVal then return end local bFullLayer = ( vsVal[1] == 'true') -- Eseguo local ptIns = ORIG() local bOk = true local nId = EgtGetFirstSelectedObj() while nId do EgtDeselectObj( nId) local bOneOk, dDimY = ProcessOneSolid( nId, ptIns, bFullLayer) EgtDraw() bOk = bOk and bOneOk ptIns = ptIns + Vector3d( 0, dDimY + 200, 0) nId = EgtGetFirstSelectedObj() end if not bOk then EgtOutBox( 'Una o più entità selezionate non sono superfici', 'SolidProcess', 'WARNING', 'OK') end