From 09fb1e6fdb5795b27364fbe0b459611fed2b3698 Mon Sep 17 00:00:00 2001 From: SaraP Date: Thu, 14 Nov 2024 14:26:09 +0100 Subject: [PATCH] - calcolo tronchetti - aggiunto GeoRaw per automatismo lavorazioni - nel file dei profili aggiunto layer con info per tronchetti. --- Profiles/Profilo78 - Offset - Copy (55).nge | Bin 0 -> 428033 bytes Profiles/Profilo78 - Offset.nge | Bin 428033 -> 428272 bytes Profiles/WinConst.lua | 7 +- Profiles/WinLib/WinCalculate.lua | 860 +++++++++++++++++--- 4 files changed, 774 insertions(+), 93 deletions(-) create mode 100644 Profiles/Profilo78 - Offset - Copy (55).nge diff --git a/Profiles/Profilo78 - Offset - Copy (55).nge b/Profiles/Profilo78 - Offset - Copy (55).nge new file mode 100644 index 0000000000000000000000000000000000000000..8f6e5b1be0437eb127cd2e031112ba64e6de78e6 GIT binary patch literal 428033 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 bSz6(lJagtvAcVA3hFo~fRpQ=BjmG~0NT4ZB literal 0 HcmV?d00001 diff --git a/Profiles/Profilo78 - Offset.nge b/Profiles/Profilo78 - Offset.nge index 8f6e5b1be0437eb127cd2e031112ba64e6de78e6..0b43bf10507b991c90e2ce4bdc61a004459af314 100644 GIT binary patch delta 152 zcmZpiAoXFQR6`463sVbo3rh>@7Pi0b(@7Pi0bEdTi#7yyZE2|54( diff --git a/Profiles/WinConst.lua b/Profiles/WinConst.lua index a58f8cd..503acae 100644 --- a/Profiles/WinConst.lua +++ b/Profiles/WinConst.lua @@ -169,6 +169,7 @@ WIN_FRAME_SPLIT = 'Frame_Split' WIN_MIXED_BOTTOM = 'Mixed_Bottom' WIN_MIXED_TOP = 'Mixed_Top' WIN_MIXED_SPLIT = 'Mixed_Split' +WIN_INFO_GRP = 'Info' WIN_REF = 'Ref' WIN_SECTION = 'Section' @@ -207,6 +208,7 @@ WIN_GEO_IN = 'In' WIN_GEO_OUT = 'Out' WIN_GEO_LEFT = 'Left' WIN_GEO_RIGHT = 'Right' +WIN_GEO_RAW = 'GeoRaw' WIN_PRF_TYPE = 'Type' WIN_PRF_MAIN = 'Main' @@ -239,7 +241,6 @@ WIN_SASH_DEPTH = 'SashDepth' WIN_RAD_REF = 'RefRad' WIN_EXTRA_DIST = 'ExtraDist' WIN_PRC_PHASE = 'PHASE' -WIN_PRC_PROFILE_INFO = 'PROFILE_INFO' WIN_PRC_NTOOLS = 'NTOOLS' WIN_PRC_TOOL_NAME = 'TOOL_NAME' WIN_PRC_OFFL = 'OFFL' @@ -286,6 +287,7 @@ WIN_PRC_TYPE = { CUT = 'Cut', STRIP_CUT = 'StripCut' } +WIN_PRC_PROFILE_INFO = 'PROFILE_INFO' WIN_PRC_PROFILE_TYPE = { HEAD = 'Head', LONGITUDINAL = 'Longitudinal', @@ -305,6 +307,7 @@ WIN_PRC_SIDETYPE = { } WIN_DOWEL = 'Dowel' +WIN_DWL_DIAM = 'DowelsDiam' WIN_DWL_TOP_PERP_LEN = 'TopPerpLen' WIN_DWL_TOP_PARA_LEN = 'TopParaLen' WIN_DWL_BOTTOM_PERP_LEN = 'BottomPerpLen' @@ -313,7 +316,9 @@ WIN_DWL_RAILBOTTOM_PERP_LEN = 'RailBottomPerpLen' WIN_DWL_RAILBOTTOM_PARA_LEN = 'RailBottomParaLen' WIN_DWL_SPLIT_PERP_LEN = 'SplitPerpLen' WIN_DWL_SPLIT_PARA_LEN = 'SplitParaLen' +WIN_DWL_LOG_LEN = 'DowelsLogLen' +WIN_LOGS = 'Log' WIN_PRJ_ORIGSPLIT = 'OrigSplit' diff --git a/Profiles/WinLib/WinCalculate.lua b/Profiles/WinLib/WinCalculate.lua index 50b4737..94730d0 100644 --- a/Profiles/WinLib/WinCalculate.lua +++ b/Profiles/WinLib/WinCalculate.lua @@ -96,32 +96,30 @@ local function FindIntersectionPoint( nCrv1, nCrv2, ptRef) end --------------------------------------------------------------------- --- funzione che dato un gruppo contenente curve ordinate che creano una curva chiusa, +-- funzione che data una lista di curve ordinate che creano una curva chiusa, -- ne estende/taglia i contorni per ottenere una curva chiusa continua -local function TrimAndOrientOrderedCurveLayer( nLayerId, bOrient) +local function TrimAndOrientOrderedCurves( vCrvs, bOrient) + local IntersCurveList = {} local LastCurveInters - local nCurveId = EgtGetFirstInGroup( nLayerId) - -- ciclo sui segmenti per ottenere lista intersezioni - while nCurveId do - local nPrevId = EgtGetPrev( nCurveId) - if not nPrevId then - nPrevId = EgtGetLastInGroup( nLayerId) - end - local ptInters = FindIntersectionPoint( nCurveId, nPrevId, EgtSP( nCurveId)) + -- ciclo sulle curve per ottenere lista intersezioni + for i = 1, #vCrvs do + -- recupero la precedente + local nPrevIndex = EgtIf( i == 1, #vCrvs, i - 1) + -- calcolo intersezione + local ptInters = FindIntersectionPoint( vCrvs[i], vCrvs[ nPrevIndex], EgtSP( vCrvs[i])) if LastCurveInters then LastCurveInters.EndInters = Point3d( ptInters) -- se il punto di intersezione è lo stesso trovato nell'iterazione precedente cerco una seconda -- intersezione tra le due curve if AreSamePointApprox( ptInters, LastCurveInters.StartInters) then - ptInters = FindIntersectionPoint( nCurveId, nPrevId, EgtEP( nCurveId)) + ptInters = FindIntersectionPoint( vCrvs[i], vCrvs[ nPrevIndex], EgtEP( vCrvs[i])) LastCurveInters.EndInters = Point3d( ptInters) end end - local NewCurveInters = { CurveId = nCurveId, StartInters = Point3d( ptInters)} + local NewCurveInters = { CurveId = vCrvs[i], StartInters = Point3d( ptInters)} table.insert( IntersCurveList, NewCurveInters) LastCurveInters = NewCurveInters - nCurveId = EgtGetNext( nCurveId) end IntersCurveList[#IntersCurveList].EndInters = IntersCurveList[1].StartInters @@ -160,11 +158,11 @@ end local function GetOutlineProfileId( nOutlineId, bUseBottomRail) -- ciclo fino a trovare il primo parent che abbia un AreaType definito ( frame o sash) - local nCurrId = nOutlineId + local nParentId = EgtGetParent( nOutlineId) local nAreaType = WIN_AREATYPES.NULL - while nCurrId and ( nAreaType == WIN_AREATYPES.SPLIT or nAreaType == WIN_AREATYPES.NULL) do - nCurrId = EgtGetParent( nCurrId) - nAreaType = EgtGetInfo( nCurrId or GDB_ID.NULL, WIN_AREATYPE, 'i') or WIN_AREATYPES.NULL + while nParentId and ( nAreaType == WIN_AREATYPES.SPLIT or nAreaType == WIN_AREATYPES.NULL) do + nParentId = EgtGetParent( nParentId) + nAreaType = EgtGetInfo( nParentId or GDB_ID.NULL, WIN_AREATYPE, 'i') or WIN_AREATYPES.NULL end -- recupero il gruppo contenente il profilo @@ -181,7 +179,7 @@ local function GetOutlineProfileId( nOutlineId, bUseBottomRail) -- verifico se bottom rail if bUseBottomRail then - local nOutlineLay = EgtGetParent( nOutlineId) + local nOutlineLay = EgtGetFirstNameInGroup( nParentId, WIN_AREAOUTLINE) local bBottomRail = EgtGetInfo( nOutlineLay, WIN_BOTTOMRAIL, 'b') or false local sOutlineName = EgtGetName( nOutlineId) if sOutlineName == WIN_BOTTOM and bBottomRail then @@ -655,7 +653,7 @@ local function CalculateOutlineFromAreaOutline( nAreaId) nBaseOutlineId = EgtGetNext( nBaseOutlineId) end -- taglio tutti i contorni - TrimAndOrientOrderedCurveLayer( nOutlineLayerId, true) + TrimAndOrientOrderedCurves( EgtGetAllInGroup( nOutlineLayerId), true) -- se presente, copio split local nBaseSplitLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_BASESPLIT) @@ -750,7 +748,7 @@ local function CalculateOutlineFromAreaOutline( nAreaId) nBaseOutlineId = EgtGetNext( nBaseOutlineId) end -- accorcio gli offset - TrimAndOrientOrderedCurveLayer( nOutlineLayerId, true) + TrimAndOrientOrderedCurves( EgtGetAllInGroup( nOutlineLayerId), true) -- se presente, copio split local nBaseSplitLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_BASESPLIT) @@ -816,7 +814,7 @@ local function CalculateOutlineFromAreaOutline( nAreaId) nBaseOutlineId = EgtGetNext( nBaseOutlineId) end -- accorcio gli offset - TrimAndOrientOrderedCurveLayer( nOutlineLayerId, true) + TrimAndOrientOrderedCurves( EgtGetAllInGroup( nOutlineLayerId), true) end end @@ -1012,25 +1010,53 @@ local function GetProfileCtrIn( nPrevOutlineId, nOutlineId, nPrevProfileId) end --------------------------------------------------------------------- --- funzione che crea la superficie corrispondente al Geo di un pezzo +-- funzione che crea la superficie corrispondente al Geo di un pezzo gestendo i casi di autointersezione local function CreateGeoArea( nGeoLayId, nDestLayId) - local vCrvs = EgtGetAllInGroup( nGeoLayId) - local nCompoId = EgtCurveCompoByChain( nDestLayId, vCrvs, EgtSP( vCrvs[1]), false) - EgtChangeClosedCurveStartPoint( nCompoId, EgtSP( vCrvs[1])) - -- verifico che orientamento della composita rispecchi quello della curva out - if not AreSameVectorApprox( EgtSV( nCompoId), EgtSV( vCrvs[1])) then - EgtInvertCurve( nCompoId) + -- recupero le curve left e right e verifico se hanno orientamento coerente ( quindi non generano autointersezioni) + local bAutointers = false + local vLeft = EgtGetNameInGroup( nGeoLayId, WIN_LEFT) + local vRight = EgtGetNameInGroup( nGeoLayId, WIN_RIGHT) + if #vLeft == 2 and not AreSamePointApprox( EgtEP( vLeft[1]), EgtSP( vLeft[2])) then + bAutointers = true + -- se orientamento non coerente devo ignorare la prima curva + vLeft[1] = GDB_ID.NULL end + if #vRight == 2 and not AreSamePointApprox( EgtEP( vRight[1]), EgtSP( vRight[2])) then + bAutointers = true + -- se orientamento non coerente devo ignorare la seconda curva + vRight[2] = GDB_ID.NULL + end + + local nCompoId + if not bAutointers then + -- se no autointersezioni costruisco il bordo del geo usando direttamente le sue curve + local vCrvs = EgtGetAllInGroup( nGeoLayId) + nCompoId = EgtCurveCompo( nDestLayId, vCrvs, false) + else + -- nel caso di autointersezione devo ignorare le curve left e right con orientamento non coerente + local vGeoCrvs = {} + local nOutId = EgtGetFirstNameInGroup( nGeoLayId, WIN_GEO_OUT) + vGeoCrvs[1] = EgtCopyGlob( nOutId, nDestLayId) + for i = 1, #vRight do + if vRight[i] ~= GDB_ID.NULL then + table.insert( vGeoCrvs, EgtCopyGlob( vRight[i], nDestLayId)) + end + end + local nInId = EgtGetFirstNameInGroup( nGeoLayId, WIN_GEO_IN) + table.insert( vGeoCrvs, EgtCopyGlob( nInId, nDestLayId)) + for i = 1, #vLeft do + if vLeft[i] ~= GDB_ID.NULL then + table.insert( vGeoCrvs, EgtCopyGlob( vLeft[i], nDestLayId)) + end + end + -- taglio le curve + TrimAndOrientOrderedCurves( vGeoCrvs, false) + -- creo compo + nCompoId = EgtCurveCompo( nDestLayId, vGeoCrvs) + end + local nArea = EgtSurfFlatRegion( nDestLayId, nCompoId) - -- controllo per eventuale autointersezione del geo di un pezzo di split - local vtN = EgtSurfFrNormVersor( nArea) - if AreOppositeVectorApprox( vtN, Z_AX()) then - EgtErase( nArea) - local nGeoIn = EgtGetFirstNameInGroup( nGeoLayId, WIN_GEO_IN) - EgtChangeClosedCurveStartPoint( nCompoId, EgtSP( nGeoIn)) - nArea = EgtSurfFlatRegion( nDestLayId, nCompoId) - end EgtErase( nCompoId) return nArea @@ -1215,7 +1241,7 @@ local function CreateFrameGeo( nOutlineId, vPrevOutlineId, vNextOutlineId, nStar end -- trim delle curve - TrimAndOrientOrderedCurveLayer( nGeoLayerId, false) + TrimAndOrientOrderedCurves( EgtGetAllInGroup( nGeoLayerId), false) -- salvo spessore serramento nel gruppo local dGeoWidth = b3CurrProfileFrame:getDimX() @@ -2131,6 +2157,28 @@ end ---------------------------------------------------------------------------------- ---------------------------------- DOWELS ---------------------------------------- ---------------------------------------------------------------------------------- +-- funzione che sottrae il dowel al solido +local function UpdateSolidWithDowel( nDowelId, nSolidId, vtDir, dLen, nLayerId) + + -- creo il solido del dowel a partire dalla circonferenza che lo definisce + local nDowelSolidId + if s_bSimplSolid then + -- se solidi semplificati creo foro grossolano per velocizzare operazioni di subtract + local nDowelApprox = EgtCopyGlob( nDowelId, nLayerId) + EgtApproxCurve( nDowelApprox, GDB_CA.LINES, 0.2) + nDowelSolidId = EgtSurfTmByRegionExtrusion( nLayerId, nDowelApprox, vtDir * dLen) + EgtErase( nDowelApprox) + else + nDowelSolidId = EgtSurfTmByRegionExtrusion( nLayerId, nDowelId, vtDir * dLen) + end + + -- sottraggo il dowel al solido + EgtSurfTmSubtract( nSolidId, nDowelSolidId) + EgtErase( nDowelSolidId) + +end + +--------------------------------------------------------------------- -- funzione che calcola il riferimento dove posizionare i dowels local function CreateDowelFrameDest( nRefProfileType, nPrevGeo, nGeo, nRefOutline, bFullOrShort, bSashOrFrame) @@ -2215,20 +2263,7 @@ local function CreateDowel( nOrigDowelId, nLayerId, frOrig, frDest, vtDir, nTest -- eventuale aggiornamento del solido if nMainExtrusionId then - -- creo solido di estrusione del dowel - local nDowelExtrusionId - if s_bSimplSolid then - -- creo foro grossolano per velocizzare operazioni di subtract - local nDowelApprox = EgtCopyGlob( nDowelId, nLayerId) - EgtApproxCurve( nDowelApprox, GDB_CA.LINES, 0.2) - nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nLayerId, nDowelApprox, vtDir * dLen) - EgtErase( nDowelApprox) - else - nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nLayerId, nDowelId, vtDir * dLen) - end - -- sottraggo il dowel al solido - EgtSurfTmSubtract( nMainExtrusionId, nDowelExtrusionId) - EgtErase( nDowelExtrusionId) + UpdateSolidWithDowel( nDowelId, nMainExtrusionId, vtDir, dLen, nLayerId) end return nDowelId @@ -3027,6 +3062,288 @@ end +---------------------------------------------------------------------------------- +---------------------------------- TRONCHETTI ---------------------------------- +---------------------------------------------------------------------------------- +-- funzione che spezza l'anta in corrispondenza dei tronchetti del telaio +local function SplitArcByAlignment( nGeoIn, nGrp) + + -- recupero il pezzo del telaio corrispondente + local nPartId = EgtGetParent( EgtGetParent( nGeoIn)) + local nOutlineId = EgtGetInfo( nPartId, WIN_REF_OUTLINE, 'i') + local nSouId = EgtGetInfo( nOutlineId, WIN_COPY, 'i') + local nAreaType = WIN_AREATYPES.NULL + while nSouId and nAreaType ~= WIN_AREATYPES.FRAME do + nSouId = EgtGetInfo( nSouId, WIN_SOU, 'i') or GDB_ID.NULL + local nParentArea = EgtGetParent( EgtGetParent( nSouId)) or GDB_ID.NULL + nAreaType = EgtGetInfo( nParentArea, WIN_AREATYPE, 'i') + end + if not nSouId then return end + local nFrameOutlineId = EgtGetInfo( nSouId, WIN_COPY, 'i') + local nFramePartId = EgtGetInfo( nFrameOutlineId, WIN_REF_PART, 'i') + + -- recupero le parti in cui era stato diviso l'arco del telaio + local nFrameLogsLayer = EgtGetFirstNameInGroup( nFramePartId, WIN_LOGS) + local vFrameLogs = EgtGetNameInGroup( nFrameLogsLayer, WIN_GEO_IN) + local ptC = EgtCP( vFrameLogs[1]) + + local nCurrCrvId = EgtCopyGlob( nGeoIn, nGrp) + local bInters = false + for i = 1, #vFrameLogs - 1 do + -- ricavo il punto di split sull'arco dell'anta + local ptFrame = EgtEP( vFrameLogs[i]) + local vtDir = ptFrame - ptC + local nLineSplit = EgtLinePVL( nGrp, ptC, vtDir, vtDir:len() + 1000) + local ptInt = EgtIP( nCurrCrvId, nLineSplit, ORIG()) + EgtErase( nLineSplit) + if ptInt then + nCurrCrvId = EgtSplitCurveAtPoint( nCurrCrvId, ptInt) or GDB_ID.NULL + bInters = true + elseif bInters then + -- se non ci sono più intersezioni esco + return + end + end +end + +--------------------------------------------------------------------- +-- funzione che spezza l'arco in base al numero di pezzi +local function SplitArcByNumber( nLogsNbr, nGeoIn, nGrp) + local nCopy = EgtCopyGlob( nGeoIn, nGrp) + EgtSplitCurve( nCopy, nLogsNbr) +end + +--------------------------------------------------------------------- +-- funzione che spezza gli archi per i tronchetti +local function SplitArc( nLogsNbr, vSections, bAlign, dOverMatTot, nGeoIn, nGeoOut, nGrp) + + -- per allineamento con telaio + if bAlign then + return SplitArcByAlignment( nGeoIn, nGrp) + + -- per sezione + elseif #vSections == 1 and nLogsNbr == 0 then + -- dalla sezione ricavo il numero minimo di pezzi + local dSection = vSections[1] - dOverMatTot + local dROut = EgtArcRadius( nGeoOut) + local dRIn = EgtArcRadius( nGeoIn) + local dAng = abs( EgtArcAngCenter( nGeoIn)) + local nParts + if dSection < dROut - dRIn + GEO.EPS_SMALL then + -- sezione troppo piccola + -- TO DO : gestione errore + EgtOutBox( 'Sezione tronchetto troppo piccola', '') + elseif dSection > dROut + dRIn - GEO.EPS_SMALL then + -- la sezione comprende già l'intero pezzo + nParts = 1 + else + nParts = dAng / 2 / acos( ( dROut - dSection) / dRIn) + nParts = ceil( nParts) + end + return SplitArcByNumber( nParts, nGeoIn, nGrp) + + -- per numero di pezzi + else + return SplitArcByNumber( nLogsNbr, nGeoIn, nGrp) + end +end + +--------------------------------------------------------------------- +-- funzione che calcola la sezione dei tronchetti +local function CalcLogsSection( nLogsNbr, vSections, bAlign, dOverMatTot, nGeoIn, nGeoOut, nGrp) + + -- se richiesta una sezione specifica senza vincoli sul numero di pezzi + if not bAlign and #vSections == 1 and nLogsNbr == 0 then + return vSections[1] + end + + -- calcolo la sezione necessaria per la suddivisione scelta + local dMySection = 0 + local dROut = EgtArcRadius( nGeoOut) + local dRIn = EgtArcRadius( nGeoIn) + if bAlign then + -- calcolo la massima sezione dai tronchetti ottenuti + local vSplits = EgtGetAllInGroup( nGrp) + for i = 1, #vSplits do + local dAng = abs( EgtArcAngCenter( vSplits[i])) + local dCurrSection = dROut - dRIn * cos( dAng / 2) + if dCurrSection > dMySection then + dMySection = dCurrSection + end + end + dMySection = dMySection + dOverMatTot + + else + -- ricavo la sezione dal numero di pezzi + local dAng = abs( EgtArcAngCenter( nGeoIn)) + dMySection = dROut - dRIn * cos( dAng / nLogsNbr / 2) + dOverMatTot + end + + if #vSections == 0 then + -- se no vincoli sulla sezione + return dMySection + else + -- cerco la sezione più adatta dalla lista di sezioni disponibili + table.sort( vSections) + for i = 1, #vSections do + if vSections[i] > dMySection - GEO.EPS_SMALL then + return vSections[i] + end + end + -- se non ho trovato la sezione errore + EgtOutBox( 'Sezioni tronchetti troppo piccole per suddivisione richiesta', '') + return nil + end +end + +--------------------------------------------------------------------- +local function CalcLogs( nGrp, nGeoOut, dOverMatIn, dOverMatOut, dOverMatExt, dOverMatInt, dRefSection, bCutExtremities) + + -- recupero tutti i tratti dell'arco + local vCrvsIn = EgtGetAllInGroup( nGrp) + local ptC = EgtCP( vCrvsIn[1]) + + -- calcolo i tronchetti + for i = 1, #vCrvsIn do + + local ptSIn = EgtSP( vCrvsIn[i]) + local ptEIn = EgtEP( vCrvsIn[i]) + + -- recupero il tratto corrispondente sulla curva out + local ptSOut, dParSOut, ptEOut, dParEOut + if i == 1 then + -- forzo a coincidere con l'estremo della curva out + ptEOut = EgtEP( nGeoOut) + dParEOut = 1 + else + _, ptEOut, dParEOut = EgtPointCurveDist( ptSIn, nGeoOut) + end + if i == #vCrvsIn then + -- forzo a coincidere con l'estremo della curva out + ptSOut = EgtSP( nGeoOut) + dParSOut = 0 + else + _, ptSOut, dParSOut = EgtPointCurveDist( ptEIn, nGeoOut) + end + local nOut = EgtCopyGlob( nGeoOut, nGrp) + EgtTrimCurveStartEndAtParam( nOut, dParSOut, dParEOut) + + -- creo composita corrispondente al pezzo + local nCompo = EgtCurveCompo( nGrp, {vCrvsIn[i]}, false) + EgtAddCurveCompoLine( nCompo, ptSOut) + EgtAddCurveCompoCurve( nCompo, nOut, false) + EgtCloseCurveCompo( nCompo) + + -- calcolo il frame per il tronchetto + local ptM = EgtMP( vCrvsIn[i]) + local vtRad = ptM - ptC + local frRef = Frame3d( ptM, vtRad ^ Z_AX(), vtRad, Z_AX()) + + -- calcolo il box locale al frame + local b3Ref = EgtGetBBoxRef( nCompo, GDB_BB.STANDARD, frRef) + local ptMin = b3Ref:getMin() + local ptMax = b3Ref:getMax() + + -- verifico se necessario sovramateriale extra per raggiungere la sezione desiderata + local dExtraSection = max( 0, dRefSection - b3Ref:getDimY() - dOverMatIn - dOverMatOut) + + -- lato bottom + local nLineBottom = EgtLinePVL( nGrp, ptMin - ( dOverMatIn + 0.5 * dExtraSection) * Y_AX(), X_AX(), 10000) + EgtExtendCurveStartByLen( nLineBottom, 10000) + EgtTransform( nLineBottom, frRef) + + -- lato top + local nLineTop = EgtLinePVL( nGrp, ptMax + ( dOverMatOut + 0.5 * dExtraSection) * Y_AX(), - X_AX(), 10000) + EgtExtendCurveStartByLen( nLineTop, 10000) + EgtTransform( nLineTop, frRef) + + -- lato right + local nLineRight + if i == 1 and not bCutExtremities then + nLineRight = EgtLinePVL( nGrp, ptMin, - Y_AX(), 10000) + EgtTransform( nLineRight, frRef) + else + nLineRight = EgtLine( nGrp, ptEOut, ptSIn) + EgtExtendCurveEndByLen( nLineRight, 10000) + end + EgtOffsetCurve( nLineRight, EgtIf( i == 1, dOverMatExt, dOverMatInt)) + EgtExtendCurveStartByLen( nLineRight, 10000) + + -- lato left + local nLineLeft + if i == #vCrvsIn and not bCutExtremities then + nLineLeft = EgtLinePVL( nGrp, ptMax, Y_AX(), 10000) + EgtTransform( nLineLeft, frRef) + else + nLineLeft = EgtLine( nGrp, ptEIn, ptSOut) + EgtExtendCurveEndByLen( nLineLeft, 10000) + end + EgtOffsetCurve( nLineLeft, EgtIf( i == #vCrvsIn, dOverMatExt, dOverMatInt)) + EgtExtendCurveStartByLen( nLineLeft, 10000) + + -- taglio le curve nei loro punti di intersezione + local vCrvs = { nLineTop, nLineRight, nLineBottom, nLineLeft} + TrimAndOrientOrderedCurves( vCrvs, false) + + -- TO DO : controllo lunghezza minima + -- local dLenTop = EgtCurveLength( nLineTop) + + -- creo il tronchetto + local nLogCrv = EgtCurveCompo( nGrp, vCrvs) + EgtSetName( nLogCrv, WIN_LOGS) + EgtSetColor( nLogCrv, EgtStdColor( 'BLUE')) + + -- salvo i sovramateriali utilizzati nella curva + EgtSetInfo( nLogCrv, WIN_PRC_OVERMAT_IN, dOverMatIn) + EgtSetInfo( nLogCrv, WIN_PRC_OVERMAT_OUT, dOverMatOut) + EgtSetInfo( nLogCrv, WIN_PRC_OVERMAT_LEFT, EgtIf( i == #vCrvsIn, dOverMatExt, dOverMatInt)) + EgtSetInfo( nLogCrv, WIN_PRC_OVERMAT_RIGHT, EgtIf( i == 1, dOverMatExt, dOverMatInt)) + + EgtSetStatus( vCrvsIn[i], GDB_ST.OFF) + EgtSetStatus( nOut, GDB_ST.OFF) + EgtErase( nCompo) + end +end + +--------------------------------------------------------------------- +-- funzione che calcola i tronchetti di un pezzo ad arco +function WinCalculate.CreateArcLogs( nPartId, nLogsNbr, vSections, bAlign, dOverMatOut, dOverMatIn, dOverMatExt, dOverMatInt, bCutExtremities) + + -- verifico dati in ingresso + if bAlign then nLogsNbr = 0 end + if not bAlign and nLogsNbr == 0 and ( #vSections == 0 or #vSections > 1) then + return + end + + -- recupero o creo il gruppo per i tronchetti + local nGrp = EgtGetFirstNameInGroup( nPartId, WIN_LOGS) + if not nGrp then + nGrp = EgtGroup( nPartId) + EgtSetName( nGrp, WIN_LOGS) + else + EgtEmptyGroup( nGrp) + end + + -- recupero il geo del pezzo + local nGeoLayerId = EgtGetFirstNameInGroup( nPartId, WIN_GEO) + local nGeoIn = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_IN) + local nGeoOut = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_OUT) + + -- spezzo l'arco interno + SplitArc( nLogsNbr, vSections, bAlign, dOverMatOut + dOverMatIn, nGeoIn, nGeoOut, nGrp) + + -- calcolo la sezione di riferimento per i tronchetti + local dSection = CalcLogsSection( nLogsNbr, vSections, bAlign, dOverMatOut + dOverMatIn, nGeoIn, nGeoOut, nGrp) + if not dSection then + return + end + + -- creo i tronchetti + CalcLogs( nGrp, nGeoOut, dOverMatIn, dOverMatOut, dOverMatExt, dOverMatInt, dSection, bCutExtremities) +end + + + ---------------------------------------------------------------------------------- ------------------------------ FUNZIONI ---------------------------------------- ---------------------------------------------------------------------------------- @@ -3099,61 +3416,420 @@ function WinCalculate.AssembleFrame() --EgtChangeGroupFrame( nRightPartId, frRight) end + + +---------------------------------------------------------------------------------- +------------------- POST PROCESSING PER AUTOMATISMO LAVORAZIONI ------------------ +---------------------------------------------------------------------------------- +-- funzione che crea la spina per tronchetti +local function CalcLogDowel( nOrigPartId, nCrvOut, bLeftOrRight, nProcLayerId, nProfileId, nInfoGrp, nSolidId) + + -- creo il frame per il posizionamento del dowel + local nOutlineRef = EgtGetInfo( nOrigPartId, WIN_REF_OUTLINE, 'i') + local ptRef = EgtIf( bLeftOrRight, EgtSP( nCrvOut), EgtEP( nCrvOut)) + local _, ptOrig, dParOrig = EgtPointCurveDist( ptRef, nOutlineRef) + local vtFrame = EgtUV( nOutlineRef, dParOrig, -1) + local frDest = Frame3d( ptOrig, - vtFrame) + + -- calcolo direzione verso interno del pezzo + local vtDir = frDest:getVersZ() + if bLeftOrRight then + vtDir = - vtDir + end + + -- recupero i dati del dowel + local dDowelDiam = EgtGetInfo( nInfoGrp, WIN_DWL_DIAM, 'd') + local dDowelLen = EgtGetInfo( nInfoGrp, WIN_DWL_LOG_LEN, 'd') + + -- creo il dowel nel riferimento della sezione + -- TO DO : recupero della sezione corretta nel caso di cambio profilo + local nSectionId = EgtGetFirstNameInGroup( nProfileId, WIN_SECTION) or EgtGetFirstNameInGroup( nProfileId, WIN_SASH .. WIN_SECTION) + local nDowelId = EgtCircle( nProcLayerId, EgtGP( nSectionId), 0.5 * dDowelDiam) + + -- posiziono il dowel usando i riferimenti + local nFrameId = EgtGetFirstNameInGroup( nProfileId, WIN_SECTIONFRAME) + local frOrig = EgtFR( nFrameId) + frOrig:invert() + EgtTransform( nDowelId, frOrig) + EgtTransform( nDowelId, frDest) + + local nPartId = EgtGetParent( nProcLayerId) + local dOverMat = EgtGetInfo( nPartId, EgtIf( bLeftOrRight, WIN_PRC_OVERMAT_LEFT, WIN_PRC_OVERMAT_RIGHT)) + EgtMove( nDowelId, - vtDir * ( s_dDowelTol + dOverMat)) + EgtModifyCurveExtrusion( nDowelId, - vtDir) + local dLen = dDowelLen + dOverMat + s_dDowelTol + EgtModifyCurveThickness( nDowelId, - dLen) + + -- setto info di lavorazione + EgtSetInfo( nDowelId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.HOLE) + EgtSetInfo( nDowelId, WIN_PRC_SIDE, EgtIf( bLeftOrRight, WIN_PRC_SIDETYPE.LEFT, WIN_PRC_SIDETYPE.RIGHT)) + + -- eventuale aggiornamento del solido + if nSolidId then + UpdateSolidWithDowel( nDowelId, nSolidId, vtDir, dLen, nProcLayerId) + end +end + +--------------------------------------------------------------------- +-- funzione che crea il pezzo del tronchetto +local function PrepareLogPart( nOrigPartId, nCrvIn, nCrvOut, bFirst, bLast, bFinishedLog, nInfoGrp) + + local nPartId = EgtGroup( GDB_ID.ROOT) + EgtSetName( nPartId, WIN_LOGS) + EgtSetColor( nPartId, Color3d( 204, 102, 0)) + + local nLogCrv = EgtGetNext( nCrvOut) + + -- setto le info con i sovramateriali corrispondenti + CopyInfo( nPartId, nLogCrv, WIN_PRC_OVERMAT_IN, 0) + CopyInfo( nPartId, nLogCrv, WIN_PRC_OVERMAT_OUT, 0) + CopyInfo( nPartId, nLogCrv, WIN_PRC_OVERMAT_LEFT, 0) + CopyInfo( nPartId, nLogCrv, WIN_PRC_OVERMAT_RIGHT, 0) + + -- recupero il profilo + local nProfileLayerId = EgtGetFirstNameInGroup( nOrigPartId, WIN_PROFILE) + local nProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) + + -- a) GEORAW + local nGeoRawLayerId = EgtGroup( nPartId) + EgtSetName( nGeoRawLayerId, WIN_GEO_RAW) + EgtCopyGlob( nLogCrv, nGeoRawLayerId) + -- creo il frame ausiliario + local vtX = EgtSV( nLogCrv) + local frGeo = Frame3d( EgtSP( nLogCrv), vtX, Z_AX() ^ vtX, Z_AX()) + local nFrameId = EgtFrame( nGeoRawLayerId, frGeo) + EgtSetName( nFrameId, WIN_PRC_FRAME) + + -- b) SOLIDO + local nSolidId + if s_bCalcSolid then + local nSolidLayerId = EgtGroup( nPartId) + EgtSetName( nSolidLayerId, WIN_SOLID) + if bFirst and bLast then + -- essendo singolo pezzo il solido è quello originale + local nOrigSolidLayerId = EgtGetFirstNameInGroup( nOrigPartId, WIN_SOLID) + local nOrigSolidId = EgtGetFirstNameInGroup( nOrigSolidLayerId, WIN_SRF_MAIN) + EgtRelocateGlob( nOrigSolidId, nSolidLayerId) + elseif bFinishedLog then + -- recupero il solido originale e lo taglio opportunamente agli estremi + local nOrigSolidLayerId = EgtGetFirstNameInGroup( nOrigPartId, WIN_SOLID) + local nOrigSolidId = EgtGetFirstNameInGroup( nOrigSolidLayerId, WIN_SRF_MAIN) + nSolidId = EgtCopyGlob( nOrigSolidId, nSolidLayerId) + + local bBox = GetProfileLocalBox( nProfileId) + local dDimY = bBox:getDimY() + if not bFirst then + local nTrimCrv = EgtLine( nSolidLayerId, EgtUP( nLogCrv, 2), EgtUP( nLogCrv, 1)) + EgtMove( nTrimCrv, Z_AX()) + local nTrimSrf = EgtSurfTmByExtrusion( nSolidLayerId, nTrimCrv, - Z_AX() * ( dDimY + 2), WIN_SURF_APPROX) + EgtSurfTmIntersect( nSolidId, nTrimSrf) + EgtErase( { nTrimCrv, nTrimSrf}) + end + if not bLast then + local nTrimCrv = EgtLine( nSolidLayerId, EgtSP( nLogCrv), EgtUP( nLogCrv, 3)) + EgtMove( nTrimCrv, Z_AX()) + local nTrimSrf = EgtSurfTmByExtrusion( nSolidLayerId, nTrimCrv, - Z_AX() * ( dDimY + 2), WIN_SURF_APPROX) + EgtSurfTmIntersect( nSolidId, nTrimSrf) + EgtErase( { nTrimCrv, nTrimSrf}) + end + else + -- il solido è esattamente il tronchetto + local bBox = GetProfileLocalBox( nProfileId) + nSolidId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nLogCrv, - bBox:getDimY() * Z_AX()) + EgtSetName( nSolidId, WIN_SOLID) + end + end + + -- c) LAVORAZIONI + local nOrigProcLayerId = EgtGetFirstNameInGroup( nOrigPartId, WIN_PRC) + + -- se unico tronchetto le lavorazioni sono quelle del pezzo originale + if bFirst and bLast then + EgtRelocateGlob( nOrigProcLayerId, nPartId) + EgtSetStatus( nOrigProcLayerId, GDB_ST.ON) + return + end + + local nProcLayerId = EgtGroup( nPartId) + EgtSetName( nProcLayerId, WIN_PRC) + + -- profili in e out + if bFinishedLog then + EgtRelocateGlob( nCrvIn, nProcLayerId) + local nSemiProfileInId = EgtGetInfo( nCrvIn, WIN_SEMI_PROFILE, 'i') + GetProcessingInfoFromSemiProfile( nCrvIn, nSemiProfileInId) + EgtSetStatus( nCrvIn, GDB_ST.ON) + EgtRelocateGlob( nCrvOut, nProcLayerId) + local nSemiProfileOutId = EgtGetInfo( nCrvOut, WIN_SEMI_PROFILE, 'i') + GetProcessingInfoFromSemiProfile( nCrvOut, nSemiProfileOutId) + EgtSetStatus( nCrvOut, GDB_ST.ON) + end + + -- profilo left + if bLast and bFinishedLog then + -- recupero la curva di lavorazione dal pezzo originale + local nLeftPrc = EgtGetFirstNameInGroup( nOrigProcLayerId, WIN_GEO_LEFT) + EgtRelocateGlob( nLeftPrc, nProcLayerId) + elseif not bLast then + -- minizinken + local nLeftId = EgtLine( nProcLayerId, EgtUP( nLogCrv, 3), EgtSP( nLogCrv)) + EgtSetName( nLeftId, WIN_LEFT) + -- assegno le info di lavorazione + EgtSetInfo( nLeftId, WIN_PRC_NTOOLS, 1) + local sToolName = EgtGetInfo( nInfoGrp, WIN_PRC_TOOL_NAME) + EgtSetInfo( nLeftId, WIN_PRC_TOOL_NAME .. '_1', sToolName) + local dOffR = EgtGetInfo( nInfoGrp, WIN_PRC_OFFR, 'd') + -- TO DO : verificare valore OffsR + EgtSetInfo( nLeftId, WIN_PRC_OFFR .. '_1', dOffR) + local dOffL = EgtGetInfo( nInfoGrp, WIN_PRC_OFFL .. '_1', 'd') + EgtSetInfo( nLeftId, WIN_PRC_OFFL .. '_1', dOffL) + end + + -- profilo right + if bFirst and bFinishedLog then + -- recupero la curva di lavorazione dal pezzo originale + local nRightPrc = EgtGetFirstNameInGroup( nOrigProcLayerId, WIN_GEO_RIGHT) + EgtRelocateGlob( nRightPrc, nProcLayerId) + elseif not bFirst then + -- minizinken + local nRightId = EgtLine( nProcLayerId, EgtUP( nLogCrv, 1), EgtUP( nLogCrv, 2)) + EgtSetName( nRightId, WIN_RIGHT) + -- assegno info di lavorazione + EgtSetInfo( nRightId, WIN_PRC_NTOOLS, 1) + local sToolName = EgtGetInfo( nInfoGrp, WIN_PRC_TOOL_NAME) + EgtSetInfo( nRightId, WIN_PRC_TOOL_NAME .. '_1', sToolName) + local dOffR = EgtGetInfo( nInfoGrp, WIN_PRC_OFFR, 'd') + -- TO DO : verificare valore OffsR + EgtSetInfo( nRightId, WIN_PRC_OFFR .. '_1', dOffR) + local dOffL = EgtGetInfo( nInfoGrp, WIN_PRC_OFFL .. '_2', 'd') + EgtSetInfo( nRightId, WIN_PRC_OFFL .. '_1', dOffL) + end + + -- dowels per incastro dei tronchetti + if not bFirst then + CalcLogDowel( nOrigPartId, nCrvOut, false, nProcLayerId, nProfileId, nInfoGrp, nSolidId) + end + if not bLast then + CalcLogDowel( nOrigPartId, nCrvOut, true, nProcLayerId, nProfileId, nInfoGrp, nSolidId) + end + + -- se i tronchetti sono gestiti come pezzi finiti cerco le lavorazioni del pezzo orginale che appartengono al tronchetto + if bFinishedLog then + local vProcessings = EgtGetAllInGroup( nOrigProcLayerId) + local nSurfTest = EgtSurfFlatRegion( nProcLayerId, nLogCrv) + for i = 1, #vProcessings do + local sPrcType = EgtGetInfo( vProcessings[i], WIN_PRC_FEATURE_TYPE) + -- forature + if sPrcType == WIN_PRC_TYPE.HOLE then + local sSide = EgtGetInfo( vProcessings[i], WIN_PRC_SIDE) + -- se dowel sull'estremo lo assegno direttamente al tronchetto corrispondente + if ( sSide == WIN_PRC_SIDETYPE.LEFT and bLast) or ( sSide == WIN_PRC_SIDETYPE.RIGHT and bFirst) then + EgtRelocateGlob( vProcessings[i], nProcLayerId) + end + -- altrimenti verifico se interno al tronchetto corrente + if sSide == WIN_PRC_SIDETYPE.IN then + local _, _, nSide = EgtPointCurveDistSide( EgtCP( vProcessings[i]), nLogCrv, Z_AX()) + if nSide == -1 then + -- copio perchè la stessa lavorazione potrebbe coinvolgere più tronchetti + EgtCopyGlob( vProcessings[i], nProcLayerId) + else + -- verifico anche la faccia di fondo + local vtExtr = EgtCurveExtrusion( vProcessings[i]) + local dThickness = EgtCurveThickness( vProcessings[i]) + _, _, nSide = EgtPointCurveDistSide( EgtCP( vProcessings[i]) + dThickness * vtExtr, nLogCrv, Z_AX()) + if nSide == -1 then + EgtCopyGlob( vProcessings[i], nProcLayerId) + end + end + end + -- fermavetro + elseif sPrcType == WIN_PRC_TYPE.STRIP_CUT then + -- TO DO da sistemare + local nStrip = EgtCopyGlob( vProcessings[i], nProcLayerId) + EgtTrimCurveWithRegion( nStrip, nSurfTest, true, false) + else + -- TO DO lavorazioni legate alla ferramenta, cambio profilo + end + end + EgtErase( nSurfTest) + end +end + +--------------------------------------------------------------------- +-- funzione che crea gli elementi ausiliari per la creazione del grezzo nell'automatismo +local function PrepareGeoRawCurve( nPartId, nGeoRawLayerId, nGeoLayerId) + + -- recupero le curve del geo + local nOut = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_OUT) + local nIn = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_IN) + local vRight = EgtGetNameInGroup( nGeoLayerId, WIN_GEO_RIGHT) + local vLeft = EgtGetNameInGroup( nGeoLayerId, WIN_GEO_LEFT) + -- verifico se le curve right e left hanno direzioni coerenti + if #vRight == 2 and not AreSamePointApprox( EgtEP( vRight[1]), EgtSP( vRight[2])) then + -- la seconda curva va ignorata + EgtErase( vRight[2]) + vRight = { vRight[1]} + end + if #vLeft == 2 and not AreSamePointApprox( EgtEP( vLeft[1]), EgtSP( vLeft[2])) then + -- la prima curva va ignorata + EgtErase( vLeft[1]) + vLeft = { vLeft[2]} + end + + -- recupero i sovramateriali da applicare alle curve + local dOvermatOut = EgtGetInfo( nPartId, WIN_PRC_OVERMAT_OUT, 'd') + local dOvermatRight = EgtGetInfo( nPartId, WIN_PRC_OVERMAT_RIGHT, 'd') + local dOvermatIn = EgtGetInfo( nPartId, WIN_PRC_OVERMAT_IN, 'd') + local dOvermatLeft = EgtGetInfo( nPartId, WIN_PRC_OVERMAT_LEFT, 'd') + + -- applico i sovramateriali + EgtOffsetCurve( nOut, dOvermatOut) + for i = 1, #vRight do + EgtOffsetCurve( vRight[i], dOvermatRight) + end + EgtOffsetCurve( nIn, dOvermatIn) + for i = 1, #vLeft do + EgtOffsetCurve( vLeft[i], dOvermatLeft) + end + + -- creo la composita a partire dalle curve + local vCrvs = EgtGetAllInGroup( nGeoLayerId) + TrimAndOrientOrderedCurves( vCrvs, false) + local nCompo = EgtCurveCompo( nGeoRawLayerId, vCrvs) + + return nCompo +end + +--------------------------------------------------------------------- +-- funzione che crea gli elementi ausiliari per la creazione del grezzo nell'automatismo nel caso di arco spezzato in tronchetti +local function PrepareGeoRawCurveFromLogs( nPartId, nGeoRawLayerId, nLogsLayerId) + + -- recupero i vari tronchetti + local vLogCrvs = EgtGetNameInGroup( nLogsLayerId, WIN_LOGS) + + -- salvo le info di sovramateriale nel pezzo + CopyInfo( nPartId, vLogCrvs[1], WIN_PRC_OVERMAT_IN, 0) + CopyInfo( nPartId, vLogCrvs[1], WIN_PRC_OVERMAT_OUT, 0) + local nOvermatLateral = EgtGetInfo( vLogCrvs[1], WIN_PRC_OVERMAT_RIGHT, 'd') + EgtSetInfo( nPartId, WIN_PRC_OVERMAT_RIGHT, nOvermatLateral) + EgtSetInfo( nPartId, WIN_PRC_OVERMAT_LEFT, nOvermatLateral) + + -- costruisco il grezzo a partire dai tronchetti + local vCrvs = {} + local vIdIn = {} + -- recupero le curve in e out dei tronchetti + for i = #vLogCrvs, 1, -1 do + local nLineOut = EgtLine( nGeoRawLayerId, EgtUP( vLogCrvs[i], 0), EgtUP( vLogCrvs[i], 1)) + local nLineIn = EgtLine( nGeoRawLayerId, EgtUP( vLogCrvs[i], 2), EgtUP( vLogCrvs[i], 3)) + table.insert( vCrvs, nLineOut) + table.insert( vIdIn, nLineIn) + end + local nLineR = EgtLine( nGeoRawLayerId, EgtEP( vCrvs[#vCrvs]), EgtSP( vIdIn[#vIdIn])) + table.insert( vCrvs, nLineR) + for i = #vIdIn, 1, -1 do + table.insert( vCrvs, vIdIn[i]) + end + local nLineL = EgtLine( nGeoRawLayerId, EgtEP( vIdIn[1]), EgtSP( vCrvs[1])) + table.insert( vCrvs, nLineL) + + -- taglio le curve nelle intersezioni ( va eliminato il sovramateriale per minizinken) + TrimAndOrientOrderedCurves( vCrvs, false) + + -- costruisco la compo del grezzo + local nCompo = EgtCurveCompo( nGeoRawLayerId, vCrvs) + + return nCompo +end + --------------------------------------------------------------------- -- funzione che prepara il progetto per passarlo all'automatismo delle lavorazioni function WinCalculate.PrepareProject() - -- elimino il gruppo dei profili + -- recupero il gruppo dei profili local nProfileLay = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_PROFILE) - EgtErase( nProfileLay) - -- elimino il gruppo delle aree - local nAreaLay = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_AREA .. '*') - EgtErase( nAreaLay) + local nInfoGrp = EgtGetFirstNameInGroup( nProfileLay, WIN_INFO_GRP) + -- elimino i pezzi di tipo fill local vFills = EgtGetNameInGroup( GDB_ID.ROOT, WIN_FILL) EgtErase( vFills) - -- in ogni pezzo - local nPartId = EgtGetFirstInGroup( GDB_ID.ROOT) - while nPartId do + -- TO DO : recupero modalità di lavorazione dei tronchetti + local bFinishedLogs = true + + -- preparo ogni pezzo per l'automatismo ( quindi salto i primi due che sono il gruppo dei profili e delle aree) + local vParts = EgtGetAllInGroup( GDB_ID.ROOT) + for i = 3, #vParts do + + local bDeletePart = false - -- cancello il gruppo dei profili - local nProfileGrp = EgtGetFirstNameInGroup( nPartId, WIN_PROFILE) - EgtErase( nProfileGrp) - - -- cancello eventuali gruppi ausiliari per cambio profilo - local nMixedOutlines = EgtGetFirstNameInGroup( nPartId, WIN_MIXED_OUTLINES) - EgtErase( nMixedOutlines or GDB_ID.NULL) - local nMixedIntersections = EgtGetFirstNameInGroup( nPartId, WIN_MIXED_INTERSECTIONS) - EgtErase( nMixedIntersections or GDB_ID.NULL) - - -- accendo gruppo delle lavorazioni - local nProcLay = EgtGetFirstNameInGroup( nPartId, WIN_PRC) - EgtSetStatus( nProcLay, GDB_ST.ON) - - -- nel gruppo dei solidi conservo solo quello principale - local nSolidGrp = EgtGetFirstNameInGroup( nPartId, WIN_SOLID) - if nSolidGrp then - local nMainSolid = EgtGetFirstNameInGroup( nSolidGrp, WIN_SRF_MAIN) - local vIds = EgtGetAllInGroup( nSolidGrp) - for i = 1, #vIds do - if vIds[i] ~= nMainSolid then - EgtErase( vIds[i]) - end + -- verifico se tronchetti + local nLogsLayerId = EgtGetFirstNameInGroup( vParts[i], WIN_LOGS) + if nLogsLayerId then + -- calcolo i pezzi corrispondenti ai tronchetti + local vCrvIn = EgtGetNameInGroup( nLogsLayerId, WIN_GEO_IN) + local vCrvOut = EgtGetNameInGroup( nLogsLayerId, WIN_GEO_OUT) + for j = 1, #vCrvIn do + PrepareLogPart( vParts[i], vCrvIn[j], vCrvOut[j], j == 1, j == #vCrvIn, bFinishedLogs, nInfoGrp) end + -- il pezzo originale va cancellato se i tronchetti sono lavorati come pezzi finiti oppure se c'è un solo tronchetto + bDeletePart = bFinishedLogs or ( #vCrvIn == 1) end - -- nel gruppo geo creo frame ausiliario - local nGeoLayerId = EgtGetFirstNameInGroup( nPartId, WIN_GEO) - local nOutCrv = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_OUT) - local vtS = EgtSV( nOutCrv) - local frGeo = Frame3d( EgtSP( nOutCrv), vtS, Z_AX() ^ vtS, Z_AX()) - local nFrameId = EgtFrame( nGeoLayerId, frGeo) - EgtSetName( nFrameId, WIN_PRC_FRAME) - - -- passo al pezzo successivo - nPartId = EgtGetNext( nPartId) + if bDeletePart then + EgtErase( vParts[i]) + else + -- cancello il gruppo dei profili + local nProfileGrp = EgtGetFirstNameInGroup( vParts[i], WIN_PROFILE) + EgtErase( nProfileGrp or GDB_ID.NULL) + + -- cancello eventuali gruppi ausiliari per cambio profilo + local nMixedOutlines = EgtGetFirstNameInGroup( vParts[i], WIN_MIXED_OUTLINES) + EgtErase( nMixedOutlines or GDB_ID.NULL) + local nMixedIntersections = EgtGetFirstNameInGroup( vParts[i], WIN_MIXED_INTERSECTIONS) + EgtErase( nMixedIntersections or GDB_ID.NULL) + + -- accendo gruppo delle lavorazioni + local nProcLay = EgtGetFirstNameInGroup( vParts[i], WIN_PRC) + EgtSetStatus( nProcLay, GDB_ST.ON) + + -- nel gruppo dei solidi conservo solo quello principale + local nSolidGrp = EgtGetFirstNameInGroup( vParts[i], WIN_SOLID) + if nSolidGrp then + local nMainSolid = EgtGetFirstNameInGroup( nSolidGrp, WIN_SRF_MAIN) + local vIds = EgtGetAllInGroup( nSolidGrp) + for i = 1, #vIds do + if vIds[i] ~= nMainSolid then + EgtErase( vIds[i]) + end + end + end + + -- creo il GeoRaw per il calcolo del grezzo + local nGeoRawLayerId = EgtGroup( vParts[i]) + EgtSetName( nGeoRawLayerId, WIN_GEO_RAW) + local nGeoLayerId = EgtGetFirstNameInGroup( vParts[i], WIN_GEO) + local nCompo + if nLogsLayerId then + nCompo = PrepareGeoRawCurveFromLogs( vParts[i], nGeoRawLayerId, nLogsLayerId) + EgtErase( nLogsLayerId) + else + nCompo = PrepareGeoRawCurve( vParts[i], nGeoRawLayerId, nGeoLayerId) + end + EgtErase( nGeoLayerId) + -- creo frame ausiliario + local vtX = EgtSV( nCompo) + local frGeo = Frame3d( EgtSP( nCompo), vtX, Z_AX() ^ vtX, Z_AX()) + local nFrameId = EgtFrame( nGeoRawLayerId, frGeo) + EgtSetName( nFrameId, WIN_PRC_FRAME) + end end + + -- elimino il gruppo delle aree + local nAreaLay = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_AREA .. '*') + EgtErase( nAreaLay) + -- elimino il gruppo dei profili + EgtErase( nProfileLay) + end