Creating Brep from JSON

Hi Mike,

I realise this topic is 2 years old, however, I’m having the exact same problem.
I’m trying to reconstruct a brep from data I extract from another brep.

The situation:
I have a brep in a script (with trimmed faces) and I’m trying to export it to a JSON, which I can then read in another script to reconstruct it.
So I can get all the curves2d, curves3d, surfaces etc. But somehow I get an invalid brep when reconstructing. Exact same message as above. The preview in the rhino viewport shows the correct geometry by the way.

Did you have any luck fixing the problem?

  • Merijn

Hi @merijndeleur - I’ve moved this to a new topic.

1 Like

What programming language are you working in?

Sorry, the original post was in response on a topic, so then it was obvious.
But, I’m working in c#!

Since you are working in C#, you could add a reference to Newtonsoft.Json.Net (a copy ships with Rhino in the system directory.) Since the Brep class is serializable, Json.Net will automatically serialize and deserialize it for you.

A, I was actually using Newtonsoft already. Did not know the Brep class is serializable.
This will work for GH-to-GH transfers. However, I would also like to be able to rebuild the geometry in other software (i.e. dynamo), but then I’ll have to look into the interpretation in dynamo probably.
Anyway, thanks!

You can use Rhino3dmIo and Newtonsoft.Json.Net to deserialize the Brep in Dynamo.

Hi,

How would I go about deserializing the brep?

I get a nice json like this when serializing:

