{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## driver Jupyter notebook for STEPCRAFT navigation, images acquisition, and automatisation" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The autoreload extension is already loaded. To reload it, use:\n", " %reload_ext autoreload\n" ] } ], "source": [ "#import the necessary libraries\n", "%load_ext autoreload\n", "%autoreload 2\n", "\n", "import sys,json\n", "FlumeAutomationLib='../lib/' #path to OctControl.pyd, GRBLserver.py, ImageAcquisition\n", "if not FlumeAutomationLib in sys.path:\n", " sys.path.append(FlumeAutomationLib)\n", "\n", "import OctControl \n", "import GRBLserver\n", "from ImageAcquisition import *" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "ename": "WebSocketBadStatusException", "evalue": "Handshake status 404", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mWebSocketBadStatusException\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mstp\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mGRBLserver\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgrbl\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mport\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m5020\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconName\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'sberpc17.epfl.ch'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#connect to stepcraft\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;31m#port and conname are port and IP address of the GRBL server (see GRBLserver.py)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/Documents/GitLab/automated-oct-scans-acquisition/lib/GRBLserver.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, conName, port, url)\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 16\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcreate_connection\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"ws://\"\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mconName\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;34m\":\"\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mport\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;34m\"/ws\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 17\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msettimeout\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1.0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstatus\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/websocket/_core.py\u001b[0m in \u001b[0;36mcreate_connection\u001b[0;34m(url, timeout, class_, **options)\u001b[0m\n\u001b[1;32m 485\u001b[0m skip_utf8_validation=skip_utf8_validation, **options)\n\u001b[1;32m 486\u001b[0m \u001b[0mwebsock\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msettimeout\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtimeout\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mgetdefaulttimeout\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 487\u001b[0;31m \u001b[0mwebsock\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconnect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 488\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mwebsock\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/websocket/_core.py\u001b[0m in \u001b[0;36mconnect\u001b[0;34m(self, url, **options)\u001b[0m\n\u001b[1;32m 212\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 213\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 214\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhandshake_response\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhandshake\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msock\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0maddrs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 215\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconnected\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[0;32mexcept\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/websocket/_handshake.py\u001b[0m in \u001b[0;36mhandshake\u001b[0;34m(sock, hostname, port, resource, **options)\u001b[0m\n\u001b[1;32m 67\u001b[0m \u001b[0mdump\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"request header\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mheader_str\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 69\u001b[0;31m \u001b[0mstatus\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_get_resp_headers\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msock\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 70\u001b[0m \u001b[0msuccess\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msubproto\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_validate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"subprotocols\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 71\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0msuccess\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/websocket/_handshake.py\u001b[0m in \u001b[0;36m_get_resp_headers\u001b[0;34m(sock, success_status)\u001b[0m\n\u001b[1;32m 127\u001b[0m \u001b[0mstatus\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresp_headers\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mread_headers\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msock\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 128\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mstatus\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0msuccess_status\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 129\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mWebSocketBadStatusException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Handshake status %d\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstatus\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 130\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mstatus\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresp_headers\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 131\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mWebSocketBadStatusException\u001b[0m: Handshake status 404" ] } ], "source": [ "stp=GRBLserver.grbl(port=5020, conName='sberpc17.epfl.ch') #connect to stepcraft\n", "#port and conname are port and IP address of the GRBL server (see GRBLserver.py)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "OctControl.init() #initialize OCT, NB ThorImage software has to be closed before\n", "params=json.load(open(\"../lib/config.json\")) #path to config.json, containing the image acquisition parameters, to be set according to your needs\n", "OctControl.setParameters(**params)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " commands to navigate the STEPCRAFT:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "stp.homing() #home the device" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "stp.moveTo(x=-500,y=-2,z=-1) #move stepcraft in position (x=-500,y=-2,z=-1)\n", "stp.waitFinish()\n", "print(stp.status)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "commands to acquire OCT scans:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "makeScan(params={\"nBscans\":900}) #OCT scan in the current position of the CNC device, the number of Bscans can be modified here directly" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "makeMoveScan(pos=(-463.5, -11.5, -40), params={}) #OCT scan in position with coordinates(-463.5, -11.5, -40)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#set here the coordinates of the positions of interest\n", "positions={\n", " \"pos1\":(-134.003,-11.5,-47.199),\n", " \"pos2\":(-134.003,-165.998,-47.199),\n", " \"pos3\":(-134.003,-396.001,-47.401)} " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "makeMoveScan(stp_position=\"pos1\", params={\"nBscans\":10}) #make OCT scan in position pos1" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "multipleScan('pos1', n=(3,3)) #acquire 9 images in a square tiling pattern (3 by 3), overlapping by 30%, \n", " #centered in position pos1\n", " #in order to change overlap between images, \n", " #change the function multipleScan in the library ImageAcquisition.py" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "G0Z-0.500\n", "G0X-141.003Y-18.500\n", "G0Z-47.451\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-134.003Y-18.500\n", "G0Z-47.451\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-127.003Y-18.500\n", "G0Z-47.451\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-141.003Y-11.500\n", "G0Z-47.451\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-134.003Y-11.500\n", "G0Z-47.451\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-127.003Y-11.500\n", "G0Z-47.451\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-141.003Y-4.500\n", "G0Z-47.451\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-134.003Y-4.500\n", "G0Z-47.451\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-127.003Y-4.500\n", "G0Z-47.451\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-141.003Y-172.998\n", "G0Z-47.454\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-134.003Y-172.998\n", "G0Z-47.454\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-127.003Y-172.998\n", "G0Z-47.454\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-141.003Y-165.998\n", "G0Z-47.454\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-134.003Y-165.998\n", "G0Z-47.454\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-127.003Y-165.998\n", "G0Z-47.454\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-141.003Y-158.998\n", "G0Z-47.454\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-134.003Y-158.998\n", "G0Z-47.454\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-127.003Y-158.998\n", "G0Z-47.454\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-141.003Y-403.001\n", "G0Z-47.351\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-134.003Y-403.001\n", "G0Z-47.351\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-127.003Y-403.001\n", "G0Z-47.351\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-141.003Y-396.001\n", "G0Z-47.351\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-134.003Y-396.001\n", "G0Z-47.351\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-127.003Y-396.001\n", "G0Z-47.351\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-141.003Y-389.001\n", "G0Z-47.351\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-134.003Y-389.001\n", "G0Z-47.351\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-127.003Y-389.001\n", "G0Z-47.351\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-191.003Y-403.001\n", "G0Z-47.504\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-184.003Y-403.001\n", "G0Z-47.504\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-177.003Y-403.001\n", "G0Z-47.504\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-191.003Y-396.001\n", "G0Z-47.504\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-184.003Y-396.001\n", "G0Z-47.504\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-177.003Y-396.001\n", "G0Z-47.504\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-191.003Y-389.001\n", "G0Z-47.504\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-184.003Y-389.001\n", "G0Z-47.504\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-177.003Y-389.001\n", "G0Z-47.504\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-91.000Y-403.001\n", "G0Z-47.706\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-84.000Y-403.001\n", "G0Z-47.706\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-77.000Y-403.001\n", "G0Z-47.706\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-91.000Y-396.001\n", "G0Z-47.706\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-84.000Y-396.001\n", "G0Z-47.706\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-77.000Y-396.001\n", "G0Z-47.706\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-91.000Y-389.001\n", "G0Z-47.706\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-84.000Y-389.001\n", "G0Z-47.706\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-77.000Y-389.001\n", "G0Z-47.706\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-141.003Y-673.500\n", "G0Z-46.904\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-134.003Y-673.500\n", "G0Z-46.904\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-127.003Y-673.500\n", "G0Z-46.904\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-141.003Y-666.500\n", "G0Z-46.904\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-134.003Y-666.500\n", "G0Z-46.904\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-127.003Y-666.500\n", "G0Z-46.904\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-141.003Y-659.500\n", "G0Z-46.904\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-134.003Y-659.500\n", "G0Z-46.904\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-127.003Y-659.500\n", "G0Z-46.904\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-219.003Y-673.500\n", "G0Z-47.330\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-212.003Y-673.500\n", "G0Z-47.330\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-205.003Y-673.500\n", "G0Z-47.330\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-219.003Y-666.500\n", "G0Z-47.330\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-212.003Y-666.500\n", "G0Z-47.330\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-205.003Y-666.500\n", "G0Z-47.330\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-219.003Y-659.500\n", "G0Z-47.330\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-212.003Y-659.500\n", "G0Z-47.330\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-205.003Y-659.500\n", "G0Z-47.330\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-63.003Y-673.500\n", "G0Z-47.651\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-56.003Y-673.500\n", "G0Z-47.651\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-49.003Y-673.500\n", "G0Z-47.651\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-63.003Y-666.500\n", "G0Z-47.651\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-56.003Y-666.500\n", "G0Z-47.651\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-49.003Y-666.500\n", "G0Z-47.651\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-63.003Y-659.500\n", "G0Z-47.651\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-56.003Y-659.500\n", "G0Z-47.651\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-49.003Y-659.500\n", "G0Z-47.651\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-141.003Y-807.500\n", "G0Z-46.751\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-134.003Y-807.500\n", "G0Z-46.751\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-127.003Y-807.500\n", "G0Z-46.751\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-141.003Y-800.500\n", "G0Z-46.751\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-134.003Y-800.500\n", "G0Z-46.751\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-127.003Y-800.500\n", "G0Z-46.751\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-141.003Y-793.500\n", "G0Z-46.751\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-134.003Y-793.500\n", "G0Z-46.751\n", "G0Z-0.500\n", "G0Z-0.500\n", "G0X-127.003Y-793.500\n", "G0Z-46.751\n", "G0Z-0.500\n", "Elapsed time is 9958.285581350327 seconds.\n" ] } ], "source": [ "tic() #take 3 by 3 tiles in each position defined in the dictionary 'positions'\n", "for p in positions:\n", " multipleScan(p, n=(3,3))\n", "toc()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "OctControl.close() #close the OCT device" ] } ], "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.6.3" } }, "nbformat": 4, "nbformat_minor": 2 }