Files
webwindowconfigurator/WebWindowComplex/Models/SashDimension.cs
T
2025-11-13 19:05:36 +01:00

704 lines
27 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using WebWindowComplex.Json;
using static WebWindowComplex.Json.WindowConst;
namespace WebWindowComplex.Models
{
public class SashDimension
{
#region Public Constructors
public SashDimension(double dDimension, MeasureTypes MeasureType, Sash Parent, int nSashId)
{
m_dDimension = dDimension;
m_Parent = Parent;
m_nSashId = nSashId;
SetMeasureType(MeasureType);
// assengno maniglia
if (Parent.SashList.Count == 0 || !Parent.SashList.Any(x => x.bHasHandle))
m_bHasHandle = true;
// assegno tipo di anta
if (Parent.SashList.Count == 0)
SetOpeningType(Openings.TILTTURN_LEFT);
else if (Parent.SashList.Count == 1)
{
switch (Parent.SashList[0].OpeningType)
{
case Openings.TURNONLY_LEFT:
{
SetOpeningType(Openings.TURNONLY_RIGHT);
break;
}
case Openings.TURNONLY_RIGHT:
{
SetOpeningType(Openings.TURNONLY_LEFT);
break;
}
case Openings.TILTTURN_LEFT:
{
SetOpeningType(Openings.TURNONLY_RIGHT);
break;
}
case Openings.TILTTURN_RIGHT:
{
SetOpeningType(Openings.TURNONLY_LEFT);
break;
}
case Openings.TILTONLY_TOP:
{
SetOpeningType(Openings.TILTONLY_BOTTOM);
break;
}
case Openings.TILTONLY_BOTTOM:
{
SetOpeningType(Openings.TILTONLY_TOP);
break;
}
case Openings.COMPLANARSLIDE_LEFT:
{
SetOpeningType(Openings.COMPLANARSLIDE_RIGHT);
break;
}
case Openings.COMPLANARSLIDE_RIGHT:
{
SetOpeningType(Openings.COMPLANARSLIDE_LEFT);
break;
}
case Openings.LIFTSLIDE_LEFT:
{
SetOpeningType(Openings.LIFTSLIDE_RIGHT);
break;
}
case Openings.LIFTSLIDE_RIGHT:
{
SetOpeningType(Openings.LIFTSLIDE_LEFT);
break;
}
}
}
else
SetOpeningType(Parent.SashList[Parent.SashList.Count - 1].OpeningType);
}
#endregion Public Constructors
#region Public Properties
public bool bHasHandle
{
get
{
return m_bHasHandle;
}
set
{
m_bHasHandle = value;
//m_Parent.ParentWindow.OnUpdatePreview(m_Parent.ParentWindow.sSerialized());
}
}
public double dDimension
{
get
{
return m_dDimension;
}
set
{
double valMax = 0;
bool valueAccept = false;
switch (MeasureType)
{
case MeasureTypes.ABSOLUT:
{
valMax = m_Parent.Width;
valueAccept = (value < valMax && value > 0) ? true : false;
break;
}
case MeasureTypes.PROPORTIONAL:
{
valMax = 20;
valueAccept = true ;
break;
}
case MeasureTypes.PERCENTAGE:
{
valMax = 100;
valueAccept = (value < valMax && value > 0) ? true : false;
break;
}
}
if (valueAccept)
{
double widthTot = m_Parent.Width;
List <SashDimension> dimensions = m_Parent.SashList;
List<double> absolutValList = new List<double>();
foreach(var item in m_Parent.SashList)
{
absolutValList.Add(item.CalculateAbsolutValue(widthTot));
}
int nIndex = dimensions.IndexOf(this);
int proportionalCount = dimensions.Where(x => x.MeasureType.Equals(MeasureTypes.PROPORTIONAL)).ToList().Count;
// Le altre dimensioni non sono solo in proporzionale
if ( proportionalCount == 0 || proportionalCount < absolutValList.Count - 1)
{
double valueInAbsolute = 0;
switch (MeasureType)
{
case MeasureTypes.ABSOLUT:
{
valueInAbsolute = value;
break;
}
case MeasureTypes.PROPORTIONAL:
{
var pesi = value + dimensions
.Where(x => x.MeasureType.Equals(MeasureTypes.PROPORTIONAL) && !x.Equals(this))
.Sum(x => x.m_dDimension);
valueInAbsolute = widthTot / pesi * value;
break;
}
case MeasureTypes.PERCENTAGE:
{
valueInAbsolute = (value / 100) * widthTot;
break;
}
}
if (value < dDimension)
{
// L'anta modificata non è l'ultima
if (nIndex < absolutValList.Count - 1)
{
absolutValList[nIndex + 1] = absolutValList[nIndex + 1] + (absolutValList[nIndex] - valueInAbsolute);
absolutValList[nIndex] = valueInAbsolute;
}
// L'anta modificata è l'ultima
else if (dimensions.Count > 1)
{
absolutValList[nIndex - 1] = absolutValList[nIndex - 1] + (absolutValList[nIndex] - valueInAbsolute);
absolutValList[nIndex] = valueInAbsolute;
}
}
else
{
// L'anta modificata non è l'ultima
if (nIndex < absolutValList.Count - 1)
{
absolutValList[nIndex + 1] = absolutValList[nIndex + 1] - (valueInAbsolute - absolutValList[nIndex]);
absolutValList[nIndex] = valueInAbsolute;
}
// L'anta modificata è l'ultima
else if (dimensions.Count > 1)
{
absolutValList[nIndex - 1] = absolutValList[nIndex - 1] - (valueInAbsolute - absolutValList[nIndex]);
absolutValList[nIndex] = valueInAbsolute;
}
}
if (MeasureType.Equals(MeasureTypes.PROPORTIONAL))
m_dDimension = value;
for(int i = 0; i < absolutValList.Count; i++)
{
var item = m_Parent.SashList.ElementAt(i);
item.SetDimension(ConvertIn(absolutValList[i], (MeasureTypes)item.SelMeasureTypeIndex, widthTot));
}
}
else
{
m_dDimension = value;
}
m_Parent.ParentWindow.OnUpdatePreview(m_Parent.ParentWindow.sSerialized());
}
//// se sono in percentuale
//if (m_MeasureType.Equals(MeasureTypes.PERCENTAGE))
//{
// // Controllo che il valore inserito sia compreso tra 0 e 100
// if (value > 0 && value < 100)
// {
// // verifico se ci sono altri in percentuale
// List<SashDimension> RelativeDimList = m_Parent.SashList.Where(x => x.MeasureType.Equals(MeasureTypes.PERCENTAGE)).ToList();
// if (RelativeDimList.Count > 0)
// {
// int nIndex = RelativeDimList.IndexOf(this);
// // se diminuisce dimensione
// if (value < m_dDimension)
// {
// if (nIndex < RelativeDimList.Count - 1)
// RelativeDimList[nIndex + 1].SetDimension(RelativeDimList[nIndex + 1].dDimension + (m_dDimension - value));
// else if (RelativeDimList.Count > 1)
// RelativeDimList[nIndex - 1].SetDimension(RelativeDimList[nIndex - 1].dDimension + (m_dDimension - value));
// else
// {
// m_dDimension = 100;
// return;
// }
// }
// // se aumenta dimensione
// else
// {
// double dRes = value;
// // se non ultima anta
// if (nIndex < RelativeDimList.Count - 1)
// {
// for (var nInd = 0; nInd <= nIndex - 1; nInd++)
// dRes += RelativeDimList[nInd].dDimension;
// dRes = (100 - dRes) / (RelativeDimList.Count - nIndex - 1);
// for (var Ind = nIndex + 1; Ind <= RelativeDimList.Count - 1; Ind++)
// RelativeDimList[Ind].SetDimension(dRes);
// }
// // se ultima anta
// else if (RelativeDimList.Count > 1)
// {
// if (RelativeDimList.Count > 2)
// {
// for (var Ind = 0; Ind <= nIndex - 2; Ind++)
// dRes += RelativeDimList[Ind].dDimension;
// }
// dRes = (100 - dRes);
// RelativeDimList[nIndex - 1].SetDimension(dRes);
// }
// else
// {
// m_dDimension = 100;
// return;
// }
// }
// }
// }
// m_dDimension = value;
// m_Parent.ParentWindow.OnUpdatePreview(m_Parent.ParentWindow.sSerialized());
//}
}
}
public int nSashId
{
get
{
return m_nSashId;
}
}
public Openings OpeningType
{
get
{
return m_SelOpeningType;
}
}
public List<IdNameStruct> OpeningTypeList
{
get
{
return m_OpeningTypeList;
}
}
public Openings SelOpeningType
{
get
{
return m_SelOpeningType;
}
set
{
m_SelOpeningType = value;
m_Parent.ReqRefreshShape();
m_Parent.RefreshHardwareOptionList();
m_Parent.SetFirstHardware();
}
}
public int SelOpeningTypeIndex
{
get
{
//return IdNameStruct.IndFromId((int)m_SelOpeningType, m_OpeningTypeList);
return (int)m_SelOpeningType;
}
set
{
//Openings newOpening = (Openings)IdNameStruct.IdFromInd(value, m_OpeningTypeList);
Openings newOpening = (Openings)value;
if ((newOpening != Openings.TILTTURN_LEFT && newOpening != Openings.TILTTURN_RIGHT) ||
(newOpening == Openings.TILTTURN_LEFT && m_bHasHandle) ||
(newOpening == Openings.TILTTURN_RIGHT && m_bHasHandle))
{
m_SelOpeningType = newOpening;
m_Parent.ReqRefreshShape();
m_Parent.RefreshHardwareOptionList();
m_Parent.SetFirstHardware();
m_Parent.ParentWindow.OnUpdatePreview(m_Parent.ParentWindow.sSerialized());
}
}
}
public MeasureTypes MeasureType
{
get
{
return m_SelMeasureType;
}
}
public List<IdNameStruct> MeasureTypeList
{
get
{
return m_MeasureTypeList;
}
}
public MeasureTypes SelMeasureType
{
get
{
return m_SelMeasureType;
}
set
{
m_SelMeasureType = value;
}
}
public int SelMeasureTypeIndex
{
get
{
return (int)m_SelMeasureType;
}
set
{
if(m_SelMeasureType != (MeasureTypes)value)
{
MeasureTypes newType = (MeasureTypes)value;
m_dDimension = ConvertDimension(m_SelMeasureType, newType);
m_SelMeasureType = (MeasureTypes)value;
m_Parent.ParentWindow.OnUpdatePreview(m_Parent.ParentWindow.sSerialized());
}
}
}
#endregion Public Properties
#region Public Methods
/// <summary>
/// Metodo per convertire la dimensione dal vecchio tipo al nuovo tipo
/// </summary>
/// <param name="oldType"> Vecchio tipo </param>
/// <param name="newType"> Nuovo tipo </param>
/// <returns></returns>
public double ConvertDimension(MeasureTypes oldType, MeasureTypes newType)
{
switch (oldType)
{
case MeasureTypes.ABSOLUT:
{
if (newType.Equals(MeasureTypes.PERCENTAGE))
{
return Double.Round((m_dDimension / m_Parent.Width) * 100, 0);
}
else
{
return ricalculatePropVal();
}
}
case MeasureTypes.PROPORTIONAL:
{
if (newType.Equals(MeasureTypes.ABSOLUT))
{
return Double.Round(convertFromPropVal(newType), 2);
}
else
{
return Double.Round(convertFromPropVal(newType));
}
}
case MeasureTypes.PERCENTAGE:
{
if (newType.Equals(MeasureTypes.ABSOLUT))
{
return Double.Round((m_dDimension * m_Parent.Width) / 100);
}
else
{
return Double.Round(ricalculatePropVal());
}
}
}
return -1;
}
/// <summary>
/// Metodo per copiare l'intero oggetto
/// </summary>
/// <returns></returns>
public SashDimension Copy()
{
SashDimension newSashDim = new SashDimension(dDimension, MeasureType, m_Parent, m_nSashId);
newSashDim.SetMeasureType(MeasureType);
newSashDim.SetOpeningType(SelOpeningType);
newSashDim.SetHasHandle(bHasHandle);
return newSashDim;
}
#endregion Public Methods
#region Internal Methods
internal JsonSashDimension Serialize()
{
JsonSashDimension JsonSashDimension = new JsonSashDimension(OpeningType, MeasureType, m_bHasHandle, m_dDimension, m_nSashId);
return JsonSashDimension;
}
internal void SetDimension(double dValue)
{
m_dDimension = dValue;
}
internal void SetHasHandle(bool value)
{
m_bHasHandle = value;
}
internal void SetOpeningType(Openings value)
{
m_SelOpeningType = value;
}
internal void SetMeasureType(MeasureTypes value)
{
m_SelMeasureType = value;
}
/// <summary>
/// Metodo per trasformare una dimensione in valore assoluto rispetto alla larghezza totale
/// </summary>
/// <param name="widthTot"> Larghezza totale </param>
/// <returns></returns>
internal double CalculateAbsolutValue(double widthTot)
{
switch (MeasureType)
{
case MeasureTypes.ABSOLUT:
{
return dDimension;
}
case MeasureTypes.PROPORTIONAL:
{
return calculatePropVal();
}
case MeasureTypes.PERCENTAGE:
{
return (dDimension / 100) * widthTot;
}
}
return 0;
}
/// <summary>
/// Metodo per convertire una dimensione da un valore assoluto al suo rispettivo tipo
/// </summary>
/// <param name="absolutVal"> Valore assoluto </param>
/// <param name="type"> Tipo di misura della dimensione </param>
/// <param name="widthTot"> Larghezza totale </param>
/// <returns></returns>
internal double ConvertIn(double absolutVal, MeasureTypes type, double widthTot)
{
switch (type)
{
case MeasureTypes.ABSOLUT:
{
return absolutVal;
}
case MeasureTypes.PROPORTIONAL:
{
return calculatePropVal();
}
case MeasureTypes.PERCENTAGE:
{
return (absolutVal / widthTot) * 100;
}
}
return -1;
}
/// <summary>
/// Metodo per convertire da misura proporzionale a misura assoluta o percentuale
/// </summary>
/// <param name="newType"></param>
/// <returns></returns>
internal double convertFromPropVal(MeasureTypes newType)
{
double tot = m_Parent.Width;
//Somma misura non proporzionali
double sumNotProp = m_Parent.SashList
.Where(m => m.MeasureType != MeasureTypes.PROPORTIONAL && !m.Equals(this))
.Sum(m => m.CalculateAbsolutValue(tot));
//Calcolo residuo
double res = tot - sumNotProp;
if (res < 0) res = 0;
//Misure proporzionali
var proportionalList = m_Parent.SashList
.Where(m => m.SelMeasureType == MeasureTypes.PROPORTIONAL)
.ToList();
double sumPesi = proportionalList.Sum(p => p.dDimension);
if (sumPesi == 0) sumPesi = 1;
if (newType.Equals(MeasureTypes.ABSOLUT))
{
return res / sumPesi * dDimension;
}
else
{
return (res / sumPesi * dDimension) / tot * 100;
}
}
/// <summary>
/// Metodo per calcolare il valore proporzionale
/// </summary>
/// <returns></returns>
internal double calculatePropVal()
{
double tot = m_Parent.Width;
//Somma misura non proporzionali
double sumNotProp = m_Parent.SashList
.Where(m => m.MeasureType != MeasureTypes.PROPORTIONAL)
.Sum(m => m.CalculateAbsolutValue(tot));
//Calcolo residuo
double res = tot - sumNotProp;
if (res < 0) res = 0;
//Misure proporzionali
var proportionalList = m_Parent.SashList
.Where(m => m.SelMeasureType == MeasureTypes.PROPORTIONAL)
.ToList();
double sumPesi = proportionalList.Sum(p => p.dDimension);
if (sumPesi == 0) sumPesi = 1;
return res / sumPesi*dDimension;
}
/// <summary>
/// Calcolo MCD
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public static double CalcolaMCD(double a, double b)
{
while (b != 0)
{
double temp = b;
b = a % b;
a = temp;
}
return a;
}
/// <summary>
/// Metodo per ricalcolare i valori proporzionali a causa della modifica di uno
/// </summary>
/// <returns></returns>
internal double ricalculatePropVal()
{
if(m_Parent.SashList.Where(m => m.MeasureType.Equals(MeasureTypes.PROPORTIONAL)).ToList().Count == 0)
{
return 1;
}
List<double> absolutValue = new List<double>();
foreach (var item in m_Parent.SashList)
{
absolutValue.Add(item.CalculateAbsolutValue(m_Parent.Width));
}
for(int i = 0; i < m_Parent.SashList.Count; i++)
{
if(!m_Parent.SashList.ElementAt(i).Equals(this) &&
m_Parent.SashList.ElementAt(i).MeasureType.Equals(MeasureTypes.PROPORTIONAL))
{
int nIndex = m_Parent.SashList.IndexOf(this);
if (absolutValue.ElementAt(nIndex) <= absolutValue.ElementAt(i))
{
var mcd = CalcolaMCD(absolutValue.ElementAt(nIndex), absolutValue.ElementAt(i));
m_Parent.SashList.ElementAt(i).m_dDimension = absolutValue.ElementAt(i) / mcd;
m_dDimension = absolutValue.ElementAt(nIndex) / mcd;
}
else
{
var mcd = CalcolaMCD(absolutValue.ElementAt(nIndex), absolutValue.ElementAt(i));
m_Parent.SashList.ElementAt(i).m_dDimension = absolutValue.ElementAt(i) / mcd;
m_dDimension = absolutValue.ElementAt(nIndex) / mcd;
}
break;
}
}
return m_dDimension;
}
#endregion Internal Methods
#region Private Fields
private bool m_bHasHandle;
private double m_dDimension;
private int m_nSashId;
private List<IdNameStruct> m_OpeningTypeList = new List<IdNameStruct>
{
new IdNameStruct((int)Openings.TURNONLY_LEFT, "A bandiera sinistra"),
new IdNameStruct((int)Openings.TURNONLY_RIGHT, "A bandiera destra"),
new IdNameStruct((int)Openings.TILTTURN_LEFT, "Ad anta-ribalta sinistra"),
new IdNameStruct((int)Openings.TILTTURN_RIGHT, "Ad anta-ribalta destra"),
new IdNameStruct((int)Openings.TILTONLY_TOP, "Solo verso alto"),
new IdNameStruct((int)Openings.TILTONLY_BOTTOM, "Solo verso basso"),
new IdNameStruct((int)Openings.PIVOT, "Pivot"),
new IdNameStruct((int)Openings.FIXED, "Fissa"),
new IdNameStruct((int)Openings.COMPLANARSLIDE_LEFT, "Complanare sinistra"),
new IdNameStruct((int)Openings.COMPLANARSLIDE_RIGHT, "Complanare destra"),
new IdNameStruct((int)Openings.LIFTSLIDE_LEFT, "Scorrevole sinistra"),
new IdNameStruct((int)Openings.LIFTSLIDE_RIGHT, "Scorrevole destra")
//new IdNameStruct((int)Openings.TURNONLY_LEFT, ">"),
//new IdNameStruct((int)Openings.TURNONLY_RIGHT, "<"),
//new IdNameStruct((int)Openings.TILTTURN_LEFT, ">*"),
//new IdNameStruct((int)Openings.TILTTURN_RIGHT, "<*"),
//new IdNameStruct((int)Openings.TILTONLY_TOP, "˄"),
//new IdNameStruct((int)Openings.TILTONLY_BOTTOM, "˅"),
//new IdNameStruct((int)Openings.PIVOT, "◊"),
//new IdNameStruct((int)Openings.FIXED, "X"),
//new IdNameStruct((int)Openings.COMPLANARSLIDE_LEFT, "-→"),
//new IdNameStruct((int)Openings.COMPLANARSLIDE_RIGHT, "←-"),
//new IdNameStruct((int)Openings.LIFTSLIDE_LEFT, "┌→"),
//new IdNameStruct((int)Openings.LIFTSLIDE_RIGHT, "←┐")
};
private List<IdNameStruct> m_MeasureTypeList = new List<IdNameStruct>
{
new IdNameStruct((int)MeasureTypes.ABSOLUT, "Absolut"),
new IdNameStruct((int)MeasureTypes.PROPORTIONAL, "Proportional"),
new IdNameStruct((int)MeasureTypes.PERCENTAGE, "Percentage"),
};
// reference
private Sash m_Parent;
private Openings m_SelOpeningType;
private MeasureTypes m_SelMeasureType;
#endregion Private Fields
}
}