From ba392fa99ff444a688f0a081db00a8da91a0aca4 Mon Sep 17 00:00:00 2001 From: SaraP Date: Tue, 11 Mar 2025 14:45:50 +0100 Subject: [PATCH] - sistemato passaggio all'automatismo lavorazioni. --- Profiles/WinConst.lua | 5 + Profiles/WinLib/WinCalculate.lua | 837 +++++++++++++++---------------- Profiles/WinLib/WinCreate.lua | 2 + 3 files changed, 401 insertions(+), 443 deletions(-) diff --git a/Profiles/WinConst.lua b/Profiles/WinConst.lua index 7e7a9ab..530c251 100644 --- a/Profiles/WinConst.lua +++ b/Profiles/WinConst.lua @@ -153,6 +153,7 @@ WIN_SASHTYPE = 'SashType' WIN_REF_OUTLINE = 'OutlineRef' WIN_REF_PART = 'PartRef' WIN_REF_BOTTOMRAIL_PART = 'BottomRailPartRef' +WIN_AREA_NAME = 'AreaName' WIN_SASH_TOP = 'Sash_Top' WIN_SASH_BOTTOM = 'Sash_Bottom' @@ -270,6 +271,10 @@ WIN_PRC_CLAMPV_1 = 'CLAMPV_1' WIN_PRC_CLAMPV_2 = 'CLAMPV_2' WIN_STRIP_DIST = 'StripDistance' +WIN_GLASS = 'GLASS' +WIN_WOOD = 'WOOD' +WIN_INACTIVE = 'INACTIVE' + WIN_REF_SPLIT = 'RefSplit' WIN_CRV_ON_FRENCH_SPLIT = 'OutlineOnFrenchSplit' WIN_PREV_OUTLINES = 'PrevOutlines' diff --git a/Profiles/WinLib/WinCalculate.lua b/Profiles/WinLib/WinCalculate.lua index c32c850..a15d934 100644 --- a/Profiles/WinLib/WinCalculate.lua +++ b/Profiles/WinLib/WinCalculate.lua @@ -1902,8 +1902,76 @@ local function CalcProfilingProcessings( nPartId, nOutlineId) EgtSetInfo( nStripCut, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.STRIP_CUT) end EgtErase( nSurfGeo) + + -- verifico se anta ricevente ( info necessaria per ottimizzazione lavorazioni) + local nAreaId = EgtGetParent( EgtGetParent( nOutlineId)) + local nAreaType = EgtGetInfo( nAreaId, WIN_AREATYPE, 'i') + if nAreaType == WIN_AREATYPES.SASH then + local nSashType = EgtGetInfo( nAreaId, WIN_SASHTYPE, 'i') + if nSashType == WIN_SASHTYPES.INACTIVE or nSashType == WIN_SASHTYPES.INACTIVE_IN then + local nBaseOutlineId = EgtGetInfo( nOutlineId, WIN_COPY, 'i') + local bOnFrenchSplit = EgtGetInfo( nBaseOutlineId, WIN_CRV_ON_FRENCH_SPLIT, 'b') + if bOnFrenchSplit then + EgtSetInfo( nPartId, WIN_SASHTYPE, WIN_INACTIVE) + end + end + end + end +--------------------------------------------------------------------- +-- funzione che calcola gli elementi ausiliari per la creazione del grezzo nell'automatismo delle lavorazioni +local function CalcGeoRaw( nPartId) + + local nGeoLayerId = EgtGetFirstNameInGroup( nPartId, WIN_GEO) + local nGeoRawLayerId = EgtCopyGlob( nGeoLayerId, nPartId) + EgtSetName( nGeoRawLayerId, WIN_GEO_RAW) + EgtSetStatus( nGeoRawLayerId, GDB_ST.OFF) + + -- recupero le curve del geo + local nOut = EgtGetFirstNameInGroup( nGeoRawLayerId, WIN_GEO_OUT) + local nIn = EgtGetFirstNameInGroup( nGeoRawLayerId, WIN_GEO_IN) + local vRight = EgtGetNameInGroup( nGeoRawLayerId, WIN_GEO_RIGHT) + local vLeft = EgtGetNameInGroup( nGeoRawLayerId, 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 del grezzo a partire dalle curve + local vCrvs = EgtGetAllInGroup( nGeoRawLayerId) + TrimAndOrientOrderedCurves( vCrvs, false) + local nCompo = EgtCurveCompo( nGeoRawLayerId, vCrvs) + + -- 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 ---------------------------------------------------------------------------------- @@ -2980,8 +3048,43 @@ end ---------------------------------------------------------------------------------- ----------------------------- CALCOLO PEZZI ------------------------------------ ---------------------------------------------------------------------------------- +-- funzione che stabilisce il nome del pezzo +local function CalcPartName( nAreaId, nAreaType) + + local sName = '' + if nAreaType == WIN_AREATYPES.FRAME then + sName = WIN_FRAME .. '_' + EgtSetInfo( nAreaId, WIN_AREA_NAME, sName) + elseif nAreaType == WIN_AREATYPES.SASH then + -- risalgo nella gerarchia per individuare la catena di sottoaree + local nParentId = EgtGetParent( nAreaId) + local nParentType = EgtGetInfo( nParentId, WIN_AREATYPE, 'i') + while nParentType ~= WIN_AREATYPES.FRAME do + local sParentName = EgtGetName( nParentId) + local _, sParentNbr = EgtStartsWith( sParentName, WIN_AREA) + sName = sParentNbr .. '_'.. sName + nParentId = EgtGetParent( nParentId) + nParentType = EgtGetInfo( nParentId, WIN_AREATYPE, 'i') + end + sName = WIN_SASH .. '_'.. sName + EgtSetInfo( nAreaId, WIN_AREA_NAME, sName) + else + -- per split o riempimento devo ricavare il nome del parent che lo contiene + local nParentId = EgtGetParent( nAreaId) + local nParentType = EgtGetInfo( nParentId, WIN_AREATYPE, 'i') + while nParentType ~= WIN_AREATYPES.FRAME and nParentType ~= WIN_AREATYPES.SASH do + nParentId = EgtGetParent( nParentId) + nParentType = EgtGetInfo( nParentId, WIN_AREATYPE, 'i') + end + sName = EgtGetInfo( nParentId, WIN_AREA_NAME, sName) + end + + return sName +end + +--------------------------------------------------------------------- -- funzione che calcola l'ingombro dei pezzi del telaio e i loro solidi -local function CreatePartFromOutline( nAreaLayerId, nOutlineId, nOutlineCrvNbr, bBottomRail) +local function CreatePartFromOutline( nAreaLayerId, sName, nOutlineId, nOutlineCrvNbr, bBottomRail) -- creo pezzo local nPartId = EgtGroup( GDB_ID.ROOT) @@ -3001,18 +3104,16 @@ local function CreatePartFromOutline( nAreaLayerId, nOutlineId, nOutlineCrvNbr, else EgtSetInfo( nOutlineId, WIN_REF_PART, nPartId) end - + -- imposto nome del pezzo - local sName = EgtGetName( nOutlineId) - if bBottomRail then - sName = WIN_BOTTOMRAIL - end - EgtSetName( nPartId, sName) + local sOutlineName = EgtIf( bBottomRail, WIN_BOTTOMRAIL, EgtGetName( nOutlineId)) + local sPartName = sName .. sOutlineName + EgtSetName( nPartId, sPartName) - -- imposto colore - if sName == WIN_BOTTOM or sName == WIN_TOP or bBottomRail then + -- imposto il colore + if sOutlineName == WIN_BOTTOM or sOutlineName == WIN_TOP or bBottomRail then EgtSetColor( nPartId, Color3d( 204, 102, 0)) - elseif sName == WIN_RIGHT or sName == WIN_LEFT then + elseif sOutlineName == WIN_RIGHT or sOutlineName == WIN_LEFT then EgtSetColor( nPartId, Color3d( 251, 128, 4)) else EgtSetColor( nPartId, Color3d( 255, 159, 57)) @@ -3035,6 +3136,8 @@ local function CreatePartFromOutline( nAreaLayerId, nOutlineId, nOutlineCrvNbr, end -- calcolo le lavorazioni associate ai profili CalcProfilingProcessings( nPartId, nOutlineId) + -- calcolo il georaw per automatismo lavorazioni + CalcGeoRaw( nPartId) -- disegno solido if s_bCalcSolid then CalcSolid( nPartId, nOutlineId) @@ -3043,15 +3146,19 @@ local function CreatePartFromOutline( nAreaLayerId, nOutlineId, nOutlineCrvNbr, -- b) Fill elseif nAreaType == WIN_AREATYPES.FILL then -- imposto nome del pezzo - EgtSetName( nPartId, WIN_FILL) + EgtSetName( nPartId, sName .. WIN_FILL) + -- ricavo tipo local nFillType = EgtGetInfo( nAreaLayerId, WIN_FILLTYPE, 'i') - -- imposto colore + + -- imposto colore e tipologia di riempimento if nFillType == WIN_FILLTYPES.GLASS then EgtSetColor( nPartId, Color3d( 71, 161, 255)) EgtSetAlpha( nPartId, 30) + EgtSetInfo( nPartId, WIN_FILLTYPE, WIN_GLASS) elseif nFillType == WIN_FILLTYPES.WOOD then EgtSetColor( nPartId, Color3d( 194, 148, 103)) + EgtSetInfo( nPartId, WIN_FILLTYPE, WIN_WOOD) end -- disegno ingombro @@ -3069,25 +3176,27 @@ end local function CalculateAreaParts( nAreaId) local nAreaType = EgtGetInfo( nAreaId, WIN_AREATYPE, 'i') + -- recupero nome dei pezzi in quest'area + local sName = CalcPartName( nAreaId, nAreaType) if nAreaType == WIN_AREATYPES.FRAME or nAreaType == WIN_AREATYPES.SASH then -- creo pezzi per ogni outline local nOutlineLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_OUTLINE) local vOutlines = EgtGetAllInGroup( nOutlineLayerId) for i = 1, #vOutlines do -- creo pezzo - CreatePartFromOutline( nAreaId, vOutlines[i], i) + CreatePartFromOutline( nAreaId, sName, vOutlines[i], i) -- se di tipo bottom verifico se ha bottomrail local sName = EgtGetName( vOutlines[i]) if sName == WIN_BOTTOM then local bBottomRail = EgtGetInfo( nOutlineLayerId, WIN_BOTTOMRAIL, 'b') or false if bBottomRail then - CreatePartFromOutline( nAreaId, vOutlines[i], i, true) + CreatePartFromOutline( nAreaId, sName, vOutlines[i], i, true) end end end elseif nAreaType == WIN_AREATYPES.FILL then -- creo riempimento - CreatePartFromOutline( nAreaId) + CreatePartFromOutline( nAreaId, sName) end -- verifico se c'e' uno split da realizzare @@ -3099,7 +3208,7 @@ local function CalculateAreaParts( nAreaId) local nSplitId = EgtGetFirstInGroup( nSplitLayerId) if nSplitId then -- creo pezzo split - local nSplitPartId = CreatePartFromOutline( nAreaId, nSplitId) + local nSplitPartId = CreatePartFromOutline( nAreaId, sName, nSplitId) -- disegno area di selezione per programma local nSelectionLayerId = EgtGroup( nAreaId) EgtSetName( nSelectionLayerId, WIN_SPLITSELECTION) @@ -3395,121 +3504,6 @@ local function CalcLogs( nGrp, nGeoOut, dOverMatIn, dOverMatOut, dOverMatExt, dO 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 ---------------------------------------- ----------------------------------------------------------------------------------- --- funzione che crea tutti i pezzi della finestra partendo dal telaio -function WinCalculate.CreatePartFromArea( nFrameId) - -- assegno il tipo di profilo alle curve del base outline - CalculateAreaProfileType( nFrameId) - -- calcolo outline a partire dal base outline - CalculateAreaOutline( nFrameId) - -- creo pezzi - CalculateAreaParts( nFrameId) - -- calcolo le spine - CalculateAreaDowels( nFrameId) -end - ---------------------------------------------------------------------- --- funzione che posiziona un pezzo -function WinCalculate.PositionPart(nPartId) - -- ricavo tipo dal nome - local sName = EgtGetName( nPartId) - local sDelta = '' - if sName == WIN_BOTTOM then - sDelta = WIN_STARTCPDELTA - elseif sName == WIN_RIGHT then - sDelta = WIN_STARTCPDELTA - elseif sName == WIN_TOP then - sDelta = WIN_STARTCPDELTA - elseif sName == WIN_LEFT then - sDelta = WIN_STARTCPDELTA - end - -- calcolo nuovo riferimento - local nGeoPartLayerId = EgtGetFirstNameInGroup( nPartId, WIN_GEO) - local nGeoPartId = EgtGetFirstNameInGroup( nGeoPartLayerId, sName) - local dDelta = EgtGetInfo( nGeoPartId, sDelta, 'd') or 0 - local nFrameLayerId = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_FRAME) - local nOutlineLayerId = EgtGetFirstNameInGroup( nFrameLayerId, WIN_OUTLINE) - local nFramePartId = EgtGetFirstNameInGroup( nOutlineLayerId, sName) - local vtStart = EgtSV( nFramePartId) - local ptStart = EgtSP( nFramePartId) + vtStart * dDelta - local _, _, dAngRight = SphericalFromVector(vtStart) - local frStart = Frame3d( ptStart) - frStart:rotate( frStart:getOrigin(), Z_AX(), dAngRight) - EgtChangeGroupFrame( nPartId, frStart) -end - ---------------------------------------------------------------------- --- funzione che assembla i pezzi -function WinCalculate.AssembleFrame() - local nBottomPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_BOTTOM) - WinCalculate.PositionPart(nBottomPartId) - local nRightPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_RIGHT) - WinCalculate.PositionPart(nRightPartId) - local nTopPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_TOP) - WinCalculate.PositionPart(nTopPartId) - local nLeftPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_LEFT) - WinCalculate.PositionPart(nLeftPartId) - -- assemblo i pezzi - --local nRightPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_RIGHT) - --local nGeoRightLayerId = EgtGetFirstNameInGroup( nRightPartId, WIN_GEO) - --local nGeoRightId = EgtGetFirstNameInGroup( nGeoRightLayerId, WIN_RIGHT) - --local dDelta = EgtGetInfo( nGeoRightId, WIN_BOTTOMCPDELTA, 'd') - --local nFrameLayerId = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_FRAME) - --local nOutlineLayerId = EgtGetFirstNameInGroup( nFrameLayerId, WIN_OUTLINE) - --local nFrameRightId = EgtGetFirstNameInGroup( nOutlineLayerId, WIN_RIGHT) - --local vtRight = EgtSV( nFrameRightId) - --local ptRight = EgtSP( nFrameRightId) + vtRight * dDelta - --local _, _, dAngRight = SphericalFromVector(vtRight) - --local frRight = Frame3d( ptRight) - --frRight:rotate( frRight:getOrigin(), Z_AX(), dAngRight) - --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) @@ -3560,241 +3554,212 @@ local function CalcLogDowel( nOrigPartId, nCrvOut, bLeftOrRight, nProcLayerId, n end --------------------------------------------------------------------- --- funzione che crea il pezzo del tronchetto -local function PrepareLogPart( nOrigPartId, nCrvIn, nCrvOut, bFirst, bLast, bFinishedLog, nInfoGrp) +-- funzione che crea i pezzi dei tronchetti +local function CalcLogParts( nOrigPartId, bFinishedLogs) + + local nProfileGrp = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_PROFILE) + local nInfoGrp = EgtGetFirstNameInGroup( nProfileGrp, WIN_INFO_GRP) - 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 + -- recupero i gruppi dal pezzo ad arco 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 nOrigSolidLayerId = EgtGetFirstNameInGroup( nOrigPartId, WIN_SOLID) 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 + -- recupero i tronchetti + local nLogLayerId = EgtGetFirstNameInGroup( nOrigPartId, WIN_LOGS) + local vCrvIn = EgtGetNameInGroup( nLogLayerId, WIN_GEO_IN) + local vCrvOut = EgtGetNameInGroup( nLogLayerId, WIN_GEO_OUT) + for i = 1, #vCrvIn do + -- creo il pezzo per il trochetto + local nPartId = EgtGroup( GDB_ID.ROOT) + EgtSetName( nPartId, WIN_LOGS) + EgtSetColor( nPartId, Color3d( 204, 102, 0)) + + local nCrvIn = vCrvIn[i] + local nCrvOut = vCrvOut[i] + 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) - 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) + -- 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 #vCrvIn == 1 then + -- essendo singolo pezzo il solido è quello originale + local nOrigSolidId = EgtGetFirstNameInGroup( nOrigSolidLayerId, WIN_SRF_MAIN) + EgtRelocateGlob( nOrigSolidId, nSolidLayerId) + elseif bFinishedLogs then + -- recupero il solido originale e lo taglio opportunamente agli estremi + local nOrigSolidId = EgtGetFirstNameInGroup( nOrigSolidLayerId, WIN_SRF_MAIN) + nSolidId = EgtCopyGlob( nOrigSolidId, nSolidLayerId) + + local bBox = GetProfileLocalBox( nProfileId) + local dDimY = bBox:getDimY() + if i ~= 1 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 - -- 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 + if i ~= #vCrvIn 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 - -- 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 + -- il solido è esattamente il tronchetto + local bBox = GetProfileLocalBox( nProfileId) + nSolidId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nLogCrv, - bBox:getDimY() * Z_AX()) + EgtSetName( nSolidId, WIN_SOLID) end end - EgtErase( nSurfTest) + + -- c) LAVORAZIONI + -- se unico tronchetto le lavorazioni sono quelle del pezzo originale + if #vCrvIn == 1 then + EgtRelocateGlob( nOrigProcLayerId, nPartId) + EgtSetStatus( nOrigProcLayerId, GDB_ST.ON) + return + end + + local nProcLayerId = EgtGroup( nPartId) + EgtSetName( nProcLayerId, WIN_PRC) + + -- profili in e out + if bFinishedLogs 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 i == #vCrvIn and bFinishedLogs then + -- recupero la curva di lavorazione dal pezzo originale + local nLeftPrc = EgtGetFirstNameInGroup( nOrigProcLayerId, WIN_GEO_LEFT) + EgtRelocateGlob( nLeftPrc, nProcLayerId) + elseif i ~= #vCrvIn 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 i == 1 and bFinishedLogs then + -- recupero la curva di lavorazione dal pezzo originale + local nRightPrc = EgtGetFirstNameInGroup( nOrigProcLayerId, WIN_GEO_RIGHT) + EgtRelocateGlob( nRightPrc, nProcLayerId) + elseif i ~= 1 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 i ~= 1 then + CalcLogDowel( nOrigPartId, nCrvOut, false, nProcLayerId, nProfileId, nInfoGrp, nSolidId) + end + if i ~= #vCrvIn 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 bFinishedLogs 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 i == #vCrvIn) or ( sSide == WIN_PRC_SIDETYPE.RIGHT and i == 1) 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 + 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 +-- funzione che crea gli elementi ausiliari per la creazione del grezzo nell'automatismo delle lavorazioni +local function CalcGeoRawFromLogs( nPartId) - -- 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) + -- svuoto il GeoRaw per ricalcolarlo + local nGeoRawLayerId = EgtGetFirstNameInGroup( nPartId, WIN_GEO_RAW) + EgtEmptyGroup( nGeoRawLayerId) -- recupero i vari tronchetti - local vLogCrvs = EgtGetNameInGroup( nLogsLayerId, WIN_LOGS) + local nLogGrp = EgtGetFirstNameInGroup( nPartId, WIN_LOGS) + local vLogCrvs = EgtGetNameInGroup( nLogGrp, WIN_LOGS) -- salvo le info di sovramateriale nel pezzo CopyInfo( nPartId, vLogCrvs[1], WIN_PRC_OVERMAT_IN, 0) @@ -3826,102 +3791,80 @@ local function PrepareGeoRawCurveFromLogs( nPartId, nGeoRawLayerId, nLogsLayerId -- costruisco la compo del grezzo local nCompo = EgtCurveCompo( nGeoRawLayerId, vCrvs) + + -- creo il 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) - return nCompo end --------------------------------------------------------------------- --- funzione che prepara il progetto per passarlo all'automatismo delle lavorazioni -function WinCalculate.PrepareProject() - - -- recupero il gruppo dei profili - local nProfileLay = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_PROFILE) - local nInfoGrp = EgtGetFirstNameInGroup( nProfileLay, WIN_INFO_GRP) +-- funzione che calcola i tronchetti di un pezzo ad arco +function WinCalculate.CreateArcLogs( nPartId, nLogsNbr, vSections, bAlign, dOverMatOut, dOverMatIn, dOverMatExt, dOverMatInt, bCutExtremities) - -- elimino i pezzi di tipo fill - local vFills = EgtGetNameInGroup( GDB_ID.ROOT, WIN_FILL) - EgtErase( vFills) - - -- 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 - - -- 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 - - 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 + -- 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 - - -- elimino il gruppo delle aree - local nAreaLay = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_AREA .. '*') - EgtErase( nAreaLay) - -- elimino il gruppo dei profili - EgtErase( nProfileLay) + -- 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) + + -- TODO : recupero modalità di lavorazione dei tronchetti + local bFinishedLogs = false + + -- creo i pezzi associati ai tronchetti + CalcLogParts( nPartId, bFinishedLogs) + if not bFinishedLogs then + -- sistemo il Georaw per il pezzo ad arco + CalcGeoRawFromLogs( nPartId) + else + -- TODO segnalare che il pezzo non va lavorato + end end +---------------------------------------------------------------------------------- +------------------------------ FUNZIONI ---------------------------------------- +---------------------------------------------------------------------------------- +-- funzione che crea tutti i pezzi della finestra partendo dal telaio +function WinCalculate.CreatePartFromArea( nFrameId) + -- assegno il tipo di profilo alle curve del base outline + CalculateAreaProfileType( nFrameId) + -- calcolo outline a partire dal base outline + CalculateAreaOutline( nFrameId) + -- creo pezzi + CalculateAreaParts( nFrameId) + -- calcolo le spine + CalculateAreaDowels( nFrameId) +end + ---------------------------------------------------------------------------------- ---------------------------------- FERRAMENTA ---------------------------------- @@ -3929,7 +3872,6 @@ end local function SearchSash( nAreaId, SashList) -- verifico il tipo local nAreaType = EgtGetInfo( nAreaId, WIN_AREATYPE, 'i') - --if nAreaType == WIN_AREATYPES.FRAME then if nAreaType == WIN_AREATYPES.SASH then -- calcolo il Box local nOutlineLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_OUTLINE) @@ -3937,6 +3879,7 @@ local function SearchSash( nAreaId, SashList) -- recupero punti di origine local nSashFrameLayerId = EgtGroup( nAreaId) EgtSetName( nSashFrameLayerId, WIN_HDW_FRAME) + EgtSetStatus( nSashFrameLayerId, GDB_ST.OFF) local vOutlineCopy = {} local nOutlineOffsetLayerId = EgtGroup( nAreaId) local nOutlineId = EgtGetFirstInGroup( nOutlineLayerId) @@ -4005,11 +3948,12 @@ local function SearchSash( nAreaId, SashList) nSouAreaId = EgtGetParent( EgtGetParent( nSouId or GDB_ID.NULL)) nSouAreaType = EgtGetInfo( nSouAreaId or GDB_ID.NULL, WIN_AREATYPE, 'i') end - if nSouId and EgtGetName( nSouId) ~= WIN_SPLIT then + if nSouId then local nFrameFrameLayerId = EgtGetFirstNameInGroup( nSouAreaId, WIN_HDW_FRAME) if not nFrameFrameLayerId then nFrameFrameLayerId = EgtGroup( nSouAreaId) EgtSetName( nFrameFrameLayerId, WIN_HDW_FRAME) + EgtSetStatus( nFrameFrameLayerId, GDB_ST.OFF) end -- ricavo aria lato telaio local sProfileType = EgtGetInfo( nSouId, WIN_PROFILETYPE) @@ -4018,6 +3962,12 @@ local function SearchSash( nAreaId, SashList) local nFrameProfileTypeId = EgtGetFirstNameInGroup( nFrameProfileId, sProfileType, 'i') local dGapDeltaOut = EgtGetInfo( nFrameProfileTypeId, WIN_GAPDELTAOUT, 'd') local dFrameGapDeltaZ = EgtGetInfo( nFrameProfileTypeId, WIN_GAPDELTAZ, 'd') + if EgtGetName( nSouId) == WIN_SPLIT then + -- se dervia da split verifico il lato + if not AreSameVectorApprox( EgtSV( nSouId), EgtSV( nBaseOutlineId)) then + dGapDeltaOut = - dGapDeltaOut + end + end local nOutlineOutId = EgtCopy( nSouId, nOutlineOffsetLayerId) EgtSetName( nOutlineOutId, 'Frame') EgtOffsetCurve( nOutlineOutId, - dGapDeltaOut) @@ -4063,8 +4013,9 @@ local function SearchSash( nAreaId, SashList) end end +--------------------------------------------------------------------- -- funzione che aggiunge l'hardware -function WinCalculate.AddHardwareForSash( nFrameId, bOnlyRequest) +local function AddHardwareForSash( nFrameId, bOnlyRequest) -- cerco ed indicizzo ante del serramento local SashList = {} SearchSash( nFrameId, SashList) @@ -4116,7 +4067,7 @@ function WinCalculate.AddHardwareForSash( nFrameId, bOnlyRequest) 'S_NAME=' .. nFavourite .. '\n' .. 'RECORDID=15A' .. '\n' - if #SashList >= 1 and SashList[1].LHeight == SashList[1].RHeight then + if #SashList >= 1 and abs( SashList[1].LHeight - SashList[1].RHeight) < GEO.EPS_SMALL then sText = sText .. 'HBB=' .. tostring( SashList[1].LHeight) .. '\n' else for nSashIndex = 1, #SashList do @@ -4169,10 +4120,10 @@ function WinCalculate.AddHardwareForSash( nFrameId, bOnlyRequest) while not EgtExistsFile( sOutputFile) and nWait < 20 do nWait = nWait + 1 EgtPause( 500) - end + end EgtPause( 500) - + -- Apro file Output in lettura local fhOutput = io.open( sOutputLavFile, 'r') if not fhOutput then @@ -4312,9 +4263,10 @@ function WinCalculate.AddHardwareForSash( nFrameId, bOnlyRequest) -- Chiudo file Output in lettura fhOutput:close() - + end +--------------------------------------------------------------------- -- funzione che aggiunge l'hardware function WinCalculate.AddHardware( nAreaId) -- verifico il tipo @@ -4326,8 +4278,7 @@ function WinCalculate.AddHardware( nAreaId) end if nAreaType == WIN_AREATYPES.SASH or ( nSplitLayerId and nSplitType == WIN_SPLITTYPES.FRENCH) then -- lancio calcolo sash - WinCalculate.AddHardwareForSash( nAreaId) - return + return AddHardwareForSash( nAreaId) else -- verifico se ci sono sotto-aree local nChildAreaId = EgtGetFirstNameInGroup( nAreaId, WIN_AREA .. '*') diff --git a/Profiles/WinLib/WinCreate.lua b/Profiles/WinLib/WinCreate.lua index 80b9f29..0ec4775 100644 --- a/Profiles/WinLib/WinCreate.lua +++ b/Profiles/WinLib/WinCreate.lua @@ -40,6 +40,7 @@ function WinCreate.ImportProfile( sProfilePath) -- creo gruppo per il profilo local nProfileId = EgtGroup( GDB_ID.ROOT) EgtSetName( nProfileId, WIN_PROFILE) + EgtSetLevel( nProfileId, GDB_LV.SYSTEM) -- importo profilo prescelto local bOk = EgtInsertFile( sProfilePath) -- recupero gruppi importati e li sposto nel gruppo profilo @@ -67,6 +68,7 @@ function WinCreate.CreateGenFrame( vFrameCrvs, vJoints) -- creo gruppo per telaio local nFrameAreaId = EgtGroup( GDB_ID.ROOT) EgtSetName( nFrameAreaId, WIN_AREA .. '(' .. WIN_FRAME .. ')') + EgtSetLevel( nFrameAreaId, GDB_LV.SYSTEM) -- imposto il tipo EgtSetInfo( nFrameAreaId, WIN_AREATYPE, WIN_AREATYPES.FRAME) -- creo il gruppo con le curve di outline