281 lines
8.3 KiB
Lua
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
|