Files
DataBeamWall/SolidProcess.lua
T
Dario Sassi 355b375f47 BeamWall :
- reinserito script per convertire superfici TriMesh in Pezzi come da BTL.
2024-12-30 13:12:02 +01:00

119 lines
3.5 KiB
Lua

-- 2024/12/30
-- Parti solide gestite come travi BTL
-- Intestazioni
require( 'EgtBase')
_ENV = EgtProtectGlobal()
EgtEnableDebug( false)
-- calcolo del riferimento del minimo box
local function SolidMinBox( nId, dMinFaceArea)
-- ciclo sulle facce della superficie
local nFacCnt = EgtSurfTmFacetCount( nId)
local dVolMin
local refMin
local b3Min
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( nId1, ptPos)
-- Calcolo il riferimento del suo box minimo
local refMin, b3Min = SolidMinBox( nId1, 100)
if not refMin then
refMin, b3Min = SolidMinBox( nId1)
end
if not refMin then
EgtOutText( 'Errore nel calcolo del box minimo della superficie (' .. tostring( nId1) .. ')')
EgtPause( 1000)
return false, 0
end
-- Modifico il riferimento in modo che X sia sul più lungo, quindi Z e poi Y
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
if dDimZ < dDimY then
refMin:rotate( refMin:getOrigin(), refMin:getVersX(), 90)
dDimZ, dDimY = dDimY, dDimZ
end
-- Porto il solido nell'origine
refMin:invert()
EgtTransform( nId1, refMin, GDB_RT.GLOB)
local b3Box = EgtGetBBoxGlob( nId1, GDB_BB.STANDARD)
local vtMove = ORIG() - b3Box:getMin()
EgtMove( nId1, 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
EgtRelocate( nId1, ProcId)
-- 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
-------------------------------------------------------------------
local ptIns = ORIG()
local bOk = true
local nId = EgtGetFirstSelectedObj()
while nId do
EgtDeselectObj( nId)
local bOneOk, dDimY = ProcessOneSolid( nId, ptIns)
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