77a3681439
- nella trasformazione di Trimesh in oggetti BTL ora si può scegliere di spostare tutte le entità del layer della Trimesh.
136 lines
4.1 KiB
Lua
136 lines
4.1 KiB
Lua
-- 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
|