DataWindow :

- aggiunta funzione per ricalcolo solidi.
This commit is contained in:
SaraP
2025-05-16 10:56:23 +02:00
parent 3e13958d8a
commit e75cc0733c
3 changed files with 200 additions and 61 deletions
+1
View File
@@ -414,6 +414,7 @@ WIN_THRESHOLD_LEN = 'ThresholdLen'
-- FERRAMENTA
WIN_HDW_FAVOURITE = 'HdwFavourite'
WIN_HDW_NULL = '000000'
WIN_HDW_HANDLE = 'HdwHandle'
WIN_HDW_FRAME = 'HdwFrame'
WIN_HDW_HANDLE_HEIGHT = 'HMan'
+193 -61
View File
@@ -21,6 +21,7 @@ require( 'EgtBase')
require( 'WinConst')
local s_dDowelTol = 1
local s_dSimplSolidApprox = 0.2 -- approssimazione lineare nel caso di solidi semplificati
local s_nSashNbr = 0 -- contatore delle ante per assegnare nomi
local s_bCalcSolid = false
@@ -2142,6 +2143,7 @@ local function CalcGeoRaw( nPartId)
end
----------------------------------------------------------------------------------
---------------------------------- SOLIDO ----------------------------------------
----------------------------------------------------------------------------------
@@ -2204,7 +2206,7 @@ local function CreateProfileSurfById( nOutlineId, nProfileId, nSectionId, dExtra
return nStmId
end
----------------------------------------------------------------------------------
---------------------------------------------------------------------
-- come CreateProfileSurfById ma riceve il nome della sezione da estrudere
local function CreateProfileSurf( nOutlineId, nProfileId, sSectionName, dExtraLen, nLayerId)
-- recupero l'id della sezione da estrudere
@@ -2394,6 +2396,7 @@ local function CalcMixedFrameSolid( nOutlineId, nSolidLayerId, nProfileLayerId,
EgtSetStatus( nTrimSurfEnd, GDB_ST.OFF)
EgtSurfTmIntersect( vMainExtrusions[1], nTrimSurfEnd)
return vMainExtrusions[1]
end
---------------------------------------------------------------------
@@ -2424,6 +2427,8 @@ local function CalcMixedSplitSolid( nOutlineId, nSolidLayerId, nProfileLayerId,
EgtSetName( nStmTrimEnd, WIN_SRF_END)
EgtSetStatus( nStmTrimEnd, GDB_ST.OFF)
EgtSurfTmIntersect( nMainExtrusionId, nStmTrimEnd)
return nMainExtrusionId
end
---------------------------------------------------------------------
@@ -2483,6 +2488,8 @@ local function CalcSolid( nPartId, nOutlineId)
-- eseguo intersezione per ottenere un solido unico
EgtSurfTmIntersect( nMainExtrusionId, nTrimSurf)
end
return nMainExtrusionId
end
---------------------------------------------------------------------
@@ -2500,33 +2507,38 @@ local function CalcFillSolid( nPartId, nOutlineLayerId, nGeoLayerId)
EgtErase( nCompoOutlineId)
end
----------------------------------------------------------------------------------
-- funzione che aggiorna il solido principale con quello associato ad una lavorazione partendo dalla sua curva
local function UpdateSolidWithProcessingSurf( nProcId, nSolidId, nLayerId)
if not EgtCurveIsClosed( nProcId) then
return
end
local vtExtr = EgtCurveExtrusion( nProcId)
local dThick = EgtCurveThickness( nProcId)
local nRefCrv = nProcId
-- se solidi semplificati approssimo in modo grossolano per velocizzare operazioni di subtract ( soprattuto su archi)
if s_bSimplSolid then
nRefCrv = EgtCopyGlob( nProcId, nLayerId)
EgtApproxCurve( nRefCrv, GDB_CA.LINES, s_dSimplSolidApprox)
end
local nProcSolidId = EgtSurfTmByRegionExtrusion( nLayerId, nRefCrv, dThick * vtExtr)
-- sottraggo al solido
EgtSurfTmSubtract( nSolidId, nProcSolidId)
EgtErase( nProcSolidId)
if s_bSimplSolid then
EgtErase( nRefCrv)
end
end
----------------------------------------------------------------------------------
---------------------------------- DOWELS ----------------------------------------
----------------------------------------------------------------------------------
-- funzione che sottrae il dowel al solido
local function UpdateSolidWithDowel( nDowelId, nSolidId, vtDir, dLen, nLayerId)
-- creo il solido del dowel a partire dalla circonferenza che lo definisce
local nDowelSolidId
if s_bSimplSolid then
-- se solidi semplificati creo foro grossolano per velocizzare operazioni di subtract
local nDowelApprox = EgtCopyGlob( nDowelId, nLayerId)
EgtApproxCurve( nDowelApprox, GDB_CA.LINES, 0.2)
nDowelSolidId = EgtSurfTmByRegionExtrusion( nLayerId, nDowelApprox, vtDir * dLen)
EgtErase( nDowelApprox)
else
nDowelSolidId = EgtSurfTmByRegionExtrusion( nLayerId, nDowelId, vtDir * dLen)
end
-- sottraggo il dowel al solido
EgtSurfTmSubtract( nSolidId, nDowelSolidId)
EgtErase( nDowelSolidId)
end
---------------------------------------------------------------------
-- funzione che recupera la lunghezza del dowel
local function CalcDowelLen( nDowelId, sKey, bFullOrShort)
@@ -2627,7 +2639,7 @@ local function CreateDowel( nOrigDowelId, nLayerId, frOrig, frDest, vtDir, nTest
-- eventuale aggiornamento del solido
if nMainExtrusionId then
UpdateSolidWithDowel( nDowelId, nMainExtrusionId, vtDir, dLen, nLayerId)
UpdateSolidWithProcessingSurf( nDowelId, nMainExtrusionId, nLayerId)
end
return nDowelId
@@ -3922,7 +3934,7 @@ local function CalcLogDowel( nOrigPartId, nCrvOut, bLeftOrRight, nProcLayerId, n
-- eventuale aggiornamento del solido
if nSolidId then
UpdateSolidWithDowel( nDowelId, nSolidId, vtDir, dLen, nProcLayerId)
UpdateSolidWithProcessingSurf( nDowelId, nSolidId, nProcLayerId)
end
end
@@ -4239,22 +4251,6 @@ function WinCalculate.CreateArcLogs( nPartId, nLogsNbr, vSections, bAlign, dOver
end
----------------------------------------------------------------------------------
------------------------------ FUNZIONI ----------------------------------------
----------------------------------------------------------------------------------
-- funzione che crea tutti i pezzi della finestra partendo dal telaio
function WinCalculate.CreatePartFromArea( nFrameId)
-- assegno il tipo di profilo alle curve del base outline
CalculateAreaProfileType( nFrameId)
-- calcolo outline a partire dal base outline
CalculateAreaOutline( nFrameId)
-- creo pezzi
s_nSashNbr = 0 -- resetto il numero di ante del progetto
CalculateAreaParts( nFrameId)
-- calcolo le spine
CalculateAreaDowels( nFrameId)
end
----------------------------------------------------------------------------------
---------------------------------- FERRAMENTA ----------------------------------
@@ -4707,7 +4703,7 @@ function WinCalculate.AddHardwareForSash( nFrameId, bOnlyRequest)
if bOnlyRequest then
nFavourite = WDG.HDWFAVOURITE
end
if not nFavourite or nFavourite == '000000' then
if not nFavourite or nFavourite == WIN_HDW_NULL then
EgtOutLog('Warning! No hardware favourite set!')
return
end
@@ -4963,18 +4959,12 @@ function WinCalculate.AddHardwareForSash( nFrameId, bOnlyRequest)
EgtSetInfo( nPocketOutlineId, WIN_PRC_SIDE, WIN_PRC_SIDETYPE.IN)
EgtModifyCurveExtrusion( nPocketOutlineId, Z_AX())
EgtModifyCurveThickness( nPocketOutlineId, - dHeight)
-- aggiornamento del solido
if s_bCalcSolid then
-- costruisco asola come volume chiuso per eseguire operazioni booleane con il solido
local nOutlineId = EgtCopyGlob( nPocketOutlineId, nSolidLayerId)
EgtMove( nOutlineId, Z_AX())
local nSolidId = EgtSurfTmByRegionExtrusion( nProcLayerId, nOutlineId, - ( dHeight + 1) * Z_AX())
EgtTransform( nSolidId, frHdw)
EgtSurfTmSubtract( nMainExtrusionId, nSolidId)
EgtErase( {nSolidId, nOutlineId})
end
-- porto la lavorazione in globale
EgtTransform( nPocketOutlineId, frHdw)
-- aggiornamento del solido
if s_bCalcSolid then
UpdateSolidWithProcessingSurf( nPocketOutlineId, nMainExtrusionId, nSolidLayerId)
end
elseif vMacro[1] == 'TASCA' then
elseif vMacro[1] == 'VITE' then
@@ -4990,7 +4980,7 @@ function WinCalculate.AddHardwareForSash( nFrameId, bOnlyRequest)
local nHoleId = EgtCircle( nProcLayerId, ptCenter, dRadius)
EgtMove( nHoleId, Z_AX())
EgtModifyCurveExtrusion( nHoleId, Z_AX())
EgtModifyCurveThickness( nHoleId, - dDepth)
EgtModifyCurveThickness( nHoleId, - ( dDepth + 1))
EgtTransform( nHoleId, frHdw)
EgtSetInfo( nHoleId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.HOLE)
@@ -5008,16 +4998,12 @@ function WinCalculate.AddHardwareForSash( nFrameId, bOnlyRequest)
EgtModifyCurveThickness( nHoleId, - dDepth)
EgtSetColor( nHoleId, EgtStdColor( 'GRAY'))
EgtSetInfo( nHoleId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.HOLE)
-- aggiornamento del solido
if s_bCalcSolid then
local nSolidHoleId = EgtSurfTmByRegionExtrusion( nProcLayerId, nHoleId, - ( dDepth + 1) * Z_AX())
EgtMove( nSolidHoleId, Z_AX())
EgtTransform( nSolidHoleId, frHdw)
EgtSurfTmSubtract( nMainExtrusionId, nSolidHoleId)
EgtErase( nSolidHoleId)
end
-- porto la lavorazione in globale
EgtTransform( nHoleId, frHdw)
-- aggiornamento del solido
if s_bCalcSolid then
UpdateSolidWithProcessingSurf( nHoleId, nMainExtrusionId, nSolidLayerId)
end
end
end
@@ -5058,6 +5044,64 @@ function WinCalculate.AddHardware( nAreaId)
end
end
---------------------------------------------------------------------
-- funzione che disegna l'hardware
local function DrawHardware( nAreaId, nAuxLayerId)
-- verifico il tipo
local nAreaType = EgtGetInfo( nAreaId, WIN_AREATYPE, 'i')
-- se anta disegno la ferramenta
if nAreaType == WIN_AREATYPES.SASH then
-- se è stato definito un preferito disegno la ferramenta
local sFavourite = EgtGetInfo( nAreaId, WIN_HDW_FAVOURITE) or WIN_HDW_NULL
if sFavourite ~= WIN_HDW_NULL then
DrawSashHardware( nAreaId, nAreaId, nAuxLayerId)
end
return
else
-- verifico se contiene un french split
local nSplitLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_SPLIT)
local nSplitType = WIN_SPLITTYPES.NULL
if nSplitLayerId then
nSplitType = EgtGetInfo( nSplitLayerId, WIN_SPLITTYPE, 'i')
end
if nSplitType == WIN_SPLITTYPES.FRENCH then
-- se ha definito un preferito devo disegnare la ferramenta
local sFavourite = EgtGetInfo( nAreaId, WIN_HDW_FAVOURITE) or WIN_HDW_NULL
if sFavourite ~= WIN_HDW_NULL then
-- recupero tutte le sottoaree di tipo anta
local vSashes = {}
local vStack = EgtGetNameInGroup( nAreaId, WIN_AREA .. '*')
local i = 1
while vStack[i] do
local nType = EgtGetInfo( vStack[i], WIN_AREATYPE, 'i')
if nType == WIN_AREATYPES.SASH then
table.insert( vSashes, vStack[i])
else
local vChildren = EgtGetNameInGroup( vStack[i], WIN_AREA .. '*')
vStack = EgtJoinTables( vStack, vChildren)
end
end
-- disegno la ferramenta su tutte le ante
for i = 1, #vSashes do
DrawSashHardware( vSashes[i], nAreaId, nAuxLayerId)
end
end
return
else
-- verifico se ci sono sotto-aree
local nChildAreaId = EgtGetFirstNameInGroup( nAreaId, WIN_AREA .. '*')
while nChildAreaId do
-- lancio verifica di quell'area
DrawHardware( nChildAreaId, nAuxLayerId)
nChildAreaId = EgtGetNextName( nChildAreaId, WIN_AREA .. '*')
end
end
end
end
----------------------------------------------------------------------------------
----------------------------------- ACCESSORI ----------------------------------
@@ -5490,5 +5534,93 @@ function WinCalculate.AddAccessories( nAreaId, bDraw)
end
end
----------------------------------------------------------------------------------
------------------------------ FUNZIONI ----------------------------------------
----------------------------------------------------------------------------------
-- funzione che crea tutti i pezzi della finestra partendo dal telaio
function WinCalculate.CreatePartFromArea( nFrameId)
-- assegno il tipo di profilo alle curve del base outline
CalculateAreaProfileType( nFrameId)
-- calcolo outline a partire dal base outline
CalculateAreaOutline( nFrameId)
-- creo pezzi
s_nSashNbr = 0 -- resetto il numero di ante del progetto
CalculateAreaParts( nFrameId)
-- calcolo le spine
CalculateAreaDowels( nFrameId)
end
---------------------------------------------------------------------
-- funzione che ricalcola i solidi ( per cambio modalità visualizzazione)
function WinCalculate.RecalcSolids( nFrameId)
-- scorro tutti i pezzi
local nPartId = EgtGetFirstPart()
while nPartId do
-- se solidi non vanno calcolati elimino semplicemente il gruppo dei solidi da ogni pezzo
if not s_bCalcSolid then
local nSolidLayId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID) or GDB_ID.NULL
EgtErase( nSolidLayId)
-- ricalcolo dei solidi
else
-- se fill, lo uso per ricalcolare strip
if EgtExistsInfo( nPartId, WIN_FILLTYPE) then
local nAreaId = EgtGetInfo( nPartId, WIN_AREA, 'i')
local nParentAreaId = EgtGetParent( nAreaId)
local nParentOutlineLayId = EgtGetFirstNameInGroup( nParentAreaId, WIN_OUTLINE)
local vParentOutlines = EgtGetAllInGroup( nParentOutlineLayId)
for i = 1, #vParentOutlines do
CreateStripFromOutline( nParentAreaId, vParentOutlines[i])
end
-- verifico se solido da calcolare
local nSolidLayId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID)
if not nSolidLayId then
local nOutlineLayId = EgtGetFirstNameInGroup( nAreaId, WIN_OUTLINE)
local nGeoLayId = EgtGetFirstNameInGroup( nPartId, WIN_GEO)
CalcFillSolid( nPartId, nOutlineLayId, nGeoLayId)
end
-- se pezzo, ricalcolo il suo solido
else
-- elimino gruppo dei solidi
local nSolidLayId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID) or GDB_ID.NULL
EgtErase( nSolidLayId)
-- ricalcolo il solido principale
local nOutlineId = EgtGetInfo( nPartId, WIN_REF_OUTLINE, 'i')
local nSolidId = CalcSolid( nPartId, nOutlineId)
-- aggiungo lavorazioni
local nProcLayId = EgtGetFirstNameInGroup( nPartId, WIN_PRC)
local vProc = EgtGetAllInGroup( nProcLayId)
for i = 1, #vProc do
local nType = EgtGetInfo( vProc[i], WIN_PRC_FEATURE_TYPE)
local nProfilingType = EgtGetInfo( vProc[i], WIN_PRC_PROFILE_INFO)
if nType == WIN_PRC_TYPE.HOLE or ( nType == WIN_PRC_TYPE.PROFILING and nProfilingType == WIN_PRC_PROFILE_TYPE.GENERIC) then
UpdateSolidWithProcessingSurf( vProc[i], nSolidId, nProcLayId)
end
end
end
end
nPartId = EgtGetNextPart( nPartId)
end
-- accessori e ferramenta
local nAuxGrp = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_AUX)
if not s_bCalcSolid then
EgtErase( nAuxGrp or GDB_ID.NULL)
elseif not nAuxGrp then
nAuxGrp = GetAuxLayer()
-- ferramenta
DrawHardware( nFrameId, nAuxGrp)
-- accessori
WinCalculate.AddAccessories( nFrameId, true)
end
end
---------------------------------------------------------------------
return WinCalculate
+6
View File
@@ -202,6 +202,12 @@ local function WinCalculate_CreatePartFromArea()
end
_G.WinCalculate_CreatePartFromArea = WinCalculate_CreatePartFromArea
----------------------------------------------------------------------------------
local function WinCalculate_RecalcSolids()
WinCalculate.RecalcSolids( WDG.FRAMEID)
end
_G.WinCalculate_RecalcSolids = WinCalculate_RecalcSolids
----------------------------------------------------------------------------------
local function WinCalculate_AddHardware()
WinCalculate.AddHardware( WDG.FRAMEID)