Switch to side-by-side view

--- a
+++ b/examples/create meshes/Create Muscle Mesh Jan.28.2022.ipynb
@@ -0,0 +1,289 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "f11c51b1",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import pymskt as mskt\n",
+    "import SimpleITK as sitk\n",
+    "import numpy as np\n",
+    "import os\n",
+    "\n",
+    "from pymskt.mesh import Mesh"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "id": "20bbd34d",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "location_seg = '../../data/muscles/segmentation.nii.gz'\n",
+    "location_save = os.path.expanduser('~/Downloads')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "id": "c43ac4d4",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "Use of `point_arrays` is deprecated. Use `point_data` instead.\n",
+      "Use of `cell_arrays` is deprecated. Use `cell_data` instead.\n"
+     ]
+    }
+   ],
+   "source": [
+    "# Loading the image in first so we can see what the labels are. \n",
+    "# This can be skipped and a path provided directly if we know\n",
+    "# the labels of interest. \n",
+    "seg_image = sitk.ReadImage(location_seg)\n",
+    "array = sitk.GetArrayFromImage(seg_image)\n",
+    "seg_labels = np.unique(array)\n",
+    "\n",
+    "mesh1 = Mesh(\n",
+    "    seg_image=seg_image,\n",
+    "    label_idx=seg_labels[1]\n",
+    "    \n",
+    ")\n",
+    "\n",
+    "# Below is the command to create the mesh\n",
+    "# all of the defaults inputs parameters are being listed \n",
+    "# so that the available options are shown. \n",
+    "mesh1.create_mesh(\n",
+    "    smooth_image=True,            # I suggest leaving this on to help create smooth surfaces.   \n",
+    "    smooth_image_var=0.3125/2,    # this is the variance of a gaussian filter - can probably be bigger for muscles.\n",
+    "    marching_cubes_threshold=0.5, # this probably shouldnt be changed. \n",
+    "    label_idx=None,               # Can specify this here instead of above if you want. \n",
+    "    min_n_pixels=None,            # if there is a minimum number of pixels you want for it to create a mesh. \n",
+    ")\n",
+    "\n",
+    "mesh1.resample_surface(clusters=10000) # Resample surface to be a specified # of vertices (w/ in a small margin of error)\n",
+    "\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a4c3a458",
+   "metadata": {},
+   "source": [
+    "## Save the mesh"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "id": "7bd7c341",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "mesh1.save_mesh(os.path.join(location_save, 'mesh1.vtk')) # Save .vtk version of the mesh\n",
+    "mesh1.save_mesh(os.path.join(location_save, 'mesh1.stl')) # Save .stl version of the mesh. "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "394b11b0",
+   "metadata": {},
+   "source": [
+    "# If you want to iterate over all of the labels and save meshes: "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "c4c39deb",
+   "metadata": {},
+   "source": [
+    "### First create a dictionary to store all of the meshes"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "id": "4368b846",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "dict_meshes = {}\n",
+    "for label_idx in seg_labels[1:]:\n",
+    "    dict_meshes[label_idx] = mskt.mesh.Mesh(\n",
+    "        seg_image=seg_image,\n",
+    "        label_idx=label_idx\n",
+    "\n",
+    "    )\n",
+    "    \n",
+    "    dict_meshes[label_idx].create_mesh(smooth_image_var=3.0) # I ADDED MORE SMOOTHING FOR THESE\n",
+    "    dict_meshes[label_idx].resample_surface(clusters=10000)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "1cc29d8d",
+   "metadata": {},
+   "source": [
+    "### Save each mesh"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "id": "f5d6738e",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "for key, mesh in dict_meshes.items():\n",
+    "    mesh.save_mesh(os.path.join(location_save, f'muscle_mesh{key}.vtk')) # Save vtk version\n",
+    "    mesh.save_mesh(os.path.join(location_save, f'muscle_mesh{key}.stl')) # Save stl version"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "b0a66862",
+   "metadata": {},
+   "source": [
+    "# Below is the viewer that should work to see these in jupyter notebooks\n",
+    "- This wasnt working on my computer for some reason. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "id": "b9f350ba",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from itkwidgets import view"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "id": "505700e8",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "array([ 0, 14, 16, 18, 20, 22, 24, 26], dtype=uint16)"
+      ]
+     },
+     "execution_count": 14,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "seg_labels"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "id": "52169ea2",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "5f7605d7f4274c78bbcbcb884feb90f8",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "Viewer(geometries=[{'vtkClass': 'vtkPolyData', 'points': {'vtkClass': 'vtkPoints', 'name': '_points', 'numberO…"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "# view expects geometries to be in a list: \n",
+    "geometries = [\n",
+    "    dict_meshes[14].mesh  # the Mesh object has the actual mesh inside of it at Mesh.mesh\n",
+    "]\n",
+    "view(geometries=geometries)\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9c6b9c5a",
+   "metadata": {},
+   "source": [
+    "### Show multiple meshes at once: "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "id": "ddf2bed6",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "b9275aa069ce432b9ab363874895c7d4",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "Viewer(geometries=[{'vtkClass': 'vtkPolyData', 'points': {'vtkClass': 'vtkPoints', 'name': '_points', 'numberO…"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "# view expects geometries to be in a list: \n",
+    "geometries = [\n",
+    "    dict_meshes[14].mesh,  # the Mesh object has the actual mesh inside of it at Mesh.mesh\n",
+    "    dict_meshes[16].mesh,\n",
+    "    dict_meshes[18].mesh,\n",
+    "    dict_meshes[20].mesh,\n",
+    "    dict_meshes[22].mesh,\n",
+    "    dict_meshes[24].mesh,\n",
+    "    dict_meshes[26].mesh\n",
+    "]\n",
+    "view(geometries=geometries)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "397e00d4",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "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.12"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}