Serialisation of GeometryBase Types

You’re going to get this question, sooner or later :slight_smile:
I’ve successfully created a mesh from a cone, all from calls to the server. But the mesh looks like:

 {
    "version": 10000,
    "archive3dm": 60,
    "opennurbs": -1945343931,
    "data": "+n8CAEAJAAAAAAAA+/8CABQAAAAAAAAA5NTXTkfp0xG/5QAQgwEi8C25G1z8/wIACAkAAAAAAAA4YwAAAEAAAAAAAAA..."
}

Your classic base64 blob, that doesn’t decode to an ideal “vertices” “faces” etc. I think this is a deeper serialisation question of the rhino/open nurbs data types, so i’m willing to get lessons thrown at me!

1 Like

This is how we serialize our RhinoCommon.Geometry.GeometryBase data types. If you were using Rhino3dmIO and C#, the data would have been automatically deserialized into a Rhino.Geometry.Mesh class. Since you are playing in a different sandbox, you would need to make additional calls to the compute server to get information about the mesh.

I’ve changed the title, now that my question is a bit more clear in my head: is there a chance/what would it take so that serialisation of GeometryBase types could be made more transparent/readable and sandbox independent?

I know this is not an easy one!

We may be able to set up some sort of API where you request specific properties to be returned; maybe some sort of GraphQL type system. Maybe the API can be set up so you can chain things together to return the properties that you want to work with.

Any ideas on what a good API would look like for this?

1 Like

Maybe just a simple query string? for example getting the faces and vertices of a brep’s displayValue. All you need to do is append ?fields=type,displayValue.vertices,displayValue.faces to your query.

Graphql can be cool, but for starters imho a simple ?fields=vertices,normals or the corollary ?omit=normals would be amazing.

I like that idea. I’ll see if I can get something like this wired up where you can specify for all of datatype X returned, give me [X.Vertices, X.Normals, X.Faces] instead. Something like

?return.Mesh=Vertices,Normals,Faces&return.Curve=Length,BoundingBox

Wow, that worked a lot easier that I thought it would. You can now pass a querystring of ?return.ObjectTpe=Property1,Property2,...

Here is a sample for getting the diameter from two circles

curl -H "api_token: steve@mcneel.com" -H "Content-Type: application/json" 
-d '[[{"X":1.0,"Y":2.0,"Z":3.0},12],[{"X":1.0,"Y":2.0,"Z":4.0},30]]' 
"https://compute.rhino3d.com/Rhino/Geometry/Circle/New?multiple=true&return.Circle=Diameter"

Here is a sample for getting Vertices and Faces from a computed mesh (note, I need to clean up JSON serialization for bounding boxes, planes, circles, arcs, and spheres still). This one is a sphere so it is still a little ugly.

curl -H "api_token: steve@mcneel.com" -H "Content-Type: application/json" 
-d '[{"IsValid":true,"BoundingBox":{"IsValid":true,"Min":{"X":-11.0,"Y":-10.0,"Z":-9.0},"Max":{"X":13.0,"Y":14.0,"Z":15.0},"Center":
{"X":1.0,"Y":2.0,"Z":3.0},"Area":3456.0,"Volume":13824.0,"Diagonal":
{"X":24.0,"Y":24.0,"Z":24.0}},"Diameter":24.0,"Radius":12.0,"EquitorialPlane":{"Origin":
{"X":1.0,"Y":2.0,"Z":3.0},"XAxis":{"X":1.0,"Y":0.0,"Z":0.0},"YAxis":{"X":0.0,"Y":1.0,"Z":0.0},"ZAxis":
{"X":0.0,"Y":0.0,"Z":1.0},"Normal":{"X":0.0,"Y":0.0,"Z":1.0}},"EquatorialPlane":{"Origin":
{"X":1.0,"Y":2.0,"Z":3.0},"XAxis":{"X":1.0,"Y":0.0,"Z":0.0},"YAxis":{"X":0.0,"Y":1.0,"Z":0.0},"ZAxis":
{"X":0.0,"Y":0.0,"Z":1.0},"Normal":{"X":0.0,"Y":0.0,"Z":1.0}},"Center":
{"X":1.0,"Y":2.0,"Z":3.0},"NorthPole":{"X":1.0000000000000007,"Y":2.0,"Z":15.0},"SouthPole":
{"X":1.0000000000000007,"Y":2.0,"Z":-9.0}},10,10]' 
"https://compute.rhino3d.com/Rhino/Geometry/Mesh/CreateFromSphere?return.Mesh=Vertices,Faces"
1 Like

