{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "LXlSRBeHtETj",
        "outputId": "681ee76b-80e4-42e3-ef47-931fe2c999e2"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Requirement already satisfied: ezdxf in /usr/local/lib/python3.12/dist-packages (1.4.2)\n",
            "Requirement already satisfied: pyparsing>=2.0.1 in /usr/local/lib/python3.12/dist-packages (from ezdxf) (3.2.3)\n",
            "Requirement already satisfied: typing_extensions>=4.6.0 in /usr/local/lib/python3.12/dist-packages (from ezdxf) (4.15.0)\n",
            "Requirement already satisfied: numpy in /usr/local/lib/python3.12/dist-packages (from ezdxf) (2.0.2)\n",
            "Requirement already satisfied: fonttools in /usr/local/lib/python3.12/dist-packages (from ezdxf) (4.59.1)\n"
          ]
        }
      ],
      "source": [
        "# Ejercicio Extra 3.1.5.\n",
        "\n",
        "\n",
        "!pip install ezdxf\n",
        "\n",
        "import math\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "import ezdxf\n",
        "\n",
        "# Solicitar semiejes al usuario\n",
        "a = float(input(\"Introduce el semieje mayor a (mm): \"))\n",
        "b = float(input(\"Introduce el semieje menor b (mm): \"))\n",
        "\n",
        "# Generar puntos de la elipse usando ecuaciones paramétricas\n",
        "t = np.linspace(0, 2*math.pi, 200)\n",
        "x = a * np.cos(t)\n",
        "y = b * np.sin(t)\n",
        "\n",
        "# Calcular focos\n",
        "c = math.sqrt(abs(a**2 - b**2))  # distancia desde el centro a cada foco\n",
        "foco1 = (c, 0)\n",
        "foco2 = (-c, 0)\n",
        "\n",
        "# Dibujar la elipse y los focos\n",
        "plt.figure(figsize=(6,6))\n",
        "plt.plot(x, y, 'b-', linewidth=2, label=\"Elipse\")\n",
        "plt.plot(foco1[0], foco1[1], 'ro', label=\"Foco 1\")\n",
        "plt.plot(foco2[0], foco2[1], 'ro', label=\"Foco 2\")\n",
        "plt.gca().set_aspect('equal', adjustable='box')\n",
        "plt.grid(True)\n",
        "plt.title(f\"Elipse con a={a} mm, b={b} mm\")\n",
        "plt.xlabel(\"X (mm)\")\n",
        "plt.ylabel(\"Y (mm)\")\n",
        "plt.legend()\n",
        "plt.show()\n",
        "\n",
        "# Exportar a DXF\n",
        "doc = ezdxf.new(dxfversion='R2010')\n",
        "msp = doc.modelspace()\n",
        "\n",
        "# Agregar la elipse usando polyline aproximada\n",
        "points = list(zip(x, y))\n",
        "msp.add_lwpolyline(points, close=True)\n",
        "\n",
        "# Agregar focos como círculos pequeños (radio 1 mm)\n",
        "msp.add_circle(foco1, radius=1)\n",
        "msp.add_circle(foco2, radius=1)\n",
        "\n",
        "# Guardar archivo DXF\n",
        "archivo_dxf = \"elipse.dxf\"\n",
        "doc.saveas(archivo_dxf)\n",
        "print(f\"Elipse exportada exitosamente a {archivo_dxf}\")"
      ]
    }
  ]
}