diff --git a/Q01-Cálculos/Assembly.cs b/Q01-Cálculos/Assembly.cs
new file mode 100644
index 0000000..1195d69
--- /dev/null
+++ b/Q01-Cálculos/Assembly.cs
@@ -0,0 +1,108 @@
+using Q01_Cálculos;
+using System.Collections;
+using System.Numerics;
+using System.Text;
+
+///
+/// Clase que representa una colección de sólidos rígidos
+///
+public class Assembly : IEnumerable, IRigidBody
+{
+
+ public List components = new();
+
+ ///
+ /// Obtiene el centro de masas del ensamblaje como la suma ponderada
+ /// de los centros de masas de todos sus componentes.
+ /// rcm = ( sum(rcm_i*m_i) / sum(m_i) )
+ ///
+ public Vector3 CenterOfMass
+ {
+ get
+ {
+ Vector3 result = new Vector3(0, 0, 0);
+ float TotalMass = 0;
+ foreach (var item in components)
+ {
+ TotalMass += item.Mass;
+ result += item.CenterOfMass * item.Mass;
+ }
+ result /= TotalMass;
+ return result;
+ }
+ }
+
+ ///
+ /// Obtiene la masa total del ensamblaje como la suma de la masa de
+ /// todos sus componentes
+ ///
+ public float Mass
+ {
+ get
+ {
+ float TotalMass = 0;
+ foreach (var item in components)
+ {
+ TotalMass += item.Mass;
+ }
+ return TotalMass;
+ }
+ }
+
+ ///
+ /// Obtiene el peso del objeto como el producto de la masa del ensamblaje por
+ /// la aceleración de la gravedad por defecto
+ ///
+ public Vector3 Weight => (Vector3)(Mass * Physics.CurrentGravity);
+
+ ///
+ /// Nombre para el componente
+ ///
+ public string Name { get; set; } = string.Empty;
+
+ ///
+ /// Obtiene como una cadena de texto legible un resumen de las características del ensamblaje y sus componentes
+ ///
+ ///
+ ///
+ public string Summary(int pad = 0)
+ {
+ StringBuilder r = new();
+ if (!string.IsNullOrEmpty(Name)) r.AppendLinePadded($"Object name: {Name}", pad);
+ r.AppendLinePadded($"- Mass: {Mass}", pad);
+ r.AppendLinePadded($"- Weight: {Weight}", pad);
+ r.AppendLinePadded($"- Center Of Mass: {CenterOfMass}", pad);
+ if (components.Count > 0)
+ {
+ r.AppendLinePadded($"- Item count: {GetChildItemCount(false)}.", pad);
+ r.AppendLinePadded($"- Total child count {GetChildItemCount(true)}", pad);
+ r.AppendLinePadded($"Child objects information ", pad);
+ foreach (var component in this)
+ r.AppendLine(component.Summary(pad + 1));
+ }
+ else
+ {
+ r.AppendLinePadded("Empty assembly", pad);
+ }
+ return r.ToString();
+ }
+
+
+ public IEnumerator GetEnumerator() => components.GetEnumerator();
+ IEnumerator IEnumerable.GetEnumerator() => components.GetEnumerator();
+
+ ///
+ /// Devuelve el recuento de elementos que pertenecen al ensamblado.
+ ///
+ /// Si es true, sumará recursivamente los componentes de los subensamblajes.
+ ///
+ public int GetChildItemCount(bool Recursive)
+ {
+ int count = 0;
+ foreach (var item in components)
+ {
+ count += item.GetChildItemCount(Recursive);
+ }
+ return count;
+ }
+}