Files
frontalini/Frontalini_ecc/CompoAF/IntRectangle.lua
T
2021-07-21 11:17:28 +02:00

281 lines
8.3 KiB
Lua

-- 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