I updated compute.rhino3d.com yesterday to have the JSON passed around be a little cleaner for more data types. The above sample for get mesh vertices and faces now looks like

curl -H "api_token: steve@mcneel.com" -H "Content-Type: application/json" 
-d '[{"EquatorialPlane":{"Origin":{"X":1.0,"Y":2.0,"Z":3.0},"XAxis":
{"X":1.0,"Y":0.0,"Z":0.0},"YAxis":{"X":0.0,"Y":1.0,"Z":0.0},"ZAxis":
{"X":0.0,"Y":0.0,"Z":1.0}},"Radius":12.0}, 10, 10]' 
"https://compute.rhino3d.com/Rhino/Geometry/Mesh/CreateFromSphere?return.Mesh=Vertices,Faces"

Well, unfortunately that change broke serialization for some plug-ins.
https://discourse.mcneel.com/t/rhino-6-4-point3f-vector3f-deserialization/60120

I’ll find a different way to clean the JSON being passed around.

I don’t have access to that topic! But you’ve thought of [JsonIgnore] decorators? If the backend uses JsonConvert…

Oops, that was a private post from a plug-in developer reporting that the serialization changes broke their file IO. I don’t want to use the JsonIgnore attributes as that would require a reference to Json.NET to be added to RhinoCommon and I want to keep RhinoCommon dependencies to only assemblies that are included with the .NET framework.

There are other serialization mechanisms that Json.NET provides that I’m pretty sure I can make it work. The ISerializable implementation would have made this very easy, but it breaks the Rhino SDK so it can’t be done.

I’ve been playing around in Python with the API a bit and ran into issues with deserialization when the API returns a Rhino.Geometry object. For example, I’m trying to convert this Curve back into a rhino3dm representation:

curve_dict = {'version': 10000, 'archive3dm': 60, 'opennurbs': -1912574355, 'data': '+n8CAF0BAAAAAAAA+/8CABQAAAAAAAAAGRGvXlEL1BG//gAQgwEi8EoaeRf8/wIAJQEAAAAAAAAQAwAAAAAAAAAEAAAABgAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAAAAAAAAAAAAAAAACAAAAFsC8SGcPHVAWwLxIZw8dUBbAvEhnDx1QH6OWR718XVAfo5ZHvXxdUCCmQWFaEZ5QIKZBYVoRnlAgpkFhWhGeUAGAAAA+p0jt+E/akDx/Jkq+gtDQLCGNy+EQlVA+lqxMcUnakDNeAwlFDpCQHCQDrpcylRAyiXl3ToPakBFTvUksGhBQHx5TGU4UlRAZvWeLRWBaUDSaM/rJYI5QDgEP/NGpVFAJIljUBADaUAS26SBN+QxQJBqriyQ4E5AUsz7nwt/aEA4GT2hI18kQML34wXVckpAdz1tDP9/AoAAAAAAAAAAAA=='}

I found the rhino3dm.ArchivableDictionary.DecodeDict(curve_dict) function which seems to provide the functionality I need, however I get the following error:

RuntimeError: Unable to decode ArchivableDictionary

rhinoversion seems to be within range (rhino3dm/src/bindings/bnd_object.cpp, line 866) so the next suspect is the if (length < 1 || nullptr == c) conditional.

