316 lines
10 KiB
Lua
316 lines
10 KiB
Lua
-- 2015/10/__
|
|
-- PIANO CUCINA CON LAVORAZIONE A L CON ANGOLO ANCHE NON RETTO
|
|
|
|
-- Intestazioni
|
|
require('EgtBase')
|
|
_ENV = EgtProtectGlobal()
|
|
EgtEnableDebug( false)
|
|
|
|
EgtAddToPackagePath(EgtGetSourceDir() .. 'LuaLibs\\?.lua')
|
|
require( 'EgtCompo')
|
|
|
|
local Nome = 'PCucinaC1'
|
|
|
|
-- Valori limite
|
|
local LgMin = 10 -- lati
|
|
local AlfaMin = 60
|
|
local AlfaMax = 150
|
|
|
|
-- Parametri : dichiarazione e valori standard
|
|
--.T (tipo) : 0=null, 1=bool, 2=int, 3=len, 4=num, 5=string
|
|
local CMP = {}
|
|
CMP.N1 = 'A' -- lato lungo muro 'obliquo'
|
|
CMP.T1 = 3
|
|
CMP.V1 = 1800
|
|
CMP.N2 = 'B' -- lato lungo muro 'orizzontale'
|
|
CMP.T2 = 3
|
|
CMP.V2 = 2000
|
|
CMP.N3 = 'C' -- profondità lato 'obliquo'
|
|
CMP.T3 = 3
|
|
CMP.V3 = 600
|
|
CMP.N4 = 'D' -- profondità lato 'orizzontale'
|
|
CMP.T4 = 3
|
|
CMP.V4 = 500
|
|
CMP.N5 = 'a' -- angolo Alfa tra i muri (compreso tra AlfaMin e AlfaMax)
|
|
CMP.T5 = 4
|
|
CMP.V5 = 110
|
|
|
|
CMP.N6 = '←→' -- Simmetria dx/sx (true = svuotamento a dx)
|
|
CMP.T6 = 1
|
|
CMP.V6 = false
|
|
CMP.N7 = '↑↓' -- Simmetria su/giù ('ribaltamento') (true = 'L' capovolta)
|
|
CMP.T7 = 1
|
|
CMP.V7 = false
|
|
CMP.Npar = 7
|
|
CMP.Nome = Nome
|
|
CMP.WithInt = true
|
|
|
|
_G.CMP = CMP
|
|
-- Aggiorno con ultimi valori salvati (se presenti)
|
|
CMP.DATA = EgtGetSourceDir() .. CMP.Nome ..'.dat'
|
|
LoadCompoData()
|
|
|
|
function CMP_Draw(bPreview)
|
|
-- Carico i messaggi
|
|
local Msg = require('EgtCompoMsg')
|
|
|
|
-- Assegnazioni
|
|
local L1 = CMP.V1
|
|
local L2 = CMP.V2
|
|
local L3 = CMP.V3
|
|
local L4 = CMP.V4
|
|
local Alfa = CMP.V5
|
|
local Simm = CMP.V6
|
|
local Rib = CMP.V7
|
|
|
|
local L5label = 'E' -- lato 'obliquo' interno
|
|
local L6label = 'F' -- lato 'orizzontale' interno
|
|
local D1label = 'd' -- diagonale
|
|
|
|
CMP.ERR = 0
|
|
CMP.MSG = ''
|
|
--Verifica di compatibilità dei dati di input
|
|
if L1 < LgMin then
|
|
L1 = LgMin
|
|
CMP.ERR = 1
|
|
CMP.MSG = Msg[2]..GetLenLimit(LgMin) --Le dimensioni dei lati devono essere > = a ...
|
|
end
|
|
if L2 < LgMin then
|
|
L2 = LgMin
|
|
if CMP.ERR == 0 then
|
|
CMP.ERR = 2
|
|
CMP.MSG = Msg[2]..GetLenLimit(LgMin) --Le dimensioni dei lati devono essere > = a...
|
|
end
|
|
end
|
|
if L3 < LgMin then
|
|
L3 = LgMin
|
|
if CMP.ERR == 0 then
|
|
CMP.ERR = 3
|
|
CMP.MSG = Msg[2]..GetLenLimit(LgMin) --Le dimensioni dei lati devono essere > = a...
|
|
end
|
|
end
|
|
if L4 < LgMin then
|
|
L4 = LgMin
|
|
if CMP.ERR == 0 then
|
|
CMP.ERR = 4
|
|
CMP.MSG = Msg[2]..GetLenLimit(LgMin) --Le dimensioni dei lati devono essere > = a...
|
|
end
|
|
end
|
|
if Alfa < AlfaMin then
|
|
Alfa = AlfaMin
|
|
if CMP.ERR == 0 then
|
|
CMP.ERR = 5
|
|
CMP.MSG = Msg[220]..AlfaMin..' e '..AlfaMax -- L'angolo Alfa deve essere compreso tra ... e ...
|
|
end
|
|
end
|
|
if Alfa > AlfaMax then
|
|
Alfa = AlfaMax
|
|
if CMP.ERR == 0 then
|
|
CMP.ERR = 6
|
|
CMP.MSG = Msg[220]..AlfaMin..' e '..AlfaMax -- L'angolo Alfa deve essere compreso tra ... e ...
|
|
end
|
|
end
|
|
|
|
-- Se Preview cancello tutto
|
|
if bPreview then
|
|
EgtNewFile()
|
|
EgtSetDefaultMaterial( BLACK())
|
|
end
|
|
|
|
-- Pezzo e Layer
|
|
local Pz = EgtGroup(GDB_ID.ROOT,GDB_RT.LOC) -- pezzo
|
|
local Ly = EgtGroup(Pz,GDB_RT.LOC) -- layer della figura principale
|
|
EgtSetName(Ly,'OutLoop')
|
|
local Lr = EgtGroup(Pz,GDB_RT.LOC) -- layer regione
|
|
EgtSetName(Lr,'Region')
|
|
local Lc = EgtGroup(Pz,GDB_RT.LOC) -- layer di costruzione
|
|
local La = EgtGroup(Pz,GDB_RT.LOC) -- layer ausiliario (diagonali e relative etichette, assi)
|
|
EgtSetName(La,"LayAux")
|
|
local Le = EgtGroup(Pz,GDB_RT.LOC) -- layer delle etichette pezzo
|
|
EgtSetName(Le,"Etichette")
|
|
local Lq = EgtGroup(Pz,GDB_RT.LOC) -- layer delle linee di quotatura
|
|
EgtSetName(Lq,"Quotature")
|
|
|
|
EgtSetCurrPartLayer(Pz,Ly)
|
|
|
|
-- Costruzione della figura
|
|
local vAlfa = Vector3d (cos(Alfa),sin(Alfa),0)
|
|
local l1 = EgtLinePVL(Ly,ORIG(),vAlfa,L1) EgtInvertCurve(l1)
|
|
EgtSetName(l1,"A6")
|
|
local l2 = EgtLinePDL(Ly,ORIG(),0,L2)
|
|
EgtSetName(l2,"A1")
|
|
local l3 = EgtLinePVL(Ly,EgtSP(l1),VRotated(vAlfa,-90),L3) EgtInvertCurve(l3)
|
|
EgtSetName(l3,"A5")
|
|
local l4 = EgtLinePDL(Ly,EgtEP(l2),90,L4)
|
|
EgtSetName(l4,"A2")
|
|
local arcAlfa , rrefAlfa
|
|
rrefAlfa = min(L1,L2)/5
|
|
arcAlfa = EgtArcC2P(La,EgtSP(l2),EgtSP(l2)+EgtEV(l2)*rrefAlfa,EgtSP(l1))
|
|
-- chiusura dei lati l5 e l6 se possibile
|
|
local l5 = EgtLinePVL(Ly,EgtSP(l3),VRotated(vAlfa,180),L1)
|
|
EgtInvertCurve(l5)
|
|
EgtSetName(l5,"A4")
|
|
local l6 = EgtLinePDL(Ly,EgtEP(l4),180,L2)
|
|
EgtSetName(l6,"A3")
|
|
if EgtIP(l5,l6,EgtSP(l3)) then
|
|
EgtModifyCurveStartPoint(l5,EgtIP(l5,l6,EgtSP(l3)))
|
|
EgtModifyCurveEndPoint(l6,EgtIP(l5,l6,EgtSP(l3)))
|
|
L5 = EgtCurveLength(l5)
|
|
L6 = EgtCurveLength(l6)
|
|
if L5 < LgMin then
|
|
if CMP.ERR == 0 then
|
|
CMP.ERR = 8
|
|
CMP.MSG = Msg[223]..GetLenLimit(LgMin) -- un lato risulta troppo piccolo (minore di ..)
|
|
end
|
|
end
|
|
if L6 < LgMin then
|
|
if CMP.ERR == 0 then
|
|
CMP.ERR = 9
|
|
CMP.MSG = Msg[223]..GetLenLimit(LgMin) -- un lato risulta troppo piccolo (minore di ..)
|
|
end
|
|
end
|
|
else
|
|
-- if CMP.ERR == 0 then
|
|
CMP.ERR = 7
|
|
CMP.MSG = Msg[221] -- figura impossibile
|
|
--end
|
|
end
|
|
|
|
-- diagonali e assi di simmetria
|
|
local d1, D1, a1, a2
|
|
if CMP.ERR == 0 then
|
|
d1 = EgtLine(La,EgtSP(l1),EgtEP(l2))
|
|
D1 = EgtCurveLength(d1)
|
|
a1 = EgtLinePVL(La,EgtMP(l3),VRotated(vAlfa,180),L1)
|
|
a2 = EgtLinePDL(La,EgtMP(l4),180,L2)
|
|
EgtModifyCurveEndPoint(a1,EgtIP(a1,a2,EgtEP(l6)))
|
|
EgtModifyCurveEndPoint(a2,EgtIP(a1,a2,EgtEP(l6)))
|
|
end
|
|
|
|
if Lc then
|
|
EgtErase(Lc)
|
|
end
|
|
|
|
-- Riempimento della figura
|
|
local e1, s1
|
|
if CMP.ERR ~= 7 then
|
|
e1 = EgtCurveCompo(Ly,{l1,l2,l4,l6,l5,l3},false)
|
|
s1 = EgtSurfFlatRegion(Lr,e1)
|
|
if CMP.ERR == 0 then
|
|
EgtSetColor(s1,AQUA())
|
|
else
|
|
EgtSetColor(s1,ORANGE())
|
|
end
|
|
EgtSetAlpha(s1,25)
|
|
EgtErase(e1)
|
|
end
|
|
|
|
-- Simmetria orizzontale
|
|
if Simm then
|
|
EgtMirror({Ly,Lr,La,Le,Lq},ORIG(),X_AX(),GDB_RT.GLOB)
|
|
EgtInvertCurve({l1,l2,l3,l4,l5,l6,arcAlfa})
|
|
if CMP.ERR == 0 then
|
|
EgtInvertCurve(d1)
|
|
end
|
|
EgtSetInfo(La,"SIMM","1")
|
|
end
|
|
-- Simmetria verticale ('ribaltamento')
|
|
if Rib then
|
|
EgtMirror({Ly,Lr,La,Le,Lq},ORIG(),Y_AX(),GDB_RT.GLOB)
|
|
EgtInvertCurve({l1,l2,l3,l4,l5,l6,arcAlfa})
|
|
EgtSetInfo(La,"RIB","1")
|
|
end
|
|
|
|
EgtReorderCurvesInGroup(Ly,ORIG())
|
|
|
|
-- Dimensioni dell'oggetto
|
|
local bbox = EgtGetBBoxGlob(Ly,GDB_BB.STANDARD)
|
|
local dimX = EgtToUiUnits(bbox:getDimX())
|
|
local dimY = EgtToUiUnits(bbox:getDimY())
|
|
local dim = bbox:getRadius() * 0.1
|
|
if CMP.ERR == 0 then
|
|
CMP.MSG = Msg[1] .. EgtNumToString(dimX,2) .. ' x ' .. EgtNumToString(dimY,2)
|
|
end
|
|
local pVal
|
|
if Rib then
|
|
pVal= bbox:getMin() - Vector3d(0,dim*3,0) -- uguali, se non ci sono linee di quotatura sotto la fiura
|
|
else
|
|
pVal= bbox:getMin() - Vector3d(0,dim*3,0)
|
|
end
|
|
|
|
-- Dimensioni sull'oggetto
|
|
local LbOn
|
|
if CMP.ERR == 0 then
|
|
local sDim = EgtNumToString(dimX,2) .. ' x ' .. EgtNumToString(dimY,2)
|
|
local dDim = bbox:getRadius() * 0.1
|
|
if L1 > L2 then
|
|
LbOn = AddLabelPnt(Lr,EgtMP(a1,GDB_ID.ROOT),sDim,dDim,90,BLACK())
|
|
else
|
|
LbOn = AddLabelPnt(Lr,EgtMP(a2,GDB_ID.ROOT),sDim,dDim,0,BLACK())
|
|
end
|
|
EgtSetStatus(LbOn,GDB_ST.OFF)
|
|
end
|
|
|
|
-- Etichette sulla figura
|
|
local stdoffset = 1
|
|
local LblL1 = AddLabel(Le,l1,stdoffset,CMP.N1,dim,-90,RED())
|
|
EgtSetInfo(LblL1,"Var",1)
|
|
local LblL2 = AddLabel(Le,l2,stdoffset,CMP.N2,dim,-90,RED())
|
|
EgtSetInfo(LblL2,"Var",2)
|
|
local LblL3 = AddLabel(Le,l3,stdoffset,CMP.N3,dim,-90,RED())
|
|
EgtSetInfo(LblL3,"Var",3)
|
|
local LblL4 = AddLabel(Le,l4,stdoffset,CMP.N4,dim,-90,RED())
|
|
EgtSetInfo(LblL4,"Var",4)
|
|
local LblAlfa = AddLabel(Le,arcAlfa,stdoffset*.5,CMP.N5,dim*.8,-90,RED())
|
|
EgtSetInfo(LblAlfa,"Var",5)
|
|
|
|
if CMP.ERR == 0 then
|
|
local LblL5 = AddLabel(Le,l5,stdoffset,L5label,dim*.75,-90,GREEN())
|
|
local LblL6 = AddLabel(Le,l6,stdoffset,L6label,dim*.75,-90,GREEN())
|
|
local LblD1 = AddLabelAl(Le,d1,stdoffset*.75,D1label,dim/2,90,GREEN())
|
|
end
|
|
|
|
-- Etichette sotto la figura
|
|
if CMP.ERR == 0 then
|
|
local lLenL5 = EgtToUiUnits(L5)
|
|
local sLenL5 = EgtNumToString(lLenL5,1)
|
|
local ValL5 = EgtTextAdv(Le,pVal,0,L5label..'='..sLenL5,'',100,'S',dim*.75,1,0,GDB_TI.BL,GDB_RT.GLOB)
|
|
EgtSetColor(ValL5,GREEN())
|
|
EgtSetStatus(ValL5,GDB_ST.SEL)
|
|
local ValL5Len = (EgtEP(ValL5,GDB_RT.GLOB)-EgtSP(ValL5,GDB_RT.GLOB)):getX() + dim/2
|
|
pVal = pVal + Vector3d(ValL5Len,0,0)
|
|
local lLenL6 = EgtToUiUnits(L6)
|
|
local sLenL6 = EgtNumToString(lLenL6,1)
|
|
local ValL6 = EgtTextAdv(Le,pVal,0,L6label..'='..sLenL6,'',100,'S',dim*.75,1,0,GDB_TI.BL,GDB_RT.GLOB)
|
|
EgtSetColor(ValL6,GREEN())
|
|
EgtSetStatus(ValL6,GDB_ST.SEL)
|
|
local ValL6Len = (EgtEP(ValL6,GDB_RT.GLOB)-EgtSP(ValL6,GDB_RT.GLOB)):getX() + dim/2
|
|
pVal = pVal + Vector3d(ValL6Len,0,0)
|
|
end
|
|
if CMP.ERR == 0 then
|
|
local lLenD1 = EgtToUiUnits(D1)
|
|
local sLenD1 = EgtNumToString(lLenD1,1)
|
|
local ValD1 = EgtTextAdv(Le,pVal,0,D1label..'='..sLenD1,'',100,'S',dim*.5,1,0,GDB_TI.BL,GDB_RT.GLOB)
|
|
EgtSetColor(ValD1,GREEN())
|
|
EgtSetStatus(ValD1,GDB_ST.SEL)
|
|
end
|
|
|
|
-- Se non Preview
|
|
if not bPreview then
|
|
-- cancello etichette e parti ausiliarie (es.: altezze, diagonali )
|
|
EgtErase({La,Le,Lq})
|
|
-- rendo visibile label sul pezzo
|
|
EgtSetStatus(LbOn,GDB_ST.ON)
|
|
end
|
|
|
|
-- Se ok
|
|
if CMP.ERR == 0 then
|
|
-- scrivo i parametri nelle info del pezzo
|
|
WriteCompoDataToPart(Pz,CMP.Nome,CMP.Npar)
|
|
-- salvo i parametri come nuovo default
|
|
SaveCompoData(CMP.Npar)
|
|
end
|
|
end
|
|
_G.CMP_Draw = CMP_Draw
|
|
CMP_Draw(true)
|
|
EgtZoom(SCE_ZM.ALL) |