{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n# Mesh manipulation\n\nUsing a mesh and modifying it while it is displayed\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "from __future__ import absolute_import\nfrom soma import aims\nimport time\nimport anatomist.direct.api as anatomist\nimport sys\nfrom soma.qt_gui.qt_backend.QtGui import qApp\nfrom soma.qt_gui.qt_backend import Qt\nimport six\n\n# create a unit sphere of radius 1 and 500 vertices\nm = aims.SurfaceGenerator.sphere(aims.Point3df(0, 0, 0), 1, 500, False)\n\n# Multiply the sphere size by 100\nfor p in six.moves.xrange(m.vertex().size()):\n    m.vertex()[p] *= 100\n\nrunloop = Qt.QApplication.instance() is None and 'IPython' not in sys.modules\n\n# Open Anatomist\na = anatomist.Anatomist()\n\n# Put the mesh in anatomist\nam = a.toAObject(m)\nam.releaseAppRef()\n\n# Create a new 3D window in Anatomist\naw = a.createWindow('3D')\n# c = anatomist.CreateWindowCommand( '3D' )\n# proc.execute( c )\n# aw = c.createdWindow()\n\n# Put the mesh in the created window\na.addObjects(am, aw)\n# c = anatomist.AddObjectCommand( [ am ], [ aw ] )\n# proc.execuFalsete( c )\n\n# keep a copy of original vertices\ncoords = [aims.Point3df(m.vertex()[i])\n          for i in six.moves.xrange(len(m.vertex()))]\n# take one vertex out of 3\npoints = six.moves.xrange(0, len(coords), 3)\n\nfor i in six.moves.xrange(10):\n    # shrink\n    for s in reversed(six.moves.xrange(100)):\n        for p in points:\n            m.vertex()[p] = coords[p] * s / 100.\n        am.setChanged()\n        am.notifyObservers()\n        qApp.processEvents()\n        time.sleep(0.01)\n    # expand\n    for s in six.moves.xrange(100):\n        for p in points:\n            m.vertex()[p] = coords[p] * s / 100.\n        am.setChanged()\n        am.notifyObservers()\n        qApp.processEvents()\n        time.sleep(0.01)\n\n# display in matplotlib for sphinx_gallery\ns = 0\nfor p in points:\n    m.vertex()[p] = coords[p] * s / 100.\nam.setChanged()\nam.notifyObservers()\nif aw.sphinx_gallery_snapshot():\n    runloop = False\nif runloop:\n    Qt.QApplication.instance().exec_()\nif runloop or 'sphinx_gallery' in sys.modules:\n    del aw, am, m"
      ]
    }
  ],
  "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.11.0"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}