In the last post, we looked at the core technology we’re going to use to expose our web-service, along with the basic project set-up. In today’s post, we’re going to flesh out this project and see the web-service in action.
At this point, I should point out that I've switched back across for VS2010 for the purposes of this post (and its immediate successors), as it really will simplify the eventual integration with Windows Azure.
Before we dive into the implementation of our web-service, here are a few words on what we’re after…
We want to implement two web-service APIs:
- One that will provide the circles representing an Apollonian gasket (in 2D)
- One that will provide the spheres representing an Apollonian packing (in 3D)
Both of these services will take a radius (for the enclosing circle/sphere) and a “level” (i.e. the number of times we should recurse to create our fractal geometry).
They should be accessible via a simple URL – as we’re talking REST rather than SOAP – for example, with a provisional domain name:
http://myapollonianservice.com/circles/5/3 should return the circles enclosed in an outer circle of radius 5, recursing through 3 levels.
http://myapollonianservice.com/spheres/10/4 should return the spheres enclosed in an outer sphere of radius 10, recursing through 4 levels.
The results should be returned as JSON containing the circle/sphere definitions. These will simply be records containing fields for the center (X, Y, [Z] and radius (or curvature, for circles), and also the “level” of each circle/sphere, so we can colorise appropriately).
Let’s take a look at the structure of our boilerplate solution…
There are two projects: a C# project called ApollonianPackingWebApi that acts as the main entry-point into our code, but is very shallow. It exists to call through into the F# project, ApollonianPackingWebAppApi, where our application logic is all defined.
It’s the code in this latter project that we care about, particularly that contained in two files: Global.fs and ValuesControllers.fs file.
The standard Global.fs contains the below code which defines the way the REST API’s URL structure translates into calls into the project’s code:
namespace FsWeb
open System
open System.Web
open System.Web.Mvc
open System.Web.Routing
open System.Web.Http
open System.Data.Entity
type Route = { controller : string
action : string
id : UrlParameter }
type MapHttpRouteSettings = { id : obj }
type Global() =
inherit System.Web.HttpApplication()
static member RegisterGlobalFilters(filters:GlobalFilterCollection) =
filters.Add(new HandleErrorAttribute())
static member RegisterRoutes(routes:RouteCollection) =
routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", {id = RouteParameter.Optional}) |> ignore
routes.MapRoute("Default",
"{controller}/{action}/{id}",
{ controller = "Home"; action = "Index"
id = UrlParameter.Optional } )
member this.Start() =
AreaRegistration.RegisterAllAreas()
Global.RegisterGlobalFilters(GlobalFilters.Filters)
Global.RegisterRoutes(RouteTable.Routes)
The actual “intelligence” of the app is contained in ValuesControllers.fs:
namespace FsWeb.Controllers
open System.Web
open System.Web.Mvc
open System.Net.Http
open System.Web.Http
type ValuesController() =
inherit ApiController()
// GET /api/values
member x.Get() = [| "value1"; "value2" |] |> Array.toSeq
// GET /api/values/5
member x.Get (id:int) = "value"
// POST /api/values
member x.Post (value:string) = ()
// PUT /api/values/5
member x.Put (id:int) (value:string) = ()
// DELETE /api/values/5
member x.Delete (id:int) = ()
This should be familiar if you’ve spent time looking at the introductory blog post I pointed to, last time.
Now for the changes we want to make… Let’s start with Globals.fs, which is being adjusted to have “rad” and “steps” parameters registered for our API controller(s).
namespace FsWeb
open System.Web.Mvc
open System.Web.Routing
open System.Web.Http
type Route =
{ controller : string
action : string
rad : UrlParameter
steps : UrlParameter }
type MapHttpRouteSettings =
{ rad : obj
steps : obj }
type Global() =
inherit System.Web.HttpApplication()
static member RegisterGlobalFilters(gfc:GlobalFilterCollection) =
gfc.Add(new HandleErrorAttribute())
static member RegisterRoutes(rc:RouteCollection) =
rc.IgnoreRoute("{resource}.axd/{*pathInfo}")
rc.MapHttpRoute(
"DefaultApi",
"api/{controller}/{rad}/{steps}",
{ rad = RouteParameter.Optional
steps = RouteParameter.Optional }) |> ignore
rc.MapRoute(
"Default",
"{controller}/{action}/{rad}/{steps}",
{ controller = "Home"
action = "Index"
rad = UrlParameter.Optional
steps = UrlParameter.Optional } )
member this.Start() =
AreaRegistration.RegisterAllAreas()
Global.RegisterGlobalFilters(GlobalFilters.Filters)
Global.RegisterRoutes(RouteTable.Routes)
The ValuesController.fs file is actually being replaced with two files: CirclesController.fs and SpheresController.fs.
Here’s CirclesController.cs, which simply calls into the CirclePackingFull.fs file copied directly from our previous project (where the code ran directly inside AutoCAD):
namespace FsWeb.Controllers
open System.Web.Http
type Circle (X, Y, Curvature, Level) =
member this.x = X
member this.y = Y
member this.k = Curvature
member this.l = Level
type CirclesController() =
inherit ApiController()
// GET /api/values/rad/steps
member x.Get(rad:double, steps:int) =
CirclePackingFullFs.Packer.ApollonianGasket rad steps |>
List.map (fun ((a,b,c),d) -> new Circle(a,b,c,d)) |>
List.toSeq
And here’s SpheresController.fs, which calls into the analogous SpherePackingInversion.fs file (the code from this post):
namespace FsWeb.Controllers
open System.Web.Http
type Sphere (X, Y, Z, Radius, Level) =
member this.x = X
member this.y = Y
member this.z = Z
member this.r = Radius
member this.l = Level
type SpheresController() =
inherit ApiController()
// GET /api/values/rad/steps
member x.Get(rad:double, steps:int) =
SpherePackingInversionFs.Packer.ApollonianGasket steps 0.01 false
|>
List.map
(fun ((a,b,c,d),e) -> new Sphere(a*rad,b*rad,c*rad,d*rad,e))
|>
List.toSeq
Now it should just be a matter of building the app and starting Internet Explorer from the debugger, which shows the default web-page provided in the boilerplate project:
To test our APIs, we can extend the URL shown in the address bar to try them both:
http://localhost:64114/api/circles/5/3
and
http://localhost:64114/api/spheres/10/4
Here is the JSON data – returned as plain text from the API – for the first call:
[{"Curvature":0.43094010767585034,"Level":3,"X":5,"Y":7.6794919243112272},{"Curvature":0.43094010767585034,"Level":3,"X":7.3205080756887728,"Y":3.6602540378443873},{"Curvature":0.43094010767585034,"Level":3,"X":2.6794919243112272,"Y":3.6602540378443873},{"Curvature":2.7856406460551022,"Level":2,"X":4.9999999999999991,"Y":5},{"Curvature":6.8641016151377556,"Level":1,"X":5.4370564668483263,"Y":5.2523346687859487},{"Curvature":12.66632301492381,"Level":0,"X":5.6315960828232612,"Y":5.3646521684371233},{"Curvature":19.730424630061563,"Level":0,"X":5.4054651711758446,"Y":5.0585238564313482},{"Curvature":19.730424630061563,"Level":0,"X":5.2534157319849024,"Y":5.321881210372414},{"Curvature":6.8641016151377556,"Level":1,"X":4.9999999999999991,"Y":4.4953306624281035},{"Curvature":12.66632301492381,"Level":0,"X":4.9999999999999982,"Y":4.2706956631257533},{"Curvature":19.730424630061563,"Level":0,"X":4.8479505608090578,"Y":4.6195949331962387},{"Curvature":19.730424630061563,"Level":0,"X":5.15204943919094,"Y":4.6195949331962387},{"Curvature":6.8641016151377556,"Level":1,"X":4.5629435331516728,"Y":5.2523346687859487},{"Curvature":12.66632301492381,"Level":0,"X":4.3684039171767388,"Y":5.3646521684371242},{"Curvature":19.730424630061563,"Level":0,"X":4.7465842680150976,"Y":5.3218812103724131},{"Curvature":19.730424630061563,"Level":0,"X":4.5945348288241563,"Y":5.0585238564313491},{"Curvature":0.8928203230275511,"Level":1,"X":8.3601385660969356,"Y":6.93997690565051},{"Curvature":3.7094010767585033,"Level":0,"X":7.156682395474709,"Y":6.2451611615838516},{"Curvature":1.8165807537309524,"Level":0,"X":9.4038779908734238,"Y":5.6356450358772605},{"Curvature":1.8165807537309524,"Level":0,"X":7.7524237442958892,"Y":8.496047697324931},{"Curvature":0.8928203230275511,"Level":1,"X":4.9999999999999982,"Y":1.1200461886989812},{"Curvature":3.7094010767585033,"Level":0,"X":5,"Y":2.509677676832299},{"Curvature":1.8165807537309524,"Level":0,"X":3.3485457534224632,"Y":0.86830726679781078},{"Curvature":1.8165807537309524,"Level":0,"X":6.6514542465775328,"Y":0.86830726679781056},{"Curvature":0.8928203230275511,"Level":1,"X":1.6398614339030615,"Y":6.9399769056505116},{"Curvature":1.8165807537309524,"Level":0,"X":2.2475762557041086,"Y":8.4960476973249328},{"Curvature":3.7094010767585033,"Level":0,"X":2.8433176045252893,"Y":6.2451611615838525},{"Curvature":1.8165807537309524,"Level":0,"X":0.59612200912657454,"Y":5.6356450358772623}]
And here’s the JSON for the second:
[{"Level":2,"Radius":1.0102051443364382,"X":0,"Y":0,"Z":0},{"Level":3,"Radius":0.89897948556635621,"X":1.9070234711746936,"Y":-1.9070234711746936,"Z":-1.9070234711746936},{"Level":4,"Radius":0.73674517520435534,"X":-1.5628725281804123,"Y":1.5628725281804123,"Z":-4.6886175845412374},{"Level":5,"Radius":0.28271609708738882,"X":-0.599731408203261,"Y":0.599731408203261,"Z":-1.7991942246097827},{"Level":5,"Radius":0.67576886917362144,"X":0,"Y":0,"Z":-5.7340889988891917},{"Level":5,"Radius":0.54135422270335332,"X":-5.7419286284627038,"Y":-3.4451571770776228,"Z":1.1483857256925409},{"Level":5,"Radius":0.54135422270335332,"X":3.4451571770776228,"Y":5.7419286284627038,"Z":1.1483857256925409},{"Level":4,"Radius":0.73674517520435534,"X":-1.5628725281804123,"Y":-4.6886175845412374,"Z":1.5628725281804123},{"Level":5,"Radius":0.28271609708738882,"X":-0.599731408203261,"Y":-1.7991942246097827,"Z":0.599731408203261},{"Level":5,"Radius":0.67576886917362144,"X":0,"Y":-5.7340889988891917,"Z":0},{"Level":5,"Radius":0.54135422270335332,"X":-5.7419286284627038,"Y":1.1483857256925409,"Z":-3.4451571770776228},{"Level":5,"Radius":0.54135422270335332,"X":3.4451571770776228,"Y":1.1483857256925409,"Z":5.7419286284627038},{"Level":4,"Radius":0.73674517520435534,"X":4.6886175845412374,"Y":1.5628725281804123,"Z":1.5628725281804123},{"Level":5,"Radius":0.28271609708738882,"X":1.7991942246097827,"Y":0.599731408203261,"Z":0.599731408203261},{"Level":5,"Radius":0.67576886917362144,"X":5.7340889988891917,"Y":0,"Z":0},{"Level":5,"Radius":0.54135422270335332,"X":-1.1483857256925409,"Y":5.7419286284627038,"Z":-3.4451571770776228},{"Level":5,"Radius":0.54135422270335332,"X":-1.1483857256925409,"Y":-3.4451571770776228,"Z":5.7419286284627038},{"Level":3,"Radius":0.89897948556635621,"X":-1.9070234711746936,"Y":1.9070234711746936,"Z":-1.9070234711746936},{"Level":4,"Radius":0.73674517520435534,"X":1.5628725281804123,"Y":-1.5628725281804123,"Z":-4.6886175845412374},{"Level":5,"Radius":0.28271609708738882,"X":0.599731408203261,"Y":-0.599731408203261,"Z":-1.7991942246097827},{"Level":5,"Radius":0.54135422270335332,"X":-3.4451571770776228,"Y":-5.7419286284627038,"Z":1.1483857256925409},{"Level":5,"Radius":0.54135422270335332,"X":5.7419286284627038,"Y":3.4451571770776228,"Z":1.1483857256925409},{"Level":4,"Radius":0.73674517520435534,"X":-4.6886175845412374,"Y":-1.5628725281804123,"Z":1.5628725281804123},{"Level":5,"Radius":0.28271609708738882,"X":-1.7991942246097827,"Y":-0.599731408203261,"Z":0.599731408203261},{"Level":5,"Radius":0.54135422270335332,"X":1.1483857256925409,"Y":-5.7419286284627038,"Z":-3.4451571770776228},{"Level":5,"Radius":0.67576886917362144,"X":-5.7340889988891917,"Y":0,"Z":0},{"Level":5,"Radius":0.54135422270335332,"X":1.1483857256925409,"Y":3.4451571770776228,"Z":5.7419286284627038},{"Level":4,"Radius":0.73674517520435534,"X":1.5628725281804123,"Y":4.6886175845412374,"Z":1.5628725281804123},{"Level":5,"Radius":0.28271609708738882,"X":0.599731408203261,"Y":1.7991942246097827,"Z":0.599731408203261},{"Level":5,"Radius":0.54135422270335332,"X":5.7419286284627038,"Y":-1.1483857256925409,"Z":-3.4451571770776228},{"Level":5,"Radius":0.67576886917362144,"X":0,"Y":5.7340889988891917,"Z":0},{"Level":5,"Radius":0.54135422270335332,"X":-3.4451571770776228,"Y":-1.1483857256925409,"Z":5.7419286284627038},{"Level":3,"Radius":0.89897948556635621,"X":-1.9070234711746936,"Y":-1.9070234711746936,"Z":1.9070234711746936},{"Level":4,"Radius":0.73674517520435534,"X":1.5628725281804123,"Y":-4.6886175845412374,"Z":-1.5628725281804123},{"Level":5,"Radius":0.28271609708738882,"X":0.599731408203261,"Y":-1.7991942246097827,"Z":-0.599731408203261},{"Level":5,"Radius":0.54135422270335332,"X":-3.4451571770776228,"Y":1.1483857256925409,"Z":-5.7419286284627038},{"Level":5,"Radius":0.54135422270335332,"X":5.7419286284627038,"Y":1.1483857256925409,"Z":3.4451571770776228},{"Level":4,"Radius":0.73674517520435534,"X":-4.6886175845412374,"Y":1.5628725281804123,"Z":-1.5628725281804123},{"Level":5,"Radius":0.28271609708738882,"X":-1.7991942246097827,"Y":0.599731408203261,"Z":-0.599731408203261},{"Level":5,"Radius":0.54135422270335332,"X":1.1483857256925409,"Y":-3.4451571770776228,"Z":-5.7419286284627038},{"Level":5,"Radius":0.54135422270335332,"X":1.1483857256925409,"Y":5.7419286284627038,"Z":3.4451571770776228},{"Level":4,"Radius":0.73674517520435534,"X":1.5628725281804123,"Y":1.5628725281804123,"Z":4.6886175845412374},{"Level":5,"Radius":0.28271609708738882,"X":0.599731408203261,"Y":0.599731408203261,"Z":1.7991942246097827},{"Level":5,"Radius":0.54135422270335332,"X":5.7419286284627038,"Y":-3.4451571770776228,"Z":-1.1483857256925409},{"Level":5,"Radius":0.54135422270335332,"X":-3.4451571770776228,"Y":5.7419286284627038,"Z":-1.1483857256925409},{"Level":5,"Radius":0.67576886917362144,"X":0,"Y":0,"Z":5.7340889988891917},{"Level":3,"Radius":0.89897948556635621,"X":1.9070234711746936,"Y":1.9070234711746936,"Z":1.9070234711746936},{"Level":4,"Radius":0.73674517520435534,"X":4.6886175845412374,"Y":-1.5628725281804123,"Z":-1.5628725281804123},{"Level":5,"Radius":0.28271609708738882,"X":1.7991942246097827,"Y":-0.599731408203261,"Z":-0.599731408203261},{"Level":5,"Radius":0.54135422270335332,"X":-1.1483857256925409,"Y":3.4451571770776228,"Z":-5.7419286284627038},{"Level":5,"Radius":0.54135422270335332,"X":-1.1483857256925409,"Y":-5.7419286284627038,"Z":3.4451571770776228},{"Level":4,"Radius":0.73674517520435534,"X":-1.5628725281804123,"Y":4.6886175845412374,"Z":-1.5628725281804123},{"Level":5,"Radius":0.28271609708738882,"X":-0.599731408203261,"Y":1.7991942246097827,"Z":-0.599731408203261},{"Level":5,"Radius":0.54135422270335332,"X":3.4451571770776228,"Y":-1.1483857256925409,"Z":-5.7419286284627038},{"Level":5,"Radius":0.54135422270335332,"X":-5.7419286284627038,"Y":-1.1483857256925409,"Z":3.4451571770776228},{"Level":4,"Radius":0.73674517520435534,"X":-1.5628725281804123,"Y":-1.5628725281804123,"Z":4.6886175845412374},{"Level":5,"Radius":0.28271609708738882,"X":-0.599731408203261,"Y":-0.599731408203261,"Z":1.7991942246097827},{"Level":5,"Radius":0.54135422270335332,"X":3.4451571770776228,"Y":-5.7419286284627038,"Z":-1.1483857256925409},{"Level":5,"Radius":0.54135422270335332,"X":-5.7419286284627038,"Y":3.4451571770776228,"Z":-1.1483857256925409},{"Level":1,"Radius":4.4948974278317806,"X":-3.1783724519578227,"Y":3.1783724519578227,"Z":3.1783724519578227},{"Level":2,"Radius":2.8989794855663567,"X":4.09977610552932,"Y":-4.09977610552932,"Z":-4.09977610552932},{"Level":3,"Radius":0.69693845669906873,"X":0.98561981760319706,"Y":-0.98561981760319706,"Z":-0.98561981760319706},{"Level":4,"Radius":0.59531041938993878,"X":-1.6837921378465335,"Y":1.6837921378465335,"Z":-3.367584275693067},{"Level":5,"Radius":0.361050735467887,"X":-1.0212056936069329,"Y":1.0212056936069329,"Z":-2.0424113872138658},{"Level":5,"Radius":0.51954937761543474,"X":0.73475377614624837,"Y":-0.73475377614624837,"Z":-5.1432764330237379},{"Level":5,"Radius":0.46089451836521378,"X":-5.2144262295640074,"Y":-2.6072131147820037,"Z":1.3036065573910018},{"Level":5,"Radius":0.46089451836521378,"X":2.6072131147820037,"Y":5.2144262295640074,"Z":1.3036065573910018},{"Level":4,"Radius":0.59531041938993878,"X":-1.6837921378465335,"Y":-3.367584275693067,"Z":1.6837921378465335},{"Level":5,"Radius":0.361050735467887,"X":-1.0212056936069329,"Y":-2.0424113872138658,"Z":1.0212056936069329},{"Level":5,"Radius":0.51954937761543474,"X":0.73475377614624837,"Y":-5.1432764330237379,"Z":-0.73475377614624837},{"Level":5,"Radius":0.46089451836521378,"X":-5.2144262295640074,"Y":1.3036065573910018,"Z":-2.6072131147820037},{"Level":5,"Radius":0.46089451836521378,"X":2.6072131147820037,"Y":1.3036065573910018,"Z":5.2144262295640074},{"Level":4,"Radius":0.59531041938993878,"X":3.367584275693067,"Y":1.6837921378465335,"Z":1.6837921378465335},{"Level":5,"Radius":0.361050735467887,"X":2.0424113872138658,"Y":1.0212056936069329,"Z":1.0212056936069329},{"Level":5,"Radius":0.51954937761543474,"X":5.1432764330237379,"Y":-0.73475377614624837,"Z":-0.73475377614624837},{"Level":5,"Radius":0.46089451836521378,"X":-1.3036065573910018,"Y":5.2144262295640074,"Z":-2.6072131147820037},{"Level":5,"Radius":0.46089451836521378,"X":-1.3036065573910018,"Y":-2.6072131147820037,"Z":5.2144262295640074},{"Level":3,"Radius":2.139387691339814,"X":-1.5127755441334152,"Y":1.5127755441334152,"Z":-7.5638777206670751},{"Level":4,"Radius":0.37775486824598364,"X":-0.2671130289629659,"Y":0.2671130289629659,"Z":-1.3355651448148294},{"Level":5,"Radius":0.34576134060244468,"X":1.2224509430607009,"Y":-1.2224509430607009,"Z":-2.6893920747335427},{"Level":5,"Radius":0.31876398046728993,"X":-2.9302022384236803,"Y":-2.479401894050806,"Z":1.5778012053050583},{"Level":5,"Radius":0.31876398046728993,"X":2.479401894050806,"Y":2.9302022384236803,"Z":1.5778012053050583},{"Level":4,"Radius":1.4037600977966975,"X":-6.94825799017795,"Y":-4.96304142155568,"Z":0.992608284311136},{"Level":5,"Radius":0.19716227375982742,"X":-0.97590346538812722,"Y":-0.6970739038486623,"Z":0.13941478076973246},{"Level":5,"Radius":1.0445812551367069,"X":-0.7386304890075206,"Y":-8.1249353790827268,"Z":-3.6931524450376023},{"Level":5,"Radius":1.1978243827074595,"X":-8.469897436830351,"Y":-1.6939794873660703,"Z":-1.6939794873660703},{"Level":5,"Radius":0.83175965498126991,"X":2.9407144617731955,"Y":4.1170002464824735,"Z":7.6458576006103094},{"Level":4,"Radius":1.4037600977966975,"X":4.96304142155568,"Y":6.94825799017795,"Z":0.992608284311136},{"Level":5,"Radius":0.19716227375982742,"X":0.6970739038486623,"Y":0.97590346538812722,"Z":0.13941478076973246},{"Level":5,"Radius":1.0445812551367069,"X":8.1249353790827268,"Y":0.7386304890075206,"Z":-3.6931524450376023},{"Level":5,"Radius":1.1978243827074595,"X":1.6939794873660703,"Y":8.469897436830351,"Z":-1.6939794873660703},{"Level":5,"Radius":0.83175965498126991,"X":-4.1170002464824735,"Y":-2.9407144617731955,"Z":7.6458576006103094},{"Level":3,"Radius":2.139387691339814,"X":-1.5127755441334152,"Y":-7.5638777206670751,"Z":1.5127755441334152},{"Level":4,"Radius":0.37775486824598364,"X":-0.2671130289629659,"Y":-1.3355651448148294,"Z":0.2671130289629659},{"Level":5,"Radius":0.34576134060244468,"X":1.2224509430607009,"Y":-2.6893920747335427,"Z":-1.2224509430607009},{"Level":5,"Radius":0.31876398046728993,"X":-2.9302022384236803,"Y":1.5778012053050583,"Z":-2.479401894050806},{"Level":5,"Radius":0.31876398046728993,"X":2.479401894050806,"Y":1.5778012053050583,"Z":2.9302022384236803},{"Level":4,"Radius":1.4037600977966975,"X":-6.94825799017795,"Y":0.992608284311136,"Z":-4.96304142155568},{"Level":5,"Radius":0.19716227375982742,"X":-0.97590346538812722,"Y":0.13941478076973246,"Z":-0.6970739038486623},{"Level":5,"Radius":1.0445812551367069,"X":-0.7386304890075206,"Y":-3.6931524450376023,"Z":-8.1249353790827268},{"Level":5,"Radius":0.83175965498126991,"X":2.9407144617731955,"Y":7.6458576006103094,"Z":4.1170002464824735},{"Level":4,"Radius":1.4037600977966975,"X":4.96304142155568,"Y":0.992608284311136,"Z":6.94825799017795},{"Level":5,"Radius":0.19716227375982742,"X":0.6970739038486623,"Y":0.13941478076973246,"Z":0.97590346538812722},{"Level":5,"Radius":1.0445812551367069,"X":8.1249353790827268,"Y":-3.6931524450376023,"Z":0.7386304890075206},{"Level":5,"Radius":0.83175965498126991,"X":-4.1170002464824735,"Y":7.6458576006103094,"Z":-2.9407144617731955},{"Level":5,"Radius":1.1978243827074595,"X":1.6939794873660703,"Y":-1.6939794873660703,"Z":8.469897436830351},{"Level":3,"Radius":2.139387691339814,"X":7.5638777206670751,"Y":1.5127755441334152,"Z":1.5127755441334152},{"Level":4,"Radius":0.37775486824598364,"X":1.3355651448148294,"Y":0.2671130289629659,"Z":0.2671130289629659},{"Level":5,"Radius":0.34576134060244468,"X":2.6893920747335427,"Y":-1.2224509430607009,"Z":-1.2224509430607009},{"Level":5,"Radius":0.31876398046728993,"X":-1.5778012053050583,"Y":2.9302022384236803,"Z":-2.479401894050806},{"Level":5,"Radius":0.31876398046728993,"X":-1.5778012053050583,"Y":-2.479401894050806,"Z":2.9302022384236803},{"Level":4,"Radius":1.4037600977966975,"X":-0.992608284311136,"Y":6.94825799017795,"Z":-4.96304142155568},{"Level":5,"Radius":0.19716227375982742,"X":-0.13941478076973246,"Y":0.97590346538812722,"Z":-0.6970739038486623},{"Level":5,"Radius":1.0445812551367069,"X":3.6931524450376023,"Y":0.7386304890075206,"Z":-8.1249353790827268},{"Level":5,"Radius":0.83175965498126991,"X":-7.6458576006103094,"Y":-2.9407144617731955,"Z":4.1170002464824735},{"Level":4,"Radius":1.4037600977966975,"X":-0.992608284311136,"Y":-4.96304142155568,"Z":6.94825799017795},{"Level":5,"Radius":0.19716227375982742,"X":-0.13941478076973246,"Y":-0.6970739038486623,"Z":0.97590346538812722},{"Level":5,"Radius":1.0445812551367069,"X":3.6931524450376023,"Y":-8.1249353790827268,"Z":0.7386304890075206},{"Level":5,"Radius":0.83175965498126991,"X":-7.6458576006103094,"Y":4.1170002464824735,"Z":-2.9407144617731955},{"Level":1,"Radius":4.4948974278317806,"X":3.1783724519578227,"Y":-3.1783724519578227,"Z":3.1783724519578227},{"Level":2,"Radius":2.8989794855663567,"X":-4.09977610552932,"Y":4.09977610552932,"Z":-4.09977610552932},{"Level":3,"Radius":0.69693845669906873,"X":-0.98561981760319706,"Y":0.98561981760319706,"Z":-0.98561981760319706},{"Level":4,"Radius":0.59531041938993878,"X":1.6837921378465335,"Y":-1.6837921378465335,"Z":-3.367584275693067},{"Level":5,"Radius":0.361050735467887,"X":1.0212056936069329,"Y":-1.0212056936069329,"Z":-2.0424113872138658},{"Level":5,"Radius":0.51954937761543474,"X":-0.73475377614624837,"Y":0.73475377614624837,"Z":-5.1432764330237379},{"Level":5,"Radius":0.46089451836521378,"X":-2.6072131147820037,"Y":-5.2144262295640074,"Z":1.3036065573910018},{"Level":5,"Radius":0.46089451836521378,"X":5.2144262295640074,"Y":2.6072131147820037,"Z":1.3036065573910018},{"Level":4,"Radius":0.59531041938993878,"X":-3.367584275693067,"Y":-1.6837921378465335,"Z":1.6837921378465335},{"Level":5,"Radius":0.361050735467887,"X":-2.0424113872138658,"Y":-1.0212056936069329,"Z":1.0212056936069329},{"Level":5,"Radius":0.46089451836521378,"X":1.3036065573910018,"Y":-5.2144262295640074,"Z":-2.6072131147820037},{"Level":5,"Radius":0.51954937761543474,"X":-5.1432764330237379,"Y":0.73475377614624837,"Z":-0.73475377614624837},{"Level":5,"Radius":0.46089451836521378,"X":1.3036065573910018,"Y":2.6072131147820037,"Z":5.2144262295640074},{"Level":4,"Radius":0.59531041938993878,"X":1.6837921378465335,"Y":3.367584275693067,"Z":1.6837921378465335},{"Level":5,"Radius":0.361050735467887,"X":1.0212056936069329,"Y":2.0424113872138658,"Z":1.0212056936069329},{"Level":5,"Radius":0.46089451836521378,"X":5.2144262295640074,"Y":-1.3036065573910018,"Z":-2.6072131147820037},{"Level":5,"Radius":0.51954937761543474,"X":-0.73475377614624837,"Y":5.1432764330237379,"Z":-0.73475377614624837},{"Level":5,"Radius":0.46089451836521378,"X":-2.6072131147820037,"Y":-1.3036065573910018,"Z":5.2144262295640074},{"Level":3,"Radius":2.139387691339814,"X":1.5127755441334152,"Y":-1.5127755441334152,"Z":-7.5638777206670751},{"Level":4,"Radius":0.37775486824598364,"X":0.2671130289629659,"Y":-0.2671130289629659,"Z":-1.3355651448148294},{"Level":5,"Radius":0.34576134060244468,"X":-1.2224509430607009,"Y":1.2224509430607009,"Z":-2.6893920747335427},{"Level":5,"Radius":0.31876398046728993,"X":-2.479401894050806,"Y":-2.9302022384236803,"Z":1.5778012053050583},{"Level":5,"Radius":0.31876398046728993,"X":2.9302022384236803,"Y":2.479401894050806,"Z":1.5778012053050583},{"Level":4,"Radius":1.4037600977966975,"X":-4.96304142155568,"Y":-6.94825799017795,"Z":0.992608284311136},{"Level":5,"Radius":0.19716227375982742,"X":-0.6970739038486623,"Y":-0.97590346538812722,"Z":0.13941478076973246},{"Level":5,"Radius":1.1978243827074595,"X":-1.6939794873660703,"Y":-8.469897436830351,"Z":-1.6939794873660703},{"Level":5,"Radius":1.0445812551367069,"X":-8.1249353790827268,"Y":-0.7386304890075206,"Z":-3.6931524450376023},{"Level":5,"Radius":0.83175965498126991,"X":4.1170002464824735,"Y":2.9407144617731955,"Z":7.6458576006103094},{"Level":4,"Radius":1.4037600977966975,"X":6.94825799017795,"Y":4.96304142155568,"Z":0.992608284311136},{"Level":5,"Radius":0.19716227375982742,"X":0.97590346538812722,"Y":0.6970739038486623,"Z":0.13941478076973246},{"Level":5,"Radius":1.1978243827074595,"X":8.469897436830351,"Y":1.6939794873660703,"Z":-1.6939794873660703},{"Level":5,"Radius":1.0445812551367069,"X":0.7386304890075206,"Y":8.1249353790827268,"Z":-3.6931524450376023},{"Level":5,"Radius":0.83175965498126991,"X":-2.9407144617731955,"Y":-4.1170002464824735,"Z":7.6458576006103094},{"Level":3,"Radius":2.139387691339814,"X":-7.5638777206670751,"Y":-1.5127755441334152,"Z":1.5127755441334152},{"Level":4,"Radius":0.37775486824598364,"X":-1.3355651448148294,"Y":-0.2671130289629659,"Z":0.2671130289629659},{"Level":5,"Radius":0.31876398046728993,"X":1.5778012053050583,"Y":-2.9302022384236803,"Z":-2.479401894050806},{"Level":5,"Radius":0.34576134060244468,"X":-2.6893920747335427,"Y":1.2224509430607009,"Z":-1.2224509430607009},{"Level":5,"Radius":0.31876398046728993,"X":1.5778012053050583,"Y":2.479401894050806,"Z":2.9302022384236803},{"Level":4,"Radius":1.4037600977966975,"X":0.992608284311136,"Y":-6.94825799017795,"Z":-4.96304142155568},{"Level":5,"Radius":0.19716227375982742,"X":0.13941478076973246,"Y":-0.97590346538812722,"Z":-0.6970739038486623},{"Level":5,"Radius":1.0445812551367069,"X":-3.6931524450376023,"Y":-0.7386304890075206,"Z":-8.1249353790827268},{"Level":5,"Radius":0.83175965498126991,"X":7.6458576006103094,"Y":2.9407144617731955,"Z":4.1170002464824735},{"Level":4,"Radius":1.4037600977966975,"X":0.992608284311136,"Y":4.96304142155568,"Z":6.94825799017795},{"Level":5,"Radius":0.19716227375982742,"X":0.13941478076973246,"Y":0.6970739038486623,"Z":0.97590346538812722},{"Level":5,"Radius":0.83175965498126991,"X":7.6458576006103094,"Y":-4.1170002464824735,"Z":-2.9407144617731955},{"Level":5,"Radius":1.0445812551367069,"X":-3.6931524450376023,"Y":8.1249353790827268,"Z":0.7386304890075206},{"Level":5,"Radius":1.1978243827074595,"X":-1.6939794873660703,"Y":1.6939794873660703,"Z":8.469897436830351},{"Level":3,"Radius":2.139387691339814,"X":1.5127755441334152,"Y":7.5638777206670751,"Z":1.5127755441334152},{"Level":4,"Radius":0.37775486824598364,"X":0.2671130289629659,"Y":1.3355651448148294,"Z":0.2671130289629659},{"Level":5,"Radius":0.31876398046728993,"X":2.9302022384236803,"Y":-1.5778012053050583,"Z":-2.479401894050806},{"Level":5,"Radius":0.34576134060244468,"X":-1.2224509430607009,"Y":2.6893920747335427,"Z":-1.2224509430607009},{"Level":5,"Radius":0.31876398046728993,"X":-2.479401894050806,"Y":-1.5778012053050583,"Z":2.9302022384236803},{"Level":4,"Radius":1.4037600977966975,"X":6.94825799017795,"Y":-0.992608284311136,"Z":-4.96304142155568},{"Level":5,"Radius":0.19716227375982742,"X":0.97590346538812722,"Y":-0.13941478076973246,"Z":-0.6970739038486623},{"Level":5,"Radius":1.0445812551367069,"X":0.7386304890075206,"Y":3.6931524450376023,"Z":-8.1249353790827268},{"Level":5,"Radius":0.83175965498126991,"X":-2.9407144617731955,"Y":-7.6458576006103094,"Z":4.1170002464824735},{"Level":4,"Radius":1.4037600977966975,"X":-4.96304142155568,"Y":-0.992608284311136,"Z":6.94825799017795},{"Level":5,"Radius":0.19716227375982742,"X":-0.6970739038486623,"Y":-0.13941478076973246,"Z":0.97590346538812722},{"Level":5,"Radius":0.83175965498126991,"X":4.1170002464824735,"Y":-7.6458576006103094,"Z":-2.9407144617731955},{"Level":5,"Radius":1.0445812551367069,"X":-8.1249353790827268,"Y":3.6931524450376023,"Z":0.7386304890075206},{"Level":1,"Radius":4.4948974278317806,"X":3.1783724519578227,"Y":3.1783724519578227,"Z":-3.1783724519578227},{"Level":2,"Radius":2.8989794855663567,"X":-4.09977610552932,"Y":-4.09977610552932,"Z":4.09977610552932},{"Level":3,"Radius":0.69693845669906873,"X":-0.98561981760319706,"Y":-0.98561981760319706,"Z":0.98561981760319706},{"Level":4,"Radius":0.59531041938993878,"X":1.6837921378465335,"Y":-3.367584275693067,"Z":-1.6837921378465335},{"Level":5,"Radius":0.361050735467887,"X":1.0212056936069329,"Y":-2.0424113872138658,"Z":-1.0212056936069329},{"Level":5,"Radius":0.46089451836521378,"X":-2.6072131147820037,"Y":1.3036065573910018,"Z":-5.2144262295640074},{"Level":5,"Radius":0.51954937761543474,"X":-0.73475377614624837,"Y":-5.1432764330237379,"Z":0.73475377614624837},{"Level":5,"Radius":0.46089451836521378,"X":5.2144262295640074,"Y":1.3036065573910018,"Z":2.6072131147820037},{"Level":4,"Radius":0.59531041938993878,"X":-3.367584275693067,"Y":1.6837921378465335,"Z":-1.6837921378465335},{"Level":5,"Radius":0.361050735467887,"X":-2.0424113872138658,"Y":1.0212056936069329,"Z":-1.0212056936069329},{"Level":5,"Radius":0.46089451836521378,"X":1.3036065573910018,"Y":-2.6072131147820037,"Z":-5.2144262295640074},{"Level":5,"Radius":0.51954937761543474,"X":-5.1432764330237379,"Y":-0.73475377614624837,"Z":0.73475377614624837},{"Level":5,"Radius":0.46089451836521378,"X":1.3036065573910018,"Y":5.2144262295640074,"Z":2.6072131147820037},{"Level":4,"Radius":0.59531041938993878,"X":1.6837921378465335,"Y":1.6837921378465335,"Z":3.367584275693067},{"Level":5,"Radius":0.361050735467887,"X":1.0212056936069329,"Y":1.0212056936069329,"Z":2.0424113872138658},{"Level":5,"Radius":0.46089451836521378,"X":5.2144262295640074,"Y":-2.6072131147820037,"Z":-1.3036065573910018},{"Level":5,"Radius":0.46089451836521378,"X":-2.6072131147820037,"Y":5.2144262295640074,"Z":-1.3036065573910018},{"Level":5,"Radius":0.51954937761543474,"X":-0.73475377614624837,"Y":-0.73475377614624837,"Z":5.1432764330237379},{"Level":3,"Radius":2.139387691339814,"X":1.5127755441334152,"Y":-7.5638777206670751,"Z":-1.5127755441334152},{"Level":4,"Radius":0.37775486824598364,"X":0.2671130289629659,"Y":-1.3355651448148294,"Z":-0.2671130289629659},{"Level":5,"Radius":0.31876398046728993,"X":-2.479401894050806,"Y":1.5778012053050583,"Z":-2.9302022384236803},{"Level":5,"Radius":0.34576134060244468,"X":-1.2224509430607009,"Y":-2.6893920747335427,"Z":1.2224509430607009},{"Level":5,"Radius":0.31876398046728993,"X":2.9302022384236803,"Y":1.5778012053050583,"Z":2.479401894050806},{"Level":4,"Radius":1.4037600977966975,"X":-4.96304142155568,"Y":0.992608284311136,"Z":-6.94825799017795},{"Level":5,"Radius":0.19716227375982742,"X":-0.6970739038486623,"Y":0.13941478076973246,"Z":-0.97590346538812722},{"Level":5,"Radius":1.1978243827074595,"X":-1.6939794873660703,"Y":-1.6939794873660703,"Z":-8.469897436830351},{"Level":5,"Radius":1.0445812551367069,"X":-8.1249353790827268,"Y":-3.6931524450376023,"Z":-0.7386304890075206},{"Level":5,"Radius":0.83175965498126991,"X":4.1170002464824735,"Y":7.6458576006103094,"Z":2.9407144617731955},{"Level":4,"Radius":1.4037600977966975,"X":6.94825799017795,"Y":0.992608284311136,"Z":4.96304142155568},{"Level":5,"Radius":0.19716227375982742,"X":0.97590346538812722,"Y":0.13941478076973246,"Z":0.6970739038486623},{"Level":5,"Radius":1.1978243827074595,"X":8.469897436830351,"Y":-1.6939794873660703,"Z":1.6939794873660703},{"Level":5,"Radius":0.83175965498126991,"X":-2.9407144617731955,"Y":7.6458576006103094,"Z":-4.1170002464824735},{"Level":5,"Radius":1.0445812551367069,"X":0.7386304890075206,"Y":-3.6931524450376023,"Z":8.1249353790827268},{"Level":3,"Radius":2.139387691339814,"X":-7.5638777206670751,"Y":1.5127755441334152,"Z":-1.5127755441334152},{"Level":4,"Radius":0.37775486824598364,"X":-1.3355651448148294,"Y":0.2671130289629659,"Z":-0.2671130289629659},{"Level":5,"Radius":0.31876398046728993,"X":1.5778012053050583,"Y":-2.479401894050806,"Z":-2.9302022384236803},{"Level":5,"Radius":0.34576134060244468,"X":-2.6893920747335427,"Y":-1.2224509430607009,"Z":1.2224509430607009},{"Level":5,"Radius":0.31876398046728993,"X":1.5778012053050583,"Y":2.9302022384236803,"Z":2.479401894050806},{"Level":4,"Radius":1.4037600977966975,"X":0.992608284311136,"Y":-4.96304142155568,"Z":-6.94825799017795},{"Level":5,"Radius":0.19716227375982742,"X":0.13941478076973246,"Y":-0.6970739038486623,"Z":-0.97590346538812722},{"Level":5,"Radius":1.0445812551367069,"X":-3.6931524450376023,"Y":-8.1249353790827268,"Z":-0.7386304890075206},{"Level":5,"Radius":0.83175965498126991,"X":7.6458576006103094,"Y":4.1170002464824735,"Z":2.9407144617731955},{"Level":4,"Radius":1.4037600977966975,"X":0.992608284311136,"Y":6.94825799017795,"Z":4.96304142155568},{"Level":5,"Radius":0.19716227375982742,"X":0.13941478076973246,"Y":0.97590346538812722,"Z":0.6970739038486623},{"Level":5,"Radius":0.83175965498126991,"X":7.6458576006103094,"Y":-2.9407144617731955,"Z":-4.1170002464824735},{"Level":5,"Radius":1.1978243827074595,"X":-1.6939794873660703,"Y":8.469897436830351,"Z":1.6939794873660703},{"Level":5,"Radius":1.0445812551367069,"X":-3.6931524450376023,"Y":0.7386304890075206,"Z":8.1249353790827268},{"Level":3,"Radius":2.139387691339814,"X":1.5127755441334152,"Y":1.5127755441334152,"Z":7.5638777206670751},{"Level":4,"Radius":0.37775486824598364,"X":0.2671130289629659,"Y":0.2671130289629659,"Z":1.3355651448148294},{"Level":5,"Radius":0.31876398046728993,"X":2.9302022384236803,"Y":-2.479401894050806,"Z":-1.5778012053050583},{"Level":5,"Radius":0.31876398046728993,"X":-2.479401894050806,"Y":2.9302022384236803,"Z":-1.5778012053050583},{"Level":5,"Radius":0.34576134060244468,"X":-1.2224509430607009,"Y":-1.2224509430607009,"Z":2.6893920747335427},{"Level":4,"Radius":1.4037600977966975,"X":6.94825799017795,"Y":-4.96304142155568,"Z":-0.992608284311136},{"Level":5,"Radius":0.19716227375982742,"X":0.97590346538812722,"Y":-0.6970739038486623,"Z":-0.13941478076973246},{"Level":5,"Radius":0.83175965498126991,"X":-2.9407144617731955,"Y":4.1170002464824735,"Z":-7.6458576006103094},{"Level":5,"Radius":1.0445812551367069,"X":0.7386304890075206,"Y":-8.1249353790827268,"Z":3.6931524450376023},{"Level":4,"Radius":1.4037600977966975,"X":-4.96304142155568,"Y":6.94825799017795,"Z":-0.992608284311136},{"Level":5,"Radius":0.19716227375982742,"X":-0.6970739038486623,"Y":0.97590346538812722,"Z":-0.13941478076973246},{"Level":5,"Radius":0.83175965498126991,"X":4.1170002464824735,"Y":-2.9407144617731955,"Z":-7.6458576006103094},{"Level":5,"Radius":1.0445812551367069,"X":-8.1249353790827268,"Y":0.7386304890075206,"Z":3.6931524450376023},{"Level":1,"Radius":4.4948974278317806,"X":-3.1783724519578227,"Y":-3.1783724519578227,"Z":-3.1783724519578227},{"Level":2,"Radius":2.8989794855663567,"X":4.09977610552932,"Y":4.09977610552932,"Z":4.09977610552932},{"Level":3,"Radius":0.69693845669906873,"X":0.98561981760319706,"Y":0.98561981760319706,"Z":0.98561981760319706},{"Level":4,"Radius":0.59531041938993878,"X":3.367584275693067,"Y":-1.6837921378465335,"Z":-1.6837921378465335},{"Level":5,"Radius":0.361050735467887,"X":2.0424113872138658,"Y":-1.0212056936069329,"Z":-1.0212056936069329},{"Level":5,"Radius":0.46089451836521378,"X":-1.3036065573910018,"Y":2.6072131147820037,"Z":-5.2144262295640074},{"Level":5,"Radius":0.46089451836521378,"X":-1.3036065573910018,"Y":-5.2144262295640074,"Z":2.6072131147820037},{"Level":5,"Radius":0.51954937761543474,"X":5.1432764330237379,"Y":0.73475377614624837,"Z":0.73475377614624837},{"Level":4,"Radius":0.59531041938993878,"X":-1.6837921378465335,"Y":3.367584275693067,"Z":-1.6837921378465335},{"Level":5,"Radius":0.361050735467887,"X":-1.0212056936069329,"Y":2.0424113872138658,"Z":-1.0212056936069329},{"Level":5,"Radius":0.46089451836521378,"X":2.6072131147820037,"Y":-1.3036065573910018,"Z":-5.2144262295640074},{"Level":5,"Radius":0.46089451836521378,"X":-5.2144262295640074,"Y":-1.3036065573910018,"Z":2.6072131147820037},{"Level":5,"Radius":0.51954937761543474,"X":0.73475377614624837,"Y":5.1432764330237379,"Z":0.73475377614624837},{"Level":4,"Radius":0.59531041938993878,"X":-1.6837921378465335,"Y":-1.6837921378465335,"Z":3.367584275693067},{"Level":5,"Radius":0.361050735467887,"X":-1.0212056936069329,"Y":-1.0212056936069329,"Z":2.0424113872138658},{"Level":5,"Radius":0.46089451836521378,"X":2.6072131147820037,"Y":-5.2144262295640074,"Z":-1.3036065573910018},{"Level":5,"Radius":0.46089451836521378,"X":-5.2144262295640074,"Y":2.6072131147820037,"Z":-1.3036065573910018},{"Level":5,"Radius":0.51954937761543474,"X":0.73475377614624837,"Y":0.73475377614624837,"Z":5.1432764330237379},{"Level":3,"Radius":2.139387691339814,"X":7.5638777206670751,"Y":-1.5127755441334152,"Z":-1.5127755441334152},{"Level":4,"Radius":0.37775486824598364,"X":1.3355651448148294,"Y":-0.2671130289629659,"Z":-0.2671130289629659},{"Level":5,"Radius":0.31876398046728993,"X":-1.5778012053050583,"Y":2.479401894050806,"Z":-2.9302022384236803},{"Level":5,"Radius":0.31876398046728993,"X":-1.5778012053050583,"Y":-2.9302022384236803,"Z":2.479401894050806},{"Level":5,"Radius":0.34576134060244468,"X":2.6893920747335427,"Y":1.2224509430607009,"Z":1.2224509430607009},{"Level":4,"Radius":1.4037600977966975,"X":-0.992608284311136,"Y":4.96304142155568,"Z":-6.94825799017795},{"Level":5,"Radius":0.19716227375982742,"X":-0.13941478076973246,"Y":0.6970739038486623,"Z":-0.97590346538812722},{"Level":5,"Radius":1.1978243827074595,"X":1.6939794873660703,"Y":1.6939794873660703,"Z":-8.469897436830351},{"Level":5,"Radius":0.83175965498126991,"X":-7.6458576006103094,"Y":-4.1170002464824735,"Z":2.9407144617731955},{"Level":5,"Radius":1.0445812551367069,"X":3.6931524450376023,"Y":8.1249353790827268,"Z":-0.7386304890075206},{"Level":4,"Radius":1.4037600977966975,"X":-0.992608284311136,"Y":-6.94825799017795,"Z":4.96304142155568},{"Level":5,"Radius":0.19716227375982742,"X":-0.13941478076973246,"Y":-0.97590346538812722,"Z":0.6970739038486623},{"Level":5,"Radius":1.1978243827074595,"X":1.6939794873660703,"Y":-8.469897436830351,"Z":1.6939794873660703},{"Level":5,"Radius":0.83175965498126991,"X":-7.6458576006103094,"Y":2.9407144617731955,"Z":-4.1170002464824735},{"Level":5,"Radius":1.0445812551367069,"X":3.6931524450376023,"Y":-0.7386304890075206,"Z":8.1249353790827268},{"Level":3,"Radius":2.139387691339814,"X":-1.5127755441334152,"Y":7.5638777206670751,"Z":-1.5127755441334152},{"Level":4,"Radius":0.37775486824598364,"X":-0.2671130289629659,"Y":1.3355651448148294,"Z":-0.2671130289629659},{"Level":5,"Radius":0.31876398046728993,"X":2.479401894050806,"Y":-1.5778012053050583,"Z":-2.9302022384236803},{"Level":5,"Radius":0.31876398046728993,"X":-2.9302022384236803,"Y":-1.5778012053050583,"Z":2.479401894050806},{"Level":5,"Radius":0.34576134060244468,"X":1.2224509430607009,"Y":2.6893920747335427,"Z":1.2224509430607009},{"Level":4,"Radius":1.4037600977966975,"X":4.96304142155568,"Y":-0.992608284311136,"Z":-6.94825799017795},{"Level":5,"Radius":0.19716227375982742,"X":0.6970739038486623,"Y":-0.13941478076973246,"Z":-0.97590346538812722},{"Level":5,"Radius":0.83175965498126991,"X":-4.1170002464824735,"Y":-7.6458576006103094,"Z":2.9407144617731955},{"Level":5,"Radius":1.0445812551367069,"X":8.1249353790827268,"Y":3.6931524450376023,"Z":-0.7386304890075206},{"Level":4,"Radius":1.4037600977966975,"X":-6.94825799017795,"Y":-0.992608284311136,"Z":4.96304142155568},{"Level":5,"Radius":0.19716227375982742,"X":-0.97590346538812722,"Y":-0.13941478076973246,"Z":0.6970739038486623},{"Level":5,"Radius":0.83175965498126991,"X":2.9407144617731955,"Y":-7.6458576006103094,"Z":-4.1170002464824735},{"Level":5,"Radius":1.1978243827074595,"X":-8.469897436830351,"Y":1.6939794873660703,"Z":1.6939794873660703},{"Level":5,"Radius":1.0445812551367069,"X":-0.7386304890075206,"Y":3.6931524450376023,"Z":8.1249353790827268},{"Level":3,"Radius":2.139387691339814,"X":-1.5127755441334152,"Y":-1.5127755441334152,"Z":7.5638777206670751},{"Level":4,"Radius":0.37775486824598364,"X":-0.2671130289629659,"Y":-0.2671130289629659,"Z":1.3355651448148294},{"Level":5,"Radius":0.31876398046728993,"X":2.479401894050806,"Y":-2.9302022384236803,"Z":-1.5778012053050583},{"Level":5,"Radius":0.31876398046728993,"X":-2.9302022384236803,"Y":2.479401894050806,"Z":-1.5778012053050583},{"Level":5,"Radius":0.34576134060244468,"X":1.2224509430607009,"Y":1.2224509430607009,"Z":2.6893920747335427},{"Level":4,"Radius":1.4037600977966975,"X":4.96304142155568,"Y":-6.94825799017795,"Z":-0.992608284311136},{"Level":5,"Radius":0.19716227375982742,"X":0.6970739038486623,"Y":-0.97590346538812722,"Z":-0.13941478076973246},{"Level":5,"Radius":0.83175965498126991,"X":-4.1170002464824735,"Y":2.9407144617731955,"Z":-7.6458576006103094},{"Level":5,"Radius":1.0445812551367069,"X":8.1249353790827268,"Y":-0.7386304890075206,"Z":3.6931524450376023},{"Level":4,"Radius":1.4037600977966975,"X":-6.94825799017795,"Y":4.96304142155568,"Z":-0.992608284311136},{"Level":5,"Radius":0.19716227375982742,"X":-0.97590346538812722,"Y":0.6970739038486623,"Z":-0.13941478076973246},{"Level":5,"Radius":0.83175965498126991,"X":2.9407144617731955,"Y":-4.1170002464824735,"Z":-7.6458576006103094},{"Level":5,"Radius":1.0445812551367069,"X":-0.7386304890075206,"Y":8.1249353790827268,"Z":3.6931524450376023}]
The Circle and Sphere types have effectively been translated (via the names of their constructor arguments rather than their internal members, which is a little confusing) into the JSON text format.
That's all it took to expose our local web-service using the ASP.NET Web API - and that's with the "overhead" of needing a separate project for our (actually pretty simple) F# code. This is really a quantum leap forwards in terms of reducing the effort required to expose a RESTful web-service. It's also now relatively straightforward to move a local web-service such as this to be hosted in the cloud.
But let's not get ahead of ourselves: in the next post in this series, we’ll look at approaches for consuming the data returned from calling these APIs and generating equivalent geometry inside AutoCAD.