From 2209ad241528f76bd5822a58c2c69526977ecc18 Mon Sep 17 00:00:00 2001 From: SaraP Date: Mon, 17 Jun 2024 09:50:41 +0200 Subject: [PATCH 1/4] - reso il calcolo dei dowels indipendente dal calcolo del solido. --- Profiles/WinLib/WinCalculate.lua | 1128 ++++++++++++++++-------------- 1 file changed, 586 insertions(+), 542 deletions(-) diff --git a/Profiles/WinLib/WinCalculate.lua b/Profiles/WinLib/WinCalculate.lua index 039a3cf..e63a958 100644 --- a/Profiles/WinLib/WinCalculate.lua +++ b/Profiles/WinLib/WinCalculate.lua @@ -719,30 +719,6 @@ local function GetPrevNextOutline( nProfileType, nOutlineId, nOutlineLayerId) return nPrevOutlineId, nNextOutlineId end ---------------------------------------------------------------------- --- funzione che dato il tipo di pezzo e di giunzione, restituisce se e' corto, lungo o angolato -local function CalcPartJointType( nProfileType, JointType) - - if JointType == WIN_JNT.ANGLED then - return WIN_PART_JNT.ANGLED - end - if nProfileType == WIN_PRF.BOTTOMRAIL or nProfileType == WIN_PRF.SPLIT then - return WIN_PART_JNT.SHORT - elseif nProfileType == WIN_PRF.BOTTOM or nProfileType == WIN_PRF.TOP then - if JointType == WIN_JNT.FULL_H then - return WIN_PART_JNT.FULL - elseif JointType == WIN_JNT.FULL_V then - return WIN_PART_JNT.SHORT - end - elseif nProfileType == WIN_PRF.LEFT or nProfileType == WIN_PRF.RIGHT then - if JointType == WIN_JNT.FULL_V then - return WIN_PART_JNT.FULL - elseif JointType == WIN_JNT.FULL_H then - return WIN_PART_JNT.SHORT - end - end -end - --------------------------------------------------------------------- -- funzione che restituisce il tipo di controprofilo dell'outline adiacente local function GetProfileCtrIn( nProfileType, nPrevOutlineId, nOutlineId, nPrevProfileId) @@ -783,6 +759,64 @@ local function GetProfileCtrIn( nProfileType, nPrevOutlineId, nOutlineId, nPrevP return sPrevCtrIn end + +--------------------------------------------------------------------- +--------------------------- GEO ----------------------------------- +--------------------------------------------------------------------- +-- funzione che dato il tipo di pezzo e di giunzione, restituisce se e' corto, lungo o angolato +local function CalcPartJointType( nProfileType, JointType) + + if JointType == WIN_JNT.ANGLED then + return WIN_PART_JNT.ANGLED + end + if nProfileType == WIN_PRF.BOTTOMRAIL or nProfileType == WIN_PRF.SPLIT then + return WIN_PART_JNT.SHORT + elseif nProfileType == WIN_PRF.BOTTOM or nProfileType == WIN_PRF.TOP then + if JointType == WIN_JNT.FULL_H then + return WIN_PART_JNT.FULL + elseif JointType == WIN_JNT.FULL_V then + return WIN_PART_JNT.SHORT + end + elseif nProfileType == WIN_PRF.LEFT or nProfileType == WIN_PRF.RIGHT then + if JointType == WIN_JNT.FULL_V then + return WIN_PART_JNT.FULL + elseif JointType == WIN_JNT.FULL_H then + return WIN_PART_JNT.SHORT + end + end +end + +--------------------------------------------------------------------- +-- funzione che crea il gruppo con i profili di un pezzo +local function CalcFrameProfiles( nPartId, nOutlineId, nPrevOutlineId, nNextOutlineId, nProfileType) + + -- creo gruppo per i profili + local nProfileLayerId = EgtGroup( nPartId) + EgtSetName( nProfileLayerId, WIN_PROFILE) + + -- recupero profili e controprofili + local nOrigMainProfileId = GetOutlineProfileId( nOutlineId, nProfileType == WIN_PRF.BOTTOMRAIL) + -- se il tipo corrente è split il pezzo va tagliato con il bottomrail, altrimenti con il bottom + local nOrigStartProfileId = GetOutlineProfileId( nPrevOutlineId, nProfileType == WIN_PRF.SPLIT) + local nOrigEndProfileId = GetOutlineProfileId( nNextOutlineId, nProfileType == WIN_PRF.SPLIT) + + -- creo copie di profilo e controprofili + local nMainProfileId = EgtCopy( nOrigMainProfileId, nProfileLayerId) + local sMainProfileType = EgtGetName( nMainProfileId) + EgtSetInfo( nMainProfileId, WIN_PRF_TYPE, sMainProfileType) + EgtSetName( nMainProfileId, WIN_PRF_MAIN) + local nStartProfileId = EgtCopy( nOrigStartProfileId, nProfileLayerId) + local sStartProfileType = EgtGetName( nStartProfileId) + EgtSetInfo( nStartProfileId, WIN_PRF_TYPE, sStartProfileType) + EgtSetName( nStartProfileId, WIN_PRF_START) + local nEndProfileId = EgtCopy( nOrigEndProfileId, nProfileLayerId) + local sEndProfileType = EgtGetName( nEndProfileId) + EgtSetInfo( nEndProfileId, WIN_PRF_TYPE, sEndProfileType) + EgtSetName( nEndProfileId, WIN_PRF_END) + + return nProfileLayerId +end + --------------------------------------------------------------------- local function GetDeltaProfile( nProfileId, sCtrIn) @@ -801,9 +835,9 @@ end --------------------------------------------------------------------- -- funzione che crea le curve del geo -local function CreateFrameGeo( nOutlineId, nPrevOutlineId, nNextOutlineId, nStartPartJointType, nEndPartJointType, nProfileType, nGeoLayerId, bBottomRail) +local function CreateFrameGeo( nOutlineId, nPrevOutlineId, nNextOutlineId, nStartPartJointType, nEndPartJointType, nProfileType, nGeoLayerId, nProfileLayerId) - local nCurrProfileId = GetOutlineProfileId( nOutlineId, bBottomRail) + local nCurrProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) local nCurrProfileRefId = EgtGetFirstNameInGroup( nCurrProfileId, WIN_REF) -- calcolo spostamento della curva iniziale dovuto a posizione riferimento local nProfileFrameId = EgtGetFirstNameInGroup( nCurrProfileId, WIN_SECTIONFRAME) @@ -841,7 +875,7 @@ local function CreateFrameGeo( nOutlineId, nPrevOutlineId, nNextOutlineId, nStar EgtInvertCurve( nPrevCurveId) else nPrevCurveId = EgtCopy( nPrevOutlineId, nGeoLayerId) - local nPrevProfileId = GetOutlineProfileId( nPrevOutlineId, nProfileType == WIN_PRF.SPLIT) + local nPrevProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_START) if nStartPartJointType == WIN_PART_JNT.SHORT then local sCtrIn = GetProfileCtrIn( nProfileType, nPrevOutlineId, nOutlineId, nPrevProfileId) local dPrevCPDelta = GetDeltaProfile( nPrevProfileId, sCtrIn) @@ -869,7 +903,7 @@ local function CreateFrameGeo( nOutlineId, nPrevOutlineId, nNextOutlineId, nStar nNextCurveId = EgtLinePVL( nGeoLayerId, EgtEP( nOutlineId), vtMedia, 3 * b3CurrProfileFrame:getDimX()) else nNextCurveId = EgtCopy( nNextOutlineId, nGeoLayerId) - local nNextProfileId = GetOutlineProfileId( nNextOutlineId, nProfileType == WIN_PRF.SPLIT) + local nNextProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_END) if nEndPartJointType == WIN_PART_JNT.SHORT then local sCtrIn = GetProfileCtrIn( nProfileType, nNextOutlineId, nOutlineId, nNextProfileId) local dNextCPDelta = GetDeltaProfile( nNextProfileId, sCtrIn) @@ -937,14 +971,11 @@ end --------------------------------------------------------------------- -- funzione che calcola l'ingombro dei pezzi del telaio -local function CalcFrameGeo( nPartId, nOutlineId, nOutlineLayerId, bBottomRail) +local function CalcFrameGeo( nPartId, nOutlineId, nOutlineLayerId, nProfileType) -- creo layer per ingombro local nGeoLayerId = EgtGroup( nPartId) EgtSetName( nGeoLayerId, WIN_GEO) - - -- ricavo tipo di profilo - local nProfileType = GetOutlineProfileType( nOutlineId, bBottomRail) -- recupero outline precedente e successivo local nPrevOutlineId, nNextOutlineId = GetPrevNextOutline( nProfileType, nOutlineId, nOutlineLayerId) @@ -981,12 +1012,15 @@ local function CalcFrameGeo( nPartId, nOutlineId, nOutlineLayerId, bBottomRail) local nStartPartJointType = CalcPartJointType( nProfileType, nStartJointType) local nEndPartJointType = CalcPartJointType( nProfileType, nEndJointType) - -- salvo i valori joint su outline per disegno solido + -- salvo i valori joint su outline per disegno solido e calcolo dowels EgtSetInfo( nOutlineId, WIN_STARTJOINT, nStartPartJointType) EgtSetInfo( nOutlineId, WIN_ENDJOINT, nEndPartJointType) + -- creo il gruppo con i profili del pezzo + local nProfileLayerId = CalcFrameProfiles( nPartId, nOutlineId, nPrevOutlineId, nNextOutlineId, nProfileType) + -- creo lati dell'outline - local nGeoOutId = CreateFrameGeo( nOutlineId, nPrevOutlineId, nNextOutlineId, nStartPartJointType, nEndPartJointType, nProfileType, nGeoLayerId, bBottomRail) + local nGeoOutId = CreateFrameGeo( nOutlineId, nPrevOutlineId, nNextOutlineId, nStartPartJointType, nEndPartJointType, nProfileType, nGeoLayerId, nProfileLayerId) -- calcolo le lavorazioni associate ai profili CalcProfilingProcessings( nPartId, nGeoLayerId) @@ -994,7 +1028,470 @@ local function CalcFrameGeo( nPartId, nOutlineId, nOutlineLayerId, bBottomRail) return nGeoOutId end + +--------------------------------------------------------------------------------- +---------------------------------- DOWELS ---------------------------------------- +---------------------------------------------------------------------------------- +local function AddStartDowels( nOutlineId, nPrevOutlineId, nProfileLayerId, nDowelLayerId, nGeoLayerId, nMainExtrusionId) + + local sOutlineName = EgtGetName( nOutlineId) + local sPrevOutlineName = EgtGetName( nPrevOutlineId) + + local nGeoInId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_IN) + local nGeoLeftId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_LEFT) + + local nMainProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) + local nStartProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_START) + + local nStartJointType = EgtGetInfo( nOutlineId, WIN_STARTJOINT, 'i') + if nStartJointType == WIN_PART_JNT.ANGLED then + + elseif nStartJointType == WIN_PART_JNT.FULL then + -- recupero profondita' d'inizio e fine + local sStart = EgtIf( sOutlineName == WIN_BOTTOM, WIN_DWL_BOTTOMPERPSTART, WIN_DWL_TOPPERPSTART) + local sEnd = EgtIf( sOutlineName == WIN_BOTTOM, WIN_DWL_BOTTOMPERPEND, WIN_DWL_TOPPERPEND) + + -- calcolo il riferimento del profilo + local nFrameProfile = EgtGetFirstNameInGroup( nStartProfileId, WIN_SECTIONFRAME) + local frOrig = EgtFR( nFrameProfile, GDB_ID.ROOT) + frOrig:invert() + -- calcolo il riferimento su cui posizionare i dowel + local ptInt = EgtSP( nGeoLeftId) + local vtRef = EgtSV( nGeoLeftId) + local frDest = Frame3d( ptInt, - vtRef) + + -- ciclo sui fori trovati + local nOrigDowelId = EgtGetFirstNameInGroup( nStartProfileId, WIN_DOWEL .. '*') + while nOrigDowelId do + local dStart = EgtGetInfo( nOrigDowelId, sStart, 'd') + if not dStart then + dStart = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPSTART, 'd') or 0 + end + local dEnd = EgtGetInfo( nOrigDowelId, sEnd, 'd') + if not dEnd then + dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPEND, 'd') or 0 + end + + local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId) + EgtSetColor( nDowelId, Color3d( 128, 128, 128)) + -- posiziono il dowel grazie ai riferimenti e assegno estrusione e spessore + EgtTransform( nDowelId, frOrig, GDB_RT.GLOB) + EgtTransform( nDowelId, frDest, GDB_RT.GLOB) + EgtMove( nDowelId, dStart * vtRef) + EgtModifyCurveExtrusion( nDowelId, vtRef) + EgtModifyCurveThickness( nDowelId, dEnd - dStart) + -- setto info di lavorazione + EgtSetInfo( nDowelId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.HOLE) + + if bCalcSolid then + -- creo solido di estrusione + local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nDowelLayerId, nDowelId, vtRef * ( dEnd - dStart + 1)) + EgtMove( nDowelExtrusionId, - vtRef) + -- sottraggo il dowel al solido + EgtSurfTmSubtract( nMainExtrusionId, nDowelExtrusionId) + EgtErase( nDowelExtrusionId) + end + + nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*') + end + + elseif nStartJointType == WIN_PART_JNT.SHORT then + -- recupero info di profondita' d'inizio e fine in base al profilo dello start + local sStart = WIN_DWL_TOPPARASTART + local sEnd = WIN_DWL_TOPPARAEND + if sPrevOutlineName == WIN_BOTTOM then + sStart = WIN_DWL_BOTTOMPARASTART + sEnd = WIN_DWL_BOTTOMPARAEND + end + if sOutlineName == WIN_SPLIT then + local sStartProfileType = EgtGetInfo( nStartProfileId, WIN_PRF_TYPE) + if sStartProfileType == WIN_RAIL_BOTTOM then + sStart = WIN_DWL_RAILBOTTOMPARASTART + sEnd = WIN_DWL_RAILBOTTOMPARAEND + elseif sStartProfileType == WIN_SASH_HORIZONTAL then + sStart = WIN_DWL_HORIZONTALSPLITPARASTART + sEnd = WIN_DWL_HORIZONTALSPLITPARAEND + elseif sStartProfileType == WIN_SASH_VERTICAL then + sStart = WIN_DWL_VERTICALSPLITPARASTART + sEnd = WIN_DWL_VERTICALSPLITPARAEND + elseif sStartProfileType == WIN_FRAME_SPLIT or sStartProfileType == WIN_SASH_SPLIT then + sStart = WIN_DWL_SPLITPARASTART + sEnd = WIN_DWL_SPLITPARAEND + end + end + + -- calcolo il riferimento del profilo + local nFrameProfile = EgtGetFirstNameInGroup( nMainProfileId, WIN_SECTIONFRAME) + local frOrig = EgtFR( nFrameProfile, GDB_ID.ROOT) + frOrig:invert() + -- calcolo il riferimento su cui posizionare i dowel + local nLeftCopy = EgtCopyGlob( nGeoLeftId, nDowelLayerId) + EgtExtendCurveStartByLen( nLeftCopy, 200) + EgtExtendCurveEndByLen( nLeftCopy, 200) + local ptInt = EgtIP( nOutlineId, nLeftCopy, ORIG()) + EgtErase( nLeftCopy) + local dParRef = EgtCurveParamAtPoint( nOutlineId, ptInt) + local vtRef = EgtUV( nOutlineId, dParRef, -1) + local frDest = Frame3d( ptInt, - vtRef) + + -- ciclo sui fori trovati + local nOrigDowelId = EgtGetFirstNameInGroup( nMainProfileId, WIN_DOWEL .. '*') + while nOrigDowelId do + local dStart = EgtGetInfo( nOrigDowelId, sStart, 'd') + if not dStart then + dStart = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPARASTART, 'd') or 0 + end + local dEnd = EgtGetInfo( nOrigDowelId, sEnd, 'd') + if not dEnd then + dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPARAEND, 'd') or 0 + end + + local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId) + EgtSetColor( nDowelId, Color3d( 128, 128, 128)) + -- posiziono il dowel grazie ai riferimenti e assegno estrusione e spessore + EgtTransform( nDowelId, frOrig) + EgtTransform( nDowelId, frDest) + EgtMove( nDowelId, vtRef * dStart) + EgtModifyCurveExtrusion( nDowelId, vtRef) + EgtModifyCurveThickness( nDowelId, dEnd - dStart) + -- setto info di lavorazione + EgtSetInfo( nDowelId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.HOLE) + + if bCalcSolid then + -- creo solido di estrusione + local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nDowelLayerId, nDowelId, vtRef * ( dEnd - dStart + 1)) + EgtMove( nDowelExtrusionId, - vtRef) + -- sottraggo il dowel al solido + EgtSurfTmSubtract( nMainExtrusionId, nDowelExtrusionId) + EgtErase( nDowelExtrusionId) + end + + nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*') + end + end +end + --------------------------------------------------------------------- +local function AddEndDowels( nOutlineId, nEndOutlineId, nProfileLayerId, nDowelLayerId, nGeoLayerId, nMainExtrusionId) + + local sOutlineName = EgtGetName( nOutlineId) + local sEndOutlineName = EgtGetName( nEndOutlineId) + + local nGeoInId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_IN) + local nGeoRightId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_RIGHT) + + local nMainProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) + local nEndProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_END) + + local nEndJointType = EgtGetInfo( nOutlineId, WIN_ENDJOINT, 'i') + if nEndJointType == WIN_PART_JNT.ANGLED then + + elseif nEndJointType == WIN_PART_JNT.FULL then + -- recupero profondita' d'inizio e fine + local sStart = EgtIf( sOutlineName == WIN_BOTTOM, WIN_DWL_BOTTOMPERPSTART, WIN_DWL_TOPPERPSTART) + local sEnd = EgtIf( sOutlineName == WIN_BOTTOM, WIN_DWL_BOTTOMPERPEND, WIN_DWL_TOPPERPEND) + + -- calcolo il riferimento del profilo + local nFrameProfile = EgtGetFirstNameInGroup( nEndProfileId, WIN_SECTIONFRAME) + local frOrig = EgtFR( nFrameProfile, GDB_ID.ROOT) + frOrig:invert() + -- calcolo il riferimento su cui posizionare i dowel + local ptInt = EgtEP( nGeoRightId) + local vtRef = EgtEV( nGeoRightId) + local frDest = Frame3d( ptInt, - vtRef) + + -- ciclo sui fori trovati + local nOrigDowelId = EgtGetFirstNameInGroup( nEndProfileId, WIN_DOWEL .. '*') + while nOrigDowelId do + local dStart = EgtGetInfo( nOrigDowelId, sStart, 'd') + if not dStart then + dStart = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPSTART, 'd') or 0 + end + local dEnd = EgtGetInfo( nOrigDowelId, sEnd, 'd') + if not dEnd then + dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPEND, 'd') or 0 + end + + local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId) + EgtSetColor( nDowelId, Color3d( 128, 128, 128)) + -- posiziono i fori grazie ai riferimenti e assegno estrusione e spessore + EgtTransform( nDowelId, frOrig) + EgtTransform( nDowelId, frDest) + EgtMove( nDowelId, - vtRef * dStart) + EgtModifyCurveExtrusion( nDowelId, - vtRef) + EgtModifyCurveThickness( nDowelId, dEnd - dStart) + -- setto info di lavorazione + EgtSetInfo( nDowelId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.HOLE) + + if bCalcSolid then + -- creo solido di estrusione + local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nDowelLayerId, nDowelId, - vtRef * ( dEnd - dStart + 1)) + EgtMove( nDowelExtrusionId, vtRef) + -- sottraggo il dowel al solido + EgtSurfTmSubtract( nMainExtrusionId, nDowelExtrusionId) + EgtErase( nDowelExtrusionId) + end + + nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*') + end + + elseif nEndJointType == WIN_PART_JNT.SHORT then + -- recupero profondita' d'inizio e fine + local sStart = WIN_DWL_TOPPARASTART + local sEnd = WIN_DWL_TOPPARAEND + if sEndOutlineName == WIN_BOTTOM then + sStart = WIN_DWL_BOTTOMPARASTART + sEnd = WIN_DWL_BOTTOMPARAEND + end + if sOutlineName == WIN_SPLIT then + local sEndProfileType = EgtGetInfo( nEndProfileId, WIN_PRF_TYPE) + if sEndProfileType == WIN_RAIL_BOTTOM then + sStart = WIN_DWL_RAILBOTTOMPARASTART + sEnd = WIN_DWL_RAILBOTTOMPARAEND + elseif sEndProfileType == WIN_SASH_HORIZONTAL then + -- non faccio nulla perche' e' uguale al top + elseif sEndProfileType == WIN_SASH_VERTICAL then + sStart = WIN_DWL_VERTICALSPLITPARASTART + sEnd = WIN_DWL_VERTICALSPLITPARAEND + elseif sEndProfileType == WIN_FRAME_SPLIT or sEndProfileType == WIN_SASH_SPLIT then + sStart = WIN_DWL_SPLITPARASTART + sEnd = WIN_DWL_SPLITPARAEND + end + end + + -- calcolo il riferimento del profilo + local nFrameProfile = EgtGetFirstNameInGroup( nMainProfileId, WIN_SECTIONFRAME) + local frOrig = EgtFR( nFrameProfile, GDB_ID.ROOT) + frOrig:invert() + -- calcolo il riferimento su cui posizionare i dowel + local nRightCopy = EgtCopyGlob( nGeoRightId, nDowelLayerId) + EgtExtendCurveStartByLen( nRightCopy, 200) + EgtExtendCurveEndByLen( nRightCopy, 200) + local ptInt = EgtIP( nOutlineId, nRightCopy, ORIG()) + EgtErase( nRightCopy) + local dParRef = EgtCurveParamAtPoint( nOutlineId, ptInt) + local vtRef = EgtUV( nOutlineId, dParRef, -1) + local frDest = Frame3d( ptInt, - vtRef) + + -- ciclo sui fori trovati + local nOrigDowelId = EgtGetFirstNameInGroup( nMainProfileId, WIN_DOWEL .. '*') + while nOrigDowelId do + local dStart = EgtGetInfo( nOrigDowelId, sStart, 'd') + if not dStart then + dStart = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPARASTART, 'd') or 0 + end + local dEnd = EgtGetInfo( nOrigDowelId, sEnd, 'd') + if not dEnd then + dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPARAEND, 'd') or 0 + end + + local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId) + EgtSetColor( nDowelId, Color3d( 128, 128, 128)) + -- posiziono i fori grazie ai riferimenti e assegno estrusione e spessore + EgtTransform( nDowelId, frOrig, GDB_RT.GLOB) + EgtTransform( nDowelId, frDest, GDB_RT.GLOB) + EgtMove( nDowelId, - vtRef * dStart) + EgtModifyCurveExtrusion( nDowelId, - vtRef) + EgtModifyCurveThickness( nDowelId, dEnd - dStart) + -- setto info di lavorazione + EgtSetInfo( nDowelId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.HOLE) + + if bCalcSolid then + -- creo solido di estrusione + local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nDowelLayerId, nDowelId, - vtRef * ( dEnd - dStart + 1)) + EgtMove( nDowelExtrusionId, vtRef) + -- sottraggo il dowel al solido + EgtSurfTmSubtract( nMainExtrusionId, nDowelExtrusionId) + EgtErase( nDowelExtrusionId) + end + + nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*') + end + end +end + +--------------------------------------------------------------------- +-- 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 ( se non esiste è nil) + local nSolidLayerId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID) or GDB_ID.NULL + local nMainExtrusionId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_SRF_MAIN) + + -- creo fori per spine su Split + local nProcLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PRC) + + -- 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 + -- se poggia sul controprofilo CntrIn2 leggo le info dello split orizzontale, altrimenti vanno bene quelle del top + -- ( cfr AddStartDowels e AddEndDowels) + if AreSamePointApprox( ptInt, EgtSP( nSplitId)) then + sStart = WIN_DWL_HORIZONTALSPLITPERPSTART + sEnd = WIN_DWL_HORIZONTALSPLITPERPEND + end + 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, nProcLayerId) + 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) + -- setto info di lavorazione + EgtSetInfo( nDowelId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.HOLE) + + if bCalcSolid then + -- creo solido di estrusione + local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, vtDowelDir * ( dEnd - dStart + 1)) + EgtMove( nDowelExtrusionId, - vtDowelDir) + -- sottraggo il dowel al solido + EgtSurfTmSubtract( nMainExtrusionId, nDowelExtrusionId) + EgtErase( nDowelExtrusionId) + end + + 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 i fori per le spine +local function CalcFrameDowels( nPartId, nOutlineId, nOutlineLayerId, nProfileType) + + -- creo fori per spine su Start ed End + local nPrevOutlineId, nNextOutlineId = GetPrevNextOutline( nProfileType, nOutlineId, nOutlineLayerId) + local nProfileLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PROFILE) + local nProcLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PRC) + local nGeoLayerId = EgtGetFirstNameInGroup( nPartId, WIN_GEO) + local nMainExtrusionId + if bCalcSolid then + local nSolidLayerId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID) + nMainExtrusionId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_SRF_MAIN) + end + AddStartDowels( nOutlineId, nPrevOutlineId, nProfileLayerId, nProcLayerId, nGeoLayerId, nMainExtrusionId) + AddEndDowels( nOutlineId, nNextOutlineId, nProfileLayerId, nProcLayerId, nGeoLayerId, nMainExtrusionId) + + -- split dowels + AddSplitDowels( nOutlineId, nOutlineLayerId, nPartId, nProfileType) +end + + +---------------------------------------------------------------------------------- +---------------------------------- SOLIDO ---------------------------------------- +---------------------------------------------------------------------------------- -- funzione che recupera tipo di inizio e fine pezzo local function CalcStartEndProfileType( nProfileType, nOutlineId, nStartProfileId, nEndProfileId) @@ -1029,279 +1526,35 @@ local function CalcStartEndProfileType( nProfileType, nOutlineId, nStartProfileI sEndProfileType = WIN_OFST .. sEndProfileType end - return sStartProfileType, sEndProfileType, StartJointType, EndJointType + return sStartProfileType, sEndProfileType end --------------------------------------------------------------------- -local function AddStartDowels( nOutlineId, nPrevOutlineId, StartJointType, nMainProfileId, nStartProfileId, nDowelLayerId, nGeoInId, nSolidLayerId, nMainExtrusionId) +-- funzione che crea il solido del pezzo del telaio +local function CalcFrameSolid( nPartId, nOutlineId, nGeoId, nProfileType) - local sOutlineName = EgtGetName( nOutlineId) - local sPrevOutlineName = EgtGetName( nPrevOutlineId) + -- creo layer per solido + local nSolidLayerId = EgtGroup( nPartId) + EgtSetName( nSolidLayerId, WIN_SOLID) + + -- recupero layer delle lavorazioni per i dowels + local nProcLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PRC) + + -- recupero profili e controprofili + local nProfileLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PROFILE) + local nMainProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) + local nStartProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_START) + local nEndProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_END) - local nStartGuideId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_STARTGUIDE) - - if StartJointType == WIN_PART_JNT.ANGLED then - - elseif StartJointType == WIN_PART_JNT.FULL then - -- recupero profondita' d'inizio e fine - local sStart = EgtIf( sOutlineName == WIN_BOTTOM, WIN_DWL_BOTTOMPERPSTART, WIN_DWL_TOPPERPSTART) - local sEnd = EgtIf( sOutlineName == WIN_BOTTOM, WIN_DWL_BOTTOMPERPEND, WIN_DWL_TOPPERPEND) - - -- calcolo il riferimento del profilo - local nFrameProfile = EgtGetFirstNameInGroup( nStartProfileId, WIN_SECTIONFRAME) - local frOrig = EgtFR( nFrameProfile, GDB_ID.ROOT) - frOrig:invert() - -- calcolo il riferimento su cui posizionare i dowel - local ptInt = EgtIP( nGeoInId, nStartGuideId, ORIG(), GDB_ID.ROOT) - local dParRef = EgtCurveParamAtPoint( nStartGuideId, ptInt) - local vtRef = EgtUV( nStartGuideId, dParRef, -1, GDB_ID.ROOT) - local frDest = Frame3d( ptInt, - vtRef) - - -- ciclo sui fori trovati - local nOrigDowelId = EgtGetFirstNameInGroup( nStartProfileId, WIN_DOWEL .. '*') - while nOrigDowelId do - local dStart = EgtGetInfo( nOrigDowelId, sStart, 'd') - if not dStart then - dStart = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPSTART, 'd') or 0 - end - local dEnd = EgtGetInfo( nOrigDowelId, sEnd, 'd') - if not dEnd then - dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPEND, 'd') or 0 - end - - local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId) - EgtSetColor( nDowelId, Color3d( 128, 128, 128)) - -- posiziono il dowel grazie ai riferimenti e assegno estrusione e spessore - EgtTransform( nDowelId, frOrig, GDB_RT.GLOB) - EgtTransform( nDowelId, frDest, GDB_RT.GLOB) - EgtMove( nDowelId, dStart * vtRef) - EgtModifyCurveExtrusion( nDowelId, vtRef) - EgtModifyCurveThickness( nDowelId, dEnd - dStart) - -- setto info di lavorazione - EgtSetInfo( nDowelId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.HOLE) - -- creo solido di estrusione - local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, vtRef * ( dEnd - dStart + 1)) - EgtMove( nDowelExtrusionId, - vtRef) - -- sottraggo il dowel al solido - EgtSurfTmSubtract( nMainExtrusionId, nDowelExtrusionId) - EgtErase( nDowelExtrusionId) - - nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*') - end - - elseif StartJointType == WIN_PART_JNT.SHORT then - -- recupero info di profondita' d'inizio e fine in base al profilo dello start - local sStart = WIN_DWL_TOPPARASTART - local sEnd = WIN_DWL_TOPPARAEND - if sPrevOutlineName == WIN_BOTTOM then - sStart = WIN_DWL_BOTTOMPARASTART - sEnd = WIN_DWL_BOTTOMPARAEND - end - if sOutlineName == WIN_SPLIT then - local sStartProfileType = EgtGetInfo( nStartProfileId, WIN_PRF_TYPE) - if sStartProfileType == WIN_RAIL_BOTTOM then - sStart = WIN_DWL_RAILBOTTOMPARASTART - sEnd = WIN_DWL_RAILBOTTOMPARAEND - elseif sStartProfileType == WIN_SASH_HORIZONTAL then - sStart = WIN_DWL_HORIZONTALSPLITPARASTART - sEnd = WIN_DWL_HORIZONTALSPLITPARAEND - elseif sStartProfileType == WIN_SASH_VERTICAL then - sStart = WIN_DWL_VERTICALSPLITPARASTART - sEnd = WIN_DWL_VERTICALSPLITPARAEND - elseif sStartProfileType == WIN_FRAME_SPLIT or sStartProfileType == WIN_SASH_SPLIT then - sStart = WIN_DWL_SPLITPARASTART - sEnd = WIN_DWL_SPLITPARAEND - end - end - - -- calcolo il riferimento del profilo - local nFrameProfile = EgtGetFirstNameInGroup( nMainProfileId, WIN_SECTIONFRAME) - local frOrig = EgtFR( nFrameProfile, GDB_ID.ROOT) - frOrig:invert() - -- calcolo il riferimento su cui posizionare i dowel - local ptInt = EgtIP( nOutlineId, nStartGuideId, ORIG(), GDB_ID.ROOT) - local dParRef = EgtCurveParamAtPoint( nOutlineId, ptInt) - local vtRef = EgtUV( nOutlineId, dParRef, -1, GDB_ID.ROOT) - local frDest = Frame3d( ptInt, - vtRef) - - -- ciclo sui fori trovati - local nOrigDowelId = EgtGetFirstNameInGroup( nMainProfileId, WIN_DOWEL .. '*') - while nOrigDowelId do - local dStart = EgtGetInfo( nOrigDowelId, sStart, 'd') - if not dStart then - dStart = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPARASTART, 'd') or 0 - end - local dEnd = EgtGetInfo( nOrigDowelId, sEnd, 'd') - if not dEnd then - dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPARAEND, 'd') or 0 - end - - local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId) - EgtSetColor( nDowelId, Color3d( 128, 128, 128)) - -- posiziono il dowel grazie ai riferimenti e assegno estrusione e spessore - EgtTransform( nDowelId, frOrig) - EgtTransform( nDowelId, frDest) - EgtMove( nDowelId, vtRef * dStart) - EgtModifyCurveExtrusion( nDowelId, vtRef) - EgtModifyCurveThickness( nDowelId, dEnd - dStart) - -- setto info di lavorazione - EgtSetInfo( nDowelId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.HOLE) - -- creo solido di estrusione - local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, vtRef * ( dEnd - dStart + 1)) - EgtMove( nDowelExtrusionId, - vtRef) - -- sottraggo il dowel al solido - EgtSurfTmSubtract( nMainExtrusionId, nDowelExtrusionId) - EgtErase( nDowelExtrusionId) - - nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*') - end - end -end - ---------------------------------------------------------------------- -local function AddEndDowels( nOutlineId, nEndOutlineId, EndJointType, nMainProfileId, nEndProfileId, nDowelLayerId, nGeoInId, nSolidLayerId, nMainExtrusionId) - - local sOutlineName = EgtGetName( nOutlineId) - local sEndOutlineName = EgtGetName( nEndOutlineId) - - local nEndGuideId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_ENDGUIDE) - - if EndJointType == WIN_PART_JNT.ANGLED then - - elseif EndJointType == WIN_PART_JNT.FULL then - -- recupero profondita' d'inizio e fine - local sStart = EgtIf( sOutlineName == WIN_BOTTOM, WIN_DWL_BOTTOMPERPSTART, WIN_DWL_TOPPERPSTART) - local sEnd = EgtIf( sOutlineName == WIN_BOTTOM, WIN_DWL_BOTTOMPERPEND, WIN_DWL_TOPPERPEND) - - -- calcolo il riferimento del profilo - local nFrameProfile = EgtGetFirstNameInGroup( nEndProfileId, WIN_SECTIONFRAME) - local frOrig = EgtFR( nFrameProfile, GDB_ID.ROOT) - frOrig:invert() - -- calcolo il riferimento su cui posizionare i dowel - local ptInt = EgtIP( nGeoInId, nEndGuideId, ORIG(), GDB_ID.ROOT) - local dParRef = EgtCurveParamAtPoint( nEndGuideId, ptInt) - local vtRef = EgtUV( nEndGuideId, dParRef, -1, GDB_ID.ROOT) - local frDest = Frame3d( ptInt, - vtRef) - - -- ciclo sui fori trovati - local nOrigDowelId = EgtGetFirstNameInGroup( nEndProfileId, WIN_DOWEL .. '*') - while nOrigDowelId do - local dStart = EgtGetInfo( nOrigDowelId, sStart, 'd') - if not dStart then - dStart = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPSTART, 'd') or 0 - end - local dEnd = EgtGetInfo( nOrigDowelId, sEnd, 'd') - if not dEnd then - dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPEND, 'd') or 0 - end - - local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId) - EgtSetColor( nDowelId, Color3d( 128, 128, 128)) - -- posiziono i fori grazie ai riferimenti e assegno estrusione e spessore - EgtTransform( nDowelId, frOrig) - EgtTransform( nDowelId, frDest) - EgtMove( nDowelId, - vtRef * dStart) - EgtModifyCurveExtrusion( nDowelId, - vtRef) - EgtModifyCurveThickness( nDowelId, dEnd - dStart) - -- setto info di lavorazione - EgtSetInfo( nDowelId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.HOLE) - -- creo solido di estrusione - local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, - vtRef * ( dEnd - dStart + 1)) - EgtMove( nDowelExtrusionId, vtRef) - -- sottraggo il dowel al solido - EgtSurfTmSubtract( nMainExtrusionId, nDowelExtrusionId) - EgtErase( nDowelExtrusionId) - - nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*') - end - - elseif EndJointType == WIN_PART_JNT.SHORT then - -- recupero profondita' d'inizio e fine - local sStart = WIN_DWL_TOPPARASTART - local sEnd = WIN_DWL_TOPPARAEND - if sEndOutlineName == WIN_BOTTOM then - sStart = WIN_DWL_BOTTOMPARASTART - sEnd = WIN_DWL_BOTTOMPARAEND - end - if sOutlineName == WIN_SPLIT then - local sEndProfileType = EgtGetInfo( nEndProfileId, WIN_PRF_TYPE) - if sEndProfileType == WIN_RAIL_BOTTOM then - sStart = WIN_DWL_RAILBOTTOMPARASTART - sEnd = WIN_DWL_RAILBOTTOMPARAEND - elseif sEndProfileType == WIN_SASH_HORIZONTAL then - -- non faccio nulla perche' e' uguale al top - elseif sEndProfileType == WIN_SASH_VERTICAL then - sStart = WIN_DWL_VERTICALSPLITPARASTART - sEnd = WIN_DWL_VERTICALSPLITPARAEND - elseif sEndProfileType == WIN_FRAME_SPLIT or sEndProfileType == WIN_SASH_SPLIT then - sStart = WIN_DWL_SPLITPARASTART - sEnd = WIN_DWL_SPLITPARAEND - end - end - - -- calcolo il riferimento del profilo - local nFrameProfile = EgtGetFirstNameInGroup( nMainProfileId, WIN_SECTIONFRAME) - local frOrig = EgtFR( nFrameProfile, GDB_ID.ROOT) - frOrig:invert() - -- calcolo il riferimento su cui posizionare i dowel - local ptInt = EgtIP( nOutlineId, nEndGuideId, ORIG(), GDB_ID.ROOT) - local dParRef = EgtCurveParamAtPoint( nOutlineId, ptInt) - local vtRef = EgtUV( nOutlineId, dParRef, -1, GDB_ID.ROOT) - local frDest = Frame3d( ptInt, - vtRef) - - -- ciclo sui fori trovati - local nOrigDowelId = EgtGetFirstNameInGroup( nMainProfileId, WIN_DOWEL .. '*') - while nOrigDowelId do - local dStart = EgtGetInfo( nOrigDowelId, sStart, 'd') - if not dStart then - dStart = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPARASTART, 'd') or 0 - end - local dEnd = EgtGetInfo( nOrigDowelId, sEnd, 'd') - if not dEnd then - dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPARAEND, 'd') or 0 - end - - local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId) - EgtSetColor( nDowelId, Color3d( 128, 128, 128)) - -- posiziono i fori grazie ai riferimenti e assegno estrusione e spessore - EgtTransform( nDowelId, frOrig, GDB_RT.GLOB) - EgtTransform( nDowelId, frDest, GDB_RT.GLOB) - EgtMove( nDowelId, - vtRef * dStart) - EgtModifyCurveExtrusion( nDowelId, - vtRef) - EgtModifyCurveThickness( nDowelId, dEnd - dStart) - -- setto info di lavorazione - EgtSetInfo( nDowelId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.HOLE) - -- creo solido di estrusione - local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, - vtRef * ( dEnd - dStart + 1)) - EgtMove( nDowelExtrusionId, vtRef) - -- sottraggo il dowel al solido - EgtSurfTmSubtract( nMainExtrusionId, nDowelExtrusionId) - EgtErase( nDowelExtrusionId) - - nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*') - end - end -end - ---------------------------------------------------------------------- --- funzione che posiziona i profili, li estrude e crea il solido -local function MakeSolidByExtrusion( nGeoId, nOutlineId, nMainProfileId, nStartProfileId, nEndProfileId, nProfileType, nSolidLayerId, nDowelLayerId) - -- recupero outline - local nPartId = EgtGetParent( nSolidLayerId) - local nGeoLayerId = EgtGetParent( nGeoId) - local nOutlineLayerId = EgtGetParent( nOutlineId) -- recupero geo + local nGeoLayerId = EgtGetParent( nGeoId) local nPrevGeoId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_LEFT) local nNextGeoId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_RIGHT) - local nGeoInId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_IN) -- recupero BBox e larghezza del geo local dGeoWidth = EgtGetInfo( nGeoId, WIN_GEOWIDTH, 'd') - -- recupero tipo di giunzioni e i controprofili - local sStartProfileType, sEndProfileType, StartJointType, EndJointType = CalcStartEndProfileType( nProfileType, nOutlineId, nStartProfileId, nEndProfileId) - - -- recupero outline precedente e successivo - local nPrevOutlineId, nEndOutlineId = GetPrevNextOutline( nProfileType, nOutlineId, nOutlineLayerId) + -- recupero i controprofili in base al tipo di giunzioni + local sStartProfileType, sEndProfileType = CalcStartEndProfileType( nProfileType, nOutlineId, nStartProfileId, nEndProfileId) -- a) MAIN EXTRUSION -- creo guida Main @@ -1326,7 +1579,7 @@ local function MakeSolidByExtrusion( nGeoId, nOutlineId, nMainProfileId, nStartP EgtSetName( nOrigMainExtrusionId, WIN_SRF_ORIGMAIN) EgtSetStatus( nOrigMainExtrusionId, GDB_ST.OFF) - + -- b) START PROFILE -- posiziono il profilo Start local nRefStartProfileId = EgtGetFirstNameInGroup( nStartProfileId, WIN_REF) @@ -1382,7 +1635,7 @@ local function MakeSolidByExtrusion( nGeoId, nOutlineId, nMainProfileId, nStartP end end end - + -- recupero outline del profilo Start e lo estrudo local nOutStartProfileId if sStartProfileType == WIN_MINIZINKEN then @@ -1391,13 +1644,13 @@ local function MakeSolidByExtrusion( nGeoId, nOutlineId, nMainProfileId, nStartP else nOutStartProfileId = EgtGetFirstNameInGroup( nStartProfileId, sStartProfileType) end - local nStartExtrusionId = EgtSurfTmSwept( nSolidLayerId, nOutStartProfileId, nStartGuideId, false, WIN_SURF_APPROX) -- eseguo intersezione per ottenere un solido unico -- ( tagliare le due superfici con EgtSurfTmCut e poi unirle potrebbe creare piccoli buchi legati alle diverse approssimazioni) EgtSurfTmIntersect( nMainExtrusionId, nStartExtrusionId) EgtErase( nStartExtrusionId) + -- c) END PROFILE -- posiziono il profilo End local nRefEndProfileId = EgtGetFirstNameInGroup( nEndProfileId, WIN_REF) @@ -1445,6 +1698,7 @@ local function MakeSolidByExtrusion( nGeoId, nOutlineId, nMainProfileId, nStartP end end end + -- recupero outline del profilo End e lo estrudo local nOutEndProfileId if sEndProfileType == WIN_MINIZINKEN then @@ -1458,240 +1712,32 @@ local function MakeSolidByExtrusion( nGeoId, nOutlineId, nMainProfileId, nStartP EgtSurfTmIntersect( nMainExtrusionId, nEndExtrusionId) EgtErase( nEndExtrusionId) - -- creo fori per spine su Start - AddStartDowels( nOutlineId, nPrevOutlineId, StartJointType, nMainProfileId, nStartProfileId, nDowelLayerId, nGeoInId, nSolidLayerId, nMainExtrusionId) - -- creo fori per spine su End - AddEndDowels( nOutlineId, nEndOutlineId, EndJointType, nMainProfileId, nEndProfileId, nDowelLayerId, nGeoInId, nSolidLayerId, nMainExtrusionId) - 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) - - -- creo fori per spine su Split - local nProcLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PRC) - - -- 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 - -- se poggia sul controprofilo CntrIn2 leggo le info dello split orizzontale, altrimenti vanno bene quelle del top - -- ( cfr AddStartDowels e AddEndDowels) - if AreSamePointApprox( ptInt, EgtSP( nSplitId)) then - sStart = WIN_DWL_HORIZONTALSPLITPERPSTART - sEnd = WIN_DWL_HORIZONTALSPLITPERPEND - end - 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, nProcLayerId) - 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) - -- setto info di lavorazione - EgtSetInfo( nDowelId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.HOLE) - - -- creo solido di estrusione - local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, vtDowelDir * ( dEnd - dStart + 1)) - EgtMove( nDowelExtrusionId, - vtDowelDir) - -- sottraggo il dowel al solido - EgtSurfTmSubtract( nMainExtrusionId, nDowelExtrusionId) - EgtErase( nDowelExtrusionId) - - 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) - - -- creo layer per solido e per profili di estrusione - local nSolidLayerId = EgtGroup( nPartId) - EgtSetName( nSolidLayerId, WIN_SOLID) - local nFrameProfileLayerId = EgtGroup( nPartId) - EgtSetName( nFrameProfileLayerId, WIN_PROFILE) - -- recupero layer delle lavorazioni per i dowels - local nProcLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PRC) - - -- ricavo tipo di profilo - local nProfileType = GetOutlineProfileType( nOutlineId, bBottomRail) - - -- recupero outline precedente e successivo - local nPrevOutlineId, nNextOutlineId = GetPrevNextOutline( nProfileType, nOutlineId, nOutlineLayerId) - - -- recupero profili e controprofili - local nOrigMainProfileId = GetOutlineProfileId( nOutlineId, bBottomRail) - -- se il tipo corrente è split il pezzo va tagliato con il bottomrail, altrimenti con il bottom - local nOrigStartProfileId = GetOutlineProfileId( nPrevOutlineId, nProfileType == WIN_PRF.SPLIT) - local nOrigEndProfileId = GetOutlineProfileId( nNextOutlineId, nProfileType == WIN_PRF.SPLIT) - - -- creo copie di profilo e controprofili - local nMainProfileId = EgtCopy( nOrigMainProfileId, nFrameProfileLayerId) - local sMainProfileType = EgtGetName( nMainProfileId) - EgtSetInfo( nMainProfileId, WIN_PRF_TYPE, sMainProfileType) - EgtSetName( nMainProfileId, WIN_PRF_MAIN) - local nStartProfileId = EgtCopy( nOrigStartProfileId, nFrameProfileLayerId) - local sStartProfileType = EgtGetName( nStartProfileId) - EgtSetInfo( nStartProfileId, WIN_PRF_TYPE, sStartProfileType) - EgtSetName( nStartProfileId, WIN_PRF_START) - local nEndProfileId = EgtCopy( nOrigEndProfileId, nFrameProfileLayerId) - local sEndProfileType = EgtGetName( nEndProfileId) - EgtSetInfo( nEndProfileId, WIN_PRF_TYPE, sEndProfileType) - EgtSetName( nEndProfileId, WIN_PRF_END) - - -- creo solido dai profili - MakeSolidByExtrusion( nGeoId, nOutlineId, nMainProfileId, nStartProfileId, nEndProfileId, nProfileType, nSolidLayerId, nProcLayerId) - - -- aggiungo dowels degli split - AddSplitDowels( nOutlineId, nOutlineLayerId, nPartId, nProfileType) - - end - --------------------------------------------------------------------- -- funzione che calcola l'ingombro dei pezzi del telaio e i loro solidi local function CreatePartFromOutline( nAreaLayerId, nOutlineId, bBottomRail) - - local nAreaType = EgtGetInfo( nAreaLayerId, WIN_AREATYPE, 'i') + -- creo pezzo local nPartId = EgtGroup( GDB_ID.ROOT) - -- se BottomRail, creo riferimento - if bBottomRail then - EgtSetInfo( nOutlineId, WIN_REF_BOTTOMRAIL_PART, nPartId) - end - -- recupero outline + -- inserisco riferimento alla sua area + EgtSetInfo( nPartId, WIN_AREA, nAreaLayerId) + + local nAreaType = EgtGetInfo( nAreaLayerId, WIN_AREATYPE, 'i') local nOutlineLayerId = EgtGetFirstNameInGroup( nAreaLayerId, WIN_OUTLINE) - local nProfileType = WIN_PRF.NULL + + -- a) Telaio, anta o split if nAreaType == WIN_AREATYPES.FRAME or nAreaType == WIN_AREATYPES.SASH or nAreaType == WIN_AREATYPES.SPLIT then - -- se area senza outline, cerco quella superiore - if not nOutlineLayerId then - local nParentAreaLayerId = EgtGetParent( nAreaLayerId) - if nParentAreaLayerId then - nOutlineLayerId = EgtGetFirstNameInGroup( nParentAreaLayerId, WIN_OUTLINE) - end + + -- creo riferimenti tra pezzo e outline + EgtSetInfo( nPartId, WIN_REF_OUTLINE, nOutlineId) + if bBottomRail then + EgtSetInfo( nOutlineId, WIN_REF_BOTTOMRAIL_PART, nPartId) + else + EgtSetInfo( nOutlineId, WIN_REF_PART, nPartId) end - - -- imposto nome + + -- imposto nome del pezzo local sName = EgtGetName( nOutlineId) if bBottomRail then sName = WIN_BOTTOMRAIL @@ -1707,39 +1753,37 @@ local function CreatePartFromOutline( nAreaLayerId, nOutlineId, bBottomRail) EgtSetColor( nPartId, Color3d( 255, 159, 57)) end + -- ricavo il tipo di profilo + local nProfileType = GetOutlineProfileType( nOutlineId, bBottomRail) + -- disegno ingombro + local nGeoId = CalcFrameGeo( nPartId, nOutlineId, nOutlineLayerId, nProfileType) + -- disegno solido + if bCalcSolid then + CalcFrameSolid( nPartId, nOutlineId, nGeoId, nProfileType) + end + -- calcolo i fori per le spine + CalcFrameDowels( nPartId, nOutlineId, nOutlineLayerId, nProfileType) + + + -- b) Fill elseif nAreaType == WIN_AREATYPES.FILL then - -- imposto nome + -- imposto nome del pezzo EgtSetName( nPartId, WIN_FILL) -- ricavo tipo local nFillType = EgtGetInfo( nAreaLayerId, WIN_FILLTYPE, 'i') + -- imposto colore if nFillType == WIN_FILLTYPES.GLASS then EgtSetColor( nPartId, Color3d( 71, 161, 255)) EgtSetAlpha( nPartId, 30) elseif nFillType == WIN_FILLTYPES.WOOD then EgtSetColor( nPartId, Color3d( 194, 148, 103)) end - end - - -- inserisco riferimento alla sua area ed al suo outline - EgtSetInfo( nPartId, WIN_AREA, nAreaLayerId) - if nAreaType ~= WIN_AREATYPES.FILL then - EgtSetInfo( nPartId, WIN_REF_OUTLINE, nOutlineId) - if not bBottomRail then EgtSetInfo( nOutlineId, WIN_REF_PART, nPartId) end - end - - if nAreaType == WIN_AREATYPES.FRAME or nAreaType == WIN_AREATYPES.SASH or nAreaType == WIN_AREATYPES.SPLIT then - -- disegno ingombro - local nGeoId = CalcFrameGeo( nPartId, nOutlineId, nOutlineLayerId, bBottomRail) - -- disegno solido - if bCalcSolid then - CalcFrameSolid( nPartId, nOutlineId, nGeoId, nOutlineLayerId, bBottomRail) - end - elseif nAreaType == WIN_AREATYPES.FILL then + -- disegno ingombro local nGeoLayerId = CalcFillGeo( nPartId, nOutlineLayerId) -- disegno solido if bCalcSolid then - CalcFillSolid(nPartId, nOutlineLayerId, nGeoLayerId) + CalcFillSolid( nPartId, nOutlineLayerId, nGeoLayerId) end end end From a47204dc6fd7d397e39d93549e841ae4a3701608 Mon Sep 17 00:00:00 2001 From: SaraP Date: Tue, 18 Jun 2024 11:38:11 +0200 Subject: [PATCH 2/4] =?UTF-8?q?-=20aggiunti=20profili=20French=5FIn=20e=20?= =?UTF-8?q?French=5Fout=20-=20gestione=20di=20finestre=20con=20pi=C3=B9=20?= =?UTF-8?q?ante=20battente/ricevente=20-=20nelle=20creazione=20della=20fin?= =?UTF-8?q?estra=20vengono=20salvati=20tutti=20i=20children=20di=20una=20c?= =?UTF-8?q?urva.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Profiles/Main.lua | 74 +++++++++++++++ Profiles/Profilo78 - Offset - Copy (46).nge | Bin 0 -> 226562 bytes Profiles/Profilo78 - Offset.nge | Bin 226562 -> 254906 bytes Profiles/WinConst.lua | 8 ++ Profiles/WinLib/WinCalculate.lua | 94 +++++++++++++++----- Profiles/WinLib/WinCreate.lua | 36 +++++--- 6 files changed, 178 insertions(+), 34 deletions(-) create mode 100644 Profiles/Profilo78 - Offset - Copy (46).nge diff --git a/Profiles/Main.lua b/Profiles/Main.lua index 31e8a3c..4df78ce 100644 --- a/Profiles/Main.lua +++ b/Profiles/Main.lua @@ -382,6 +382,80 @@ local nFillId = WinCreate.AddFill( nSashId, WIN_FILLTYPES.GLASS) -- -- aggiungo vetro -- local nFill3Id = WinCreate.AddFill( nSash3Id, WIN_FILLTYPES.GLASS) +------------------------ Finestra tripla anta battente / ricevente / ricevente ------------------------ + +-- -- definisco divisioni +-- local nArea1Id, nArea0Id = WinCreate.AddSplit( nFrameId, WIN_SPLITORIENTATION.VERTICAL, WIN_MEASURE.ABSOLUT, WindowWidth / 3, _, WIN_SPLITTYPES.FRENCH) +-- local nArea2Id, nArea3Id = WinCreate.AddSplit( nArea0Id, WIN_SPLITORIENTATION.VERTICAL, WIN_MEASURE.ABSOLUT, WindowWidth / 3, _, WIN_SPLITTYPES.FRENCH) +-- +-- -- aggiungo prima anta +-- local SashJointType = WIN_JNT.FULL_V +-- local nSash1Id = WinCreate.AddSash( nArea1Id, SashJointType, SashJointType, SashJointType, SashJointType, WIN_SASHTYPES.ACTIVE) +-- -- aggiungo vetro +-- local nFill1Id = WinCreate.AddFill( nSash1Id, WIN_FILLTYPES.GLASS) +-- +-- -- aggiungo seconda anta +-- local nSash2Id = WinCreate.AddSash( nArea2Id, SashJointType, SashJointType, SashJointType, SashJointType, WIN_SASHTYPES.INACTIVE_IN) +-- -- aggiungo vetro +-- local nFill2Id = WinCreate.AddFill( nSash2Id, WIN_FILLTYPES.GLASS) +-- +-- -- aggiungo terza anta +-- local nSash3Id = WinCreate.AddSash( nArea3Id, SashJointType, SashJointType, SashJointType, SashJointType, WIN_SASHTYPES.INACTIVE_OUT) +-- -- aggiungo vetro +-- local nFill3Id = WinCreate.AddFill( nSash3Id, WIN_FILLTYPES.GLASS) + + +------------------------ Finestra tripla anta battente / battente / ricevente ------------------------ + +-- -- definisco divisioni +-- local nArea1Id, nArea0Id = WinCreate.AddSplit( nFrameId, WIN_SPLITORIENTATION.VERTICAL, WIN_MEASURE.ABSOLUT, WindowWidth / 3, _, WIN_SPLITTYPES.FRENCH) +-- local nArea2Id, nArea3Id = WinCreate.AddSplit( nArea0Id, WIN_SPLITORIENTATION.VERTICAL, WIN_MEASURE.ABSOLUT, WindowWidth / 3, _, WIN_SPLITTYPES.FRENCH) +-- +-- -- aggiungo prima anta +-- local SashJointType = WIN_JNT.FULL_V +-- local nSash1Id = WinCreate.AddSash( nArea1Id, SashJointType, SashJointType, SashJointType, SashJointType, WIN_SASHTYPES.ACTIVE_OUT) +-- -- aggiungo vetro +-- local nFill1Id = WinCreate.AddFill( nSash1Id, WIN_FILLTYPES.GLASS) +-- +-- -- aggiungo seconda anta +-- local nSash2Id = WinCreate.AddSash( nArea2Id, SashJointType, SashJointType, SashJointType, SashJointType, WIN_SASHTYPES.ACTIVE_IN) +-- -- aggiungo vetro +-- local nFill2Id = WinCreate.AddFill( nSash2Id, WIN_FILLTYPES.GLASS) +-- +-- -- aggiungo terza anta +-- local nSash3Id = WinCreate.AddSash( nArea3Id, SashJointType, SashJointType, SashJointType, SashJointType, WIN_SASHTYPES.INACTIVE) +-- -- aggiungo vetro +-- local nFill3Id = WinCreate.AddFill( nSash3Id, WIN_FILLTYPES.GLASS) + + +------------------------ Finestra quattro ante battente / battente / ricevente / ricevente ------------------------ + +-- -- definisco divisioni +-- local nArea1Id, nAreaTmpId = WinCreate.AddSplit( nFrameId, WIN_SPLITORIENTATION.VERTICAL, WIN_MEASURE.ABSOLUT, WindowWidth / 4, _, WIN_SPLITTYPES.FRENCH) +-- local nArea2Id, nAreaTmp1Id = WinCreate.AddSplit( nAreaTmpId, WIN_SPLITORIENTATION.VERTICAL, WIN_MEASURE.ABSOLUT, WindowWidth / 4, _, WIN_SPLITTYPES.FRENCH) +-- local nArea3Id, nArea4Id = WinCreate.AddSplit( nAreaTmp1Id, WIN_SPLITORIENTATION.VERTICAL, WIN_MEASURE.ABSOLUT, WindowWidth / 4, _, WIN_SPLITTYPES.FRENCH) +-- +-- -- aggiungo prima anta +-- local SashJointType = WIN_JNT.FULL_V +-- local nSash1Id = WinCreate.AddSash( nArea1Id, SashJointType, SashJointType, SashJointType, SashJointType, WIN_SASHTYPES.ACTIVE_OUT) +-- -- aggiungo vetro +-- local nFill1Id = WinCreate.AddFill( nSash1Id, WIN_FILLTYPES.GLASS) +-- +-- -- aggiungo seconda anta +-- local nSash2Id = WinCreate.AddSash( nArea2Id, SashJointType, SashJointType, SashJointType, SashJointType, WIN_SASHTYPES.ACTIVE_IN) +-- -- aggiungo vetro +-- local nFill2Id = WinCreate.AddFill( nSash2Id, WIN_FILLTYPES.GLASS) +-- +-- -- aggiungo terza anta +-- local nSash3Id = WinCreate.AddSash( nArea3Id, SashJointType, SashJointType, SashJointType, SashJointType, WIN_SASHTYPES.INACTIVE_IN) +-- -- aggiungo vetro +-- local nFill3Id = WinCreate.AddFill( nSash3Id, WIN_FILLTYPES.GLASS) +-- +-- -- aggiungo quarta anta +-- local nSash4Id = WinCreate.AddSash( nArea4Id, SashJointType, SashJointType, SashJointType, SashJointType, WIN_SASHTYPES.INACTIVE_OUT) +-- -- aggiungo vetro +-- local nFill4Id = WinCreate.AddFill( nSash4Id, WIN_FILLTYPES.GLASS) + ------------------------ Finestra sei ante con montanti verticali e orizzontale ------------------------ diff --git a/Profiles/Profilo78 - Offset - Copy (46).nge b/Profiles/Profilo78 - Offset - Copy (46).nge new file mode 100644 index 0000000000000000000000000000000000000000..bceecb3635a93d9798ccef059a1ce57751d8d585 GIT binary patch literal 226562 zcmeEv37i$h@&8*-RD{KVx44KXUby@AHZHG04p9VT6%vhdBPbxJ9A2Bn3s6BKVvLEa z@r*{1DBkRNfSO>U#`}nCyhuD)#UP5Z|L(4?>gk^8H*bbr;h$gL2X>}wdcIv%-CbRM zPTRJr)Gn!1s`pvb`;IwxVy~XxZO=n_sZ@_1Jx1s8tNi6l65Mac@99Bmw1~1Z|39Fr z&(skU$K>(HP5cLOU4I)ht|vgx;W=lCCnY$QH-46O;G|vo{{dCiBc_cTcFMVvcjuwL zBPRD6GhzCOev_(7OWXJe17}RHDk(yk@W+y4`%bBp(72FA{1I{p{c#0K)$Yj2 z1F8m(87mkPf~EKiB68;<5s3WNRC|$eFajc{ksz-&LQORbr5i6<0YolVZ!&fDsIloeAVX%S zTnLKp9dD)RMkei*$~f!0Kptf2-dzA(!H3K~vray&D-UjFtA$Y^JC+u|RqC$A) zf>88=-0iMVA3%duNFBvw5|I$O>hE+9SkB=uv6AlE%j^O+e} z9?@n;)?r%y^arL4&KX)usq8{N>-(>l>kt0r$q^7JWj_0~L)Ynde(-AjSEhjDSEXF@B>d9i|Y|l0dNnQ=(ZxFm-Lu zEJAdU6sT;83j*o+UNokPLC|1KQZ9(D3|>eA4b~y$f!nz<=vjhVN~rAw z5m!n~1Ep8tL{frvsOilB#A1c$Ns39CgmgmmS4k#;R<+#)fpkk65Ha+x&Ks!hUak^DS;-C3TZsitJ#}Vw-ZnJ zAAh%cCr*OyDDN@1=7E7@r%kUCe|WeR4-YtH;K2UXRYm*pdvQB#K#!Ap4=aL!0nrub zJ#iIvV4pty`IAEN8owVb?nNglpNECIMEaeT!Amh75I;};b^akK7({8FCRB0)_OY2; zP>HOZA#CMr;gBA$m6OQIw{an03zYy_xi&5Yq#x|r(m2DI<7E)Tg@8?50%T>nTnI>y zXS$@G!E$Zowo`HfhKo3{v`y`vMb8o>!=*Ys1QDestcqx!F%6`va2&&h9##=p1!~_c zR)`+2jDVx8+#qa~Z3t|fY&uF8awV=+J$FGM-I68*5lK34lv|T41m*$eP4k#ZP#{=_ zmS{SQlxf(uo6g61?ue>rH=TK$vn{ApRnir>eF2Ix*i ze1OPhE(D~*3%MI7(w=G?U9B!Mg4Y(*9<-&rV=nV&A6u462OT*JUP(sP<;Qm3Mz-Iy zWyI%JNvRpa@JZyA=OY-&LRs8f2U#)cNty!HHXft6ih^j&Kq>tusvdZe(qROWl7s&FD_q(n+F8$AZCaFZTY+>j+`5d3Xv&i;&D zVy%*jDI_Yf(Drgxq*Q@w+229OG=o>2mk~n>_N%s(_}r2aSO`xIWC1*A7{`TenW#ArW0KWBV|n zTxvWqy0JDd+(i>35n?`fKvlmQ>3^qZ7cBOm>TrK<|*#dH;aQTT>pc!k<7(kmyXQjwFwBrlWk^(Ybq@o!9f$C*lX zR=%Nf!UI#ct_fL8GUUp0L?WyHkqbf5z2m(Qj8GD34}8OIVM-T#L*yhdb$dLMf&}QH z;sFu0r#eS21VxXWkku)X_P{=G3sbt_8zLuxsoO#(xew5_Oo2Ppp7IS{2#Ov#9jo!R z;a3B`+ro@)QOnKfDzmT^XLPmheRpICQ^N4?&z}fWWB1L)ur@4UJ8t^aev{hpAPsCw zimx>&I)Fb7v<7Nun<9s|2QIUoVt=^sn2yDt4)!>9mLEyOAd=v0Py77_xqat>V(E?3PBts5_8))AtQ z=YB~%K?SCm8IR~dj^lTlKq{p1gjs)rQ^U-99;b^ny)fh|ZFA59uYP~ceII*GnSb7M z#SLpe*LF{(WL+9F4JW?e<4>P9WgfV1!X8~WudBcAQMMxQktHA3ro*MT!UTMif;Px{vGHEZi1#SuLDGLm03R+;K zgOI&FLq*vFTz$#{XNRa(`pX?U!~)m!JG^?$<$WT!Ys}!Rkjc2Vn9V(+Qd^KpJ;@Vu zSzzH!(<*q{AR@WLMeZ^X_D6FKPwjBnJA&3&FBEudUN~2~@)*!A^g4IumF)59rV$pWVU(Lx3ZVvI_>iUc7%4ZM*!&dy7 z^VD;TPC@;iQ0r~~9~}TT+IavEMRag^Wf_G+cKKH`~QGu z`)n1>-t*tD*_uH=x@N@^NKwVPasxwEVtzujHfm!d)K6gsaBrj7%2--q?RG3L+=_b} z#ps$42S?qK>}@QZ;t2%$q32-JDMH9iC-4T;42BB<>2>405R7mVB11W`NcbJX{jsK> zhTF*gcf>sj#LOqn&>J%|+vWrd!SHiDGi7&(WK@~0v=oV8%Sd4}sU%~5YFtxsQeexX zx>5nUnXnPUd{om_E(Ap%bhc-_oh3lpQ`1!^Fc~=#0kwrArWm%8N}@eAU8OiFuw_yG z_yFBX*&jshL9aUHLQwPVHUFgI!1kAr2k)tEUg0 zSHx1MzVmSJ8*_)&d7}(NnqB|&7eBr1ttbf0n-n{tU6%4GAvuJv>JUl(H2Aa12{XCE6TX ze&5WCA0N8=k?hg-Lzn!}eS(LexCQpmn>xO|{Ao?c=dP>HOEu|{&)SZzdholSP9*5? zS5d0K7Ffzl`5p}ogrgW#%1dQUQYjZJ9j4y)yB(j6YHKw(Nr`(QTd~|AP)f?ndJXEk zW2Z4+DElo+nJ!wGnzZN9Wo_7?(mADG=W{)LZ@|d>pH+T+AUo%VnK$0jl)IE3HGp?9X&_8I!pSk)6 zf6k`|E~(oEd!DO;@dd?_)ALRj;fV(f*RtJe^j= z9de?4fbTO`9QpDyk3DE}@_puv1$)*_Y&t7vWRg);+I*H90%q8D3^;GBf3L?e@3dQ0 zxe~&u)R^}=JlS;d$sUFyuP9^bXK(lGwej^`*cazLQL^eWEz5r{U9^7lx%;r%?bdx* zy;Re4MlN$9+es&Nwe!E$))(LN=S^jMen=%mdZ^_?Sfp$i0kv0g+GC&hoc8LW?Ai7E3|iM#%W}Z< zT`vE})NbtHrA>=AKM}C`}WP8;XKs+ZU5(1@kcT;2{HKzkh zIz{&#NlE9Vv|2o~%}3j5Y0ybLZ}m5;x?Ha5ZcKQhrBrq#Zf$P~Cs7%mR4TjSvCVlF zSxJG)TfnF`#P=C^V$(5x$d#Z~>+gd2K6A~D{onaR2fJ$?0;xzkZ^{$3HuJl%>My^3 z;F{|{ssH2Dp$}d2+mEQ8Ex-9UKm4+>CvzumKGCdHq<&gHarF}!)@RPikGhRgOL9!fReU zuRVMH_WPgMbCqW0luRemove&w0}JmJ+B>aW;yeeI}@y7&9+<5yRVzGZNHDbq#!j=$^i1Ev&sdwtbv z(!nb3S8&C_*-GFGtQOpC2PS0HpKCPp(~GJ7RWk+LwM(* z%aGH;B^UESqR{zW@~zuT2N%92I_VO*xF!1N5*b=XXD`1i( z6o*_m{GkCUb|HMd@rjcz9$UaxE#m&~O}QhJ_9BcPGJ;pVY4?E7Yu3Efu&%y-=EC@^08~q9&=c8fnA3DN1tP}@T&7tjYCwkx{0Nqwm#FY?)IzB_0VLt)p}@V zzZoyAE4f%X^Lbu)t0Y<~++ptAM+n}0ze&6D$hen0jmPBCk$HI1o^a;d@|aYk)%ZF# z+qwrHE)X%!;5miO=rIdBv}*vNI0>v0QENN`bTeTigtkJBi@6XKJ#y`b#wP7S@xmQr zkqD@*sBy(1Os5rbhcZIDhMWXei5w4z0eTj6L{{yZ3qjE%mwxD!NPFPSZ{@`!vg}o~ z#M%*w4DD2lEFFQhH!ZSsL|KJxVd)68Q+!sS`In9;yRa=R9VuzKr6X!sU@I;i(N*7f zhqe$#xH|ABVI8x`z4itC#Vn&-avSHCHH|6u?yq;bZ2e^uJf2jR9|^=DQe!=wQd2~e zr+fGO>!w5-A=9|s{_qvf*1>u1w5=y7V_Eh^eaA6)&t3pvq4|S|tj5J02+rom z4`tmWGIaSu5VAIz7MMRs`2tO2g66;L+lM@GL%XNzKWsJfpG$7lGc;=LsOL{D>phpz z-{r#xr`o$*9+`|)gq-W{G-@OAw!7F_qF=H#O7y7swlha=e=eebyUf+|gqf+sT) zy9vYLn*U5|vp+wtAoIw?34{IT70i2ZWBU{ij6|^^o}-Ke+k#jz;{*tm}CFlxf;-tDxCFXi^!X@(>lI2CPB4hbKBCd*yZ?0B@P!BV^1|N_p`whHKOfNZU%S0`9GiURjT_JQ z$ujWt&b3nx>dWrn%OJk~T|626O<0W96pv15{?@cemcE@-ljmzqkuI+tqs*;Ok6eGM z$;%4Co5Hxzx-kGd5~DRm1^W2px7v71dZN}849QNx))b^aQArs!Sm$Gm6j+)aLXEX{ z%pF=QPz@ASv&t?7hm80~RQ5Jzjy-WvyFqy=cF8x#y>@MW_wK;2ZcR6J{Lkx0bdE6? z<`Y=o>I|tZfKP(BT2nFM7jgE4bLF?@8dBD&YEHuLcs$->pT!^LiO0OH^nXD`6nbdm zJ|YRAgK=SC>EIRNV0Gx?=W$+#J=TneF%-AF=Bx$jA#d)XLoFwWxKd(DD7^|Nk`m0qGL*(*h3N4L2`CWixeKD^0tS31fd;GYf*`sj z4eBlAs`CbF`t`_N6a?l$OO!w`4aADYwx`-#i<~W}rBt?oAiQj^`5bR%#zW~9HBkvv zJxB*D*m8R(cxKY>kd_jx2`VZQf}~*pPGK{xBvRr@|4K^lM9;un=AavqtN?GCWIa3V0Lo6!NcKq5I+?1_sJ|!n$hlrErv7QoHIVsA* zx$JUG<0+BBM{$|o5W~k+p8bdU0xn7j!j_m$$#dDZU^yix4wwT#en-R8gv-v@Y+2oaLbmW?sjy#srmeNNhw!oYg%uf7?33DuWOFl7i(csVj z{v~fb?N3a&N=eLbs@N#%OIYnATpR=7Xs4l zCSKzN?>Mr5EXW1n@=Jn%M4`@#GN%O5-=jF8H{=~M^D)tZ9H)?c|k9f zM;tAhJ>fF?)=7vt6!VikV#-ALnpDh-#+~u|kGunCvs}OQ@XAY5N|*C5Jv_I#tiAZs z!;P(19r?|}`b!U27WRH5*_R$(z3!Oj?&gNj{?fy&KBq6ag!ekO@JkOd3?a^V&YQCO zF7c&@N4C4A!oPCjk;)~lQ!!7)kX{LV=>g4^uQMl8V>}_q!K6Q zC_qhh1OjrB&l>uzcyHSCUu4?+`Qp9KnEp}*(*RE59l|0l8H_}tOIM?{Es>G#tNfUv z^NRTh1CcI-5VPV$#0Q8BZm0_Z=`o!}sSVTm+6de(Nmgt+@)vT|b_sSR5rkEB1FvG1 zrQs7wAgycz+wjOnK_+xR6#D zM6jAad@GK&u&{w))SMs|TxnH-NzNKVWaw|Z5Qv`dWkvHpL}VDgbRl@C)da|3xLgQC zKR70QSW0QKiu(E*o8KiVrC_*-69aDx z7d(LB+9nn}fcrzM5-fcaJzg1sQ39yuE{GbOElmOq_1pzPbW0j53;jXes6a)hRR&QI zEmHtNfnXVk6+gfH9@{;OoGqxORHi|-zOYs`%bO@=ikXp!4&*r1%mh*)jVFd#uFeZ@ zIypIbgiZ%eBr5`?x?nc@Zt1P*RTo6Jb=YJ1sA<^Hs_)m;&-k+KQR{ZRiJZaM-=@QM zgW5XS3UU|OCwXYdz}d{Ehw8;oL}Uq29D;zz@KWwA5@|1cTj%FR-rF5!r>DRIuet~* zBh&!i>VmLZ78$M&(p`W=N8~aW0@C4)+>H}y586got4oaFO$%xd+EUJmEMxmvvhY?q zl#YyrTuDY~8>yYQkOObpGGYX)q-?>EN(d`*NQLN8b{ts(BLemptO$7kQ4oz8D5c*h zt6@opDa0|7ytMk;QqD@Kx!|5eC>@gwxr(d=XlP4gI3uQ%h^j-IUVS&dYPVXj%3+HIU;Onuc$MZ6H<03m8v+U-x+jS7P87 z=I3(wzHXX6M@pX_6%rZW*G=!PDf0WeX))xYzfIcA-`5?EYCFW^$z=IqCPj@UpU1L* z@JEOPq0=f{Q*Z8s-Pn>^qQOq%I+mWhS8Ul3qjH2Xd_e} z-L#9Lwi!H*opGtAl-!~#W~v5M4IVRAp3g5%2_-E+4;gv256ndE*mQy5`k{W)GJ*?% z=p#KBP=JoeX3iDZ2ui;JdH_!o5ZTPR00JVPz$|%ZmnYP)P0z+K>cPxA8v&66`pE)~$Xh$_Y+16f9RA46yJY{Z3v&@Kggt*cylHBPV8N+niuA8lHP~A{n8gl8jLZlxYkU zNMQ)#-rg`C)iayYK5iQ*7h;8)Zhj54_pkRExGn?@$>!64J|inmAv)D}(A zW;CYnE{XPFfEzgpoH&fyJKOW6ll>O82SZFL7lNYu&Kt@O>l@c8g2~^tYLGJ$B3gZ0 z@Ez-$I_>|b2_K#x{vGQJ6pLH%9cvfFa0R^u-?0vXs4c6!VDa8_w)i{N1#=uH0Na_2 zdDDX5v39XCCvftc&72(;^%q9`!8E)$J4XnVvK0eJ3|k4rT$l)~ls~cQgD1{zm>u|z zHSTBK((hQa+1t){tX-_|UAtTO9qYneAu#VKFYB#bgkZAoSm(WS#Pu$D9_qO0oRitQm6Dp%B|YoP*nT1xOV5F)meh};a*S!r-JhAU}oR*)X21R{6F z6*G#PYFGDnyCG3jGmGWT-LRObL3{la@>Lu?Ww7~JIz?`eQAX>OU2zu)L3zLcmcnK#NgS6VFb~tL1%dRs(VqE!mJmX#6(=qT#(Tfwmk1hs1{Va;?GbaCVCWyp_B7OXgoqsa#ca-J zu!XRlYNE9#r*>y~q3MPYH7mtC_g&QrI0z892>} z{6G0t%%kf49fXvNmDy}!`IF@@?08lLi$1nVfnZHIv<-nLcSyyK9Gg3|FBN@@+5xY8 zCV$}a%3*cUfPr$a>41T_+f?L>9PfoHR(E0SYyoC8BbqsW7c*O6oFDgu+GPy)gxY1& zNHHWpG8P+qLSs}gYfmT@J+&v4g(MnEB2J(KUWYzLR6RoN2KI#3V={5A4mr~N6 ze|qvBznRUhV<&v}){#+NxW>%-Keqk!s$CCa2fnr8{>evvR^Q{O>4&ua`9G+hRK2od zMEgrlV?2@Eepu#cut2W(-ehw!2R4G-onSr;It8g9!o6?)`NWH!pT&Bh-hOao2qDN&AO2C%3(G;nf3|&SLGJ>vHwu-)eeP3RFVMzL>rF zfs^OWV*fcSGx(W}Q3xpGXPM{L&dA?$)4I$XXC2$I%VRfF3Au32gukR}#(Gg4&~q#y z<>h-_{C4&Ev)D&nS^G8LXigq_VBbAvUNDR8^;N4$2d~g{LU7!Wj1|f9aW8h}r+-Ru z8SB?B*mr)9$8OGGLMk6U3`bs3#>!1Uef#&{JT;50>GR3=*Y2Wax%WT4d%k`0Z1(!? z{NpXFa<2tKM(KlVc3Yoi$FNE7Ec(gf&(_tS zQ8jSN55K#gggmF~gL}QSB5Hl77G1NF%<9bV!fw6y(}72fUsXT)&|Owvd!;_!Yx&K; z`Qew1J!9z`v;t;l|Jm#s{?++Ebg(9jIUV?q(w3G|R7rpayW@n|5@>V1QOf3SHala% zo^=zO&dOOKI&Y}^kQ)Tn_k5)&tNld1B$^^D!_LrotG`**<#H{J;p16n`9s-*-E z2M5UuqaaX9I=!S`eUg$YgG{m}-XJ*?6L5)m^CTextju9^R<9gAYC#l>T4pUJ_(Tn} zbA&)C(I=uXVRx&TTR*Je1dj+&H=R^vNEhCGV#U|jt)I;fUfQ&1^AlQ{wA+m zJoTp~C;f|BDEZOJ@*$r8t*rMXWxDD&r`~kL;@NEFhBb?8cGS{{vG@8hvsvwS>prYr z8pWb7F@i33K|K7cD;n=Bp3S~E?}?ICkL3=n6$sXZj~K+O^4qb$=Dk*X7oTaUoY$$H zf2Lu~dmWx^y7*+~lOy{rNeR}6+ssf_IQ@zvUw-DX2W{^#J9_Xbl>zBG&*l-rTxaeq z%a0=RL;Yqg&IXfbx8D9o{yKDq+4P-ULqH_#B97ohBDa9lkpN6 zij=3CTYH`s>Gr%X&r#QpavVC~IR71qfQ7CV17ufIIYd2orSGF-*@NZ`Ik9Kl3oisj zo9+X$Z%IaIoe&|mjEHN=8nat1^AQ@e;Yt>p6QtYuiwuNa(dwvqHy4Dbl8gaOw$(b- zboeAMj1f)4GLmANChoRCeXC-tJfTJoL8#h?ibH&hU$Jr(yAYn^M+_Iwoy}G);(dpk zaz`fZWjA_0R^V1|+CJd(nl&#qtgEk|x$wP92Cc|o)T=wCDmG+J^)MWHMH#_Ja`P+C ziu|1=3pbLX^epfsBN$0EvypX3%V>h@0xRh;r(~r8DVO`tLpU+$wqY^ZFhV3F7)dn0 zkq9W`&J5tJ%8h9xHchgBl({lL{pXIk8t`49BUd zC=PvzAhIeL4g^GwT>YYvNqbN(60e^jZE9$7mqdHeAR#BsxxoV(q!en;8u3GV5jr-}O&_@zcxRvPUwuWOoPHg%`Jl-5n(@x4Q!@19NSuaOGt) zu5YoEkYOq_vPU&POWU;zk3XPFenJPXjnHd8K9AOE)={sBj|PQ-JiY}1Jo zXz-XCe2=j@?UnJH#o6KYw|!RIfu9{-k142iA`HWkS2V1uSSwEKbt1@N%+-CeF@Ofo zg@9`@k|0Ba=R!bw%ypE|fJwc%5YVZLflN6L4HzOst~9ah7v`r`&*Hc^2w_|)9cexm zWHBGR^Y@hb5aZEcLd=n9{H)Bfg#*r*eU7fUMv4?@%;0Bb`keaj=MLqcm3h9)n&rzM zT|$NW=1X_DvRnFeMz2KOV4+UqXJvkN&-(|>yhC$x(SiZjz4g!8?2uK@9y+>{rbhu& zHpVs~vXjq0j54(A(r&_pEZ)$1px=a4&$)eRqR$V+HX(2@Tw8YflPg{lCgk>)dd~5i zklM{X7w)|v_eCJ2lk6rWpjzE`RZDGGLKIyT;Zr;DCc?nvNNtnJ(fNyX=(>*f0!+CG zSfXGMha-m~aDx#_ccF4RX%7Z*(Bwp#L#;g%Tx(C#WA^-|_9~^8LO4OXl(E|w&rCT> zh-**z*jXXCRg4QQ)CbVi^Oj=@Uqt2Y))`Zn#g*im>Vt2^NWV;sanodo3zQb;7fOiUot`jrCCJid3abrMBEpd+o~BQ}=pWbK>&B!#UJcsuGDi6xMoP zYDi=nN!BcbkxjXJN3PzKmdU;&8Np~4;B62hk3pS2MVG>AJ;h60iG!5o}rOgTsSlUCR$U)eZ z6bOdF1%YmU3}~%DunY*%U=I}9Y>}dv`J`og3QP0C8#GR~KS(K>uzXIYDn_55EFH1w z`Rgy$4TmWJhIBt++@X&y7N4KIwB74>?Y=_y6Mp#mrqaw7^%K6X|HXpqp46O(>EMGK zX0tc?-f`~*Rho`GxvnH*>?RDn^PSl*u6(pJ?oHY~g0TF3v5TdcrHZ^oh$|2%l6Q^xl~B&u8l@diVXxxBos0 znM#PW2@6Nie*f23Jp0mq9oE*5zT%vNXYKJ(2IJrTr_+WnJg}FC;m9k>SoxQJT`zo} z%QE@Q8#kWqljZDldKC`fhc(^7*M5KfyWF*>Z5cFSFT5H;oekErbZ@w2rFgDQUw7czNuF0iwF0J|6fO2}VcTzHH96n`Q(5SB16Pu_`;JSx`csD;U~A zMB*>-TU;vp@TE);13#~p1!z$OL{^jT4g^Gw{6?rRIYb5n;6gxIk|2W%>q0=fkELX{ zIzvUqz0E=V8K*GA4Gl3!(&FFv~I; zBAEeFpgNBTA!3_(gl&crsJ@uRlr%OgNKeIUC8YxK{32A81#ypqj>3gpwF1F95Jc`? zhKXt`Fy1^pNLg~xej^|6^U$RMmuXa++N;a1yENcpnJffDTFTPH&iHQW!Lv|N`Cc%x zpMv!)pWznUa9`?V=6@^eJ+=(#GLseklIhZFda^qdfj3Az>96y`J?&N;9J)yTCKZXm zfKvtz>|b4#-jCml+hGHGoYb3t++FrH<)>fx7o7S{YRw-H?9)el_Wh`INw-q*Di8M; zpMl>MpQWpgDlVrd>8e5#G!3BYyYl@e$x}oHu*kOmdHGxsAwSI4|9Sbcgh12WYc7+j zvTbfae_DI+$g)}(KW6(WIr*QLpHO??BK*(GNA<4@*P9d_z)68tKpAYgB899wxBC(cnvWte+Gd(^j+9D0rz)!Lp38^+ zKO_P3Q@3afDmE(6GjnzBh@QJQPa}%pO1ThjMcH#lriKvuS%_f!=BA2x2(=g4P4EJ* zx(KK}=w@B7WU)CxddyyeG@xM0T?lC6V<40EOw$~@kwBGLjYZ696DcF~u_{n|eNFu% zJ!Tg{B10F;g|McUffQEH0f?c0h4%cWnIM|2hv0>#8%88nid=)LyG*QHdJ7+fJxrd2 zzGKeNTFUf^%PMaC^~<$PF%SWPRV>BuqZO6IhbSIdpT{xsDbNtyeaeDJwu09 zeXkF{ioN%e=cz2XX}Q+n^&lrmmlKIQs*+kjDbuBCAK+s%){EFHXhHy z+>U*!pG4Hfng`b@}HH1@nonjhTiM z-|z9KPn$B2-|)~$VoSwcYyVv;wpd`4IjgD{mc&^WhA$dd(;N%4`jmLiuYPmfij#0u zC2Ax^#Kl3EA8AxYaGcu8gZ5ziB_}knZcQH$J&El%ku3xqZ?`9t{Or$H$!ru>}a!Vk!2d+4ds@t3(J%+O#Q5_87>dJ+S?V(0s0VeC>fN zj-&E6CrD53in|bKq&@dm#kTzf(QK}GEcGed-(rLHMQL+{Jl~VW(fJ3fSThdRho*(; zz^KZ*JWiPH--*+uO@~pHbZ}H9?KAm?moDfyh#ooe5_IVw9Qf?0vA5wAN6O=9S$-r9 zGb0f_eg_5(Q~I05tH+(e=WFcVn5)Q`90WsTJ`zt>WuL~0cVenEzR(O%O|&YrtMUg$ z(-hPmm~|Hd(rtsKaRPUwJuvHujjt{lMiNQJLCj{rZb)1WkCChuK<$~c*e+zdv9!Sa zLDC+Kuq1Byn@4;8E&#G(dogwK7bJ+5Uzv3&y9JE#MLY%o8<3$WmI&y^NADkR!*7G>s8es{Uue`Ct$v=65o8Y*emg^p6EAk#$Qvbkx z6ZYVHS~AF6>`n_-gY?t^pWXZfH^FufY(<+k8*b-Q>~@b0Q*>Ra8pJli*!}Ev%l&e% z`+fb}93l3!U`k24pQZ`6`_gjEgBwbljww2?sJ&7b0@5YIk79yRd%&|UtA-3)WP))i+?iu03_f>ekr?{n*D5)q%9qOw8Z&ir_4E-_ zr&kr1?#`bnQtwHltI7(6M1nA4>IjHah*3C2L`fI&-505z=T4t~?nHqkXeEVv7&Lg( zh^gK#F7m~sG>VG%_Ra|aAf>hhsR&gpB8;wUo1ERJb+aV)ZnV@aXt zt{TNLZI{QAkn)%=Y{%cT%aT8$(sD^fSaD2OZo|b<>^pH5h{CWEr7CGUdudEphP|uw zR9X@!XsP2o&PkSE%M`RXb1rDbSkTgF)5z{o8A8>R1#tqZFrH=GV%oG<|5w!h&lI%}w{B5; z<$p!(|4dQ47Dt@6j#Yc(e?{&8Oi}BFvoAk>Q4@Rg8+bd+OIu()f}jakNbS+r-mGZ( zVY9q=%k{(7KKb+QJEcf zL>B_?u}^{wL!>SQq}#G&;~RM{k&#>oC`%mV&{TDXi;Vk@$7vApRK|&0{tMrwFXk<2 z9RcjGJWz?s}!=;py zl{7XhNY9UA(WgR^650S4M1g8`VnAyJLL-0>4f<1HK0bW6sK6BS5&7+wl|N7*7!qt9 zY*vsS`I#Ecn3fVO1475W`jyi4+Ld1X;0<0Yxig)2)<^ASzJp(sw~1-FFO|0TU7+ z1*%>5Xy+p#P+@KbCi&ittY_);-}0~id0F}rR$kqy<2>7Q+&q^_LA-drDnNrZaX~aH z=+t;GL|5S?${Vl_ArL)&vw!z~{WyZ5#@wNG-hg!&G&jdnB{6SW;EOkDunyeO z2tDAE)1R;Cv;5f)&&gSVT1v1EU2}y%DO)kf7z|t4l;mUO>5BJ$`0~us!ny3x_CuHa z&|M!@icadGH+6h_x$kstE73quO9|G2d)%SEeBect>c{=!%?`YC&>(mT>8gm?3GuZy z*WT1^p)--jd}{X21Q?KQp)&#Y23`K<>`a*56uZ-aO@vJs#l`UxrC)Y8!FnKq?ZOA% z#=?({3`W>8XHIeg#s*tVn-iob=}eg26dM8E0-KJagzcIaH!MGYFL{9A7bLBQA8FGU*1uU`) z0qJ%T4FNtFpRkBnq-k7SY+g6k(G~IVy(a;yAY6W+eb?ze~`2X z7B;c1Z$|BbMMh5Sb_-ijo9-9NzQ?ks29CIIFMc)xBHL}Vj2!+)+bXcI2^O%E z@YDc|-4dq-e8|BYL;{vY&f_F&ExXGp=7z7Z-$OOw2e1;NaoD16X(H%O|WYk`z3jyi!l^@3h+v+n< z3P`1rY|&6A_}Jh7@r0-NEZD>Y_W$gpjJA{VU;u7{Kf3Xa+M895QD=4IK`kPY6&a1JFqU7(e!A8+_5YlBt*5i9Y7f8pQJu6AS|qJtoW$ z?(aS#5|$0c4Diuw!d!p$C<&W-E`IZ_dcdM#j00UjA(z!X`Wy|ryt4)?(bh~*%e2={LEty zTAXnD84LETo7i-gmlG@X4rNNQfjP+;$KN0QycSMhbNmZKG}okIs8Q# zOW*0&Yvb#0a!2F5CrVa5re$f}>60Jc`>K}JZny5k>ZO_@t_F z+^}YG&5pSbHIw$r-+FFF_52QV+5Vm1?0m|*QM{q{Qmp#5uX^qLueJ5X_xyQN*`6O# z3E9y4{p-h+4`GqAVFZ-1;`0@|y>RM*bJ?@&_ZhUVt(N7*F8j~ z%M*U5n*p#Rv1@xXj!SpKIdgFOJcr@obdbd|=iveZm7u|kb3t%x3GtIaLr>ZT!RgoB z*#DhBbU53CB%=T7yeUuA+RX35s=xgDforb+r2danhdy-8Z$F}Xw*2Pb{P4@ho-CRP zh@n}jc;k`r#a}!zm-U%*@?-BcMJcK=vvTEYxAj?e4Ey@c17B#m{HM2(*_u9|e1GjO z6Ff{R>Pk|k3m+Z#+^mv&YS}Btl{`B4@hAwa@_VuIE6@Dr39r6Tf5o2bYe#j|8<3xU z{OXF)w+xOiWxD7Wr|mxPrx(?-y}oKS>EIQbl^Yk-e}316-1FKo7UA2^X7hd#$z{AUS2q7!e3G~V-rYOJot<5 z&)%`1mbH7X%hiv6t6ACOi7Q7|URleIyXK2e+CQx6xl37+EHCrf+DT8O_T*BYvHHtd zJ$zECy!4`2pyya()1|LZ_^3<$t+lM@3yTilm08lDKWh7_gp=zHW)zGkx8n|LgLu{H zI;$hY+wwS~3P=YRTxT4w-AW5mz||JKr;rnS-3gBG+I0Dn;}6PcjvU(vh#a|=M5jX9 zgBA?OYa{YbHN)(9&$LbHAmFf<2rUe$FsJT3D zGn;)ON)gzFZDAowQAvv}L@5Hx(6DVUMEQi5qy|x%c%|{53@Pf6Z!$FObTBa*6w;)< zSj*o1^)8pKzszcVMIy#e7hWLamvxJ1JY(;kf8E3n{A9*!*#c-f(>QVR+Lf)R?&VuX z3*N z5B22)mM$U>IBwERH8OaB4>ha7}7(1&n!ZcjIrA=Ih#2)#Q+@V zRt_Uyr0(5LtCF>0Pu@{EyNEAOe`CzXfe+oFdkeKcE1UM*y1DGC-QWFe;buK+kVQOr z#A~{6&pMa85Z3R1&AR13%w_8;diVWmW$wtNJ!cyh&Rb&!O2}QA8Mp2B@_rrG)^AvL zz`?Wj_=pCs?*7wh!xtXd%L{)$go-jð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 literal 0 HcmV?d00001 diff --git a/Profiles/Profilo78 - Offset.nge b/Profiles/Profilo78 - Offset.nge index bceecb3635a93d9798ccef059a1ce57751d8d585..5f0a6806d141f6d81d4dd1b2eb7a5813acd53d47 100644 GIT binary patch delta 8347 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 G!v6sV{a*I~ delta 20 bcmdmWoWJQ6Z$k@X3)2?ne Date: Tue, 18 Jun 2024 15:48:59 +0200 Subject: [PATCH 3/4] - modifica creazione aree di selezione - aggiunte info per gestione split multipli - resettate variabili globali su chiamate da programma --- .vscode/settings.json | 7 ++++- Profiles/WinConst.lua | 3 ++ Profiles/WinLib/WinCalculate.lua | 49 +++++++++++++++++++++----------- Profiles/WinLib/WinCreate.lua | 20 ++++++++++--- Profiles/WinProject.lua | 12 +++++++- 5 files changed, 68 insertions(+), 23 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index a4b88aa..9ed05cd 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -108,7 +108,12 @@ "EgtFrame", "EgtReplaceString", "EgtCircle", - "EgtArc2PV" + "EgtArc2PV", + "EgtSurfTmSubtract", + "EgtSurfTmIntersect", + "GDB_IN", + "GEO", + "dist" ], "Lua.diagnostics.disable": [ "empty-block" diff --git a/Profiles/WinConst.lua b/Profiles/WinConst.lua index 6a76ddd..867badf 100644 --- a/Profiles/WinConst.lua +++ b/Profiles/WinConst.lua @@ -99,6 +99,7 @@ WIN_FRAME = 'Frame' WIN_AREAOUTLINE = 'BaseOutline' WIN_OUTLINE = 'Outline' WIN_SELECTION = 'Selection' +WIN_SPLITSELECTION = 'SplitSelection' WIN_ORIGOUTLINE = 'OrigOutline' WIN_GEO = 'Geo' WIN_SOLID = 'Solid' @@ -238,6 +239,8 @@ WIN_DWL_BOTTOMHORIZONTALSPLITPARAEND = 'BottomHorizontalSplitParaEnd' WIN_DWL_HORIZONTALSPLITPERPSTART = 'HorizontalSplitPerpStart' WIN_DWL_HORIZONTALSPLITPERPEND = 'HorizontalSplitPerpEnd' +WIN_PRJ_ORIGSPLIT = 'OrigSplit' + WIN_HARDWARE = 'Hardware' WIN_HDW_FAVOURITE = 'HdwFavourite' WIN_HDW_FRAME = 'HdwFrame' diff --git a/Profiles/WinLib/WinCalculate.lua b/Profiles/WinLib/WinCalculate.lua index 34cdea1..054b315 100644 --- a/Profiles/WinLib/WinCalculate.lua +++ b/Profiles/WinLib/WinCalculate.lua @@ -597,18 +597,7 @@ local function CalculateOutlineFromAreaOutline( nAreaId) -- accorcio gli offset TrimAndOrientOrderedCurveLayer( nOutlineLayerId) end - - -- disegno area di selezione per programma - local nSelectionLayerId = EgtGroup( nAreaId) - EgtSetName( nSelectionLayerId, WIN_SELECTION) - EgtSetStatus( nSelectionLayerId, GDB_ST.OFF) - local vOutlineList = EgtGetAllInGroup( nOutlineLayerId) - local nCompoId = EgtCurveCompo( nSelectionLayerId, vOutlineList, false) - local nSelectionArea = EgtSurfFlatRegion( nSelectionLayerId, nCompoId) - EgtSetColor( nSelectionArea, 'YELLOW') - EgtSetAlpha( nSelectionArea, 10) - EgtMove( nSelectionArea, 10 * Z_AX()) - EgtErase( nCompoId) + end --------------------------------------------------------------------- @@ -1668,6 +1657,7 @@ local function CreatePartFromOutline( nAreaLayerId, nOutlineId, bBottomRail) CalcFillSolid(nPartId, nOutlineLayerId, nGeoLayerId) end end + return nPartId end @@ -1778,13 +1768,13 @@ local function CreateStripFromOutline( nAreaId, nOutlineId) -- recupero guida Main local nGuideId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_MAINGUIDE) -- recupero strip piu' vicino a prev outline - local nMainStripId = GetStripNearestToOutline( nMainProfileId, nPrevOutlineId, WIN_STRIP) + local nMainStripId = GetStripNearestToOutline( nMainProfileId, nPrevOutlineId) -- estrudo MainStrip local nMainStripExtrusionId = EgtSurfTmSwept( nSolidLayerId, nMainStripId, nGuideId, false, WIN_SURF_APPROX) -- b) taglio con start -- recupero strip dello start piu' vicino ad outline - local nStartStripId = GetStripNearestToOutline( nStartProfileId, nOutlineId, WIN_STRIP) + local nStartStripId = GetStripNearestToOutline( nStartProfileId, nOutlineId) -- disegno guida start per lo strip trovando le intersezioni degli outline minimi e massimi tra MainStrip e StartStrip local nMainStripMinOffsetId, nMainStripMaxOffsetId = CreateStripGuideLines( nOutlineId, nMainStripId, nMainProfileId, nSolidLayerId) @@ -1811,7 +1801,7 @@ local function CreateStripFromOutline( nAreaId, nOutlineId) -- c) taglio con end -- recupero strip piu' vicino ad outline - local nEndStripId = GetStripNearestToOutline( nEndProfileId, nOutlineId, WIN_STRIP) + local nEndStripId = GetStripNearestToOutline( nEndProfileId, nOutlineId) -- disegno guida end per lo strip trovando le intersezioni degli outline minimi e massimi tra MainStrip ed EndStrip local nEndStripMinOffsetId, nEndStripMaxOffsetId = CreateStripGuideLines( nNextOutlineId, nEndStripId, nEndProfileId, nSolidLayerId) @@ -1874,7 +1864,19 @@ local function CalculateAreaParts( nAreaId) local nSplitId = EgtGetFirstInGroup( nSplitLayerId) if nSplitId then -- creo pezzo split - CreatePartFromOutline( nAreaId, nSplitId) + local nSplitPartId = CreatePartFromOutline( nAreaId, nSplitId) + -- disegno area di selezione per programma + local nSelectionLayerId = EgtGroup( nAreaId) + EgtSetName( nSelectionLayerId, WIN_SPLITSELECTION) + EgtSetStatus( nSelectionLayerId, GDB_ST.OFF) + local nSplitPartGeoId = EgtGetFirstNameInGroup( nSplitPartId, WIN_GEO) + local vOutlineList = EgtGetAllInGroup( nSplitPartGeoId) + local nCompoId = EgtCurveCompo( nSelectionLayerId, vOutlineList, false) + local nSelectionArea = EgtSurfFlatRegion( nSelectionLayerId, nCompoId) + EgtSetColor( nSelectionArea, 'YELLOW') + EgtSetAlpha( nSelectionArea, 10) + EgtMove( nSelectionArea, 10 * Z_AX()) + EgtErase( nCompoId) end end elseif nAreaType ~= WIN_AREATYPES.FILL then @@ -1894,6 +1896,19 @@ local function CalculateAreaParts( nAreaId) end end + -- disegno area di selezione per programma + local nSelectionLayerId = EgtGroup( nAreaId) + EgtSetName( nSelectionLayerId, WIN_SELECTION) + EgtSetStatus( nSelectionLayerId, GDB_ST.OFF) + local nOutlineLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_OUTLINE) + local vOutlineList = EgtGetAllInGroup( nOutlineLayerId) + local nCompoId = EgtCurveCompo( nSelectionLayerId, vOutlineList, false) + local nSelectionArea = EgtSurfFlatRegion( nSelectionLayerId, nCompoId) + EgtSetColor( nSelectionArea, 'YELLOW') + EgtSetAlpha( nSelectionArea, 10) + EgtMove( nSelectionArea, 10 * Z_AX()) + EgtErase( nCompoId) + -- calcolo i pezzi delle sottoaree local nChildAreaId = EgtGetFirstNameInGroup( nAreaId, WIN_AREA .. '*') while nChildAreaId do @@ -2322,7 +2337,7 @@ function WinCalculate.AddHardware( nFrameId) local nHoleId = EgtCircle( nPartHdwLayerId, ptCenter, dRadius) -- per lavorazione EgtModifyCurveExtrusion( nHoleId, Z_AX()) - local dDepth = 25.0 + local dDepth = tonumber(25) if #vMacro == 3 then dDepth = tonumber( vMacro[3]) end diff --git a/Profiles/WinLib/WinCreate.lua b/Profiles/WinLib/WinCreate.lua index 5c83c49..94785d7 100644 --- a/Profiles/WinLib/WinCreate.lua +++ b/Profiles/WinLib/WinCreate.lua @@ -225,13 +225,16 @@ function WinCreate.AddSplit( nAreaLayerId, SplitType, MeasureType, nPosition, n end -- funzione che crea tagli split multipli -function WinCreate.AddSplits( nAreaLayerId, SplitType, MeasureType, PositionList, nProportion) +function WinCreate.AddSplits( nAreaLayerId, SplitType, MeasureType, PositionList, nProportion, nSplitType) local AreaList = {} if MeasureType == WIN_MEASURE.ABSOLUT then local nResArea1 local nResArea2 = nAreaLayerId for nIndex = 1, #PositionList do - nResArea1, nResArea2 = WinCreate.AddSplit( nResArea2, SplitType, MeasureType, PositionList[nIndex], nProportion) + if nIndex > 1 then + EgtSetInfo( nResArea2, WIN_PRJ_ORIGSPLIT, nAreaLayerId) + end + nResArea1, nResArea2 = WinCreate.AddSplit( nResArea2, SplitType, MeasureType, PositionList[nIndex], nProportion, nSplitType) table.insert( AreaList, nResArea1) if nIndex == #PositionList then table.insert( AreaList, nResArea2) @@ -242,7 +245,10 @@ function WinCreate.AddSplits( nAreaLayerId, SplitType, MeasureType, PositionList local nResArea2 = nAreaLayerId local dAddPosition = 0 for nIndex = 1, #PositionList do - nResArea1, nResArea2 = WinCreate.AddSplit( nResArea2, SplitType, MeasureType, PositionList[nIndex], nProportion - dAddPosition) + if nIndex > 1 then + EgtSetInfo( nResArea2, WIN_PRJ_ORIGSPLIT, nAreaLayerId) + end + nResArea1, nResArea2 = WinCreate.AddSplit( nResArea2, SplitType, MeasureType, PositionList[nIndex], nProportion - dAddPosition, nSplitType) table.insert( AreaList, nResArea1) if nIndex == #PositionList then table.insert( AreaList, nResArea2) @@ -253,14 +259,20 @@ function WinCreate.AddSplits( nAreaLayerId, SplitType, MeasureType, PositionList local nResArea1 local nResArea2 = nAreaLayerId local dAddPosition = 0 + local sChildAreas = '' for nIndex = 1, #PositionList do - nResArea1, nResArea2 = WinCreate.AddSplit( nResArea2, SplitType, MeasureType, EgtIf( nIndex == 1, PositionList[nIndex], PositionList[nIndex] / ( 1 - dAddPosition)), nProportion) + if nIndex > 1 then + EgtSetInfo( nResArea2, WIN_PRJ_ORIGSPLIT, nAreaLayerId) + sChildAreas = sChildAreas .. nResArea2 .. EgtIf( nIndex < #PositionList, ',', '') + end + nResArea1, nResArea2 = WinCreate.AddSplit( nResArea2, SplitType, MeasureType, EgtIf( nIndex == 1, PositionList[nIndex], PositionList[nIndex] / ( 1 - dAddPosition)), nProportion, nSplitType) table.insert( AreaList, nResArea1) if nIndex == #PositionList then table.insert( AreaList, nResArea2) end dAddPosition = dAddPosition + PositionList[nIndex] end + EgtSetInfo( nAreaLayerId, 'ChildSplit', sChildAreas) end return AreaList end diff --git a/Profiles/WinProject.lua b/Profiles/WinProject.lua index a79f6b6..f8d1cea 100644 --- a/Profiles/WinProject.lua +++ b/Profiles/WinProject.lua @@ -63,16 +63,26 @@ end _G.WinCreate_AddBottomRail = WinCreate_AddBottomRail local function WinCreate_AddSplits() + local AreaIndex = 1 + while WDG['AREAID' .. AreaIndex] do + WDG['AREAID' .. AreaIndex] = nil + AreaIndex = AreaIndex + 1 + end local PositionList = {} local PositionIndex = 1 while WDG['POSITION' .. PositionIndex] do table.insert( PositionList, WDG['POSITION' .. PositionIndex]) PositionIndex = PositionIndex + 1 end - local AreaList = WinCreate.AddSplits(WDG.AREAID, WDG.SPLITTYPE, WDG.MEASURETYPE, PositionList, WDG.PROPORTION) + local AreaList = WinCreate.AddSplits(WDG.AREAID, WDG.SPLITORIENTATION, WDG.MEASURETYPE, PositionList, WDG.PROPORTION, WDG.SPLITTYPE) for AreaIndex = 1, #AreaList do WDG['AREAID' .. AreaIndex] = AreaList[ AreaIndex] end + PositionIndex = 1 + while WDG['POSITION' .. PositionIndex] do + WDG['POSITION' .. PositionIndex] = nil + PositionIndex = PositionIndex + 1 + end end _G.WinCreate_AddSplits = WinCreate_AddSplits From c988d0004abcdf67d7bd13509a748d530d5ed26e Mon Sep 17 00:00:00 2001 From: Emmanuele Sassi Date: Wed, 19 Jun 2024 07:16:56 +0200 Subject: [PATCH 4/4] - nascosti dowel e profili --- Profiles/WinLib/WinCalculate.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Profiles/WinLib/WinCalculate.lua b/Profiles/WinLib/WinCalculate.lua index df8828b..8f476a5 100644 --- a/Profiles/WinLib/WinCalculate.lua +++ b/Profiles/WinLib/WinCalculate.lua @@ -828,7 +828,7 @@ local function CalcFrameProfiles( nPartId, nOutlineId, nPrevOutlineId, nNextOutl -- creo gruppo per i profili local nProfileLayerId = EgtGroup( nPartId) EgtSetName( nProfileLayerId, WIN_PROFILE) - + EgtSetStatus( nProfileLayerId, GDB_ST.OFF) -- recupero profili e controprofili local nOrigMainProfileId = GetOutlineProfileId( nOutlineId, nProfileType == WIN_PRF.BOTTOMRAIL) -- se il tipo corrente è split il pezzo va tagliato con il bottomrail, altrimenti con il bottom @@ -975,7 +975,7 @@ local function CalcProfilingProcessings( nPartId, nGeoLayerId) -- creo gruppo delle lavorazioni local nProcGrp = EgtGroup( nPartId) EgtSetName( nProcGrp, WIN_PRC) - + EgtSetStatus( nProcGrp, GDB_ST.OFF) -- recupero tutte le curve del geo local vGeoCrvs = EgtGetAllInGroup( nGeoLayerId) for i = 1, #vGeoCrvs do