Files
frontalini/Frontalini_ecc/CompoAF/Alz&Front.lua
T
2021-07-21 20:21:57 +02:00

240 lines
8.8 KiB
Lua

-- 2021/06/__
-- (exRettangolo interno dati base e altezza)
-- 21/06/2021 Nicola Pievani: creazione del file Alz&Front
-- 05/07/2021 Nicola Pievani: Inserisco commenti
-- 08/07/2021 CB: inizio disegno dei 'rettangoli esterni'
-- 00b 10/07/2020 CB: costruzione della tabella "MyTab"
-- 00c 13/07/2021 CB: introduzone record "SideREc" e tabella "SideTab"
-- 00d 15/07/2021 CB: introduzione funzione per disegno rettangoli
-- 00e 16/07/2021
-- 00f 20/07/2021
-- 21/07/2021 - aggiornato progetto in GIT
-- Intestazioni
require( 'EgtBase')
_ENV = EgtProtectGlobal()
EgtEnableDebug( true)
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 = {}
-- elenco dei parametri visualizzati nell'interfaccia del programma OMAG-Cut
CMP.A_Height=30
CMP.F_Height=30
CMP.A_DeltaAng=0
CMP.F_DeltaAng=0
-- parametri passati da OmagCut
CMP.BBoxRad = 1000
CMP.HeightText = 100
--
_G.CMP = CMP
-- Funzione di disegno
local function CMP_Draw(bPreview)
-- Carico i messaggi
local Msg = require('EgtCompoMsg')
-- Assegno l'angolo di incremento per i tagli inclinati
local F_Delta = CMP.F_DeltaAng
local A_Delta = CMP.A_DeltaAng
-- Assegno l'altezza
local FH = CMP.F_Height
local AH = CMP.A_Height
-- Assegno la dimensione di riferimento (=1/10 del 'raggio' della figura)
local dDim = CMP.BBoxRad*0.1
--
CMP.ERR = 0
CMP.MSG = ''
-- 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")
--local PzAF = EgtGroup(GDB_ID.ROOT,GDB_RT.LOC) -- ??? nuova part: alzatine e frontalini ???????
--local LyA = EgtGroup(PzAF,GDB_RT.LOC) -- layer alzatine
--EgtSetName(LyA,'Alzatine')
--local LyF = EgtGroup(PzAF,GDB_RT.LOC) -- layer frontalini
--EgtSetName(LyF,'Frontalini')
--local LyAe = EgtGroup(PzAF,GDB_RT.LOC) -- layer etichette alzatine
--EgtSetName(LyAe,'Etich_Alzatine')
--local LyFe = EgtGroup(PzAF,GDB_RT.LOC) -- layer etichette frontalini
--EgtSetName(LyFe,'Etich_Frontalini')
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
-- spengo i layer Aux e Quotature
EgtSetStatus( La, GDB_ST.OFF)
EgtSetStatus( Lq, GDB_ST.OFF)
local sInd = nil
--[[ faccio scorrere tutti gli elementi del layer OutLoop e di ognuno leggo se contiente nelle info "AF=.."
"AF=0" ( o nil) al lato non deve essere associatu nulla
"AF=1" al lato deve essere associto un'alzatina
"AF=2" al lato deve essere associato un frontalino
nel ciclo while che segue carico una tabella che contine tutti i lati e i riferimenti ai lati successivi,
oltre a informazioni sulle direzioni iniziali/finali dei lati cghe seguono/precedono.
(In questa fase possono essere aggiunte altre informazioni...)
La variabile sMsg è usta dal programma per verificare che i lati letti dalla tabella siano gli stessi
passati dal programma
]]
local sMsg = " "
local SideNum =1
--local SideTab = {}
SideTab = {}
local CurrSide = EgtGetFirstInGroup( Lw)
local PrecSide = nil
while CurrSide ~= nil do
local SideRec = {}
local Info = EgtGetInfo( CurrSide, "AF", 'i')
if SideNum == 1 then
-- |a = SideId, b = SideInfo-A/F, c= PrecSideInfo, d = ProxSideInfo,|
-- |e = SideStartVector, f = SideEndVector|
-- |g = PrecSideEndvector, h = ProxSideStartVector|
SideRec = {a = CurrSide, b = Info, c = 0, d = 0,
e = EgtSV(CurrSide), f = nil, g = nil
}
else
SideRec = {a=CurrSide, b=Info, c = SideTab[SideNum-1].b, d = 0,
e = EgtSV(CurrSide), f = EgtEV(CurrSide),
g = SideTab[SideNum-1].f, h = nil
}
SideTab[SideNum-1].d = SideRec.b ; SideTab[SideNum-1].h = SideRec.e
end
--
if Info == 1 then
sMsg = sMsg ..EgtGetName(CurrSide).."=Alzatina "
EgtSetColor(CurrSide, 'RED')
elseif Info == 2 then
sMsg = sMsg ..EgtGetName(CurrSide).."=Frontalino "
EgtSetColor(CurrSide, 'GREEN')
else
EgtSetColor(CurrSide, 'BLACK')
end
table.insert(SideTab, SideRec)
--[[ da eliminare
-- creo un rettangolo parallelo al lato corrente
sMsg = sMsg ..EgtGetName(CurrSide).."=Frontalino "
EgtSetColor(CurrSide, 'GREEN')
table.insert( MyTab, {CurrId=CurrSide, AF=Info, PrecId=PrecSide}
else
EgtSetColor(CurrSide, 'BLACK')
table.insert( MyTab, {CurrId=CurrSide, AF=0, PrecId=PrecSide}
end
end ]]
-- passo al lato successivo
PrecSide = CurrSide
CurrSide = EgtGetNext( CurrSide)
SideNum = SideNum + 1
end
-- completo la tabella con i riferimenti tra primo e ultimo lato e viceversa)
-- |a = SideId, b = SideInfo-A/F, c= PrecSideInfo, d = ProxSideInfo,|
-- |e = SideStartVector, f = SideEndVector|
-- |g = PrecSideEndvector, h = ProxSideStartVector|
if #SideTab > 1 then
SideTab[1].c = SideTab[#SideTab].b
SideTab[1].g = SideTab[#SideTab].f
SideTab[#SideTab].d = SideTab[1].b
SideTab[#SideTab].h = SideTab[1].e
end
-- restituisco un messaggio al programma OMAG-Cut
CMP.MSG = sMsg
-- costruisco le figure (rettangoli) rappresentative di alzatine e frontalini
for SideNum = 1 , #SideTab do
if (SideTab[SideNum].b ~= 0 and SideTab[SideNum].b ~= nil) then
local Side = SideTab[SideNum].a
local SVect = SideTab[SideNum].e
local EVect = SideTab[SideNum].f
local Pz; local Ly; local BaseL; local HeightL
local sName
-- caso di alzatina
if SideTab[SideNum].b == 1 then
-- ++++++++++++++++++++++++++++ QUI ++++++++++++++
Pz = EgtGroup(GDB_ID.ROOT,GDB_RT.LOC) -- nuova parte per alzatina o frontalino
EgtSetName( Pz,"Alz_Lato"..SideNum)
Lay = EgtGroup(Pz,GDB_RT.LOC) -- layer della figura
EgtSetName(Lay,'OutLoop')
BaseL = EgtCurveLength( Side)
sName = "A"
HeightL = AH --(=CMP.A_Heigth)
elseif SideTab[SideNum].b == 2 then
Pz = EgtGroup(GDB_ID.ROOT,GDB_RT.LOC) -- nuova parte per alzatina o frontalino
EgtSetName( Pz,"Front_Lato"..SideNum)
Lay = EgtGroup(Pz,GDB_RT.LOC) -- layer della figura
EgtSetName(Lay,'OutLoop')
BaseL = EgtCurveLength( Side)
HeightL = FH --(=CMP.F_Heigth)
sName = "F"
end
-- ++++++++++++++++++++++++++++ QUI ++++++++++++++
Pt = EgtSP( Side) + VRotated( SVect*dDim, -90)
--
--
--
-- chiamo la funzione per il disegno del rettangolo (Lay, Pt, Base, Altezza, Vettore direz. iniziale, prefisso per nome lati)
DrawRect (Lay, Pt, BaseL, HeightL, SVect, sName)
end
end -- for
--[==[
-- 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)
]==]
return
end
_G.CMP_Draw = CMP_Draw
--CMP_Draw(true)
--EgtZoom(SCE_ZM.ALL)