-- 2021/05/__ -- Rettangolo esterno -- inoltre le coordinate del centro rispetto all'origine del host -- Intestazioni require( 'EgtBase') _ENV = EgtProtectGlobal() EgtEnableDebug( false) EgtAddToPackagePath(EgtGetSourceDir() .. 'LuaLibs\\?.lua') require( 'EgtCompo') -- Valori limite local LgMin = 10 local RMin = 5 -- Parametri : dichiarazione e valori standard --.T (tipo) : 0=null, 1=bool, 2=int, 3=len, 4=num, 5=string local CMP = {} CMP.N1 = 'X' CMP.T1 = 3 -- 0=null, 1=bool, 2=int, 3=len, 4=num, 5=string CMP.V1 = 50 CMP.N2 = 'Y' CMP.T2 = 3 CMP.V2 = 50 CMP.N3 = 'L' CMP.T3 = 3 CMP.V3 = 300. CMP.N4 = 'H' CMP.T4 = 3 CMP.V4 = 200. CMP.N5 = 'Ang' -- rotazione rispetto ad asse x CMP.T5 = 4 CMP.V5 = 0 CMP.Npar = 5 CMP.Nome = 'IntRectangle' CMP.Ind = 0 CMP.Int = 1 _G.CMP = CMP -- Aggiorno con ultimi valori salvati (se presenti) CMP.DATA = EgtGetSourceDir() .. CMP.Nome ..'.dat' LoadCompoData() -- Funzione di disegno local function CMP_Draw(bPreview) -- Carico i messaggi local Msg = require('EgtCompoMsg') -- Assegno le dimensioni local X = CMP.V1 local Y = CMP.V2 local L = CMP.V3 local H = CMP.V4 local Ang = CMP.V5 CMP.ERR = 0 CMP.MSG = '' -- Verifica della dimensioni if L < LgMin then L = LgMin CMP.ERR = 1 CMP.MSG = Msg[2]..GetLenLimit(LgMin) -- La lunghezza dei lati deve essere maggiore o uguale a elseif H < LgMin then H = LgMin CMP.ERR = 2 CMP.MSG = Msg[2]..GetLenLimit(LgMin) -- La lunghezza dei lati deve essere maggiore o uguale a end -- Pezzo e Layer già definiti local Pz = EgtGetFirstGroupInGroup( GDB_ID.ROOT) if not Pz then CMP.ERR = 5 CMP.MSG = "Pezzo non trovato" return end local La = EgtGetFirstNameInGroup( Pz, "LayAux") local Lo = EgtGetFirstNameInGroup( Pz, "Region") local Lw = EgtGetFirstNameInGroup( Pz, "OutLoop") local Le = EgtGetFirstNameInGroup( Pz, "Etichette") local Lq = EgtGetFirstNameInGroup( Pz, "Quotature") local Ls = EgtGetFirstNameInGroup( Pz, "SelectRegion") if not Ls then Ls = EgtGroup( Pz, GDB_RT.LOC) EgtSetName( Ls, "SelectRegion") end if not La or not Lo or not Lw or not Le or not Lq then CMP.ERR = 6 CMP.MSG = "Layer non trovato" return end local Lr = EgtGetFirstNameInGroup( Pz, "ErrorLay") if Lr then EgtEmptyGroup(Lr) else Lr = EgtGroup( Pz, GDB_RT.LOC) EgtSetName( Lr, "ErrorLay") end EgtSetStatus( La, GDB_ST.OFF) EgtSetStatus( Le, GDB_ST.OFF) EgtSetStatus( Lq, GDB_ST.OFF) local Li = nil -- ciascun gruppo contenente il contorno di un vuoto local Ll = nil -- ciascun gruppo contenente le etichette e quotature di un vuoto local sInd = nil -- Se indice < 1 sto aggiungendo un foro e quindi cerco un nuovo indice valido if CMP.Ind < 1 then -- cerco primo indice libero per componente interno local nInd = 0 local v0 = EgtGetFirstInGroup(Ls) while v0 do sInd = EgtGetInfo(v0,"ID") local nTmp = tonumber(sInd) if nTmp > nInd then nInd = nTmp end v0 = EgtGetNext( v0) end CMP.Ind = nInd + 1 sInd = tostring(CMP.Ind) -- inserisco gruppo per nuovo componente interno Li = EgtGroup( Pz, GDB_RT.GLOB) EgtSetName( Li, 'InLoop') EgtSetInfo( Li, "ID", sInd) Ll = EgtGroup( Pz, GDB_RT.GLOB) EgtSetName( Ll, 'HoleLabels') EgtSetInfo( Ll, "ID", sInd) else -- Ho selezionato un foro già inserito, per modificarlo -- Cerco gruppo del contorno del vuoto selezionato Li = EgtGetFirstInGroup(Pz) while Li do if EgtGetName(Li) == "InLoop" and EgtGetInfo(Li,"ID") == tostring(CMP.Ind) then -- Cancello eventuale vecchio buco e relative etichette EgtEmptyGroup(Li) break end Li=EgtGetNext(Li) end -- Cerco gruppo delle etichette del vuoto selezionato Ll = EgtGetFirstInGroup(Pz) while Ll do if EgtGetName(Ll) == "HoleLabels" and EgtGetInfo(Ll,"ID") == tostring(CMP.Ind) then -- Cancello vecchie etichette EgtEmptyGroup(Ll) break end Ll=EgtGetNext(Ll) end sInd = tostring( CMP.Ind) -- Cancello vecchia regione per selezione local v0 = EgtGetFirstNameInGroup( Ls, sInd) if v0 then EgtErase( v0) end end -- Modifiche per eventuali simmetria o ribaltamento local Xc = X local Yc = Y if EgtGetInfo(La,"SIMM") then Xc = - X end if EgtGetInfo(La,"RIB") then Yc = - Y end --Costruzione della figura (mediante composizione di segmenti e archi) local ptXY0 = Point3d( Xc, Yc, 0) -- Coordinate del centro della figura ( = PUNTO DI INSERIMENTO ) local pt0 = ptXY0 + Vector3d( L/2, -H/2, 0) local l1 = EgtLinePDL( Li, pt0, 180, L) local l2 = EgtLinePDL( Li, EgtEP(l1), 90, H) local l3 = EgtLinePDL( Li, EgtEP(l2), 0, L) local l4 = EgtLine( Li, EgtEP(l3), EgtSP(l1)) EgtReorderCurvesInGroup( Li, ORIG()) local c1 = {l1,l2,l3,l4} local e1 = EgtCurveCompo( Li, c1, false) EgtSetName(e1,sInd) EgtSetInfo(e1,"ID", sInd) -- Cancello regione del foro selezionato (se preesistente) local v0 = EgtGetFirstNameInGroup(Ls,sInd) if v0 then EgtErase(v0) end -- Ricalcolo superficie del piano senza vecchio buco per poi poter verificare posizione di quello nuovo CreateTopSurf(Lw,Lo,La,Ls) -- Creo regione di selezione del nuovo buco EgtInvertCurve(e1) v0 = EgtSurfFlatRegion(Ls,e1) EgtSetName(v0,sInd) EgtErase(e1) if CMP.ERR == 0 then EgtSetColor(v0,Color3d(0,255,0,25)) else EgtSetColor(v0,ORANGE()) end EgtSetStatus(v0,GDB_ST.SEL) EgtSetInfo(v0,"ID", sInd) --Dimensioni dell'oggetto local bbox = EgtGetBBoxGlob(Li,GDB_BB.STANDARD) local dim = bbox:getRadius() * 0.1 -- Etichette nella figura -- Lati local stdoffset = 1 local LblL1 = AddLabel(Ll,l1,stdoffset,CMP.N3,dim,-90,RED()) -- EgtSetInfo(LblL1,"Var",1) local LblL4 = AddLabel(Ll,l4,stdoffset,CMP.N4,dim,-90,RED()) --EgtSetInfo(LblL2,"Var",2) -- Etichetta del centro della figura ( = PUNTO DI INSERIMENTO ) local ln01 = EgtLinePDL(Ll,ptXY0-Vector3d(dim*.25,0,0),0,dim*.5) local ln02 = EgtLinePDL(Ll,ptXY0-Vector3d(0,dim*.25,0),90,dim*.5) local ln1 = EgtLinePDL(Ll,ptXY0,45,dim) pt1 = EgtEP(ln1) local ln2 = EgtLinePDL(Ll,pt1,0,dim) local lblXY = AddLabel(Ll,ln2,stdoffset,"("..CMP.N1..";"..CMP.N2..")",dim,90,RED()) EgtErase(ln2) -- Rotazione EgtDeselectAll() EgtSelectLayerObjs(Li) EgtRotate(GDB_ID.SEL,ptXY0,Z_AX(),Ang,GDB_RT.GLOB) EgtDeselectAll() EgtSelectLayerObjs(Ll) EgtRotate(GDB_ID.SEL,ptXY0,Z_AX(),Ang,GDB_RT.GLOB) EgtDeselectAll() EgtRotate(v0,ptXY0,Z_AX(),Ang,GDB_RT.GLOB) EgtSetStatus(v0,GDB_ST.SEL) -- Verifica delle interferenza con altri fori o con l'host -- copio la regione creata, per fare la verifica (in quanto l'originale viene sostituito -- dal risultato della sottrazione) local TempCopy = EgtCopyGlob(v0,La) -- recupero superficie pezzo local Region = EgtGetFirstInGroup(Lo) while Region do if EgtGetType(Region) == GDB_TY.SRF_FRGN then break end Region=EgtGetNext(Region) end if not Region then return end EgtSurfFrSubtract(TempCopy, Region) -- SE C'E' INTERFERENZA DEL FORO IN COSTRUZIONE CON ALTRI CONTORNI if EgtExistsObj( TempCopy) then local e1 = EgtCurveCompo(Lr,{l1,l2,l3,l4},false) EgtSetColor(e1,RED()) EgtCopyGlob(Ll,Lr,GDB_IN.LAST_SON) RemoveHole( CMP.Ind) -- cancello il foro che stavo costruendo CMP.Ind = 0 CMP.ERR = 7 CMP.MSG = Msg[300] -- Il componente esce dai contorni del piano .. return end -- SE NON C'E' INTERFERENZA DEL FORO IN COSTRUZIONE CON ALTRI CONTORNI -- Ricalcolo della regione CreateTopSurf( Lw, Lo, La, Ls) -- Salvo i dati if CMP.ERR == 0 then -- scrivo i parametri nella label del layer ausiliario WriteCompoDataToPart(v0,CMP.Nome,CMP.Npar) -- salvo i parametri come nuovo default SaveCompoData(CMP.Npar) end return end _G.CMP_Draw = CMP_Draw