Any insights into what could be going wrong?

All objects that derive from rhino3dm.CommonObject should use the Encode and Decode functions for CommonObject.

curve = rhino3dm.CommonObject.Decode(curve_dict)

Steve, thank you so much for the info, the decoder works great!

I have tried decoding a Brep JSON string to a Brep in Javascript.
Using rhino3dm boolean.html example, I’ve added the addObj and feed it into Module.CommonObject.decode()
The decode output as ‘null’. Thoughts ?
source JSON:

{
    "version": 10000,
    "archive3dm": 70,
    "opennurbs": -1912574055,
    "data": "+n8CAO0BAAD7/wIAFAAAABfIYEfjC9QRv/4AEIMBIvCrKI6+/P8CAMEBAAAQAwAAAAAAAAACAAAAAgAAAAIAAAAGAAAAAAAAAAAAAAAAAAAAAADwPwAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAA0QAYAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAAAEAAAAAAAAAIQAAAAAAAABBAAAAAAAAAFEAMAAAAAAAAAAAAJECTcgWlyw8dQAAAAAAAAAAAtjgI9qmODsD2sJLF64InQAAAAAAAAAAAo+P7BKu4KMAzmSGp7ETbPAAAAAAAAAAAvTgI9qmODsD1sJLF64InwAAAAAAAAAAA////////I0CWcgWlyw8dwAAAAAAAAAAAAAAAAAAAJECTcgWlyw8dQAAAAAAAAAAAAAAAAAAAJECTcgWlyw8dQAAAAAAAADRAtjgI9qmODsD2sJLF64InQAAAAAAAADRAo+P7BKu4KMAzmSGp7ETbPAAAAAAAADRAvTgI9qmODsD1sJLF64InwAAAAAAAADRA////////I0CWcgWlyw8dwAAAAAAAADRAAAAAAAAAJECTcgWlyw8dQAAAAAAAADRAdWEmR/9/AoAAAAAA"
}

Okay, this is a strange error.
I have made a geometry serialization component in GH utilizing Newtonsoft.Json serialization. However it returns different outputs when executed in Rhino 6 and Rhino 7 WIP.

Rhino 6:

Rhino 7 WIP:
image

Successfully decoded Rhino 6 brep data:

{
  "version": 10000,
  "archive3dm": 60,
  "opennurbs": -1942196347,
  "data": "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QAEAAAABAAAAAgAAAAAAAAACAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADP8jFmgolAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAsvQMMApIRMAAAAAAAAAAgAIAAAACAAAAAwAAAAEAAAACAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsvQMMApIRMAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADAAAAz/IxZoKJQMAAAAAAAAAAgAMAAAADAAAAAAAAAAEAAAACAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAz/IxZoKJQMAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAAsvQMMApIREDAcx9LxmhSQAQAAAABAAAABAAAAAAAAAACAAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAsvQMMApIREDAcx9LxmhSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAAAAAAAAAAAAADP8jFmgolAQAUAAAAEAAAABQAAAAAAAAACAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADP8jFmgolAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAGAAAAwHMfS8ZoUsCy9AwwCkhEwAYAAAAFAAAAAgAAAAEAAAACAAAABgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAwHMfS8ZoUsCy9AwwCkhEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAHAAAAz/IxZoKJQMAAAAAAAAAAgAEAAAACAAAAAQAAAAEAAAACAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAz/IxZoKJQMAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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"
}


Added a box :slight_smile:

1 Like

Hi Tony,
Please try with the latest Rhino WIP. I think I fixed this issue.

Hi @stevebaer,

Is there a way to do this in c#?

Cheers,
Dan

I just added FromJSON and ToJSON to CommonObject in the RhinoCommon that ships with Rhino this week. This should be available in the latest preliminary Rhino3dmIO nuget package

4 Likes

Legend! Much appreciate Steve. I will go get the latest now.

Cheers,
Dan