EgwWindowLua :
- integrato il calcolo degli split dowels nel calcolo del solido - modifica alla struttura della ricorsione nel calcolo dei pezzi dal telaio.
This commit is contained in:
@@ -656,7 +656,6 @@ WinCalculate.SetCalcSolid( true)
|
||||
|
||||
-- -- creo i pezzi
|
||||
WinCalculate.CreatePartFromArea( nFrameId)
|
||||
WinCalculate.AddSplitDowelToParts( nFrameId)
|
||||
WinCalculate.AddHardware( nFrameId)
|
||||
|
||||
-- -- creo tabella per salvataggio
|
||||
|
||||
+234
-241
@@ -333,6 +333,19 @@ local function CalcProfileType( nAreaId)
|
||||
end
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- funzione che cicla ricorsivamente su aree e sottoaree per impostare i tipi di profilo
|
||||
local function CalculateAreaProfileType( nAreaId)
|
||||
-- calcolo i profili per l'area corrente
|
||||
CalcProfileType( nAreaId)
|
||||
-- calcolo i profili per le eventuali sottoaree
|
||||
local nChildAreaId = EgtGetFirstNameInGroup( nAreaId, WIN_AREA .. '*')
|
||||
while nChildAreaId do
|
||||
CalculateAreaProfileType( nChildAreaId)
|
||||
nChildAreaId = EgtGetNextName( nChildAreaId, WIN_AREA .. '*')
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
---------------------------------------------------------------------
|
||||
--------------------- CALCOLO OUTLINE -------------------------------
|
||||
@@ -601,6 +614,20 @@ local function CalculateOutlineFromAreaOutline( nAreaId)
|
||||
EgtErase( nCompoId)
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- funzione che cicla ricorsivamente su aree e sottaree per calcolare gli outlines
|
||||
local function CalculateAreaOutline( nAreaId)
|
||||
-- calcolo outlines per l'area corrente
|
||||
CalculateOutlineFromAreaOutline( nAreaId)
|
||||
-- calcolo outlines per le eventuali sottoaree
|
||||
local nChildAreaId = EgtGetFirstNameInGroup( nAreaId, WIN_AREA .. '*')
|
||||
while nChildAreaId do
|
||||
CalculateAreaOutline( nChildAreaId)
|
||||
nChildAreaId = EgtGetNextName( nChildAreaId, WIN_AREA .. '*')
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
---------------------------------------------------------------------
|
||||
---------------------- CALCOLO PEZZI ------------------------------
|
||||
@@ -958,7 +985,7 @@ local function CalcStartEndProfileType( nProfileType, nOutlineId, nStartProfileI
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function AddDowelStart( nOutlineId, nPrevOutlineId, StartJointType, nMainProfileId, nStartProfileId, nDowelLayerId, nGeoInId, nSolidLayerId,
|
||||
local function AddStartDowels( nOutlineId, nPrevOutlineId, StartJointType, nMainProfileId, nStartProfileId, nDowelLayerId, nGeoInId, nSolidLayerId,
|
||||
nMainExtrusionId, nStartExtrusionId, nExtrCopyId)
|
||||
|
||||
local sOutlineName = EgtGetName( nOutlineId)
|
||||
@@ -1085,8 +1112,8 @@ local function AddDowelStart( nOutlineId, nPrevOutlineId, StartJointType, nMainP
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function AddDowelEnd( nOutlineId, nEndOutlineId, EndJointType, nMainProfileId, nEndProfileId, nDowelLayerId, nGeoInId, nSolidLayerId,
|
||||
nMainExtrusionId, nEndExtrusionId, nExtrCopyId)
|
||||
local function AddEndDowels( nOutlineId, nEndOutlineId, EndJointType, nMainProfileId, nEndProfileId, nDowelLayerId, nGeoInId, nSolidLayerId,
|
||||
nMainExtrusionId, nEndExtrusionId, nExtrCopyId)
|
||||
|
||||
local sOutlineName = EgtGetName( nOutlineId)
|
||||
local sEndOutlineName = EgtGetName( nEndOutlineId)
|
||||
@@ -1329,7 +1356,7 @@ local function MakeSolidByExtrusion( nGeoId, nOutlineId, nMainProfileId, nStartP
|
||||
EgtSurfTmCut( nStartExtrusionId, nExtrCopyId, true, false)
|
||||
|
||||
-- creo fori per spine su Start
|
||||
AddDowelStart( nOutlineId, nPrevOutlineId, StartJointType, nMainProfileId, nStartProfileId, nDowelLayerId, nGeoInId, nSolidLayerId, nMainExtrusionId, nStartExtrusionId, nExtrCopyId)
|
||||
AddStartDowels( nOutlineId, nPrevOutlineId, StartJointType, nMainProfileId, nStartProfileId, nDowelLayerId, nGeoInId, nSolidLayerId, nMainExtrusionId, nStartExtrusionId, nExtrCopyId)
|
||||
|
||||
|
||||
-- c) END PROFILE
|
||||
@@ -1403,12 +1430,165 @@ local function MakeSolidByExtrusion( nGeoId, nOutlineId, nMainProfileId, nStartP
|
||||
EgtSurfTmCut( nEndExtrusionId, nExtrCopyId, true, false)
|
||||
|
||||
-- creo fori per spine su End
|
||||
AddDowelEnd( nOutlineId, nEndOutlineId, EndJointType, nMainProfileId, nEndProfileId, nDowelLayerId, nGeoInId, nSolidLayerId, nMainExtrusionId, nEndExtrusionId, nExtrCopyId)
|
||||
AddEndDowels( nOutlineId, nEndOutlineId, EndJointType, nMainProfileId, nEndProfileId, nDowelLayerId, nGeoInId, nSolidLayerId, nMainExtrusionId, nEndExtrusionId, nExtrCopyId)
|
||||
|
||||
-- elimino copia dell'estrusione principale
|
||||
EgtErase( { nExtrCopyId})
|
||||
end
|
||||
|
||||
----------------------------------------------------------------------------------
|
||||
------------------------------- SPLIT DOWELS -------------------------------------
|
||||
----------------------------------------------------------------------------------
|
||||
-- funzione che calcola intersezione, geometrie e superfici dei dowel degli split
|
||||
local function CalSplitDowel( nSplitLayerId, nOutlineId, nProfileType, nPartId)
|
||||
|
||||
-- verifico se interseca l'outline che sto analizzando
|
||||
local nSplitId = EgtGetFirstInGroup( nSplitLayerId)
|
||||
local ptInt = EgtIP( nOutlineId, nSplitId, EgtSP( nSplitId))
|
||||
if not ptInt then
|
||||
return
|
||||
end
|
||||
|
||||
-- se interseca, recupero il profilo dello split
|
||||
local nOrigSplitProfileId = GetOutlineProfileId( nSplitId, false)
|
||||
|
||||
-- creo copia del profilo
|
||||
local nFrameProfileLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PROFILE)
|
||||
local nSplitProfileId = EgtCopy( nOrigSplitProfileId, nFrameProfileLayerId)
|
||||
local sSplitProfileType = EgtGetName( nOrigSplitProfileId)
|
||||
EgtSetInfo( nSplitProfileId, WIN_PRF_TYPE, sSplitProfileType)
|
||||
EgtSetName( nSplitProfileId, WIN_PRF_SPLIT)
|
||||
|
||||
-- recupero intersezione con lato In o Out del geo
|
||||
local nGeoLayerId = EgtGetFirstNameInGroup( nPartId, WIN_GEO)
|
||||
local nGeoCrvId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_IN)
|
||||
local ptInters = EgtIP( nGeoCrvId, nSplitId, EgtSP( nSplitId))
|
||||
if not ptInters and nProfileType == WIN_PRF.SPLIT then
|
||||
nGeoCrvId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_OUT)
|
||||
ptInters = EgtIP( nGeoCrvId, nSplitId, EgtSP( nSplitId))
|
||||
end
|
||||
|
||||
-- recupero frame del profilo e lo applico a tutte le sue geometrie
|
||||
local nSplitProfileFrameId = EgtGetFirstNameInGroup( nSplitProfileId, WIN_SECTIONFRAME)
|
||||
local frInvertSplitProfile = EgtFR( nSplitProfileFrameId)
|
||||
frInvertSplitProfile:invert()
|
||||
EgtTransform( EgtGetAllInGroup( nSplitProfileId), frInvertSplitProfile)
|
||||
-- assegno come riferimento del profilo il punto di intersezione e la direzione dello split
|
||||
local vtDir = - EgtSV( nSplitId) -- se non fosse lineare potrebbe essere end vector ?
|
||||
EgtChangeGroupFrame( nSplitProfileId, Frame3d( ptInters, vtDir))
|
||||
|
||||
-- calcolo la direzione del dowel sempre verso l'interno del pezzo
|
||||
local vtDowelDir = Vector3d( vtDir)
|
||||
local _, _, nSide = EgtPointCurveDistSide( ptInters + vtDowelDir, nGeoCrvId, Z_AX())
|
||||
if nSide == 1 then
|
||||
-- se a destra della curva significa che la direzione è uscente dal pezzo e va invertita
|
||||
vtDowelDir = - vtDowelDir
|
||||
end
|
||||
|
||||
-- recupero solido del pezzo
|
||||
local nSolidLayerId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID)
|
||||
local nMainExtrusionId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_SRF_MAIN)
|
||||
local nOrigMainExtrusionId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_SRF_ORIGMAIN)
|
||||
|
||||
-- creo fori per spine su Split
|
||||
local nDowelLayerId = EgtGetFirstNameInGroup( nPartId, WIN_DOWEL)
|
||||
|
||||
-- recupero profondita' d'inizio e fine
|
||||
local sStart = WIN_DWL_TOPPERPSTART
|
||||
local sEnd = WIN_DWL_TOPPERPEND
|
||||
if nProfileType == WIN_PRF.BOTTOM then
|
||||
sStart = WIN_DWL_BOTTOMPERPSTART
|
||||
sEnd = WIN_DWL_BOTTOMPERPEND
|
||||
elseif nProfileType == WIN_PRF.BOTTOMRAIL then
|
||||
sStart = WIN_DWL_RAILBOTTOMPERPSTART
|
||||
sEnd = WIN_DWL_RAILBOTTOMPERPEND
|
||||
elseif nProfileType == WIN_PRF.SPLIT then
|
||||
local sProfileType = EgtGetInfo( nOutlineId, WIN_PROFILETYPE)
|
||||
if sProfileType == WIN_SASH_HORIZONTAL then
|
||||
sStart = WIN_DWL_HORIZONTALSPLITPERPSTART
|
||||
sEnd = WIN_DWL_HORIZONTALSPLITPERPEND
|
||||
-- sta sempre leggendo l'informazione corretta? ( cfr dowel per start ed end nella crezione del solido)
|
||||
elseif sProfileType == WIN_SASH_VERTICAL then
|
||||
sStart = WIN_DWL_VERTICALSPLITPERPSTART
|
||||
sEnd = WIN_DWL_VERTICALSPLITPERPEND
|
||||
else -- sProfileType == WIN_FRAME_SPLIT
|
||||
sStart = WIN_DWL_SPLITPERPSTART
|
||||
sEnd = WIN_DWL_SPLITPERPEND
|
||||
end
|
||||
end
|
||||
|
||||
-- ciclo sui fori trovati
|
||||
local nOrigDowelId = EgtGetFirstNameInGroup( nSplitProfileId, WIN_DOWEL .. '*')
|
||||
while nOrigDowelId do
|
||||
local dStart = EgtGetInfo( nOrigDowelId, sStart, 'd')
|
||||
if not dStart then
|
||||
dStart = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPSTART, 'd')
|
||||
end
|
||||
local dEnd = EgtGetInfo( nOrigDowelId, sEnd, 'd')
|
||||
if not dEnd then
|
||||
dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPEND, 'd')
|
||||
end
|
||||
local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId)
|
||||
EgtSetColor( nDowelId, Color3d( 128, 128, 128))
|
||||
|
||||
-- posiziono il dowel e gli assegno estrusione e spessore
|
||||
EgtMove( nDowelId, vtDowelDir * dStart)
|
||||
EgtModifyCurveExtrusion( nDowelId, vtDowelDir)
|
||||
EgtModifyCurveThickness( nDowelId, dEnd - dStart)
|
||||
-- creo solido di estrusione
|
||||
local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, vtDowelDir * ( dEnd - dStart + 1))
|
||||
EgtMove( nDowelExtrusionId, - vtDowelDir)
|
||||
EgtInvertSurf( nDowelExtrusionId)
|
||||
-- taglio estrusi per ottenere solido
|
||||
EgtSurfTmCut( nMainExtrusionId, nDowelExtrusionId, true, false)
|
||||
EgtSurfTmCut( nDowelExtrusionId, nOrigMainExtrusionId, true, false)
|
||||
|
||||
nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*')
|
||||
end
|
||||
end
|
||||
|
||||
----------------------------------------------------------------------------------
|
||||
-- funzione che cicla ricorsivamente sulle aree e sottoaree relative al pezzo per aggiungere gli split dowels
|
||||
local function AddAreaSplitDowels( nOutlineId, nPartId, nProfileType, nAreaLayerId)
|
||||
|
||||
-- verifico la presenza di eventuali split nell'area corrente
|
||||
local nSplitLayerId = EgtGetFirstNameInGroup( nAreaLayerId, WIN_SPLIT)
|
||||
if nSplitLayerId then
|
||||
local nSplitType = EgtGetInfo( nSplitLayerId, WIN_SPLITTYPE, 'i') or WIN_SPLITTYPES.NULL
|
||||
if nSplitType ~= WIN_SPLITTYPES.FRENCH then
|
||||
CalSplitDowel( nSplitLayerId, nOutlineId, nProfileType, nPartId)
|
||||
end
|
||||
end
|
||||
|
||||
-- verifico la presenza di split nelle sottoaree
|
||||
local nChildAreaId = EgtGetFirstNameInGroup( nAreaLayerId, WIN_AREA .. '*')
|
||||
while nChildAreaId do
|
||||
local nAreaType = EgtGetInfo( nChildAreaId, WIN_AREATYPE, 'i')
|
||||
if nAreaType == WIN_AREATYPES.SPLIT then
|
||||
AddAreaSplitDowels( nOutlineId, nPartId, nProfileType, nChildAreaId)
|
||||
end
|
||||
nChildAreaId = EgtGetNextName( nChildAreaId, WIN_AREA .. '*')
|
||||
end
|
||||
end
|
||||
|
||||
----------------------------------------------------------------------------------
|
||||
-- funzione che aggiunge al solido i dowels degli split che lo intersecano
|
||||
local function AddSplitDowels( nOutlineId, nOutlineLayerId, nPartId, nProfileType)
|
||||
|
||||
-- se profilo bottom con BottomRail esco ( gli split dowels saranno aggiuti sul BottomRail associato)
|
||||
if nProfileType == WIN_PRF.BOTTOM then
|
||||
local bBottomRail = EgtGetInfo( nOutlineLayerId, WIN_BOTTOMRAIL, 'b') or false
|
||||
if bBottomRail then
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
-- recupero area del pezzo
|
||||
local nAreaLayerId = EgtGetParent( nOutlineLayerId)
|
||||
-- aggiungo gli split dowels a partire dall'area corrente
|
||||
AddAreaSplitDowels( nOutlineId, nPartId, nProfileType, nAreaLayerId)
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- funzione che crea il solido del pezzo del telaio
|
||||
local function CalcFrameSolid( nPartId, nOutlineId, nGeoId, nOutlineLayerId, bBottomRail)
|
||||
@@ -1449,6 +1629,10 @@ local function CalcFrameSolid( nPartId, nOutlineId, nGeoId, nOutlineLayerId, bBo
|
||||
|
||||
-- creo solido dai profili
|
||||
MakeSolidByExtrusion( nGeoId, nOutlineId, nMainProfileId, nStartProfileId, nEndProfileId, nProfileType, nSolidLayerId, nDowelLayerId)
|
||||
|
||||
-- aggiungo dowels degli split
|
||||
AddSplitDowels( nOutlineId, nOutlineLayerId, nPartId, nProfileType)
|
||||
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
@@ -1583,12 +1767,36 @@ local function CreateStripGuideLines( nOutlineId, nStripId, nProfileId, nSolidLa
|
||||
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- funzione che recupera il pezzo associato ad un outline
|
||||
local function FindAssociatedPart( nOutlineId)
|
||||
|
||||
local nPartId = EgtGetInfo( nOutlineId, WIN_REF_BOTTOMRAIL_PART, 'i') or EgtGetInfo( nOutlineId, WIN_REF_PART, 'i')
|
||||
if not nPartId then
|
||||
-- cerco la prima curva da cui deriva che ha un pezzo associato
|
||||
local nBaseOutline = EgtGetInfo( nOutlineId, WIN_COPY, 'i')
|
||||
while not nPartId do
|
||||
-- recupero il base outline da cui deriva
|
||||
nBaseOutline = EgtGetInfo( nBaseOutline, WIN_SOU, 'i')
|
||||
-- verifico se ha un profilo associato ( e quindi un pezzo)
|
||||
local sProfileType = EgtGetInfo( nBaseOutline, WIN_PROFILETYPE)
|
||||
if sProfileType then
|
||||
-- recupero l'outline associato
|
||||
local nCrvId = EgtGetInfo( nBaseOutline, WIN_COPY, 'i')
|
||||
nPartId = EgtGetInfo( nCrvId, WIN_REF_BOTTOMRAIL_PART, 'i') or EgtGetInfo( nCrvId, WIN_REF_PART, 'i')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return nPartId
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- funzione che crea gli Strip
|
||||
local function CreateStripFromOutline( nAreaId, nOutlineId)
|
||||
|
||||
-- recupero il pezzo associato ( prendendo quello di bottomrail se esiste)
|
||||
local nPartId = EgtGetInfo( nOutlineId, WIN_REF_BOTTOMRAIL_PART, 'i') or EgtGetInfo( nOutlineId, WIN_REF_PART, 'i')
|
||||
local nPartId = FindAssociatedPart( nOutlineId)
|
||||
-- recupero layer per solido e per profili di estrusione
|
||||
local nSolidLayerId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID)
|
||||
local nMainProfileLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PROFILE)
|
||||
@@ -1597,8 +1805,8 @@ local function CreateStripFromOutline( nAreaId, nOutlineId)
|
||||
local nOutlineLayerId = EgtGetParent( nOutlineId)
|
||||
local nPrevOutlineId, nNextOutlineId = GetPrevNextOutline( WIN_PRF.NULL, nOutlineId, nOutlineLayerId)
|
||||
-- recupero i pezzi precedente e successivo, prendendo eventualmente quelli di bottomrail
|
||||
local nPrevPartId = EgtGetInfo( nPrevOutlineId, WIN_REF_BOTTOMRAIL_PART, 'i') or EgtGetInfo( nPrevOutlineId, WIN_REF_PART)
|
||||
local nNextPartId = EgtGetInfo( nNextOutlineId, WIN_REF_BOTTOMRAIL_PART, 'i') or EgtGetInfo( nNextOutlineId, WIN_REF_PART)
|
||||
local nPrevPartId = FindAssociatedPart( nPrevOutlineId)
|
||||
local nNextPartId = FindAssociatedPart( nNextOutlineId)
|
||||
|
||||
-- recupero profilo e controprofili
|
||||
local nMainProfileId = EgtGetFirstNameInGroup( nMainProfileLayerId, WIN_PRF_MAIN)
|
||||
@@ -1671,238 +1879,10 @@ local function CreateStripFromOutline( nAreaId, nOutlineId)
|
||||
EgtErase( nStripExtrCopyId)
|
||||
end
|
||||
|
||||
----------------------------------------------------------------------------------
|
||||
------------------------------- SPLIT DOWELS -------------------------------------
|
||||
----------------------------------------------------------------------------------
|
||||
-- funzione che calcola intersezione, geometrie e superfici dei dowel degli split
|
||||
local function CalSplitDowel( nSplitLayerId, nOutlineId, nProfileType, nPartId)
|
||||
|
||||
-- verifico se interseca l'outline che sto analizzando
|
||||
local nSplitId = EgtGetFirstInGroup( nSplitLayerId)
|
||||
local ptInt = EgtIP( nOutlineId, nSplitId, EgtSP( nSplitId))
|
||||
if not ptInt then
|
||||
return
|
||||
end
|
||||
|
||||
-- se interseca, recupero il profilo dello split
|
||||
local nOrigSplitProfileId = GetOutlineProfileId( nSplitId, false)
|
||||
|
||||
-- creo copia del profilo
|
||||
local nFrameProfileLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PROFILE)
|
||||
local nSplitProfileId = EgtCopy( nOrigSplitProfileId, nFrameProfileLayerId)
|
||||
local sSplitProfileType = EgtGetName( nOrigSplitProfileId)
|
||||
EgtSetInfo( nSplitProfileId, WIN_PRF_TYPE, sSplitProfileType)
|
||||
EgtSetName( nSplitProfileId, WIN_PRF_SPLIT)
|
||||
|
||||
-- recupero intersezione con lato In o Out del geo
|
||||
local nGeoLayerId = EgtGetFirstNameInGroup( nPartId, WIN_GEO)
|
||||
local nGeoCrvId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_IN)
|
||||
local ptInters = EgtIP( nGeoCrvId, nSplitId, EgtSP( nSplitId))
|
||||
if not ptInters and nProfileType == WIN_PRF.SPLIT then
|
||||
nGeoCrvId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_OUT)
|
||||
ptInters = EgtIP( nGeoCrvId, nSplitId, EgtSP( nSplitId))
|
||||
end
|
||||
|
||||
-- recupero frame del profilo e lo applico a tutte le sue geometrie
|
||||
local nSplitProfileFrameId = EgtGetFirstNameInGroup( nSplitProfileId, WIN_SECTIONFRAME)
|
||||
local frInvertSplitProfile = EgtFR( nSplitProfileFrameId)
|
||||
frInvertSplitProfile:invert()
|
||||
EgtTransform( EgtGetAllInGroup( nSplitProfileId), frInvertSplitProfile)
|
||||
-- assegno come riferimento del profilo il punto di intersezione e la direzione dello split
|
||||
local vtDir = - EgtSV( nSplitId) -- se non fosse lineare potrebbe essere end vector ?
|
||||
EgtChangeGroupFrame( nSplitProfileId, Frame3d( ptInters, vtDir))
|
||||
|
||||
-- calcolo la direzione del dowel sempre verso l'interno del pezzo
|
||||
local vtDowelDir = Vector3d( vtDir)
|
||||
local _, _, nSide = EgtPointCurveDistSide( ptInters + vtDowelDir, nGeoCrvId, Z_AX())
|
||||
if nSide == 1 then
|
||||
-- se a destra della curva significa che la direzione è uscente dal pezzo e va invertita
|
||||
vtDowelDir = - vtDowelDir
|
||||
end
|
||||
|
||||
-- recupero solido del pezzo
|
||||
local nSolidLayerId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID)
|
||||
local nMainExtrusionId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_SRF_MAIN)
|
||||
local nOrigMainExtrusionId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_SRF_ORIGMAIN)
|
||||
|
||||
-- creo fori per spine su Split
|
||||
local nDowelLayerId = EgtGetFirstNameInGroup( nPartId, WIN_DOWEL)
|
||||
|
||||
-- recupero profondita' d'inizio e fine
|
||||
local sStart = WIN_DWL_TOPPERPSTART
|
||||
local sEnd = WIN_DWL_TOPPERPEND
|
||||
if nProfileType == WIN_PRF.BOTTOM then
|
||||
sStart = WIN_DWL_BOTTOMPERPSTART
|
||||
sEnd = WIN_DWL_BOTTOMPERPEND
|
||||
elseif nProfileType == WIN_PRF.BOTTOMRAIL then
|
||||
sStart = WIN_DWL_RAILBOTTOMPERPSTART
|
||||
sEnd = WIN_DWL_RAILBOTTOMPERPEND
|
||||
elseif nProfileType == WIN_PRF.SPLIT then
|
||||
local sProfileType = EgtGetInfo( nOutlineId, WIN_PROFILETYPE)
|
||||
if sProfileType == WIN_SASH_HORIZONTAL then
|
||||
sStart = WIN_DWL_HORIZONTALSPLITPERPSTART
|
||||
sEnd = WIN_DWL_HORIZONTALSPLITPERPEND
|
||||
-- sta sempre leggendo l'informazione corretta? ( cfr dowel per start ed end nella crezione del solido)
|
||||
elseif sProfileType == WIN_SASH_VERTICAL then
|
||||
sStart = WIN_DWL_VERTICALSPLITPERPSTART
|
||||
sEnd = WIN_DWL_VERTICALSPLITPERPEND
|
||||
else -- sProfileType == WIN_FRAME_SPLIT
|
||||
sStart = WIN_DWL_SPLITPERPSTART
|
||||
sEnd = WIN_DWL_SPLITPERPEND
|
||||
end
|
||||
end
|
||||
|
||||
-- ciclo sui fori trovati
|
||||
local nOrigDowelId = EgtGetFirstNameInGroup( nSplitProfileId, WIN_DOWEL .. '*')
|
||||
while nOrigDowelId do
|
||||
local dStart = EgtGetInfo( nOrigDowelId, sStart, 'd')
|
||||
if not dStart then
|
||||
dStart = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPSTART, 'd')
|
||||
end
|
||||
local dEnd = EgtGetInfo( nOrigDowelId, sEnd, 'd')
|
||||
if not dEnd then
|
||||
dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPEND, 'd')
|
||||
end
|
||||
local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId)
|
||||
EgtSetColor( nDowelId, Color3d( 128, 128, 128))
|
||||
|
||||
-- posiziono il dowel e gli assegno estrusione e spessore
|
||||
EgtMove( nDowelId, vtDowelDir * dStart)
|
||||
EgtModifyCurveExtrusion( nDowelId, vtDowelDir)
|
||||
EgtModifyCurveThickness( nDowelId, dEnd - dStart)
|
||||
-- creo solido di estrusione
|
||||
local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, vtDowelDir * ( dEnd - dStart + 1))
|
||||
EgtMove( nDowelExtrusionId, - vtDowelDir)
|
||||
EgtInvertSurf( nDowelExtrusionId)
|
||||
-- taglio estrusi per ottenere solido
|
||||
EgtSurfTmCut( nMainExtrusionId, nDowelExtrusionId, true, false)
|
||||
EgtSurfTmCut( nDowelExtrusionId, nOrigMainExtrusionId, true, false)
|
||||
|
||||
nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*')
|
||||
end
|
||||
end
|
||||
|
||||
----------------------------------------------------------------------------------
|
||||
-- funzione ricorsiva che cerca gli split che possono dare origine a dei dowel
|
||||
local function VerifyDowelArea( nAreaLayerId, nOutlineId, nProfileType, nPartId)
|
||||
|
||||
-- verifico la presenza di eventuali Split
|
||||
local nSplitLayerId = EgtGetFirstNameInGroup( nAreaLayerId, WIN_SPLIT)
|
||||
if nSplitLayerId then
|
||||
local nSplitType = EgtGetInfo( nSplitLayerId, WIN_SPLITTYPE, 'i') or WIN_SPLITTYPES.NULL
|
||||
if nSplitType ~= WIN_SPLITTYPES.FRENCH then
|
||||
CalSplitDowel( nSplitLayerId, nOutlineId, nProfileType, nPartId)
|
||||
end
|
||||
end
|
||||
|
||||
-- verifico la presenza di split in sotto aree
|
||||
local nArea1LayerId = EgtGetFirstNameInGroup( nAreaLayerId, WIN_AREA1)
|
||||
if nArea1LayerId then
|
||||
local nAreaType = EgtGetInfo( nArea1LayerId, WIN_AREATYPE, 'i')
|
||||
if nAreaType == WIN_AREATYPES.SPLIT then
|
||||
VerifyDowelArea( nArea1LayerId, nOutlineId, nProfileType, nPartId)
|
||||
end
|
||||
end
|
||||
local nArea2LayerId = EgtGetFirstNameInGroup( nAreaLayerId, WIN_AREA2)
|
||||
if nArea2LayerId then
|
||||
local nAreaType = EgtGetInfo( nArea2LayerId, WIN_AREATYPE, 'i')
|
||||
if nAreaType == WIN_AREATYPES.SPLIT then
|
||||
VerifyDowelArea( nArea2LayerId, nOutlineId, nProfileType, nPartId)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
----------------------------------------------------------------------------------
|
||||
-- funzione che posiziona i fori delle spine degli split, li estrude e crea il solido
|
||||
local function AddSplitDowelToExtrusion( nOutlineId, bIsBottomRail)
|
||||
|
||||
-- ricavo pezzo associato
|
||||
local sPartRef = WIN_REF_PART
|
||||
if bIsBottomRail then
|
||||
sPartRef = WIN_REF_BOTTOMRAIL_PART
|
||||
end
|
||||
local nPartId = EgtGetInfo( nOutlineId, sPartRef, 'i')
|
||||
|
||||
-- ricavo tipo di profilo
|
||||
local nProfileType = GetOutlineProfileType( nOutlineId, bIsBottomRail)
|
||||
|
||||
-- se profilo Bottom con BottomRail, esco ( gli split dowels saranno fatti sul BottomRail)
|
||||
local nOutlineLayerId = EgtGetParent( nOutlineId)
|
||||
if nProfileType == WIN_PRF.BOTTOM then
|
||||
local bBottomRail = EgtGetInfo( nOutlineLayerId, WIN_BOTTOMRAIL, 'b') or false
|
||||
if bBottomRail then
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
-- recupero l'area di cui fa parte il pezzo
|
||||
local nAreaLayerId = EgtGetParent( nOutlineLayerId)
|
||||
|
||||
-- verifico la presenza di eventuali Split
|
||||
VerifyDowelArea( nAreaLayerId, nOutlineId, nProfileType, nPartId)
|
||||
end
|
||||
|
||||
----------------------------------------------------------------------------------
|
||||
function WinCalculate.AddSplitDowelToParts( nAreaId)
|
||||
-- se non ho calcolato i solidi, esco
|
||||
if not bCalcSolid then
|
||||
return
|
||||
end
|
||||
-- recupero tipo di area
|
||||
local nAreaType = EgtGetInfo( nAreaId, WIN_AREATYPE, 'i')
|
||||
if nAreaType == WIN_AREATYPES.FRAME or nAreaType == WIN_AREATYPES.SASH then
|
||||
-- recupero pezzi outline
|
||||
local nOutlineLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_OUTLINE)
|
||||
local nOutlineId = EgtGetFirstInGroup( nOutlineLayerId)
|
||||
while nOutlineId do
|
||||
AddSplitDowelToExtrusion( nOutlineId, false)
|
||||
-- se di tipo bottom
|
||||
local sName = EgtGetName( nOutlineId)
|
||||
if sName == WIN_BOTTOM then
|
||||
-- se ha BottomRail
|
||||
local bBottomRail = EgtGetInfo( nOutlineLayerId, WIN_BOTTOMRAIL, 'b') or false
|
||||
if bBottomRail then
|
||||
AddSplitDowelToExtrusion( nOutlineId, true)
|
||||
end
|
||||
end
|
||||
nOutlineId = EgtGetNext( nOutlineId)
|
||||
end
|
||||
end
|
||||
-- verifico se c'e' uno split
|
||||
local nSplitLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_SPLIT)
|
||||
if nSplitLayerId then
|
||||
local nSplitType = EgtGetInfo( nSplitLayerId, WIN_SPLITTYPE, 'i') or WIN_SPLITTYPES.NULL
|
||||
-- se split ha pezzo associato
|
||||
if nSplitType ~= WIN_SPLITTYPES.FRENCH then
|
||||
local nSplitId = EgtGetFirstInGroup( nSplitLayerId)
|
||||
if nSplitId then
|
||||
AddSplitDowelToExtrusion( nSplitId, false)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- verifico se ci sono aree
|
||||
local nChildAreaId = EgtGetFirstNameInGroup( nAreaId, WIN_AREA .. '*')
|
||||
while nChildAreaId do
|
||||
-- lancio costruzione pezzi di quell'area
|
||||
WinCalculate.AddSplitDowelToParts( nChildAreaId)
|
||||
nChildAreaId = EgtGetNextName( nChildAreaId, WIN_AREA .. '*')
|
||||
end
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
------------------------- FUNZIONI ----------------------------------
|
||||
---------------------------------------------------------------------
|
||||
-- funzione che cicla ricorsivamente sulla struttura per creare tutti i pezzi della finestra
|
||||
function WinCalculate.CreatePartFromArea( nAreaId)
|
||||
-- funzione che cicla ricorsivamente su aree e sottaree per calcolare i pezzi
|
||||
local function CalculateAreaParts( nAreaId)
|
||||
|
||||
-- assengo il tipo di profilo alle curve del base outline
|
||||
CalcProfileType( nAreaId)
|
||||
|
||||
-- calcolo outline a partire dal base outline
|
||||
CalculateOutlineFromAreaOutline( nAreaId)
|
||||
|
||||
-- creo pezzo
|
||||
local nAreaType = EgtGetInfo( nAreaId, WIN_AREATYPE, 'i')
|
||||
if nAreaType == WIN_AREATYPES.FRAME or nAreaType == WIN_AREATYPES.SASH then
|
||||
-- creo pezzi per ogni outline
|
||||
@@ -1955,15 +1935,28 @@ function WinCalculate.CreatePartFromArea( nAreaId)
|
||||
end
|
||||
end
|
||||
|
||||
-- verifico se ci sono sotto-aree da realizzare
|
||||
-- calcolo i pezzi delle sottoaree
|
||||
local nChildAreaId = EgtGetFirstNameInGroup( nAreaId, WIN_AREA .. '*')
|
||||
while nChildAreaId do
|
||||
-- lancio costruzione pezzi di quell'area
|
||||
WinCalculate.CreatePartFromArea( nChildAreaId)
|
||||
CalculateAreaParts( nChildAreaId)
|
||||
nChildAreaId = EgtGetNextName( nChildAreaId, WIN_AREA .. '*')
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
---------------------------------------------------------------------
|
||||
------------------------- FUNZIONI ----------------------------------
|
||||
---------------------------------------------------------------------
|
||||
-- funzione che crea tutti i pezzi della finestra partendo dal telaio
|
||||
function WinCalculate.CreatePartFromArea( nFrameId)
|
||||
-- assengo il tipo di profilo alle curve del base outline
|
||||
CalculateAreaProfileType( nFrameId)
|
||||
-- calcolo outline a partire dal base outline
|
||||
CalculateAreaOutline( nFrameId)
|
||||
-- creo pezzi
|
||||
CalculateAreaParts( nFrameId)
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- funzione che posiziona un pezzo
|
||||
function WinCalculate.PositionPart(nPartId)
|
||||
|
||||
@@ -69,7 +69,6 @@ WinCalculate.SetCalcSolid( true)
|
||||
-- creo i pezzi
|
||||
local nFrameId = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_AREAASTERISK)
|
||||
WinCalculate.CreatePartFromArea( nFrameId)
|
||||
WinCalculate.AddSplitDowelToParts( nFrameId)
|
||||
|
||||
-- elimino profilo se in batch per test
|
||||
if WINDOW and WINDOW.TEST and WINDOW.TEST == 1 then
|
||||
|
||||
Reference in New Issue
Block a user