JSON
`[

[
{
“Value”: {
“version”: 10000,
“archive3dm”: 60,
“opennurbs”: -1944819291,
“data”:
“+n8CAJgXAAAAAAAA+/8CABQAAAAAAAAAQ8Jv8CqjCEad2KfSxM4qNij+rDr8/wIAYBcAAAAAAAAzAIAAQMcGAAAAAAAAEAYAAAABAAAA+n8CALUBAAAAAAAA+/8CABQAAAAAAAAAGRGvXlEL1BG//gAQgwEi8EoaeRf8/wIAfQEAAAAAAAAQAgAAAAEAAAADAAAACQAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAYLURU+yH5PxgtRFT7Ifk/GC1EVPshCUAYLURU+yEJQNIhM3982RJA0iEzf3zZEkAYLURU+yEZQBgtRFT7IRlACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwPwAAAAAAAAAAzTt/Zp6g5j/NO39mnqDmP////////++/AAAAAAAA8D8AAAAAAADwP8w7f2aeoPa/zTt/Zp6g5j/NO39mnqDmPwAAAAAAAADAB1wUMyamoTwAAAAAAADwP807f2aeoPa/zDt/Zp6g5r/NO39mnqDmPwEAAAAAAPC/AAAAAAAA8L8AAAAAAADwPwAAAAAAALC8zTt/Zp6g5r/NO39mnqDmPwAAAAAAAAAAAAAAAAAAAAAAAAAAAADwP27NL4v/fwKAAAAAAAAAAAABAAAA+n8CAL0AAAAAAAAA+/8CABQAAAAAAAAAGRGvXlEL1BG//gAQgwEi8EoaeRf8/wIAhQAAAAAAAAAQAgAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAA8D8CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAAAAAxzI75/38CgAAAAAAAAAAAAQAAAPp/AgC9AAAAAAAAAPv/AgAUAAAAAAAAABkRr15RC9QRv/4AEIMBIvBKGnkX/P8CAIUAAAAAAAAAEAIAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAABgtRFT7IRlAAgAAAAAAAAAAAPA/AAAAAAAAAAAAAAAAAADwPxgtRFT7IRlAzhf8Sv9/AoAAAAAAAAAAAAEAAAD6fwIAvQAAAAAAAAD7/wIAFAAAAAAAAAAZEa9eUQvUEb/+ABCDASLwShp5F/z/AgCFAAAAAAAAABACAAAAAAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAADwPwAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAADwPwIAAAAAAAAAAADwPxgtRFT7IRlAAAAAAAAAAAAYLURU+yEZQJvwLZ//fwKAAAAAAAAAAAABAAAA+n8CAL0AAAAAAAAA+/8CABQAAAAAAAAAGRGvXlEL1BG//gAQgwEi8EoaeRf8/wIAhQAAAAAAAAAQAgAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAGC1EVPshGUACAAAAAAAAAAAAAAAYLURU+yEZQAAAAAAAAAAAAAAAAAAAAABkK18s/38CgAAAAAAAAAAAAQAAAPp/AgC1AQAAAAAAAPv/AgAUAAAAAAAAABkRr15RC9QRv/4AEIMBIvBKGnkX/P8CAH0BAAAAAAAAEAIAAAABAAAAAwAAAAkAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAGC1EVPsh+T8YLURU+yH5PxgtRFT7IQlAGC1EVPshCUDSITN/fNkSQNIhM3982RJAGC1EVPshGUAYLURU+yEZQAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAAAAAM07f2aeoOY/zTt/Zp6g5j/////////vvwAAAAAAAPA/AAAAAAAA8D/MO39mnqD2v807f2aeoOY/zTt/Zp6g5j8AAAAAAAAAwAdcFDMmpqE8AAAAAAAA8D/NO39mnqD2v8w7f2aeoOa/zTt/Zp6g5j8BAAAAAADwvwAAAAAAAPC/AAAAAAAA8D8AAAAAAACwvM07f2aeoOa/zTt/Zp6g5j8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D9uzS+L/38CgAAAAAAAAAAACaK5LQCAAEAQBQAAAAAAABADAAAAAQAAAPp/AgDdAAAAAAAAAPv/AgAUAAAAAAAAABkRr15RC9QRv/4AEIMBIvBKGnkX/P8CAKUAAAAAAAAAEAMAAAABAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAPA/AgAAAAAAAAAAAPA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D9pa1J7/38CgAAAAAAAAAAAAQAAAPp/AgD9AQAAAAAAAPv/AgAUAAAAAAAAABkRr15RC9QRv/4AEIMBIvBKGnkX/P8CAMUBAAAAAAAAEAMAAAABAAAAAwAAAAkAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAGC1EVPsh+T8YLURU+yH5PxgtRFT7IQlAGC1EVPshCUDSITN/fNkSQNIhM3982RJAGC1EVPshGUAYLURU+yEZQAkAAAAAAAAAAADwPwAAAAAAAAAAAAAAAAAA8D8AAAAAAADwP807f2aeoOY/zTt/Zp6g5j/NO39mnqDmP807f2aeoOY/B1wUMyamkTwAAAAAAADwPwAAAAAAAPA/AAAAAAAA8D/MO39mnqDmv807f2aeoOY/zTt/Zp6g5j/NO39mnqDmPwAAAAAAAPC/B1wUMyamoTwAAAAAAADwPwAAAAAAAPA/zTt/Zp6g5r/MO39mnqDmv807f2aeoOY/zTt/Zp6g5j8Kip5MOXmqvAAAAAAAAPC/AAAAAAAA8D8AAAAAAADwP8s7f2aeoOY/zTt/Zp6g5r/NO39mnqDmP807f2aeoOY/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D+Y3W6i/38CgAAAAAAAAAAAAQAAAPp/AgD9AQAAAAAAAPv/AgAUAAAAAAAAABkRr15RC9QRv/4AEIMBIvBKGnkX/P8CAMUBAAAAAAAAEAMAAAABAAAAAwAAAAkAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAGC1EVPsh+T8YLURU+yH5PxgtRFT7IQlAGC1EVPshCUDSITN/fNkSQNIhM3982RJAGC1EVPshGUAYLURU+yEZQAkAAAAAAAAAAADwPwAAAAAAAAAAAAAAAAAAAAAAAAAAAADwP807f2aeoOY/zTt/Zp6g5j8AAAAAAAAAAM07f2aeoOY/B1wUMyamkTwAAAAAAADwPwAAAAAAAAAAAAAAAAAA8D/MO39mnqDmv807f2aeoOY/AAAAAAAAAADNO39mnqDmPwAAAAAAAPC/B1wUMyamoTwAAAAAAAAAAAAAAAAAAPA/zTt/Zp6g5r/MO39mnqDmvwAAAAAAAAAAzTt/Zp6g5j8Kip5MOXmqvAAAAAAAAPC/AAAAAAAAAAAAAAAAAADwP8s7f2aeoOY/zTt/Zp6g5r8AAAAAAAAAAM07f2aeoOY/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8Ctwpv/38CgAAAAAAAAAAApvfFGACAAEBsBQAAAAAAABADAAAAAQAAAPp/AgD9AAAAAAAAAPv/AgAUAAAAAAAAAN/U105H6dMRv+UAEIMBIvBz19j3/P8CAMUAAAAAAAAAEQAAAAAAAPA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwPwAAAAAAAAAAAAAAAAAAAAAAAAAAAADwPwAAAAAAAACAKVyPwvUoAMB7FK5H4XqUP1K4HoXrUfC/UrgehetR8D8pXI/C9SgAwHsUrkfhepQ/UrgehetR8L9SuB6F61HwPxyhahX/fwKAAAAAAAAAAAABAAAA+n8CADkDAAAAAAAA+/8CABQAAAAAAAAAF8hgR+ML1BG//gAQgwEi8Ksojr78/wIAAQMAAAAAAAAQAwAAAAEAAAACAAAAAwAAAAIAAAAJAAAAAAAAAAAAAAAAAAAAAADwPwAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAADwPwoAAAAAAAAAAAAAAAAAAAAAAAAAGC1EVPsh+T8YLURU+yH5PxgtRFT7IQlAGC1EVPshCUDSITN/fNkSQNIhM3982RJAGC1EVPshGUAYLURU+yEZQBIAAAAAAAAAAADwPwAAAAAAAAAAAAAAAAAAAAAAAAAAAADwP807f2aeoOY/zTt/Zp6g5j8AAAAAAAAAAM07f2aeoOY/B1wUMyamkTwAAAAAAADwPwAAAAAAAAAAAAAAAAAA8D/MO39mnqDmv807f2aeoOY/AAAAAAAAAADNO39mnqDmPwAAAAAAAPC/B1wUMyamoTwAAAAAAAAAAAAAAAAAAPA/zTt/Zp6g5r/MO39mnqDmvwAAAAAAAAAAzTt/Zp6g5j8Kip5MOXmqvAAAAAAAAPC/AAAAAAAAAAAAAAAAAADwP8s7f2aeoOY/zTt/Zp6g5r8AAAAAAAAAAM07f2aeoOY/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPwAAAAAAAAAAAAAAAAAA8D8AAAAAAADwP807f2aeoOY/zTt/Zp6g5j/NO39mnqDmP807f2aeoOY/B1wUMyamkTwAAAAAAADwPwAAAAAAAPA/AAAAAAAA8D/MO39mnqDmv807f2aeoOY/zTt/Zp6g5j/NO39mnqDmPwAAAAAAAPC/B1wUMyamoTwAAAAAAADwPwAAAAAAAPA/zTt/Zp6g5r/MO39mnqDmv807f2aeoOY/zTt/Zp6g5j8Kip5MOXmqvAAAAAAAAPC/AAAAAAAA8D8AAAAAAADwP8s7f2aeoOY/zTt/Zp6g5r/NO39mnqDmP807f2aeoOY/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D9lv9FX/38CgAAAAAAAAAAAAQAAAPp/AgD9AAAAAAAAAPv/AgAUAAAAAAAAAN/U105H6dMRv+UAEIMBIvBz19j3/P8CAMUAAAAAAAAAEQAAAAAAAPA/AAAAAAAAAAAAAAAAAADwPwAAAAAAAPA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwPwAAAAAAAAAAAAAAAAAAAAAAAAAAAADwPwAAAAAAAPC/KVyPwvUoAMB7FK5H4XqUP1K4HoXrUfC/UrgehetR8D8pXI/C9SgAwHsUrkfhepQ/UrgehetR8L9SuB6F61HwPwkMc5T/fwKAAAAAAAAAAACm98UYAIAAQHEAAAAAAAAAEAIAAAAAAAAAAAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAPA/AAAAAAAAAAAAAAAAAADwPwMAAAAAAAAAAQAAAAEAAAAAAAAAAAAAACkGi6cAgABA4QAAAAAAAAAQAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAQAAAAIAAAABAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwPwEAAAABAAAAAAAAAAAAAAAAAAAAGC1EVPshGUABAAAAAQAAAAIAAAACAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAYLURU+yEZQAIAAAACAAAAAAAAAAAAAAAAAAAAGC1EVPshGUAAAAAAAAAAAAIAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYLURU+yEZQL42LMoAgABAIQMAAAAAAAAQBgAAAAAAAAAAAAAAAAAAAAAAAAAYLURU+yEZQAIAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYLURU+yEZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0h0znr345f/SHTOevfjl/wEAAAABAAAAAAAAAAAAAAAAAAAAAADwPwAAAAAAAAAAAQAAAAAAAAADAAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAAAAAAAAAAAYLURU+yEZQAEAAAABAAAAAQAAAAAAAAACAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYLURU+yEZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAADwPwAAAAABAAAAAAAAAAEAAAADAAAABgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAYLURU+yEZQAIAAAAAAAAAAAAAAAEAAAACAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYLURU+yEZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAAAAAAAAAAAAAAYLURU+yEZQAEAAAABAAAAAQAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYLURU+yEZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0h0znr345f/SHTOevfjl/wWJ3kcAgABAUQAAAAAAAAAQAwAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAQAAAABAAAAAgAAAAMAAAAEAAAAAQAAAAEAAAACAAAAAQAAAAUAAAABAAAAAgAAAC8CACoAgABAgQAAAAAAAAARAwAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAAAAAAIAAAABAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEj3BFSuB6F61Hwv1K4HoXrUfC/AAAAAAAAAABSuB6F61HwP1K4HoXrUfA/AAAAAAAA8D8AgABABwAAAAAAAAAAAAAS2UH/AIAAQAcAAAAAAAAAAAAAEtlB/wEAAAAAgABADQAAAAAAAAABAAAAAQAAAABdKRLMGZQ92P9/AoAAAAAAAAAAAA==”
},
“IsValid”: true,
“IsValidWhyNot”: “”,
“Boundingbox”: {
“IsValid”: true,
“Min”: {
“X”: -1.0,
“Y”: -1.0,
“Z”: 0.0
},
“Max”: {
“X”: 1.0,
“Y”: 1.0,
“Z”: 1.0
},
“Center”: {
“X”: 0.0,
“Y”: 0.0,
“Z”: 0.5
},
“Area”: 16.0,
“Volume”: 4.0,
“Diagonal”: {
“X”: 2.0,
“Y”: 2.0,
“Z”: 1.0
}
},
“IsGeometryLoaded”: true,
“TypeDescription”: “3D Boundary-Representation”,
“TypeName”: “Brep”,
“ReferenceID”: “00000000-0000-0000-0000-000000000000”,
“ClippingBox”: {
“IsValid”: true,
“Min”: {
“X”: -1.02,
“Y”: -1.02,
“Z”: 0.0
},
“Max”: {
“X”: 1.02,
“Y”: 1.02,
“Z”: 1.0
},
“Center”: {
“X”: 0.0,
“Y”: 0.0,
“Z”: 0.5
},
“Area”: 16.4832,
“Volume”: 4.1616,
“Diagonal”: {
“X”: 2.04,
“Y”: 2.04,
“Z”: 1.0
}
},
“IsReferencedGeometry”: false
}
]
]

However, when deserializing, I get an exception: Solution exception:Member 'archive3dm' was not found.
`

This is how I’m trying to do it right now. I’m looping through a json by it’s JArray’s and JObjects.

    public static dynamic JsonToJObject(JToken jToken)
    {
        switch (jToken.Type)
        {
            case JTokenType.Object:
                return JsonConvert.DeserializeObject<Brep>(jToken.ToString());
            case JTokenType.Array:
                return jToken.Select(JsonToJObject).ToList();
            default:
                return ((JValue)jToken).Value;
        }
    }

Not sure if that was the question, but it works great here (Rhino Version 6.3.18090.471)

var box = new BoundingBox(0,0,0,10,10,10);
var brep = box.ToBrep();
var json = Newtonsoft.Json.JsonConvert.SerializeObject(brep);
var brep2 = Newtonsoft.Json.JsonConvert.DeserializeObject<Rhino.Geometry.Brep>(json);
1 Like