-- -- EEEEEEEEEE GGGGGG wwww wwww -- EEEEEEEEEE GGGGGGGGGG wwww wwww -- EEEE GGGG GGGG wwww wwww wwww -- EEEE GGGG wwww wwww wwww -- EEEEEEE GGGG GGGGGGG wwww wwwwww wwww -- EEEEEEE GGGG GGGGGGG wwww wwwwww wwww -- EEEE GGGG GGGG wwww wwwwwwww wwww -- EEEE GGGG GGGG wwww wwww wwww wwww -- EEEEEEEEEE GGGGGGGGGG wwwwwwww wwwwwwww -- EEEEEEEEEE GGGGGG wwwwwww wwwwwww -- -- fc_rectangle.lua by EgalWare s.r.l. 2019.05.07 -- Autore: Filippo Monchi -- fc_rectangle dati i valori 'Thickness' e 'face' e con nome attributo -- 2019.05.07 V1.000 FM Write Component -- 2019.09.24 V1.001 FM Manage side distance parameters (top, bottom, lock, hinge) from ddf -- 2019.09.25 V1.002 FM Fix some error on calculate lines and rectangle position when diameter tool used -- 2019.10.18 V2.000 FM Manage use Materials -- 2019.10.18 V2.000 FM Manage to draw not premptive lines between premptive lines only if premptive lines are 2 and their start and stop -- distances are defined and without or zero step value -- 2022.07.27 V2.001 FM Modification to use compiled code -- 2023.05.15 V2.002 FM fix errors (x/0) when exists only 1 horizontal line and/or only 1 vertical line and both distances ( from reference and opposite sides) are difined -- Tavola per definizione modulo (serve ma non usata) local fc_rectangle = {} -- Intestazioni require( 'EgtBase') EgtEnableDebug( false) -- per messaggi -- EgtAddToPackagePath( EgtGetSourceDir() .. '?.lua') EgtAddToPackagePath( DGD.BASEDIR .. '?.lua') -- Valori limite local DimMin = 4. -- valore minimo lato local function GetMachToolErrorMessage( nErrorId, sGeomName, dIdMach, dOriDiamTool, nIdLogErr, sMchngName) local EgtDoorsMsg = require( 'EgtDoorsMsg') local sMessage = '' if dOriDiamTool then if nErrorId == -1 then -- lavorazione non presente in tabella sMessage = string.format(EgtDoorsMsg[466], nIdLogErr, dIdMach, sGeomName, EgtToUiUnits( dOriDiamTool)) elseif nErrorId == -2 then -- errore nel settare la lavorazione, lavorazione non presente in libreria sMessage = string.format(EgtDoorsMsg[467], nIdLogErr, sMchngName, dIdMach, sGeomName, EgtToUiUnits( dOriDiamTool)) elseif nErrorId == -3 then -- errore nell'acquisire parametri lavorazione sMessage = string.format(EgtDoorsMsg[468], nIdLogErr, sMchngName, dIdMach, sGeomName, EgtToUiUnits( dOriDiamTool)) elseif nErrorId == -4 then -- errore nell'acquisire parametri lavorazione sMessage = string.format(EgtDoorsMsg[469], nIdLogErr, sMchngName, dIdMach, sGeomName, EgtToUiUnits( dOriDiamTool)) elseif nErrorId == -5 then -- diametro utensile non trovato sMessage = string.format(EgtDoorsMsg[470], nIdLogErr, sMchngName, dIdMach, sGeomName, EgtToUiUnits( dOriDiamTool)) elseif nErrorId == -6 then -- nome geometria non presente in tabella sMessage = string.format(EgtDoorsMsg[471], nIdLogErr, sGeomName, EgtToUiUnits( dOriDiamTool)) elseif nErrorId == -7 then -- altezza massima utensile non trovata sMessage = string.format(EgtDoorsMsg[472], nIdLogErr, sMchngName, dIdMach, sGeomName, EgtToUiUnits( dOriDiamTool)) elseif nErrorId == -8 then -- tabella non presente nelle note sMessage = string.format(EgtDoorsMsg[509], nIdLogErr) end elseif nErrorId == -1 then -- lavorazione non presente in tabella sMessage = string.format(EgtDoorsMsg[504], nIdLogErr, dIdMach, sGeomName) elseif nErrorId == -2 then -- errore nel settare la lavorazione sMessage = string.format(EgtDoorsMsg[505], nIdLogErr, sMchngName, dIdMach, sGeomName) elseif nErrorId == -3 then -- errore nell'acquisire parametri lavorazione sMessage = string.format(EgtDoorsMsg[506], nIdLogErr, sMchngName, dIdMach, sGeomName) elseif nErrorId == -4 then -- errore nell'acquisire parametri lavorazione sMessage = string.format(EgtDoorsMsg[507], nIdLogErr, sMchngName, dIdMach, sGeomName) elseif nErrorId == -5 then -- diametro utensile non trovato sMessage = string.format(EgtDoorsMsg[508], nIdLogErr, sMchngName, dIdMach, sGeomName) elseif nErrorId == -6 then -- nome geometria non presente in tabella sMessage = string.format(EgtDoorsMsg[503], nIdLogErr, sGeomName) elseif nErrorId == -7 then -- altezza massima utensile non trovata sMessage = string.format(EgtDoorsMsg[473], nIdLogErr, sMchngName, dIdMach, sGeomName) elseif nErrorId == -8 then -- tabella non presente nelle note sMessage = string.format(EgtDoorsMsg[509], nIdLogErr) end return sMessage end local function DrawAddLineDrawCircle( pInitial, pFinal, nGroup, idTable, bPrev, nGroupCirc, nRad, bDrawFirst, bDrawLast, cColor1, cColor2, sMVar) local nLine = EgtLine(nGroup, pInitial, pFinal, GDB_RT.LOC) local nNumLine if idTable then table.insert( idTable, nLine) -- se devo inserire una variazione nell'entità if sMVar then nNumLine = #idTable end end if bPrev then if bDrawFirst then local nCircle1 = EgtCircle( nGroupCirc, pInitial, nRad , GDB_RT.LOC) EgtSetColor(nCircle1, cColor1) end if bDrawLast then local nCircle2 = EgtCircle( nGroupCirc, pFinal, nRad , GDB_RT.LOC) EgtSetColor(nCircle2, cColor2) end end return nLine, nNumLine, sMVar end local function DrawAddCircleDrawCircle( pCenter, dRadius, dAngIni, dAngCen, nGroup, idTable, bPrev, nGroupCirc, nRad, bDrawFirst, bDrawLast, cColor1, cColor2, sMVar) local nCircle = EgtArc( nGroup, pCenter, dRadius, dAngIni, dAngCen, 0, GDB_RT.LOC) local nNumCircle if idTable then table.insert( idTable, nCircle) -- se devo inserire una variazione nell'entità if sMVar then nNumCircle = #idTable end end if bPrev then if bDrawFirst then local nCircle1 = EgtCircle( nGroupCirc, EgtSP( nCircle), nRad , GDB_RT.LOC) EgtSetColor( nCircle1, cColor1) end if bDrawLast then local nCircle2 = EgtCircle( nGroupCirc, EgtEP( nCircle), nRad , GDB_RT.LOC) EgtSetColor( nCircle2, cColor2) end end return nCircle, nNumCircle, sMVar end local function DrawRectangleWithFillet ( Lg, L, H, dThickD, rf) local tHint = {} local hint local pIni, pEnd, pCen -- Costruzione della geometria principale pIni = Point3d(((L/2)-rf),(H/2),dThickD) pCen = Point3d(((L/2)-rf),((H/2)-rf),dThickD) pEnd = Point3d((L/2),((H/2)-rf),dThickD) DrawAddCircleDrawCircle( pCen, rf, 90,-90, Lg, tHint, bPreview, Dm, 0, false, false, RED(), RED()) pIni = pEnd if abs(rf - (H/2)) > GEO.EPS_SMALL then -- se c'è spazio per una linea tra i due raccordi pEnd = Point3d((L/2),-(H/2)+rf,dThickD) DrawAddLineDrawCircle( pIni, pEnd, Lg, tHint, bPreview, Dm, 0, false, false, RED(), RED()) pIni = pEnd end pCen = Point3d(((L/2)-rf),(-(H/2)+rf),dThickD) pEnd = Point3d(((L/2)-rf),-(H/2),dThickD) DrawAddCircleDrawCircle( pCen, rf, 0,-90, Lg, tHint, bPreview, Dm, 0, false, false, RED(), RED()) pIni = pEnd if abs(rf - (L/2)) > GEO.EPS_SMALL then -- se c'è stazio per una linea tra i due raccordi pEnd = Point3d(-((L/2)-rf),-(H/2),dThickD) DrawAddLineDrawCircle( pIni, pEnd, Lg, tHint, bPreview, Dm, 0, false, false, RED(), RED()) pIni = pEnd end pCen = Point3d(-((L/2)-rf),(-(H/2)+rf),dThickD) pEnd = Point3d(-(L/2),(-(H/2)+rf),dThickD) DrawAddCircleDrawCircle( pCen, rf, -90,-90, Lg, tHint, bPreview, Dm, 0, false, false, RED(), RED()) pIni = pEnd if abs(rf - (H/2)) > GEO.EPS_SMALL then -- se c'è stazio per una linea tra i due raccordi pEnd = Point3d(-(L/2),((H/2)-rf),dThickD) DrawAddLineDrawCircle( pIni, pEnd, Lg, tHint, bPreview, Dm, 0, false, false, RED(), RED()) pIni = pEnd end pCen = Point3d(-((L/2)-rf),((H/2)-rf),dThickD) pEnd = Point3d(-((L/2)-rf),(H/2),dThickD) DrawAddCircleDrawCircle( pCen, rf, 180,-90, Lg, tHint, bPreview, Dm, 0, false, false, RED(), RED()) pIni = pEnd if abs(rf - (L/2)) > GEO.EPS_SMALL then -- se c'è spazio per una linea tra i due raccordi pEnd = Point3d(((L/2)-rf),(H/2),dThickD) DrawAddLineDrawCircle( pIni, pEnd, Lg, tHint, bPreview, Dm, 0, false, false, RED(), RED()) end -- trasformo in geometria composita i/il percorsi/o di contorno -- primo percorso if ( #tHint > 0) then hint = EgtCurveCompo( Lg, tHint, true) if hint then EgtInvertCurve( hint) end end return hint end local function MakeRectWithFillet( Lg, P1, P2, Rf, Ang) local hint_3 = EgtRectangle2P( Lg, P1, P2, GDB_RT.LOC) if hint_3 then local nNewId, nNumEnt = EgtExplodeCurveCompo( hint_3) if nNewId and nNumEnt and nNumEnt > 0 then local pStartIni -- se devo inserire i raccordi if Rf > 0 then local tIdFil = {} local nLine for p = 1, (nNumEnt-1) do nLine = EgtCurveFillet( Lg, ( nNewId + p - 1), EgtEP( nNewId + p - 1), ( nNewId + p), EgtSP( nNewId + p), Rf, true) table.insert( tIdFil, nLine) end nLine = EgtCurveFillet( Lg, ( nNewId + nNumEnt - 1), EgtEP( nNewId + nNumEnt - 1), nNewId, EgtSP(nNewId), Rf, true) table.insert( tIdFil, nLine) -- creo curvecompo pStartIni = EgtMP( nNewId) hint_3 = EgtCurveCompo( Lg, { nNewId, tIdFil[1], (nNewId+1), tIdFil[2], (nNewId+2), tIdFil[3], (nNewId+3), tIdFil[4]}, true) else -- creo curvecompo pStartIni = EgtMP( nNewId) hint_3 = EgtCurveCompo( Lg, { nNewId, (nNewId+1), (nNewId+2), (nNewId+3)}, true) end if hint_3 then EgtChangeClosedCurveStartPoint( hint_3, pStartIni, GDB_RT.LOC) -- cambio punto di inizio if Ang ~= 0 then EgtRotate( hint_3, EgtGP( hint_3), Z_AX(), Ang, GDB_RT.LOC) -- ruoto end end end end return hint_3 end -- Funzione di sistemazione parametri function fc_rectangle.AdjustParams( tMhPar) -- Assegno parametri da dati utensili in macchina local MB = require( 'MachiningBase') local EgtDoorsMsg = require( 'EgtDoorsMsg') local nTempT3 local dNumMessage local dNumLog = 0 local sMessToOut = '' local dMaxMat3 local sMchngName3 local sLGR local nLGRi = 1 -- setto le variabili dimensioni porta tMhPar.W = DGD.dW tMhPar.L = DGD.dH tMhPar.type = 2 -- 1: lines, 2: rectangle -- variabile supporto calcolo offset tMhPar.esfr = 0 -- nome geometria e diametri utensili delle associate lavorazioni if tMhPar.LGR then sLGR = tMhPar.LGR if DGD.MachEn > 0 and tMhPar.d3 then nTempT3, dMaxMat3, sMchngName3 = MB.GetToolDataFromAttrib( sLGR, nLGRi) end end -- se devo disegnare le geometrie di lavorazione if DGD.MachEn > 0 then -- gestisco il risultato della lettura utensili if DGD.bProoduce and tMhPar.d3 and nTempT3 <= 0 then dNumLog = -2795 sMessToOut = sMessToOut .. '\n'.. GetMachToolErrorMessage( nTempT3, sLGR, nLGRi, tMhPar.d3, dNumLog, sMchngName3) elseif nTempT3 then tMhPar.d3 = nTempT3 end end -- se il diametro non è stato definito (dal controllo lavorazione) if not tMhPar.d3 then tMhPar.d3 = 0 end -- assegnamento valore a variabili di appoggio if not tMhPar.ctr then -- se non devo considerare l'utensile tMhPar.esfr = 0 else -- considero l'utensile tMhPar.esfr = tMhPar.d3/2 end if not tMhPar.rf then tMhPar.rf = 0 else tMhPar.rf = abs(tMhPar.rf) end if tMhPar.rf > 0 then -- se c'è raccordo disattivo gli sbordi tMhPar.pre = nil end --------------------------------------- -- setto parametri da ddf --------------------------------------- -- profondità if DGD.DEPTH then if tMhPar.Dhr then tMhPar.Dhr = EgtIf( DGD.DEPTH >= DGD.dT, 0, DGD.DEPTH) end end if DGD.DFT and DGD.DFT > 0 then -- se ho distanza top tMhPar.tdr = DGD.DFT end if DGD.DFB and DGD.DFB > 0 then -- se ho distanza bottom tMhPar.bdr = DGD.DFB end if DGD.DFL and DGD.DFL > 0 then -- se ho distanza lock tMhPar.ldr = DGD.DFL end if DGD.DFH and DGD.DFH > 0 then -- se ho distanza hinge tMhPar.hdr = DGD.DFH end if not tMhPar.clr then -- se non è definita la lunghezza di arresto tMhPar.clr = -tMhPar.d3*0.75 else tMhPar.clr = abs(tMhPar.clr) end if not tMhPar.cir then -- se non è definita la lunghezza di arresto alle intersezioni tMhPar.cir = 0 else tMhPar.cir = abs(tMhPar.cir) end -- se devo disegnare le geometrie di lavorazione if DGD.MachEn > 0 then -- se la profondità delle linee verticali è maggiore della capacita utensile limito la profondità ed emetto un warning if tMhPar.Dhr and dMaxMat3 and tMhPar.Dhr > dMaxMat3 then dNumLog = -2794 dNumMessage = 549 sMessToOut = sMessToOut .. '\n'.. string.format(EgtDoorsMsg[dNumMessage], dNumLog, tMhPar.Nome, EgtToUiUnits(tMhPar.Dhr), EgtToUiUnits(dMaxMat3)) tMhPar.Dhr = dMaxMat3 - 0.02 -- tolgo 0.02 per permettere la lavorazione end end if dNumLog ~= 0 then return tMhPar, dNumLog, sMessToOut end return tMhPar, 0, '' end -- Funzione di disegno function fc_rectangle.Draw( tFDecorPar, bPreview, bRunByCompo, nDrawMach) -- Assegno le variabili per rettangolo local Dhr = tFDecorPar.Dhr local rty = tFDecorPar.rty local ofr = tFDecorPar.ofr local rer = tFDecorPar.rer local tdr = tFDecorPar.tdr local bdr = tFDecorPar.bdr local ldr = tFDecorPar.ldr local hdr = tFDecorPar.hdr local rw = tFDecorPar.rw local rl = tFDecorPar.rl local rf = tFDecorPar.rf local clr = tFDecorPar.clr local cir = tFDecorPar.cir local esfr = tFDecorPar.esfr local d3 = tFDecorPar.d3 -- Assegno variabili comuni local pre = tFDecorPar.pre local dtype = tFDecorPar.type local L = tFDecorPar.L local W = tFDecorPar.W -- Assegno i nomi geometrie local LGR = tFDecorPar.LGR local DM = 'DUMMY' -- variabili per messaggi e settaggi vari local sCompoName = tFDecorPar.Nome local nCompoNpar = tFDecorPar.Npar local sCompoPath = tFDecorPar.Path -- eventuale messaggio errore rilevato nell'adjust local nCodAdj = tFDecorPar.nCod local sCodAdj = tFDecorPar.sCod -- variabili per messaggi di errore local sNamePar1 = 'rl' local sNamePar2 = 'rw' local sNamePar5 = 'Dhr' local sNamePar6 = 'rf' local sNamePar9 = 'ldr' local sNamePar10 = 'tdr' local sNamePar11 = 'ofr' local sNamePar12 = 'hdr' local sNamePar13 = 'bdr' -- RunByComponentInterface local RC = true -- Messaggi codice errori local EM = ' ' local EC = 0 local ErrorBase = 2700 -- variabili che abilitano la creazione della geometria local bMakeFaceGeom3 = true if not bRunByCompo then -- controllo se lanciato da componente RC = false end -- 0 solo geom esterna, 1 solo geom mach, 2 entrambe if not nDrawMach then -- se non definita la setto per non creare geometria di lavorazione nDrawMach = 0 end local nForceMakeFace = nDrawMach if not Dhr or Dhr < GEO.EPS_SMALL or ( rty and rty == 1 and ( rl < GEO.EPS_SMALL or rw < GEO.EPS_SMALL)) then -- se rettangolo con spessore o dimensioni a 0 bMakeFaceGeom3 = false end -- if nForceMakeFace == 0 then -- se solo geometria disabilito il raggio fresa -- esfr = 0 -- end if ldr then ldr = abs(ldr) end if hdr then hdr = abs(hdr) end if tdr then tdr = abs(tdr) end if bdr then bdr = abs(bdr) end local EgtDoorsMsg = require( 'EgtDoorsMsg') if not bPreview and EC ~= 0 then return (ErrorBase+EC), EM end -- Se Preview cancello tutto if bPreview then EgtNewFile() EgtSetDefaultMaterial( BLACK()) end -- Pezzo e Layer local Pz if bPreview then Pz = EgtGroup(GDB_ID.ROOT,GDB_RT.LOC) -- nuovo pezzo else if not RC then Pz = EgtGetCurrPart() -- pezzo corrente end if not Pz then Pz = EgtGroup(GDB_ID.ROOT,GDB_RT.LOC) -- nuovo pezzo end end -- Layer local Dm local Lg local GId local hint local nRev local pIni, pEnd local dStartValX, dStopValX local dStartValY, dStopValY local dValXv1Ini, dValXv1End, dValYv1Ini, dValYv1End -- prima linea verticale local dValXv2Ini, dValXv2End, dValYv2Ini, dValYv2End -- seconda linea verticale local dValXh1Ini, dValXh1End, dValYh1Ini, dValYh1End -- prima linea orizzontale local dValXh2Ini, dValXh2End, dValYh2Ini, dValYh2End -- seconda linea orizzontale local dStart Lg = EgtGroup(Pz,GDB_RT.LOC) -- layer della figura principale EgtSetName(Lg,sCompoName) if nDrawMach > 0 then -- se abilitata geometria lavorazione Dm = EgtGroup( Pz, GDB_RT.LOC) -- layer disegni cerchi rappresentante il diametro utensile EgtSetName(Dm,DM) end if nForceMakeFace ~= 1 then -- se abilitata geometria esterna if bMakeFaceGeom3 then -- se posso fare rettangolo if not rty or rty == 0 then -- se rettangolo con offset -- messaggio di errore if 2*(abs(ofr)+esfr) >= W or 2*(abs(ofr)+esfr) >= L then -- se offset troppo grande EC = 26 EM = string.format( EgtDoorsMsg[649], sNamePar11, EgtToUiUnits(ofr), EgtToUiUnits(esfr), EgtToUiUnits(min(((W/2)-esfr),((L/2)-esfr))-0.01), sCompoPath) return (ErrorBase+EC), EM end -- al valore dell'offset viene aggiunta al raggio utensile -- il rettangolo può risultare quindi inferiore GId = EgtRectangle2P( Lg, Point3d( -(W/2)+(abs(ofr)+esfr), -(L/2)+(abs(ofr)+esfr), 0), Point3d( (W/2)-(abs(ofr)+esfr), (L/2)-(abs(ofr)+esfr), 0), GDB_RT.GLOB) if GId then -- cambio il punto di inizio in centro al lato inferiore EgtChangeClosedCurveStartPoint( GId, Point3d( 0, -(L/2)+(abs(ofr)+esfr), 0), GDB_RT.GLOB) EgtMove( GId, Point3d(W/2,L/2,0) - ORIG()) EgtModifyCurveThickness( GId, -Dhr) -- di default è sul lato keyway EgtSetName( GId, LGR) end else -- rettangolo con geometria if rty and rty == 2 then -- se rettangolo ricavato dalle distanze ricalcolo le dimensioni e il raccordo perché sono le distanze dai bordi a essere preservate rw = W - ldr - hdr - (esfr*4) rl = L - tdr - bdr - (esfr*4) -- forzo la geometria a un valore che poi viene calcolato comunque dalle distanze dai bordi. -- con valore 0 si ottiene la centratura del rettangolo risultante con la porta -- con valori 1, 2, 4 e 5 si rispettano le distanze dai bordi -- con valori 3 e 6 si ottiene la centratura in X del rettangolo risultante, le distanze top e bottom rispettano i relativi parametri. -- con valori 7 e 8 si ottiene la centratura in Y del rettangolo risultante, le distanze lock e hinge rispettano i relativi parametri. rer = 1 -- se le dimensioni risultano negative do errore if rw+(esfr*2) <= 0 then EC = 27 EM = string.format( EgtDoorsMsg[626], sNamePar9..'+'..sNamePar12, EgtToUiUnits(ldr+hdr), EgtToUiUnits(W-(esfr*2)-0.01), sCompoPath) return (ErrorBase+EC), EM elseif rl+(esfr*2) <= 0 then EC = 28 EM = string.format( EgtDoorsMsg[626], sNamePar10..'+'..sNamePar13, EgtToUiUnits(tdr+bdr), EgtToUiUnits(L-(esfr*2)-0.01), sCompoPath) return (ErrorBase+EC), EM end -- se ho il raccordo if rf then rf = rf - (esfr*2) end end -- se le dimensioni del raccordo sono eccessive le riconduco a valori accettabili if rl and rw and rf then if 2*rf > min(rl,rw) then rf = min(rl,rw)/2 end end if rf > 0 or not pre or pre == 0 then -- rettangolo con raccordo o non ho prelazione local dCompareRadius = rf if rty and rty == 2 then -- se rettangolo ricavato dalle distanze dCompareRadius = dCompareRadius + esfr end if dCompareRadius > 0 then -- rettangolo con raccordo -- alle dimensioni del rettangolo viene aggiunto il diametro utensile -- il rettangolo può risultare quindi maggiorato GId = DrawRectangleWithFillet ( Lg, rw+(2*esfr), rl+(2*esfr), 0, rf+esfr) else -- senza raccordo -- alle dimensioni del rettangolo viene aggiunto il diametro utensile -- il rettangolo puo' risultare quindi maggiorato GId = EgtRectangle2P( Lg, Point3d( -(rw/2)-esfr, -(rl/2)-esfr, 0), Point3d( (rw/2)+esfr, (rl/2)+esfr, 0), GDB_RT.GLOB) end if GId then -- cambio il punto di inizio in centro al lato inferiore EgtChangeClosedCurveStartPoint( GId, Point3d( 0, -(rl/2)-esfr, 0), GDB_RT.GLOB) if not rer or rer == 0 then -- se in centro EgtMove( GId, Point3d(W/2,L/2,0) - ORIG()) elseif rer == 1 then -- se riferito top-lock if rty and rty == 2 then -- se rettangolo ricavato dalle distanze EgtMove( GId, Point3d(((rw+(2*esfr))/2)+(ldr+esfr),L-((rl+(2*esfr))/2)-(tdr+esfr),0) - ORIG()) else EgtMove( GId, Point3d(((rw+(2*esfr))/2)+(ldr-esfr),L-((rl+(2*esfr))/2)-(tdr-esfr),0) - ORIG()) end elseif rer == 2 then -- se riferito top-hinge EgtMove( GId, Point3d(W-((rw+(2*esfr))/2)-(hdr-esfr),L-((rl+(2*esfr))/2)-(tdr-esfr),0) - ORIG()) elseif rer == 3 then -- se riferito top-center EgtMove( GId, Point3d(W/2,L-((rl+(2*esfr))/2)-(tdr-esfr),0) - ORIG()) elseif rer == 4 then -- se riferito bottom-lock EgtMove( GId, Point3d(((rw+(2*esfr))/2)+(ldr-esfr),((rl+(2*esfr))/2)+(bdr-esfr),0) - ORIG()) elseif rer == 5 then -- se riferito bottom-hinge EgtMove( GId, Point3d(W-((rw+(2*esfr))/2)-(hdr-esfr),((rl+(2*esfr))/2)+(bdr-esfr),0) - ORIG()) elseif rer == 6 then -- se riferito bottom-center EgtMove( GId, Point3d(W/2,((rl+(2*esfr))/2)+(bdr-esfr),0) - ORIG()) elseif rer == 7 then -- se riferito center-lock EgtMove( GId, Point3d(((rw+(2*esfr))/2)+(ldr-esfr),L/2,0) - ORIG()) elseif rer == 8 then -- se riferito center-hinge EgtMove( GId, Point3d(W-((rw+(2*esfr))/2)-(hdr-esfr),L/2,0) - ORIG()) end EgtModifyCurveThickness( GId, -Dhr) -- di default è sul lato keyway EgtSetName( GId, LGR) end else -- ho prelazione if pre == 1 then -- se prelazione su linee verticali -- prima linea verticale if not rer or rer == 0 or rer == 3 or rer == 6 then -- se in centro in X dValXv1Ini = (W-rw)/2 - esfr elseif rer == 1 or rer == 4 or rer == 7 then -- se riferito a lock if rty and rty == 2 then -- se rettangolo ricavato dalle distanze dValXv1Ini = ldr + esfr else dValXv1Ini = ldr - esfr end else -- tutti gli altri casi (riferito a hinge) dValXv1Ini = W - hdr + esfr end dValXv1End = dValXv1Ini dValYv1Ini = L - clr -- posizione in alto dValYv1End = clr -- disegno linea pIni = Point3d( dValXv1Ini, dValYv1Ini, 0) pEnd = Point3d( dValXv1End, dValYv1End, 0) hint = DrawAddLineDrawCircle( pIni, pEnd, Lg, nil, bPreview, Dm, (d3/2), true, true, RED(), RED()) if hint then EgtModifyCurveThickness( hint, -Dhr) -- di default è sul lato keyway EgtSetName( hint, LGR) end -- seconda linea verticale if rer and ( rer == 2 or rer == 5 or rer == 8) then -- se riferito a hinge dValXv2Ini = dValXv1Ini - rw - 2*esfr else -- tutti gli altri casi (riferito a lock) dValXv2Ini = dValXv1Ini + rw + 2*esfr end dValXv2End = dValXv2Ini dValYv2Ini = L - clr -- posizione in alto dValYv2End = clr -- disegno linea pIni = Point3d( dValXv2Ini, dValYv2Ini, 0) pEnd = Point3d( dValXv2End, dValYv2End, 0) hint = DrawAddLineDrawCircle( pIni, pEnd, Lg, nil, bPreview, Dm, (d3/2), true, true, RED(), RED()) if hint then EgtModifyCurveThickness( hint, -Dhr) -- di default è sul lato keyway EgtSetName( hint, LGR) end -- prima linea orizzontale if not rer or rer == 0 or rer == 7 or rer == 8 then -- se in centro dValYh1Ini = (L+rl)/2 + esfr elseif rer >= 1 and rer <= 3 then -- se riferito top if rty and rty == 2 then -- se rettangolo ricavato dalle distanze dValYh1Ini = L - tdr - esfr else dValYh1Ini = L - tdr + esfr end else -- tutti gli altri casi (bottom) dValYh1Ini = bdr - esfr end dValYh1End = dValYh1Ini if rer and ( rer == 2 or rer == 5 or rer == 8) then -- se riferito a hinge dValXh1Ini = dValXv1Ini - cir dValXh1End = dValXv2Ini + cir else -- negli altri casi (riferito a lock) dValXh1Ini = dValXv1Ini + cir dValXh1End = dValXv2Ini - cir end -- disegno linea pIni = Point3d( dValXh1Ini, dValYh1Ini, 0) pEnd = Point3d( dValXh1End, dValYh1End, 0) hint = DrawAddLineDrawCircle( pIni, pEnd, Lg, nil, bPreview, Dm, (d3/2), true, true, RED(), RED()) if hint then EgtModifyCurveThickness( hint, -Dhr) -- di default è sul lato keyway EgtSetName( hint, LGR) end -- seconda linea orizzontale if rer and ( rer >= 4 and rer <= 6) then -- se riferito a bottom dValYh2Ini = dValYh1Ini + rl + 2*esfr else -- in tutti gli altri casi (top) dValYh2Ini = dValYh1Ini - rl - 2*esfr end dValYh2End = dValYh2Ini if rer and ( rer == 2 or rer == 5 or rer == 8) then dValXh2Ini = dValXv1Ini - cir dValXh2End = dValXv2Ini + cir else -- negli altri casi dValXh2Ini = dValXv1Ini + cir dValXh2End = dValXv2Ini - cir end -- disegno linea pIni = Point3d( dValXh2Ini, dValYh2Ini, 0) pEnd = Point3d( dValXh2End, dValYh2End, 0) hint = DrawAddLineDrawCircle( pIni, pEnd, Lg, nil, bPreview, Dm, (d3/2), true, true, RED(), RED()) if hint then EgtModifyCurveThickness( hint, -Dhr) -- di default è sul lato keyway EgtSetName( hint, LGR) end else -- ho prelazione su linee orizzontali -- prima linea orizzontale if not rer or rer == 0 or rer == 7 or rer == 8 then -- se in centro dValYh1Ini = (L+rl)/2 + esfr elseif rer >= 1 and rer <= 3 then -- se riferito top if rty and rty == 2 then -- se rettangolo ricavato dalle distanze dValYh1Ini = L - tdr - esfr else dValYh1Ini = L - tdr + esfr end else -- tutti gli altri casi (bottom) dValYh1Ini = bdr - esfr end dValYh1End = dValYh1Ini dValXh1Ini = clr -- posizione a sinistra dValXh1End = W - clr -- disegno linea pIni = Point3d( dValXh1Ini, dValYh1Ini, 0) pEnd = Point3d( dValXh1End, dValYh1End, 0) hint = DrawAddLineDrawCircle( pIni, pEnd, Lg, nil, bPreview, Dm, (d3/2), true, true, RED(), RED()) if hint then EgtModifyCurveThickness( hint, -Dhr) -- di default è sul lato keyway EgtSetName( hint, LGR) end -- seconda linea orizzontale if rer and ( rer >= 4 and rer <= 6) then -- se riferito a bottom dValYh2Ini = dValYh1Ini + rl + 2*esfr else -- in tutti gli altri casi dValYh2Ini = dValYh1Ini - rl - 2*esfr end dValYh2End = dValYh2Ini dValXh2Ini = clr -- posizione a sinistra dValXh2End = W - clr -- disegno linea pIni = Point3d( dValXh2Ini, dValYh2Ini, 0) pEnd = Point3d( dValXh2End, dValYh2End, 0) hint = DrawAddLineDrawCircle( pIni, pEnd, Lg, nil, bPreview, Dm, (d3/2), true, true, RED(), RED()) if hint then EgtModifyCurveThickness( hint, -Dhr) -- di default è sul lato keyway EgtSetName( hint, LGR) end -- prima linea verticale if not rer or rer == 0 or rer == 3 or rer == 6 then -- se in centro dValXv1Ini = (W-rw)/2 - esfr elseif rer == 1 or rer == 4 or rer == 7 then -- se riferito a lock if rty and rty == 2 then -- se rettangolo ricavato dalle distanze dValXv1Ini = ldr + esfr else dValXv1Ini = ldr - esfr end else -- tutti gli altri casi (riferito a hinge) dValXv1Ini = W - hdr + esfr end dValXv1End = dValXv1Ini if rer and ( rer >= 4 and rer <= 6) then -- se riferito a bottom dValYv1Ini = dValYh1Ini + cir dValYv1End = dValYh2Ini - cir else -- tutti gli altri casi (top) dValYv1Ini = dValYh1Ini - cir dValYv1End = dValYh2Ini + cir end -- disegno linea pIni = Point3d( dValXv1Ini, dValYv1Ini, 0) pEnd = Point3d( dValXv1End, dValYv1End, 0) hint = DrawAddLineDrawCircle( pIni, pEnd, Lg, nil, bPreview, Dm, (d3/2), true, true, RED(), RED()) if hint then EgtModifyCurveThickness( hint, -Dhr) -- di default è sul lato keyway EgtSetName( hint, LGR) end -- seconda linea verticale if rer and ( rer == 2 or rer == 5 or rer == 8) then -- se in centro dValXv2Ini = dValXv1Ini - rw - 2*esfr else -- tutti gli altri casi dValXv2Ini = dValXv1Ini + rw + 2*esfr end dValXv2End = dValXv2Ini if rer and ( rer >= 4 and rer <= 6) then -- se riferito a bottom dValYv2Ini = dValYh1Ini + cir dValYv2End = dValYh2Ini - cir else -- tutti gli altri casi (top) dValYv2Ini = dValYh1Ini - cir dValYv2End = dValYh2Ini + cir end -- disegno linea pIni = Point3d( dValXv2Ini, dValYv2Ini, 0) pEnd = Point3d( dValXv2End, dValYv2End, 0) hint = DrawAddLineDrawCircle( pIni, pEnd, Lg, nil, bPreview, Dm, (d3/2), true, true, RED(), RED()) if hint then EgtModifyCurveThickness( hint, -Dhr) -- di default è sul lato keyway EgtSetName( hint, LGR) end end end -- messaggi di errore (dopo aver fatto il disegno) if rty and rty == 1 then -- se rettangolo con dimensioni definite if not rer or rer == 0 then -- se in centro if rw + (2*esfr) >= W then -- se larghezza rettangolo è più grande della larghezza porta EC = 29 EM = string.format( EgtDoorsMsg[626], sNamePar2, EgtToUiUnits(rw), EgtToUiUnits(W-(2*esfr)-0.001), sCompoPath) return (ErrorBase+EC), EM elseif rl + (2*esfr) >= L then -- se altezza rettangolo è più grande dell'altezza porta EC = 30 EM = string.format( EgtDoorsMsg[626], sNamePar1, EgtToUiUnits(rl), EgtToUiUnits(L-(2*esfr)-0.001), sCompoPath) return (ErrorBase+EC), EM end else if rw + (2*esfr) >= W then -- se larghezza rettangolo è più grande della larghezza porta EC = 31 EM = string.format( EgtDoorsMsg[626], sNamePar2, EgtToUiUnits(rw), EgtToUiUnits(W-(2*esfr)-0.001), sCompoPath) return (ErrorBase+EC), EM elseif rl + (2*esfr) >= L then -- se altezza rettangolo è più grande dell'altezza porta EC = 32 EM = string.format( EgtDoorsMsg[626], sNamePar1, EgtToUiUnits(rl), EgtToUiUnits(L-(2*esfr)-0.001), sCompoPath) return (ErrorBase+EC), EM elseif rer and ( rer == 2 or rer == 5 or rer == 8) and ( hdr+esfr+rw >= W) then -- se riferito a hinge e sborda in X EC = 33 EM = string.format( EgtDoorsMsg[650], sNamePar12, EgtToUiUnits(hdr), sNamePar2, EgtToUiUnits(rw), EgtToUiUnits(esfr), sCompoPath) return (ErrorBase+EC), EM elseif rer and ( rer == 2 or rer == 5 or rer == 8) and ( hdr-esfr <= 0) then -- se riferito a hinge e sborda in X EC = 34 EM = string.format( EgtDoorsMsg[665], sNamePar12, EgtToUiUnits(hdr), EgtToUiUnits(esfr), sCompoPath) return (ErrorBase+EC), EM elseif rer and (rer == 1 or rer == 4 or rer == 7) and (ldr+esfr+rw >= W) then -- se riferito a lock e sborda in X EC = 35 EM = string.format( EgtDoorsMsg[650], sNamePar9, EgtToUiUnits(ldr), sNamePar2, EgtToUiUnits(rw), EgtToUiUnits(esfr), sCompoPath) return (ErrorBase+EC), EM elseif rer and (rer == 1 or rer == 4 or rer == 7) and (ldr-esfr <= 0) then -- se riferito a lock e sborda in X EC = 36 EM = string.format( EgtDoorsMsg[665], sNamePar9, EgtToUiUnits(ldr), EgtToUiUnits(esfr), sCompoPath) return (ErrorBase+EC), EM elseif rer and ( rer >= 4 and rer <= 6) and (bdr+esfr+rl >= L) then -- se riferito a bottom e sborda in Y EC = 37 EM = string.format( EgtDoorsMsg[651], sNamePar13, EgtToUiUnits(bdr), sNamePar1, EgtToUiUnits(rl), EgtToUiUnits(esfr*2), sCompoPath) return (ErrorBase+EC), EM elseif rer and ( rer >= 4 and rer <= 6) and (bdr-esfr <= 0) then -- se riferito a bottom e sborda in Y EC = 38 EM = string.format( EgtDoorsMsg[666], sNamePar13, EgtToUiUnits(bdr), EgtToUiUnits(esfr), sCompoPath) return (ErrorBase+EC), EM elseif rer and ( rer >= 1 and rer <= 3) and (tdr+esfr+rl >= L) then -- se riferito a top e rettangolo sborda in Y EC = 39 EM = string.format( EgtDoorsMsg[651], sNamePar10, EgtToUiUnits(tdr), sNamePar1, EgtToUiUnits(rl), EgtToUiUnits(esfr*2), sCompoPath) return (ErrorBase+EC), EM elseif rer and ( rer >= 1 and rer <= 3) and (tdr-esfr <= 0) then -- se riferito a top e rettangolo sborda in Y EC = 40 EM = string.format( EgtDoorsMsg[666], sNamePar10, EgtToUiUnits(tdr), EgtToUiUnits(esfr), sCompoPath) return (ErrorBase+EC), EM end end end end end end -- cambio colore alla geometria if bPreview then if EC == 0 then EgtSetColor( Lg or GDB_ID.NULL, AQUA()) else EgtSetColor( Lg or GDB_ID.NULL, ORANGE()) end end -- Se non Preview -- (NOTA : se ci sono errori il componente non viene eseguito dal programma di gestione dei componenti) if not bPreview then if bRunByCompo then -- scrivo i parametri nelle info del pezzo WriteCompoDataToPart(Pz,sCompoName,nCompoNpar) end -- scrivo note nel layer della cerniera EgtSetInfo(Lg,'Type' ,'fc_rectangle') EgtSetInfo(Lg,'L' ,L) EgtSetInfo(Lg,'W' ,W) EgtSetInfo(Lg,'Dhr' ,Dhr) EgtSetInfo(Lg,'rty' ,rty) EgtSetInfo(Lg,'ofr' ,ofr) EgtSetInfo(Lg,'rer' ,rer) EgtSetInfo(Lg,'tdr' ,tdr) EgtSetInfo(Lg,'bdr' ,bdr) EgtSetInfo(Lg,'ldr' ,ldr) EgtSetInfo(Lg,'hdr' ,hdr) EgtSetInfo(Lg,'rw' ,rw) EgtSetInfo(Lg,'rl' ,rl) EgtSetInfo(Lg,'rf' ,rf) EgtSetInfo(Lg,'clr' ,clr) EgtSetInfo(Lg,'cir' ,cir) EgtSetInfo(Lg,'esfr' ,esfr) EgtSetInfo(Lg,'pre' ,pre) EgtSetInfo(Lg,'dtype' ,dtype) EgtSetInfo(Lg,'LGR' ,LGR) EgtSetInfo(Lg,'Path' ,sCompoPath) -- cancello le parti ausiliarie se disegnate if Dm then EgtErase(Dm) end end if EC == 0 and nCodAdj and nCodAdj < 0 then EC = nCodAdj EM = sCodAdj end return EC, EM, Lg end return fc_rectangle