{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib widget" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from pysketcher import *" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from ipywidgets import FloatSlider, AppLayout, Label, HBox, Button, Output" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "from IPython.display import HTML, SVG, display, clear_output" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "from math import tan, radians, sin, cos" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "myfig={}" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "gw = \"\"\"\\\n", "libraries: [\"from math import tan, radians, sin, cos\",\"from pysketcher import *\"]\n", "fontsize: 18\n", "g: 9.81 # constant gravity\n", "theta: 30.0 # inclined plane angle\n", "L: 10.0 # sketch sizing parameter\n", "a: 1.0 #\n", "xmin: 0.0 # sketech min Abscissa\n", "ymin: -3.0 # sketech min Ordinate \n", "rl: 2.0 # rectangle width\n", "rL: 1.0 # rectangle length\n", "setframe: # sketch setup\n", " action: \"drawing_tool.set_coordinate_system(xmin=xmin, xmax=xmin+1.5*L,ymin=ymin, ymax=ymin+1.5*L,instruction_file='tmp_mpl_friction.py')\"\n", "setblackline: # default frame values and actions\n", " action: \"drawing_tool.set_linecolor('black')\"\n", "B: point(a+L,0) # wall right end\n", "A: point(a,tan(radians(theta))*L) # wall left end\n", "normal_vec: point(sin(radians(theta)),cos(radians(theta))) # Vector normal to wall\n", "tangent_vec: point(cos(radians(theta)),-sin(radians(theta))) # Vector tangent to wall\n", "help_line: Line(A,B) # wall line\n", "x: a + 3*L/10.\n", "y: help_line(x=x) \n", "contact: point(x, y) \n", "c: contact + rL/2*normal_vec\n", "rectangle: \n", " formula: Rectangle(contact, rl, rL)\n", " style:\n", " linecolor: blue\n", " filled_curves: blue\n", " transform: [\"rotate(-theta, contact)\",\"translate(-rl/2*tangent_vec)\"]\n", "N: \n", " formula: Force(contact - rl*normal_vec, contact, r'$N$', text_pos='start')\n", " style:\n", " linecolor: black\n", "mg: \n", " formula: Gravity(c, rl, text='$Mg$')\n", " style:\n", " linecolor: black\n", "wheel: \n", " formula: \"Composition({'outer': rectangle})\" \n", " style:\n", " shadow: 1\n", "body: \n", " formula: \"Composition({'wheel': wheel, 'N': N, 'mg': mg})\"\n", " style:\n", " linecolor: black\n", "mB:\n", " formula: Text(r'$B$',B)\n", "mA:\n", " formula: Text(r'$A$', A)\n", "wall: \n", " formula: Wall(x=[A[0], B[0]], y=[A[1], B[1]], thickness=-0.25,transparent=False)\n", " style:\n", " linecolor: black \n", "angle: \n", " formula: \"Arc_wText(r'$theta$', center=B, radius=3, start_angle=180-theta, arc_angle=theta, fontsize=fontsize)\"\n", " style:\n", " linecolor: black\n", " linewidth: 1\n", "ground: \n", " formula: Line((B[0]-L/10., 0), (B[0]-L/2.,0))\n", " stlye:\n", " linecolor: black\n", " linestyle: dashed\n", " linewidth: 1\n", "x_const: \n", " formula: Line(contact, contact + point(0,4))\n", " style:\n", " linestyle: dotted\n", " transform: rotate(-theta, contact)\n", "x_axis: \n", " formula: \"Axis(start=contact+ 2*rl*normal_vec, length=2*rl,label='$x$', rotation_angle=-theta)\"\n", "plan: \n", " formula: \"Composition({'body': body, 'angle': angle, 'inclined wall': wall, 'x start': x_const, 'x axis': x_axis, 'mA': mA, 'mB': mB})\"\n", "friction: \n", " formula: \"Composition({'plan': plan, 'ground': ground})\"\n", "\"\"\"" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "sketchParse(gw,myfig)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "d = myfig['friction'].draw()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "drawing_tool.display()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "angle = myfig['theta']\n", "def doright(change):\n", " global angle\n", " rotate(-5)\n", " angle += 5\n", "def doleft(change):\n", " global angle\n", " rotate(5)\n", " angle -= 5\n", "def rotate(theta):\n", " global angle\n", " drawing_tool.erase()\n", " myfig['plan']['angle'].changeAngles(180-angle,angle)\n", " myfig['plan'].rotate(theta,myfig['B'])\n", " myfig['friction'].draw()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "left = Button(\n", " description = '',\n", " icon = 'rotate-left',\n", ")\n", "left.on_click(doleft)\n", "right = Button(\n", " description = '',\n", " icon = 'rotate-right',\n", ")\n", "right.on_click(doright)\n", "output = Output()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "applayout = AppLayout(\n", " center=output,\n", " footer=HBox([left,right]),\n", " pane_heights=[0, 6, 1]\n", ")\n", "#drawing_tool.mpl.ion()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "d03a54aefc93457189c47f3aca45649f", "version_major": 2, "version_minor": 0 }, "text/plain": [ "AppLayout(children=(HBox(children=(Button(icon='rotate-left', style=ButtonStyle()), Button(icon='rotate-right'…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "applayout" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "with output:\n", " clear_output()\n", " display(drawing_tool.mpl.gcf().canvas)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "drawing_tool.mpl.ion()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "import time" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [], "source": [ "for i in range(0,5):\n", " doright(None)\n", " with output:\n", " clear_output(wait=True)\n", " display(drawing_tool.mpl.gcf().canvas)\n", " time.sleep(1)" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", " \n", " \n", " \n", " \n", " 2020-08-01T18:48:57.482473\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.3.0, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for i in range(0,10):\n", " doright(None)\n", " clear_output(wait=True)\n", " display(SVG(sketch2SVG()))\n", " time.sleep(0.01)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "drawing_tool.mpl" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "myfig['friction'].graphviz_dot('friction')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!dot -Tpng -o friction.png friction.dot" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](friction.png)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "drawing_tool.mpl.gcf().canvas.print_png(\"friction.png\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](friction.png)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "display(SVG(sketch2SVG()))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "gcf = drawing_tool.mpl.gcf()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "gcf.canvas" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "applayout.widgets['f066103c31184869818fd23961bacf85']." ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [], "source": [ "from io import BytesIO\n", "from PIL import Image\n", "def sketch2PNG():\n", " f = BytesIO()\n", " drawing_tool.mpl.gcf().canvas.print_png(f)\n", " img = Image.open(f)\n", " return img" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAABHeUlEQVR4nO3dd3iV5f3H8XcSloNphyKKQG0FDWhA6wJEiAPbuhgq21aCIuJkiTgRARdDFGzZIGBA+1NbIAEVREUgMlRcBFx1AgEczOT3xzGPCQnIOMkJed6v6+of58nJOV96tfjxfp77/sTl5OTkIEmSpNCIj/UAkiRJKl4GQEmSpJAxAEqSJIWMAVCSJClkDICSJEkhYwCUJEkKGQOgJElSyBgAJUmSQsYAKEmSFDIGQEmSpJAxAEqSJIWMAVCSJClkDICSJEkhYwCUJEkKGQOgJElSyBgAJUmSQsYAKEmSFDIGQEmSpJAxAEqSJIWMAVCSJClkDICSJEkhYwCUJEkKGQOgJElSyBgAJUmSQsYAKEmSFDIGQEmSpJAxAEqSJIWMAVCSJClkDICSJEkhYwCUJEkKGQOgJElSyBgAJUmSQsYAKEmSFDIGQEmSpJAxAEqSJIWMAVCSJClkDICSJEkhYwCUJEkKGQOgJElSyBgAJUmSQsYAKEmSFDIGQEmSpJAxAEqSJIWMAVCSJClkDICSJEkhYwCUJEkKGQOgJElSyBgAJUmSQsYAKEmSFDIGQEmSpJAxAEqSJIWMAVCSJClkDICSJEkhYwCUJEkKGQOgJElSyBgAJUmSQsYAKEmSFDIGQEmSpJAxAEqSJIWMAVCSJClkDICSJEkhYwCUJEkKGQOgJElSyBgAJUmSQsYAKEmSFDIGQEmSpJAxAEqSJIWMAVCSJClkDICSJEkhYwCUJEkKGQOgJElSyBgAJUmSQsYAKEmSFDIGQEmSpJAxAEqSJIWMAVCSJClkDICSJEkhYwCUJEkKGQOgJElSyBgAJUmSQsYAKEmSFDIGQEmSpJAxAEqSJIWMAVCSJClkDICSJEkhYwCUJEkKGQOgJElSyBgAJUmSQsYAKEmSFDIGQEmSpJAxAEqSJIWMAVCSJClkDICSJEkhYwCUJEkKGQOgJElSyBgAJUmSQsYAKEmSFDIGQEmSpJAxAEqSJIWMAVCSJClkDICSJEkhYwCUJEkKGQOgJElSyBgAJUmSQsYAKEmSFDIGQClksrKySE5OjvUYkqQYMgBKIXPdddexdOnSWI8hSYohA6AUIunp6WRkZJCVlRXrUSRJMWQAlEIkLS2N3r17AxgCJSnEDIBSSIwZM4aUlBSqVasGQGZmZownkiTFigFQCoGsrCzWrFlD7dq1qV27NgAbNmyI8VSSpFgxAEohMGjQIPr27QtAlSpVAFcAJSnMDIBSKZeZmUmdOnWC4Je7AugzgJIUXgZAqZQbPHgwXbt2LXB9zZo1MZhGklQSlIn1AJKKTmpqKkCw8zdXlSpVvAUsSSFmAJRKsSVLljB69OgC19PT090EIkkh5i1gqZQaMmRIsPHjgw8+YNu2bcHPateu7QqgJIWYAVAqhdLT01m/fn2w8aN3797cddddwc9r167tJhBJCjFvAUulSGZmJr179yY1NZXatWvTtm1bKlSowL///W/i4uJo0qQJL7zwAunp6QC0bt2alJQUWrRoEePJJUnFKS4nJycn1kNIKjpdunRh/PjxABx33HGsXLkyWBmUJIWTAVAqxT777DPq1KnDjh07gmvt2rVj8uTJMZxKkhRrPgMolWKPPfZYvvAHMGXKFKZPnx6jiSRJJYEBUCqlNmzYwJgxYwCoUKECjz32WPCzbt268fnnn8dqNElSjBkApVJq1KhR/PDDDwBce+213HzzzVx11VVApAauU6dOZGdnx3JESVKM+AygVAr99NNPHH/88Xz33XcALF++nAYNGrBx40bq168frP49+uij3HLLLbEcVZIUA64ASqVQuXLlqFevXvD60UcfBaBq1arBjmCAvn378s477xT3eJKkGDMASqVQQkICEydOpFKlSgBMnDiRZ599FoDmzZtz6623ArBt2zbatWuXryVEklT6GQClUqpmzZqMHDkyeJ2SksIXX3wBwMCBA0lMTARg5cqV9O/fPyYzSpJiw2cApVIsJyeHq666ihkzZgCQnJzM7NmziY+PZ+XKlZx++uls376duLg45s+fz3nnnRfbgSVJxcIVQKkUi4uL48knn+TYY48FIC0tLVgVrF+/PgMHDgQiQbFjx472A0tSSLgCKIVAeno6ycnJAJQvX55ly5Zx8sknk52dTYsWLXj55ZcBW0JKu02bNpGdnU3VqlVjPYqkGHMFUAqBFi1a0LNnTyCy8aN9+/Zs376d+Ph4JkyYQOXKlYFIS8i0adNiOaqKyFNPPUX9+vVJSUnBf++XZACUQmLQoEGcfPLJQORcwAEDBgBw3HHHMWrUqOB9119/PZ999llMZlT0bd++ndtuu43rr7+eTz/9lGeffdZVXkneApbCZMWKFZx++uns2LGDuLg4XnnlFZo0aQLA1VdfHaz+nX/++aSlpREf778jHuo++OADGjRokO+on4oVK7Jy5UpOOOGE2A0mKab8210KkQYNGvDAAw8AkY0fHTp0YNOmTUCkOq5GjRoAzJ8/n8cffzxWYyqK/vSnPzF48GDKli3LaaedBsCWLVvo2LEju3btivF0kmLFFUApZHbt2sX555/PggULAOjQoQMTJ04EIsGvefPmQKRNZOnSpcF5gTo0rF+/nmrVqhEXFxdcy87O5sMPP+SYY46hQYMGfPLJJwA89NBD9O7dO1ajSoohVwClkNm9JWTSpElBS8j555/P2WefDUSeHbMl5NCSmprKH//4RyZMmJDvenx8PCeddBKVK1dm0qRJQTi86667ePvtt2MxqqQYMwBKIVSzZk2eeOKJ4HVuS8gDDzzA66+/zu9//3sAVq1aZUvIIWLp0qW0bt2aDRs2cNNNN7F27dpC39e4cWN69eoFwI4dO2jXrh0//fRTcY4qqQQwAEoh1a5dO9q0aQPAxo0badq0KXfddRf3338/c+fOpVy5cgA88sgjwTmBKrkaNWpEly5dALjwwguDFd7C3HfffZx66qkArF69mj59+hTHiJJKEJ8BlEJsw4YN1K9fP+gIbtmyJS+99BIQCX633347EDkqZuXKlVSpUiVWo2o3OTk5+Z7zg8jmjv/85z+0adOmwM92995779GwYUO2bt0KwNy5c4PDwiWVfq4ASiFWrVo1xo8fH7yeN28e7777LgC33HILzZo1A+Czzz6je/fusRhRhXjvvfc488wzeeutt/Jdr1ixIm3btv3V8AdQr149Bg8eHLzu3Lkz69evj/qskkomVwAlccsttwTHvpx66qm8+eablC9fns8++4zExMTgqJipU6dy9dVXx3BSLV68mPPOO4+tW7dy4okn8vbbb3PEEUcc0GdlZ2dz0UUXkZaWBkCrVq2YMWPGPgVISYc2VwAl7bUl5MknnwzeZ0tI7CUlJQVH85QpU4avv/76gD8rPj6ecePGBd3AqampTJo0KSpzSirZXAGUBBRsCXn55Zdp2rQpANdccw3PPPMMAM2aNSM9Pd2WkBj68MMPGT16NA888ACHHXbYQX9eamoqrVu3BmwJkcLCv8ElAZGWkIEDBwKRDQYdO3YMbv0+8cQTQUvIyy+/bEtIMdm8eTM33XRTgVW+P/7xjzzyyCNRCX8QufXbsWNHwJYQKSxcAZQU2LVrF82bN+fVV18FbAmJpZUrV3LppZeybt06LrnkEl544YUifTZv06ZN+VpCBg0a5PEwUinmCqCkQEJCAhMmTMjXEjJjxgwg0hJy2223Ab+0hOQeIaLoO+aYY4IDmhcsWMBHH31UpN+3e0vIgAEDbAmRSjEDoKR8dm8J6datW3BO4MCBA4NVP1tCitZvf/tb/vWvf9G4cWNWrlzJH//4xyL/zsaNGwfdwLaESKWbt4AlFZCTk8PVV1/N9OnTAWjRogVz5swhPj6eVatW0ahRI7Zv305cXBzz5s0LzgvUgcnJyWHq1Km0bt06aGDJ+7PiPJZl+/btnHnmmcHq30033cSwYcOK7fslFQ9XACUVEBcXx5NPPsmxxx4LQHp6OiNGjAAgMTGRBx98EPhls8jGjRtjNuuh7ssvv6Rly5a0b9+ee++9t8DPi/tMvnLlyjF58mQqVKgAwPDhw5k7d26xziCp6LkCKGmP5s2bR4sWLQAoX748S5cu5ZRTTiE7O5sWLVoEHcFXX301U6dOjeWoh6yMjAz+/Oc/s3PnThISEvjoo4+oVatWrMdi+PDh9OzZE4g8j7hq1SqOOuqoGE8lKVpcAZS0R82bN+fmm28GYNu2bbRv355t27YRHx/PhAkTgm7gZ555JjgnUPsnKSmJe++9l2OOOYaXXnqpRIQ/gBtvvJELLrgAiKxSduvWDdcLpNLDFUBJe7V161YaNWoUdAT36tUr6JB95plnuOaaa4DILtJVq1Zx3HHHFfuMO3fupEyZMsX+vQfiww8/LLChY9euXWzatIlq1arFaKrC/e9//yMxMZENGzYAMGHChOC8QEmHNlcAJe1VhQoVmDJlSrA5YejQocE5gVdffXXQDbxp0yY6depEdnZ2sc22c+dO7rvvPs4++2y2b99ebN97ILZv306/fv2oW7ducLROroSEhBIX/gCqV6/O6NGjg9c33ngja9eujeFEkqLFACjpVzVo0IAHHngAKLwlJHfV7+WXX+axxx4rlpk+/vhjGjduzN13382SJUuC/uKS6r///S+DBg0iOzubbt268eWXX8Z6pH1iS4hUOhkAJe2TW2+9NegG/vTTT7nxxhsBqFq1KhMmTAh2q/br14+VK1cW2Rw5OTn885//5NRTT+XNN98Mrg8ZMoQFCxYU2fcerL/97W+0adOGMmXKcMcdd/C73/0u1iPtsxEjRgTdwK+99hpDhw6N7UCSDprPAEraZ59++in169cPVv+mTZtG27Zteeutt2jcuHFwGzYxMZG33norOEokWr755huuu+46/u///i/P1cpAZJ6aNWuyYsUKKleuHNXvPRDbtm2jfPny+a5t2LCBdevWkZSUFKOpDtzChQtp2rQpOTk5lC1bljfffPOQ/HNIinAFUNI+O/744wu0hLzwwgskJyeTlJTEySefDBRNS8hLL71EYmLibuHvH8AnQGMAPvnkE7p27cqaNWtiumN11qxZ1K5du8BKaLVq1Q7Z0LR7S0j79u1tCZEOYa4AStovu7eEJCQkcMYZZzBnzhzWrVsXtIRA5BzB888//6C+74cffuD222/nqaeeynP1t8A/gb/9/HodUB/YAkDr1q259tprueiiiw7quw/EjBkzaNu2LVB0K6GxsntLSI8ePRg+fHiMp5J0IFwBlLRfcltCatSoAUSOMPnb3/5GxYoVSUxMZNCgQcF7O3XqdFAtIW+99RannXbabuHvEmAVv4Q/gBOAkcGrF154gbS0ND7++OMD/u4Ddemll1K/fn0ATjzxRLZt21bsMxSV3VtCRowYYUuIdIhyBVDSAdlbS0hycjLz588HDqwlZOfOnTz44IPcd999eXacHg48CnQFCqtHywHaAs8CULt2bbp160b37t05/PDDD+BPeOBWrVrF0qVL6dy5c7FXuRWHESNGcNNNNwG2hEiHKlcAJR2Q5s2bc8sttwCRDQ/t2rULWkLGjx+fryVkfwLgmjVrguNdfgl/pwNvAykUHv74+fpTQHUAMjMzmT9/Pi+88EKRPQ+4evVq/vrXvwYHJedKTEykS5cupTL8AXTv3j1fS0hKSootIdIhxgAo6YA9+OCDnHLKKQCsXLmSu+66C4DjjjuOJ598MnjfDTfcwKeffrrXz8o93qVBgwZ5jneJBwYAi4A/7vmXA9WA8cGrtLQ0FixYwPLly/fxT7TvXnjhBZKSknjxxRdDV5MWHx/PuHHjgsOrZ86cycSJE2M8laT9YQCUdMAqVKjA5MmTg5aQhx9+OGgJueqqq4KauE2bNtG5c+c9toR8++23XHbZZVx33XX88MMPP1+tQyT43QuU3Y+pkoHI7cldu3Yxa9YsXnzxxYN6FrEwSUlJHHbYYUAk/Eb780u63VtCevToYUuIdAgxAEo6KA0aNGDgwIHALy0hWVlZwL61hOz5eJflwJkHONVDQD0AvvrqK+bMmcNzzz0X1Zq6Y489ltGjR9O9e3cyMjJKZJVbUWvVqhWdOnUCbAmRDjVuApF00LKzs2nevDmvvPIKAO3atWPy5MlAJPg1b96cnJwcypUrx5IlS6hfv/4ejnf5DfAv8u/wPVDLgTOAHQB07tyZLl260KRJk/3+pC1btjBy5Eh69epFQkJCFGYrPTZv3kyDBg1Yt24dEHksoG/fvrEdStKvcgVQ0kGLj49nwoQJQQPHlClTgnMCmzVrxm233QZEzpFr164dr732GklJSYUc7/IO0Ql/AKcC9wevnnvuOebMmcP//ve//fqUxYsX06BBA/r168fgwYOjNFvpUalSJSZOnBhseBkwYAAZGRkxnkrSr3EFUFLUTJ06lXbt2gFQpUoVVq1aRY0aNdi2bRtnnHFG0IwRFxeXZ9PErx3vcjB2Ac2AhQDUr1+f6667jpSUFMqW3bfnChctWkSTJk3Izs6mWrVqrF27lkqVKkV5zkNfv379gjMg69aty7Jly4JnJCWVPK4ASoqaa665hquuugqArKysYONH+fLl820W+SX87cvxLgcjAZgIRALbypUrWbBgAWlpafv8Ceeccw59+vThnHPOYcmSJYa/PbjnnnuCmrvVq1cHtXGSSiZXACVF1caNG6lfvz6ff/45AI8++mhwXuCjjz4a3A6OBL4PgBOLYapJQEcgsnP5hhtuoFu3bpx4Yv7vzsnJ4dVXX+W8887Ld33Hjh3Ex8f7/N+vWL16NUlJSWzduhWA2bNnc+GFF8Z4KkmFcQVQUlRVrVqV8ePHB6/79u3LO++8A8DNN9+cpxs4B2hRTFO1B1oDsHXrVp5//nmef/55fvzxx+AdX375JS1btqRZs2a89NJL+X67bNmyhr99ULduXYYMGRK87tKlC+vXr4/hRJL2xAAoKeqaN2/OrbfeChRsCZkwYULQEgKfAt2LYaJfbwl56aWXmD17NgB///vf85xHqP3RvXv3YNXPlhCp5DIASioSAwcOJDExEcjfElKjRo18LSEwCnijGCaqBkwIXu3eEvL3v/+dv/zlLxx99NGMHz+eI444ohhmKn3i4+MZO3asLSFSCeczgJKKzMqVKzn99NPZvn07cXFxzJ8/P3i+rl27dnk6gqsA3wJlimGqm4FhABx99NHccMMN3HjjjVStWpVvv/2WuLg4fvOb3xTDHKXbzJkzadWqFQAVK1ZkxYoV1KpVK8ZTScrlCqCkIlO/fv19agmBLODyYprqPiIHThdsCfntb39r+IuSK6+8Ml9LSIcOHWwJkUoQA6CkInXrrbfSrFkzAD777DNuvPFGIHJOYP6DoF8EUothoieA74JXixYtYuHChbz22mvF8N3hMnz4cE444QQg8t9z3g0ikmLLW8CSitxnn31GYmIimzZtAuCZZ57hkksu4aKLLmLp0qVs377953eWB74icku4qPwAJAEfA5Fu4MqVK9O9e3e6d+9O9erVi/C7w+e1116jadOmZGdnU6ZMGRYvXhycFygpdlwBlFTkjjvuOEaNGhW8vv7662nWrBnvvPMO8+bNo379+j//ZBvRPxpm93/HPQKYRmTjSaQXeNOmTbz44ovMmjWLHTt2RPn7w+3cc88NDoXeuXMn7dq1y3f8jqTYMABKKha7t4QsX76cOXPmcO655zJ58mTKly//8zuXAUOj9K3PAX8GNu92/TTgDHZvCXn11VeZO3dulL5bufK2hLz//vu2hEglgAFQUrEZNWoUNWrUAGDXrl288Ubk+JfExMSgRzaiD7D2IL/tUeAKYAnQcw/vqUnkmcCIF198kfnz5/PRRx8d5Hcrr3LlyjF58mQqVKgAwMiRI5kzZ06Mp5LCzQAoqdhUrVqVCRN+OYuvb9++rFq1CoCePXvSvHnzn3+SDZx3gN9yDjAQuBSo+PO1TcCebu22A9oA+VtCPAg6uurWrcvQob+s7Hbu3JnvvvtuL78hqSgZACUVq/PPP3+PLSHjx48/yJaQEcDrQH8iQfApYCwwEyi7h9+JA54EjgV+aQl58cUXbbCIsrwtIV999ZUtIVIMGQAlFbu8LSGrVq2if//+QKQlJP/RMPvaEvIBcAtwU55rpwLXAF2IhLy9qQaMD16lpaXx6quvBi0hio64uLh8LSGzZs3KtyIsqfh4DIykmNhbS0j79u2ZMmXKz++swt5bQiYDXYGfdru+FjhhP6e6BXgcgN///vfB0TC5gUXRMWvWLK688krAlhApVlwBlBQT9evX58EHHwQKtoSMHDlyt5aQy/bySUdTMPzFsf/hD2AQcDIAX3/9db6WEEXPFVdcQefOnQFbQqRYMQBKiplbbrklX0tI9+6RZ/6qVKnCxIkTiYvLvXX7EjBjD5/SAmi727V9uW1cmArAFHKfF1y0aBGvvfaaLSFFYNiwYflaQgYPHhzbgaSQMQBKipn4+HgmTJhA5cqVAZg6dSrTpk0D4LzzzuP222/P8+6OwGfAs4V80vTdXv/5IKZqADwQvHruueeYM2cO//vf/w7iM7W7SpUqMWnSJOLjI/8Yuvvuu1m2bFmMp5LCwwAoKaaOO+44nnzyyeD19ddfz2effQbA/fffT4MGDX7+yTagFpEjW+bl+YTM3T4xGn3CtwFNgfwtIb9U1ikazj33XPr06QNEWkLat29vS4hUTAyAkmLu6quv5uqrrwYiLSGdO3cmOzub8uXLM27cOBISEn5+Z+5zYj3I7fGFRrt92pVRmCgBmMDuLSFpaWlR+Gzldffdd9sSIsWAAVBSifDEE09QvXp1AObPn8/jjz/OBx98QNeuXQvZIPAkkb++Nv78n1wPR3Gigi0h8+bNsyUkygprCZk9e3aMp5JKP4+BkRRzW7Zs4aKLLuL1118PriUkJFC2bFm2bt0KRM6Q++Wvq+OAdUR27L6f55Oi/ddZDnAVuRtQatWqRbdu3ejevTtHHHFElL8r3EaOHEmPHj0AOProo1m1ahW/+c1vYjyVVHq5Aigp5ipWrMgFF1yQ79quXbuC8PenP/2JF154IU9LyGfADeQPf9cXwWT5W0LWrl1rS0gR6d69OxdddBFgS4hUHFwBlFQi7Ny5k7JlC9a1nXrqqSxatIjDDz+c6dOnc9VVV+3hE7L59caPAzWPyHEzkZXJrl278o9//CN4dk3R8eWXX5KYmMj69esBGDduXHBeoKTocgVQUsx99NFHhYY/gBUrVrB48WIA2rZtS/v27Qt510UUXfgDaA7cDERWJmfNmsWLL77Ihg0bivA7w+eYY45hzJgxwesePXqQmbn7Lm9J0WAAlBRTN910E3/84x/3+POcnBw6deqUryXkd7/73W7v+r+iGzAwCDgRsCWkKOVtCfn+++/p2LGjLSFSETAASoqJTZs2ERcXx4gRI/Jdr1OnDn/9618BglXBvC0hlStXpnz58rt92nNFPO02YADwcXAlIyODDz/80JaQIjBs2LCgG9iWEKloGAAlFbsnn3wyz4aOX4wbN46PP/6Yf/7znxx99NGMHTs2eN/UqVN55pln6NGjR3BQ9C86EukMLgrvEGkWGUruLuMzzzyT66+/nsMPP5xXXnmFL774ooi+O5xsCZGKnptAJBWbXbt2UbNmzQKBKSEhgU2bNuU7WuWLL77g2GOP5ZlnnuGaa64BoEKFCsHOYIDq1avnqWhLAqIZErKB4UAfIiuAkRXJgQMHcuutt7JgwQIWLFgAwFFHHUXXrl0pV65cFL9fd955Jw8++CAQ2QmekZHB4YcfHuOppNLBFUBJxWLevHmUKVOmQPjr3bs3O3fuLHCu3rHHRo5eydsSkjf8VatWjeeffz7P7eAMYEiUpv0cuAC4hdzwd/LJJ7NkyRLuuOMOEhISaNKkSXBw9fr163n11Vej9N3Klbcl5IMPPqBXr14xnkgqPQyAkopc8+bNadGiRYHra9eu5aGHHvrV33/iiSc47rjj8l3r0aMHp59++m6/3xdYc5DTzgDqk7dv+Oabb2bp0qV5eonhk08+4fvvvw9eF7wtrYNVrlw5pkyZwmGHHQZE/ndgS4gUHQZASUXm448/Ji4ujvnz5+e7fskll5CTk8MJJ5ywT59TtWrVAqs/559/PhDZRdy8efOfr2YDzfilJ3h/bAI6AG3JrZc79thjSUtL47HHHguqynbu3MmcOXOYNGkSmzdvBiK3pnPnUXSddNJJDB06NHjdpUsXvvvuuxhOJJUOPgMoqUj07NmT4cOHF7i+cOFCzj333P3+vLi4/Of8JSYm8tZbb1GhQgU+//xz6tevz8aNub3A3Yg0eOyrBUTC36fBlTZt2vDkk09SrVq14NpXX33Fc889xzfffBNcq1WrFpdddhmVKlXa7z+T9k1OTg4tW7YMVv8uv/xyZs6cWeB/E5L2nQFQUlRt3ryZypUrF7hep04dPvzww2Bn5/5Yu3YttWvXLnD9tttu4+GHHwZgxowZtG3bNs9PXwPO+ZVPzj3e5ZcdvpUqVeKJJ56gXbt2QcDIycnhjTfeYP78+cGZdAkJCTRv3pwzzzzTIFIMdm8JGTt2LF26dInxVNKhywAoKWpGjx5Nt27dClw/2Eqv3/zmN8E/+CHybNj27duJi4tj3rx5NGvWDIAOHTowefLkn99VGfgG2NPO3HeBdsCK4ErTpk2ZMGECNWvWDK5t2rSJ559/nnXr1gXXfv/733PFFVcUciC1itKsWbO48sorATjyyCNZsWJFof9iIOnXGQAlHbRdu3Zxwgkn8Pnnn+e7XtjxLvtr06ZN+c4MHDJkCAkJCdx2220A1KhRg5UrV1K1alU2bdpE/fr1+fTT3Fu5LYGXdvvEbGAE0JvCjndJSEgI3rlq1Speeukltm3bFlw7++yzadasGWXKlDngP5MO3LXXXsu4ceMAOOecc3jllVcoU6YMs2fPZu3atfz444/B/zYk7ZkBUNJBefnllwvdANGrV6+oNDiccsopvPvuu8HrnJwcsrOzSU5ODjaXXH311UydOhWAV199lWbNmvHLX23TiGzsAPgC6AKkBZ938sknM3nyZE499dTg2k8//cR//vMf3nnnneBapUqVuPzyy/d544qKxpYtW2jQoAFr164F4IEHHuDOO+/ktNNOY/ny5ZQtW5Zt27Z5W176FQZASQesRYsWzJs3r8D1tWvXRiUo7dixI9/hyikpKTz11FNA5NiV+vXrBx3BU6dODc4L7N27N0OG5J4JWB74ikjoSyF3hy9EjncZNGhQsMM3d/bnn38+2OELkQ0nLVu2zPc+xc6iRYto0qQJ2dnZlClThjfeeIM777yTuXPnArBhwwaqVq0a4ymlks0AKGm/rVmzhj/84Q8Frrds2ZKXXtr9luuBu/jii/Od+5adnZ1vZWfatGlB6KtcuTKrVq3iuOOOY9u2bfz5z39mxYrc5/uqkjf4HXvssYwfPz7f2YQ7d+5k3rx5vPnmm8G1ChUqcMkll3DKKadE7c+k6Ojfvz8DBw4EIi0hp512GtOmTQNg9erVnHTSSbEcTyrxPAdQ0n65+eabCw1/CxcujGr4y8nJyRf+kpOTC9zWu+qqq4KauE2bNtGpUyeys7MpX748U6ZMydMS8kv4a9OmDStXrswX/r7++muefvrpfOGvVq1adOvWzfBXwrz//vtMnTqVO++8k4YNGwKRlpD3338/eE/eY3okFc4AKGmfbN68mbi4OIYNG5bveu3atdm1a9cBne23N927d8/3ek/hMm9LyMsvv8xjjz0GRJ7t2/0ZxL/85S8MHTo0ONsvJyeH119/naeffjoIDQkJCVxwwQV06NCh0ONsFFuDBg2iXbt21KtXj4svvji4Lb98+fLgPQZA6dcZAKVSqnfv3jRs2JC4uDh69+5d4OepqanBz1u3bk16evoeP2vMmDGFhqGxY8eyZs2aAzrb79c8+eQvBzmfdNJJlC1bttD3ValShQkTJgSrg/369WPlypVApC4u70rf2rVree6559i2bRubNm1i4sSJpKWlBWf7/e53v+O6667jrLPOchNBCfTll18Gm33WrVvHAw88UOhu7K+//rq4R5MOOT4DKJViY8aMIS0tjdTUVAr7v3pmZiajR4/e427dXbt2UatWrQI9t/Hx8WzatIkjjzyySOZ+5JFHuP3224PX+/JQ/x133BEcCp23JeSLL74gMTExaAm5/PLLufTSS/nyyy/zHe9y1llncf7553u8SwmWk5PDggULeOihh/baCXzXXXdx2WWXsXTpUtasWcPpp59OixYtGDNmDBD5l4auXbsW19hSieQKoFSKZWVlBeEu9x9+eWVkZJCSklLo77788suUKVOmQPi7/fbb2bVrV5GFv9zvyFW1atV92tH5wAMPUL9+fSByfl///v2ByIaP3J3DAP/5z39Yvnx5EP4qVapEx44dueCCCwx/JVxcXBxNmzblv//9L8uXL+eaa64pdPV59OjRzJkzh65duzJ48GCuu+46Bg0aFPRJR+N4IulQZwCUSrnatWuTlJTE6NGjC/wsMzOz0CaF5OTkQs/2W7t2LUOHDi2SOXPNnDkz3+ulS5fu0++VL1+eyZMnB8fGPPLII8E5gW3atKFDhw4AbNu2jeeee47s7GwSExO5/vrrqVWrVhT/BCoODRo0YMqUKXz88cd079493yMC33zzDT169Mj3/jp16gDs8f8LUtgYAKVSKiMjg6SkJAD69u1LRkYGGRkZe/2dNWvWEBcXV+B5wJYtW5KTk1MshyC3atUq3+v9qfpKTExk0KBBwetOnToFt35HjBjBMcccA8Ann3zCli1buOKKKzzb7xBXq1YtRo4cyZo1azjssMMAaN68ebBCnZmZSVZWFm3atAEiZ1fmfS5UCisDoFRKLV26NPgHXatWrahSpUq+lY+srKx84WpPx7u8+uqrUT3eZW8WL16c7/WiRYv2+zNuvvnmYPXy888/D3YTf/DBB2zatCl438iRI/PtHNWh7bjjjuObb77hm2++IS3tl6aX9PR0ateuna9OUJIBUCq1chsycnXt2jXfc4Dp6em0aNGCH3/8kXPPPbfA8S61atVi165dNGnSpDjGBSIbMfI6++yz9/sz4uPjmTBhQvAP/GeeeYb777+f5ORkTj31VG6++WYg0jLSvn17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2LFjB2effTZLly4FoHv37owcOTImM0oqeq4ASlIxmDt3bvCMXazCH8CVV165zy0h//3vf2M2p6Si5QqgJBWx3NW/HTt28OabbwaHM8fK7i0hDz74IH379gVsCZHCwgAoSUXslVdeoVmzZvzf//0ff/3rX2M9DgCvvfYaTZs2DTZ+LF68mKSkJHJycrjkkkuC1b/LLruMWbNmxTy0SoouA6AkFbELLriAb7/9loyMjBIVpPbUEvLVV1+RmJjId999B8C//vUvrr322liOKinKfAZQkorQ6tWrSUtL4/bbby9R4Q/gnnvuISkpCYjM2bt3byBy6/fpp58O3tezZ08yMzNjMqOkomEAlKQiNGrUKH73u98FO29LksJaQnLPCbzsssuCVb/vv/+eDh062BIilSIGQEkqIps3b2b8+PF07dqV8uXLx3qcQtWtW5ehQ4cGr7t06cL69esBePzxx4OWkNdff92WEKkUMQBKUhGZPn06P/74IykpKbEeZa+6d+/OhRdeCMCXX35JSkoKOTk5VKxYkcmTJwd9xffcc09wTqCkQ5sBUJKKyOTJk2nRogU1atSI9Sh7FRcXl68lZObMmUycOBGAs846y5YQqRQyAEpSEVi3bh0LFiygQ4cOsR5ln1SvXj3fxo8ePXqwdu1aAAYMGBB0A3/wwQfccccdMZlRUvQYACWpCEydOpXDDz+cyy67LNaj7LMrrriCzp07A5GWkA4dOhTaEjJq1Cj+85//xHBSSQfLAChJRWDWrFn89a9/5cgjj4z1KPtl2LBhnHDCCQAsWrSIIUOGAPCnP/2JRx55JHjftddey7fffhuLESVFgQFQkqLsiy++YNmyZfztb3+L9Sj7rVKlSkyaNCnY+DFgwAAyMjIA6NatGy1btgTg66+/pmvXrtglIB2aDICSFGUvvvgiCQkJXHzxxbEe5YCce+659OnTB4hs/GjXrh0//vgjcXFx/Otf/wq6gZ9//nnGjRsXy1ElHSADoCRF2QsvvMC5555L1apVYz3KAbv77ruDlpD3338/X0tIr169gvf17NmTNWvWxGRGSQfOLmBJiqKdO3dSrVo1+vTpExyfcqhavXo1SUlJbN26FYDZs2dTtWpVkpOTqVChAt988w0QOSpmwYIFlClTJpbjStoPrgBKUhQtX76cLVu20LRp01iPctB2bwlp164dzZs355RT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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for i in range(0,10):\n", " doright(None)\n", " clear_output(wait=True)\n", " display(sketch2PNG()) \n", " time.sleep(0.01)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 4 }