diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0185283 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +data/ +__pycache__/ +*.tar* +*_json/ +*_step/ +*_image/ +*.7z +data.json +output.* +_*/ \ No newline at end of file diff --git a/Bethany/README.md b/Bethany/README.md new file mode 100644 index 0000000..0637413 --- /dev/null +++ b/Bethany/README.md @@ -0,0 +1,20 @@ +# Bethany + +## Prerequisites + +- Linux +- Python 3.10 + +## Dependencies + +Install python package dependencies through pip: + +```bash +$ pip install -r requirements.txt +``` + +Install [pythonocc](https://github.com/tpaviot/pythonocc-core) (OpenCASCADE) by conda: + +```bash +$ conda install -c conda-forge pythonocc-core=7.5.1 +``` \ No newline at end of file diff --git a/Bethany/create_datasets.sh b/Bethany/create_datasets.sh new file mode 100644 index 0000000..4ea9fd5 --- /dev/null +++ b/Bethany/create_datasets.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +ENV_NAME=Bethany + +CONDA_INIT_SCRIPT="$(conda info --base)/etc/profile.d/conda.sh" + +if [ -f "$CONDA_INIT_SCRIPT" ]; then + # 初始化 conda + source "$CONDA_INIT_SCRIPT" +else + echo "Error: Cannot find conda initialization script." + exit 1 +fi + +conda activate "$ENV_NAME" + + +conda activate Bethany + +JSON_SOURCE=./examples/ + +OUT_DIR=./examples/_out + +# python json2step.py --src $JSON_SOURCE -o $OUT_DIR/steps_segment/ --mode segment +# python step2img.py --src $OUT_DIR/steps_segment/ -o $OUT_DIR/images_segment/ --mode segment +# python img2seg.py --src $OUT_DIR/images_segment/ -o $OUT_DIR/images_mask --srcc $OUT_DIR/images_transparent/ + +python json2step.py --src $JSON_SOURCE -o $OUT_DIR/steps_default/ --mode default +python step2img.py --src $OUT_DIR/steps_default/ -o $OUT_DIR/images_default/ --mode default +python step2img.py --src $OUT_DIR/steps_default/ -o $OUT_DIR/images_transparent/ --mode transparent +python step2img.py --src $OUT_DIR/steps_default/ -o $OUT_DIR/images_orthographic/ --mode orthographic + +python json2dataset.py --src $JSON_SOURCE -o $OUT_DIR/code_default_directout_3k.json --ignore True --mode default --token 3072 +python json2dataset.py --src $JSON_SOURCE -o $OUT_DIR/code_transparent_directout_3k.json --ignore True --mode transparent --token 3072 +python json2dataset.py --src $JSON_SOURCE -o $OUT_DIR/code_orthographic_directout_3k.json --ignore True --mode orthographic --token 3072 +python json2py.py --src $JSON_SOURCE -o $OUT_DIR/codes_python/ +python py2step.py --src $OUT_DIR/codes_python/ -o $OUT_DIR/steps_from_py/ +python step2img.py --src $OUT_DIR/steps_from_py/ -o $OUT_DIR/images_from_py/ + +conda deactivate diff --git a/Bethany/examples/00000069.json b/Bethany/examples/00000069.json new file mode 100644 index 0000000..da3c1f1 --- /dev/null +++ b/Bethany/examples/00000069.json @@ -0,0 +1,1163 @@ +{ + "entities": { + "FNcGhUAI1rPTVzA_1": { + "name": "Extrude 2", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGm", + "sketch": "FoxdciJZmsb6NDG_0" + }, + { + "profile": "JGK", + "sketch": "FoxdciJZmsb6NDG_0" + }, + { + "profile": "JGq", + "sketch": "FoxdciJZmsb6NDG_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": -0.002 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FoxdciJZmsb6NDG_0": { + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 0.0, + "x": -0.0, + "z": 1.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + "type": "Sketch", + "name": "Sketch 1", + "profiles": { + "JGi": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.0075, + "x": 0.0075, + "z": 0.0 + }, + "curve": "JGN", + "end_point": { + "y": -0.0075, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.0075, + "x": 0.0075, + "z": 0.0 + }, + "curve": "KGpB", + "end_point": { + "y": -0.01, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01, + "x": 0.01, + "z": 0.0 + }, + "curve": "JGl", + "end_point": { + "y": -0.01, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.01, + "x": 0.01, + "z": 0.0 + }, + "curve": "JGt", + "end_point": { + "y": -0.01, + "x": 0.01, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.01, + "x": 0.01, + "z": 0.0 + }, + "curve": "JGZ", + "end_point": { + "y": 0.01, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0075, + "x": 0.0075, + "z": 0.0 + }, + "curve": "KGZB", + "end_point": { + "y": 0.01, + "x": 0.0075, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGK": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.01, + "x": -0.0075, + "z": 0.0 + }, + "curve": "JGV", + "end_point": { + "y": 0.01, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.015, + "x": 0.0075, + "z": 0.0 + }, + "curve": "KGdB", + "end_point": { + "y": 0.01, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.015, + "x": -0.0075, + "z": 0.0 + }, + "curve": "JG1", + "end_point": { + "y": 0.015, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.015, + "x": -0.0075, + "z": 0.0 + }, + "curve": "KGVB", + "end_point": { + "y": 0.01, + "x": -0.0075, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGm": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.01, + "x": -0.01, + "z": 0.0 + }, + "curve": "JGR", + "end_point": { + "y": 0.01, + "x": -0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.015, + "x": -0.0075, + "z": 0.0 + }, + "curve": "KGVB", + "end_point": { + "y": 0.01, + "x": -0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.015, + "x": -0.0275, + "z": 0.0 + }, + "curve": "JGx", + "end_point": { + "y": 0.015, + "x": -0.0075, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.01, + "x": -0.0275, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": 0.01, + "x": -0.0325, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KG5B", + "end_angle": 1.5707963267948966, + "radius": 0.005, + "type": "Arc3D", + "start_point": { + "y": 0.015, + "x": -0.0275, + "z": 0.0 + }, + "reference_vector": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.01, + "x": -0.0325, + "z": 0.0 + }, + "curve": "KGJB", + "end_point": { + "y": -0.01, + "x": -0.0325, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.01, + "x": -0.0275, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": -0.01, + "x": -0.0325, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KG9B", + "end_angle": 1.5707963267948966, + "radius": 0.005, + "type": "Arc3D", + "start_point": { + "y": -0.015, + "x": -0.0275, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": -1.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.015, + "x": -0.0275, + "z": 0.0 + }, + "curve": "JG9", + "end_point": { + "y": -0.015, + "x": -0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.015, + "x": -0.0075, + "z": 0.0 + }, + "curve": "KGlB", + "end_point": { + "y": -0.01, + "x": -0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01, + "x": -0.01, + "z": 0.0 + }, + "curve": "JGd", + "end_point": { + "y": -0.01, + "x": -0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.01, + "x": -0.01, + "z": 0.0 + }, + "curve": "JGp", + "end_point": { + "y": -0.01, + "x": -0.01, + "z": 0.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": -0.025, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00254, + "curve": "KGxB", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGO": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": -0.01, + "x": -0.0075, + "z": 0.0 + }, + "curve": "JGh", + "end_point": { + "y": -0.01, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.015, + "x": 0.0075, + "z": 0.0 + }, + "curve": "KGtB", + "end_point": { + "y": -0.01, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.015, + "x": -0.0075, + "z": 0.0 + }, + "curve": "KGBB", + "end_point": { + "y": -0.015, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.015, + "x": -0.0075, + "z": 0.0 + }, + "curve": "KGlB", + "end_point": { + "y": -0.01, + "x": -0.0075, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGa": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": -0.0075, + "x": -0.0075, + "z": 0.0 + }, + "curve": "JGF", + "end_point": { + "y": -0.0075, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.0075, + "x": 0.0075, + "z": 0.0 + }, + "curve": "KGpB", + "end_point": { + "y": -0.01, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01, + "x": -0.0075, + "z": 0.0 + }, + "curve": "JGh", + "end_point": { + "y": -0.01, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.0075, + "x": -0.0075, + "z": 0.0 + }, + "curve": "KGhB", + "end_point": { + "y": -0.01, + "x": -0.0075, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": -0.025, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00254, + "curve": "KGxB", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGe": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.0075, + "x": -0.0075, + "z": 0.0 + }, + "curve": "JGJ", + "end_point": { + "y": -0.0075, + "x": -0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.0075, + "x": -0.0075, + "z": 0.0 + }, + "curve": "KGhB", + "end_point": { + "y": -0.01, + "x": -0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01, + "x": -0.01, + "z": 0.0 + }, + "curve": "JGd", + "end_point": { + "y": -0.01, + "x": -0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.01, + "x": -0.01, + "z": 0.0 + }, + "curve": "JGp", + "end_point": { + "y": -0.01, + "x": -0.01, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.01, + "x": -0.01, + "z": 0.0 + }, + "curve": "JGR", + "end_point": { + "y": 0.01, + "x": -0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0075, + "x": -0.0075, + "z": 0.0 + }, + "curve": "KGRB", + "end_point": { + "y": 0.01, + "x": -0.0075, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGG": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.025, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00254, + "curve": "KG1B", + "normal": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGq": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.01, + "x": 0.01, + "z": 0.0 + }, + "curve": "JGZ", + "end_point": { + "y": 0.01, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.015, + "x": 0.0075, + "z": 0.0 + }, + "curve": "KGdB", + "end_point": { + "y": 0.01, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.015, + "x": 0.0275, + "z": 0.0 + }, + "curve": "JG5", + "end_point": { + "y": 0.015, + "x": 0.0075, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.01, + "x": 0.0275, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": 0.01, + "x": 0.0325, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KGFC", + "end_angle": 1.5707963267948966, + "radius": 0.005, + "type": "Arc3D", + "start_point": { + "y": 0.015, + "x": 0.0275, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.01, + "x": 0.0325, + "z": 0.0 + }, + "curve": "KGNB", + "end_point": { + "y": -0.01, + "x": 0.0325, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.01, + "x": 0.0275, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": -0.01, + "x": 0.0325, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KGBC", + "end_angle": 1.5707963267948966, + "radius": 0.005, + "type": "Arc3D", + "start_point": { + "y": -0.015, + "x": 0.0275, + "z": 0.0 + }, + "reference_vector": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.015, + "x": 0.0275, + "z": 0.0 + }, + "curve": "KGFB", + "end_point": { + "y": -0.015, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.015, + "x": 0.0075, + "z": 0.0 + }, + "curve": "KGtB", + "end_point": { + "y": -0.01, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01, + "x": 0.01, + "z": 0.0 + }, + "curve": "JGl", + "end_point": { + "y": -0.01, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.01, + "x": 0.01, + "z": 0.0 + }, + "curve": "JGt", + "end_point": { + "y": -0.01, + "x": 0.01, + "z": 0.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.025, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00254, + "curve": "KG1B", + "normal": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGS": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.0075, + "x": -0.0075, + "z": 0.0 + }, + "curve": "JGB", + "end_point": { + "y": 0.0075, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0075, + "x": 0.0075, + "z": 0.0 + }, + "curve": "JGN", + "end_point": { + "y": -0.0075, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.0075, + "x": -0.0075, + "z": 0.0 + }, + "curve": "JGF", + "end_point": { + "y": -0.0075, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0075, + "x": -0.0075, + "z": 0.0 + }, + "curve": "JGJ", + "end_point": { + "y": -0.0075, + "x": -0.0075, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGW": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.0075, + "x": -0.0075, + "z": 0.0 + }, + "curve": "JGB", + "end_point": { + "y": 0.0075, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0075, + "x": 0.0075, + "z": 0.0 + }, + "curve": "KGZB", + "end_point": { + "y": 0.01, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.01, + "x": -0.0075, + "z": 0.0 + }, + "curve": "JGV", + "end_point": { + "y": 0.01, + "x": 0.0075, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0075, + "x": -0.0075, + "z": 0.0 + }, + "curve": "KGRB", + "end_point": { + "y": 0.01, + "x": -0.0075, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "FvuS8faJ2NEIb6O_0": { + "name": "Extrude 1", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGm", + "sketch": "FoxdciJZmsb6NDG_0" + }, + { + "profile": "JGO", + "sketch": "FoxdciJZmsb6NDG_0" + }, + { + "profile": "JGq", + "sketch": "FoxdciJZmsb6NDG_0" + }, + { + "profile": "JGi", + "sketch": "FoxdciJZmsb6NDG_0" + }, + { + "profile": "JGe", + "sketch": "FoxdciJZmsb6NDG_0" + }, + { + "profile": "JGa", + "sketch": "FoxdciJZmsb6NDG_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.002 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + } + }, + "properties": { + "bounding_box": { + "max_point": { + "y": 0.002, + "x": 0.0325, + "z": 0.015000000000000001 + }, + "type": "BoundingBox3D", + "min_point": { + "y": -0.002, + "x": -0.0325, + "z": -0.015000000000000003 + } + } + }, + "sequence": [ + { + "index": 0, + "type": "Sketch", + "entity": "FoxdciJZmsb6NDG_0" + }, + { + "index": 1, + "type": "ExtrudeFeature", + "entity": "FvuS8faJ2NEIb6O_0" + }, + { + "index": 2, + "type": "ExtrudeFeature", + "entity": "FNcGhUAI1rPTVzA_1" + } + ] +} \ No newline at end of file diff --git a/Bethany/examples/00001005.json b/Bethany/examples/00001005.json new file mode 100644 index 0000000..4bba646 --- /dev/null +++ b/Bethany/examples/00001005.json @@ -0,0 +1,956 @@ +{ + "entities": { + "Fo8ZVIGCycfBiaX_1": { + "transform": { + "origin": { + "y": -0.0254, + "x": 0.0, + "z": -9.93e-06 + }, + "y_axis": { + "y": 0.0, + "x": -0.0, + "z": 1.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + "type": "Sketch", + "name": "Sketch 4", + "profiles": { + "JTC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.01164113, + "x": -0.000635, + "z": 0.0 + }, + "curve": "JTB", + "end_point": { + "y": 0.01164113, + "x": 0.000635, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.01164113, + "x": 0.000635, + "z": 0.0 + }, + "curve": "JTV", + "end_point": { + "y": 0.01015007, + "x": 0.000635, + "z": 0.0 + } + }, + { + "center_point": { + "y": 9.93e-06, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": 0.01015007, + "x": 0.000635, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JTt", + "end_angle": 0.12508148463379154, + "radius": 0.01016, + "type": "Arc3D", + "start_point": { + "y": 0.01015007, + "x": -0.000635, + "z": 0.0 + }, + "reference_vector": { + "y": 0.9980449651344315, + "x": 0.06249998055848972, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.01164113, + "x": -0.000635, + "z": 0.0 + }, + "curve": "JTF", + "end_point": { + "y": 0.01015007, + "x": -0.000635, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JTW": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.00242794, + "x": -0.000635, + "z": 0.0 + }, + "curve": "JTN", + "end_point": { + "y": -0.00240808, + "x": -0.000635, + "z": 0.0 + } + }, + { + "center_point": { + "y": 9.93e-06, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": -0.00240808, + "x": 0.000635, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JT5", + "end_angle": 0.5136274205390272, + "radius": 0.0025, + "type": "Arc3D", + "start_point": { + "y": -0.00240808, + "x": -0.000635, + "z": 0.0 + }, + "reference_vector": { + "y": -0.9672042042658119, + "x": -0.25400005364278505, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.00242794, + "x": 0.000635, + "z": 0.0 + }, + "curve": "JTd", + "end_point": { + "y": -0.00240808, + "x": 0.000635, + "z": 0.0 + } + }, + { + "center_point": { + "y": 9.93e-06, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": 0.00242794, + "x": 0.000635, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JT1", + "end_angle": 0.5136274205390281, + "radius": 0.0025, + "type": "Arc3D", + "start_point": { + "y": 0.00242794, + "x": -0.000635, + "z": 0.0 + }, + "reference_vector": { + "y": 0.9672042042658119, + "x": 0.25400005364278505, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JTK": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": -0.00850306, + "x": -0.000635, + "z": 0.0 + }, + "curve": "JTR", + "end_point": { + "y": -0.00240808, + "x": -0.000635, + "z": 0.0 + } + }, + { + "center_point": { + "y": 9.93e-06, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": -0.00240808, + "x": 0.000635, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JT5", + "end_angle": 0.5136274205390272, + "radius": 0.0025, + "type": "Arc3D", + "start_point": { + "y": -0.00240808, + "x": -0.000635, + "z": 0.0 + }, + "reference_vector": { + "y": -0.9672042042658119, + "x": -0.25400005364278505, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.00850306, + "x": 0.000635, + "z": 0.0 + }, + "curve": "JTh", + "end_point": { + "y": -0.00240808, + "x": 0.000635, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.00850306, + "x": -0.000635, + "z": 0.0 + }, + "curve": "JTl", + "end_point": { + "y": -0.00850306, + "x": 0.000635, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JTS": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.01015007, + "x": -0.000635, + "z": 0.0 + }, + "curve": "JTJ", + "end_point": { + "y": 0.00242794, + "x": -0.000635, + "z": 0.0 + } + }, + { + "center_point": { + "y": 9.93e-06, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": 0.00242794, + "x": 0.000635, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JT1", + "end_angle": 0.5136274205390281, + "radius": 0.0025, + "type": "Arc3D", + "start_point": { + "y": 0.00242794, + "x": -0.000635, + "z": 0.0 + }, + "reference_vector": { + "y": 0.9672042042658119, + "x": 0.25400005364278505, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.01015007, + "x": 0.000635, + "z": 0.0 + }, + "curve": "JTZ", + "end_point": { + "y": 0.00242794, + "x": 0.000635, + "z": 0.0 + } + }, + { + "center_point": { + "y": 9.93e-06, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": 0.01015007, + "x": 0.000635, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JTt", + "end_angle": 0.12508148463379154, + "radius": 0.01016, + "type": "Arc3D", + "start_point": { + "y": 0.01015007, + "x": -0.000635, + "z": 0.0 + }, + "reference_vector": { + "y": 0.9980449651344315, + "x": 0.06249998055848972, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "FYk0kTmVxIulnxh_1": { + "name": "Extrude 4", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JPC", + "sketch": "F4akSLM8jsEhHQd_1" + }, + { + "profile": "JPG", + "sketch": "F4akSLM8jsEhHQd_1" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.025400000000000002 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "CutFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "F262llpzE1N6Ecl_0": { + "name": "Extrude 1", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGC", + "sketch": "Fl5EmzXybmYL8OB_0" + }, + { + "profile": "JGK", + "sketch": "Fl5EmzXybmYL8OB_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.025400000000000002 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FqOjU5KExGkflVJ_1": { + "name": "Extrude 2", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGK", + "sketch": "Fl5EmzXybmYL8OB_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.012700000000000001 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "CutFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FeetK5BcCKytC5s_1": { + "name": "Extrude 3", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JLC", + "sketch": "FPXPvHvj2sTuxfF_1" + }, + { + "profile": "JLG", + "sketch": "FPXPvHvj2sTuxfF_1" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": -0.012700000000000001 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "CutFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "SymmetricFeatureExtentType" + }, + "F4akSLM8jsEhHQd_1": { + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "x_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + }, + "type": "Sketch", + "name": "Sketch 3", + "profiles": { + "JPC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.006985, + "x": -0.0218948, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0025019, + "curve": "JPB", + "normal": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JPG": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.006985, + "x": -0.0035, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0025019, + "curve": "JPF", + "normal": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "FPXPvHvj2sTuxfF_1": { + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "x_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + }, + "type": "Sketch", + "name": "Sketch 2", + "profiles": { + "JLG": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.006985, + "x": -0.0218948, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0015, + "curve": "JLF", + "normal": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JLC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.006985, + "x": -0.0035, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0015, + "curve": "JLB", + "normal": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "Fl5EmzXybmYL8OB_0": { + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 0.0, + "x": -0.0, + "z": 1.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + "type": "Sketch", + "name": "Sketch 1", + "profiles": { + "JGC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.01016, + "curve": "JGB", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.003175, + "curve": "JGF", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGK": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.003175, + "curve": "JGF", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0025, + "curve": "JGJ", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGG": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0025, + "curve": "JGJ", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + } + }, + "properties": { + "bounding_box": { + "max_point": { + "y": 0.0, + "x": 0.010160000000000004, + "z": 0.010140136833396287 + }, + "type": "BoundingBox3D", + "min_point": { + "y": -0.025400000000000002, + "x": -0.010160000000000004, + "z": -0.010160000000000004 + } + } + }, + "sequence": [ + { + "index": 0, + "type": "Sketch", + "entity": "Fl5EmzXybmYL8OB_0" + }, + { + "index": 1, + "type": "ExtrudeFeature", + "entity": "F262llpzE1N6Ecl_0" + }, + { + "index": 2, + "type": "ExtrudeFeature", + "entity": "FqOjU5KExGkflVJ_1" + }, + { + "index": 3, + "type": "Sketch", + "entity": "FPXPvHvj2sTuxfF_1" + }, + { + "index": 4, + "type": "ExtrudeFeature", + "entity": "FeetK5BcCKytC5s_1" + }, + { + "index": 5, + "type": "Sketch", + "entity": "F4akSLM8jsEhHQd_1" + }, + { + "index": 6, + "type": "ExtrudeFeature", + "entity": "FYk0kTmVxIulnxh_1" + }, + { + "index": 7, + "type": "Sketch", + "entity": "Fo8ZVIGCycfBiaX_1" + } + ] +} \ No newline at end of file diff --git a/Bethany/examples/00001010.json b/Bethany/examples/00001010.json new file mode 100644 index 0000000..aad0cdc --- /dev/null +++ b/Bethany/examples/00001010.json @@ -0,0 +1,910 @@ +{ + "entities": { + "FB1BsVVXjokR8sK_0": { + "name": "Extrude 1", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGO", + "sketch": "Ff9nQMfu23XEMAd_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.005080000000000001 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FZkEXQdoeyMOwbM_1": { + "transform": { + "origin": { + "y": 0.0, + "x": -0.0, + "z": 0.00125824 + }, + "y_axis": { + "y": -0.0, + "x": 0.0, + "z": 1.0 + }, + "x_axis": { + "y": 0.0, + "x": -1.0, + "z": 0.0 + }, + "z_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + } + }, + "type": "Sketch", + "name": "Sketch 3", + "profiles": { + "JNS": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": -0.00439146, + "x": -0.00718479, + "z": 0.0 + }, + "curve": "JNB", + "end_point": { + "y": -0.00439146, + "x": -0.01310092, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.00125824, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": -0.00439146, + "x": -0.01310092, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KNRB", + "end_angle": 0.550647298233991, + "radius": 0.01347038, + "type": "Arc3D", + "start_point": { + "y": -0.010783240000000001, + "x": -0.009525, + "z": 0.0 + }, + "reference_vector": { + "y": -0.2326006910873911, + "x": -0.9725723204500878, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.010783240000000001, + "x": 0.009525, + "z": 0.0 + }, + "curve": "JN1", + "end_point": { + "y": -0.010783240000000001, + "x": -0.009525, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.00125824, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": -0.00439146, + "x": 0.01310092, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KNJB", + "end_angle": 0.550647298233991, + "radius": 0.01347038, + "type": "Arc3D", + "start_point": { + "y": -0.010783240000000001, + "x": 0.009525, + "z": 0.0 + }, + "reference_vector": { + "y": -0.7071067811865476, + "x": 0.7071067811865476, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.00439146, + "x": 0.00718479, + "z": 0.0 + }, + "curve": "JNd", + "end_point": { + "y": -0.00439146, + "x": 0.01310092, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.00566146, + "x": 0.00718479, + "z": 0.0 + }, + "normal": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": -0.00439146, + "x": 0.00718479, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JNl", + "end_angle": 1.5707963267948966, + "radius": 0.00127, + "type": "Arc3D", + "start_point": { + "y": -0.00566146, + "x": 0.00591479, + "z": 0.0 + }, + "reference_vector": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.00566146, + "x": 0.00591479, + "z": 0.0 + }, + "curve": "JNV", + "end_point": { + "y": -0.00826675, + "x": 0.00591479, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.00826675, + "x": -0.00591479, + "z": 0.0 + }, + "curve": "JNt", + "end_point": { + "y": -0.00826675, + "x": 0.00591479, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.00566146, + "x": -0.00591479, + "z": 0.0 + }, + "curve": "JNN", + "end_point": { + "y": -0.00826675, + "x": -0.00591479, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.00566146, + "x": -0.00718479, + "z": 0.0 + }, + "normal": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": -0.00566146, + "x": -0.00591479, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JNp", + "end_angle": 1.5707963267948966, + "radius": 0.00127, + "type": "Arc3D", + "start_point": { + "y": -0.00439146, + "x": -0.00718479, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JNO": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": -0.00439146, + "x": -0.01421416, + "z": 0.0 + }, + "curve": "JNF", + "end_point": { + "y": -0.00439146, + "x": -0.01310092, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.00125824, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": -0.00439146, + "x": -0.01310092, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KNRB", + "end_angle": 0.550647298233991, + "radius": 0.01347038, + "type": "Arc3D", + "start_point": { + "y": -0.010783240000000001, + "x": -0.009525, + "z": 0.0 + }, + "reference_vector": { + "y": -0.2326006910873911, + "x": -0.9725723204500878, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.010783240000000001, + "x": 0.009525, + "z": 0.0 + }, + "curve": "JN1", + "end_point": { + "y": -0.010783240000000001, + "x": -0.009525, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.00125824, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": -0.00439146, + "x": 0.01310092, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KNJB", + "end_angle": 0.550647298233991, + "radius": 0.01347038, + "type": "Arc3D", + "start_point": { + "y": -0.010783240000000001, + "x": 0.009525, + "z": 0.0 + }, + "reference_vector": { + "y": -0.7071067811865476, + "x": 0.7071067811865476, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.00439146, + "x": 0.01421416, + "z": 0.0 + }, + "curve": "JNh", + "end_point": { + "y": -0.00439146, + "x": 0.01310092, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.011993940000000002, + "x": 0.01421416, + "z": 0.0 + }, + "curve": "JNZ", + "end_point": { + "y": -0.00439146, + "x": 0.01421416, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.011993940000000002, + "x": -0.01421416, + "z": 0.0 + }, + "curve": "JNJ", + "end_point": { + "y": -0.011993940000000002, + "x": 0.01421416, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.00439146, + "x": -0.01421416, + "z": 0.0 + }, + "curve": "JNR", + "end_point": { + "y": -0.011993940000000002, + "x": -0.01421416, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "FlICELfwWsWdhrL_1": { + "name": "Extrude 2", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JJO", + "sketch": "FmHlkQzj3o8nFL2_1" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.018288000000000002 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "JoinFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FmHlkQzj3o8nFL2_1": { + "transform": { + "origin": { + "y": -0.00508, + "x": -0.0, + "z": 0.00125824 + }, + "y_axis": { + "y": 0.0, + "x": -0.0, + "z": 1.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + "type": "Sketch", + "name": "Sketch 2", + "profiles": { + "JJO": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": -0.00125824, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.006731, + "curve": "JJB", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": -0.00125824, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.003175, + "curve": "JJF", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JJC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": -0.00125824, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.003175, + "curve": "JJF", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "Ff9nQMfu23XEMAd_0": { + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 0.0, + "x": -0.0, + "z": 1.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + "type": "Sketch", + "name": "Sketch 1", + "profiles": { + "JGC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": -0.009525, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0014478, + "curve": "JGJ", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGG": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.009525, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0014478, + "curve": "JGN", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGK": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.003175, + "curve": "JGZ", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGO": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.009525, + "x": -0.009525, + "z": 0.0 + }, + "curve": "JGB", + "end_point": { + "y": 0.009525, + "x": 0.009525, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": -0.009525, + "x": 0.009525, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGV", + "end_angle": 1.5707963267948966, + "radius": 0.01347038, + "type": "Arc3D", + "start_point": { + "y": 0.009525, + "x": 0.009525, + "z": 0.0 + }, + "reference_vector": { + "y": -0.7071067811865476, + "x": 0.7071067811865476, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.009525, + "x": -0.009525, + "z": 0.0 + }, + "curve": "JGF", + "end_point": { + "y": -0.009525, + "x": 0.009525, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": -0.009525, + "x": -0.009525, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGR", + "end_angle": 1.5707963267948966, + "radius": 0.01347038, + "type": "Arc3D", + "start_point": { + "y": 0.009525, + "x": -0.009525, + "z": 0.0 + }, + "reference_vector": { + "y": 0.7071067811865476, + "x": -0.7071067811865476, + "z": 0.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": -0.009525, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0014478, + "curve": "JGJ", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.009525, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0014478, + "curve": "JGN", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.003175, + "curve": "JGZ", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + } + }, + "properties": { + "bounding_box": { + "max_point": { + "y": 0.0, + "x": 0.013470384181603727, + "z": 0.009525 + }, + "type": "BoundingBox3D", + "min_point": { + "y": -0.023368000000000003, + "x": -0.01347038418160373, + "z": -0.007008510176092386 + } + } + }, + "sequence": [ + { + "index": 0, + "type": "Sketch", + "entity": "Ff9nQMfu23XEMAd_0" + }, + { + "index": 1, + "type": "ExtrudeFeature", + "entity": "FB1BsVVXjokR8sK_0" + }, + { + "index": 2, + "type": "Sketch", + "entity": "FmHlkQzj3o8nFL2_1" + }, + { + "index": 3, + "type": "ExtrudeFeature", + "entity": "FlICELfwWsWdhrL_1" + }, + { + "index": 4, + "type": "Sketch", + "entity": "FZkEXQdoeyMOwbM_1" + } + ] +} \ No newline at end of file diff --git a/Bethany/examples/00001011.json b/Bethany/examples/00001011.json new file mode 100644 index 0000000..e9ecc79 --- /dev/null +++ b/Bethany/examples/00001011.json @@ -0,0 +1,823 @@ +{ + "entities": { + "FFM6rAYixEEIKBE_0": { + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 0.0, + "x": -0.0, + "z": 1.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + "type": "Sketch", + "name": "Sketch 1", + "profiles": { + "JGK": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0127, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.003175, + "curve": "JG1", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGO": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": -0.034925, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.003175, + "curve": "JGR", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": -0.034925, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0047625, + "curve": "JGZ", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGa": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.0127, + "x": -0.041275, + "z": 0.0 + }, + "curve": "JGB", + "end_point": { + "y": 0.0127, + "x": -0.02566071, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.015875, + "x": -0.02566071, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": 0.015875, + "x": -0.02248571, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JG5", + "end_angle": 1.5707963267948966, + "radius": 0.003175, + "type": "Arc3D", + "start_point": { + "y": 0.0127, + "x": -0.02566071, + "z": 0.0 + }, + "reference_vector": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.015875, + "x": -0.02248571, + "z": 0.0 + }, + "curve": "JGp", + "end_point": { + "y": 0.01930466, + "x": -0.02248571, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.01930466, + "x": -0.01931071, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": 0.01930466, + "x": -0.02248571, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JG9", + "end_angle": 1.5707963267948966, + "radius": 0.003175, + "type": "Arc3D", + "start_point": { + "y": 0.02247966, + "x": -0.01931071, + "z": 0.0 + }, + "reference_vector": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02247966, + "x": 0.01931071, + "z": 0.0 + }, + "curve": "JGh", + "end_point": { + "y": 0.02247966, + "x": -0.01931071, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.01930466, + "x": 0.01931071, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": 0.01930466, + "x": 0.02248571, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KGBB", + "end_angle": 1.5707963267948966, + "radius": 0.003175, + "type": "Arc3D", + "start_point": { + "y": 0.02247966, + "x": 0.01931071, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.015875, + "x": 0.02248571, + "z": 0.0 + }, + "curve": "JGl", + "end_point": { + "y": 0.01930466, + "x": 0.02248571, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.015875, + "x": 0.02566071, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": 0.0127, + "x": 0.02566071, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KGFB", + "end_angle": 1.5707963267948966, + "radius": 0.003175, + "type": "Arc3D", + "start_point": { + "y": 0.015875, + "x": 0.02248571, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": -1.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0127, + "x": 0.02566071, + "z": 0.0 + }, + "curve": "JGt", + "end_point": { + "y": 0.0127, + "x": 0.041275, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.009525, + "x": 0.041275, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": 0.0127, + "x": 0.041275, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KGJB", + "end_angle": 1.5707963267948966, + "radius": 0.003175, + "type": "Arc3D", + "start_point": { + "y": 0.009525, + "x": 0.04445, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.009525, + "x": 0.04445, + "z": 0.0 + }, + "curve": "JGN", + "end_point": { + "y": -0.009525, + "x": 0.04445, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.009525, + "x": 0.041275, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": -0.009525, + "x": 0.04445, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KGNB", + "end_angle": 1.5707963267948966, + "radius": 0.003175, + "type": "Arc3D", + "start_point": { + "y": -0.0127, + "x": 0.041275, + "z": 0.0 + }, + "reference_vector": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.0127, + "x": -0.041275, + "z": 0.0 + }, + "curve": "JGF", + "end_point": { + "y": -0.0127, + "x": 0.041275, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.009525, + "x": -0.041275, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": -0.009525, + "x": -0.04445, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KGRB", + "end_angle": 1.5707963267948966, + "radius": 0.003175, + "type": "Arc3D", + "start_point": { + "y": -0.0127, + "x": -0.041275, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": -1.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.009525, + "x": -0.04445, + "z": 0.0 + }, + "curve": "JGJ", + "end_point": { + "y": -0.009525, + "x": -0.04445, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.009525, + "x": -0.041275, + "z": 0.0 + }, + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "end_point": { + "y": 0.009525, + "x": -0.04445, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KGVB", + "end_angle": 1.5707963267948966, + "radius": 0.003175, + "type": "Arc3D", + "start_point": { + "y": 0.0127, + "x": -0.041275, + "z": 0.0 + }, + "reference_vector": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": -0.034925, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0047625, + "curve": "JGZ", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.034925, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0047625, + "curve": "JGd", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0127, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00873125, + "curve": "JGx", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": -0.034925, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.003175, + "curve": "JGR", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGG": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.034925, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.003175, + "curve": "JGV", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGS": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.034925, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.003175, + "curve": "JGV", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.034925, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0047625, + "curve": "JGd", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGW": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0127, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00873125, + "curve": "JGx", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0127, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.003175, + "curve": "JG1", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "FyrL0AwNhBqP1e8_0": { + "name": "Extrude 1", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGa", + "sketch": "FFM6rAYixEEIKBE_0" + }, + { + "profile": "JGO", + "sketch": "FFM6rAYixEEIKBE_0" + }, + { + "profile": "JGS", + "sketch": "FFM6rAYixEEIKBE_0" + }, + { + "profile": "JGW", + "sketch": "FFM6rAYixEEIKBE_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.006350000000000001 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "F0gWDhaieH90UVv_1": { + "name": "Extrude 2", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGW", + "sketch": "FFM6rAYixEEIKBE_0" + }, + { + "profile": "JGS", + "sketch": "FFM6rAYixEEIKBE_0" + }, + { + "profile": "JGO", + "sketch": "FFM6rAYixEEIKBE_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.0031750000000000003 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "CutFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + } + }, + "properties": { + "bounding_box": { + "max_point": { + "y": 0.0, + "x": 0.04445, + "z": 0.02247965972423567 + }, + "type": "BoundingBox3D", + "min_point": { + "y": -0.006350000000000001, + "x": -0.04445, + "z": -0.012700000000000003 + } + } + }, + "sequence": [ + { + "index": 0, + "type": "Sketch", + "entity": "FFM6rAYixEEIKBE_0" + }, + { + "index": 1, + "type": "ExtrudeFeature", + "entity": "FyrL0AwNhBqP1e8_0" + }, + { + "index": 2, + "type": "ExtrudeFeature", + "entity": "F0gWDhaieH90UVv_1" + } + ] +} \ No newline at end of file diff --git a/Bethany/examples/00001616.json b/Bethany/examples/00001616.json new file mode 100644 index 0000000..1426c55 --- /dev/null +++ b/Bethany/examples/00001616.json @@ -0,0 +1,1346 @@ +{ + "entities": { + "Fy764kKG1BS9fZ0_0": { + "name": "Extrude 1", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGa", + "sketch": "FvI77z4ukaNTCHu_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.025400000000000002 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "Fc8GnOUCGRcQ4an_1": { + "name": "Extrude 2", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGe", + "sketch": "FvI77z4ukaNTCHu_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.050800000000000005 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FvI77z4ukaNTCHu_0": { + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + }, + "type": "Sketch", + "name": "Sketch 1", + "profiles": { + "JGi": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "radius": 0.0635, + "type": "Circle3D", + "curve": "JG9+JG5+JG1+JGx+JGt+JGp+JGl+JGh", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JGK": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.08980256, + "x": -0.08980256, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGJ", + "end_angle": 0.7853981633974483, + "radius": 0.127, + "type": "Arc3D", + "start_point": { + "y": 0.127, + "x": 0.0, + "z": 0.0 + }, + "reference_vector": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.04490128, + "x": -0.04490128, + "z": 0.0 + }, + "curve": "KGNB", + "end_point": { + "y": 0.08980256, + "x": -0.08980256, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.04490128, + "x": -0.04490128, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGp", + "end_angle": 0.7853981633974483, + "radius": 0.0635, + "type": "Arc3D", + "start_point": { + "y": 0.0635, + "x": 0.0, + "z": 0.0 + }, + "reference_vector": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0635, + "x": 0.0, + "z": 0.0 + }, + "curve": "KGJB", + "end_point": { + "y": 0.127, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGO": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.0, + "x": -0.127, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGN", + "end_angle": 0.7853981633974483, + "radius": 0.127, + "type": "Arc3D", + "start_point": { + "y": 0.08980256, + "x": -0.08980256, + "z": 0.0 + }, + "reference_vector": { + "y": 0.7071067811865475, + "x": -0.7071067811865475, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0, + "x": -0.0635, + "z": 0.0 + }, + "curve": "KGRB", + "end_point": { + "y": 0.0, + "x": -0.127, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.0, + "x": -0.0635, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGt", + "end_angle": 0.7853981633974483, + "radius": 0.0635, + "type": "Arc3D", + "start_point": { + "y": 0.04490128, + "x": -0.04490128, + "z": 0.0 + }, + "reference_vector": { + "y": 0.7071067811865475, + "x": -0.7071067811865475, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.04490128, + "x": -0.04490128, + "z": 0.0 + }, + "curve": "KGNB", + "end_point": { + "y": 0.08980256, + "x": -0.08980256, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGa": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": -0.08980256, + "x": 0.08980256, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGZ", + "end_angle": 0.7853981633974483, + "radius": 0.127, + "type": "Arc3D", + "start_point": { + "y": -0.127, + "x": 0.0, + "z": 0.0 + }, + "reference_vector": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.04490128, + "x": 0.04490128, + "z": 0.0 + }, + "curve": "KGFB", + "end_point": { + "y": -0.08980256, + "x": 0.08980256, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": -0.04490128, + "x": 0.04490128, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JG5", + "end_angle": 0.7853981633974483, + "radius": 0.0635, + "type": "Arc3D", + "start_point": { + "y": -0.0635, + "x": 0.0, + "z": 0.0 + }, + "reference_vector": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.0635, + "x": 0.0, + "z": 0.0 + }, + "curve": "KGBB", + "end_point": { + "y": -0.127, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.08980256, + "x": 0.08980256, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGB", + "end_angle": 0.7853981633974482, + "radius": 0.127, + "type": "Arc3D", + "start_point": { + "y": 0.0, + "x": 0.127, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.08980256, + "x": 0.08980256, + "z": 0.0 + }, + "curve": "KGdB", + "end_point": { + "y": 0.04490128, + "x": 0.04490128, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.04490128, + "x": 0.04490128, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGh", + "end_angle": 0.7853981633974482, + "radius": 0.0635, + "type": "Arc3D", + "start_point": { + "y": 0.0, + "x": 0.0635, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0, + "x": 0.127, + "z": 0.0 + }, + "curve": "KGZB", + "end_point": { + "y": 0.0, + "x": 0.0635, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGe": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.0, + "x": 0.127, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGd", + "end_angle": 0.7853981633974483, + "radius": 0.127, + "type": "Arc3D", + "start_point": { + "y": -0.08980256, + "x": 0.08980256, + "z": 0.0 + }, + "reference_vector": { + "y": -0.7071067811865475, + "x": 0.7071067811865475, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0, + "x": 0.127, + "z": 0.0 + }, + "curve": "KGZB", + "end_point": { + "y": 0.0, + "x": 0.0635, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.0, + "x": 0.0635, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JG9", + "end_angle": 0.7853981633974483, + "radius": 0.0635, + "type": "Arc3D", + "start_point": { + "y": -0.04490128, + "x": 0.04490128, + "z": 0.0 + }, + "reference_vector": { + "y": -0.7071067811865475, + "x": 0.7071067811865475, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.04490128, + "x": 0.04490128, + "z": 0.0 + }, + "curve": "KGFB", + "end_point": { + "y": -0.08980256, + "x": 0.08980256, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGG": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.08980256, + "x": 0.08980256, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGF", + "end_angle": 0.7853981633974484, + "radius": 0.127, + "type": "Arc3D", + "start_point": { + "y": 0.127, + "x": 0.0, + "z": 0.0 + }, + "reference_vector": { + "y": 0.7071067811865475, + "x": 0.7071067811865475, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.08980256, + "x": 0.08980256, + "z": 0.0 + }, + "curve": "KGdB", + "end_point": { + "y": 0.04490128, + "x": 0.04490128, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.04490128, + "x": 0.04490128, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGl", + "end_angle": 0.7853981633974484, + "radius": 0.0635, + "type": "Arc3D", + "start_point": { + "y": 0.0635, + "x": 0.0, + "z": 0.0 + }, + "reference_vector": { + "y": 0.7071067811865475, + "x": 0.7071067811865475, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0635, + "x": 0.0, + "z": 0.0 + }, + "curve": "KGJB", + "end_point": { + "y": 0.127, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGS": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": -0.08980256, + "x": -0.08980256, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGR", + "end_angle": 0.7853981633974483, + "radius": 0.127, + "type": "Arc3D", + "start_point": { + "y": 0.0, + "x": -0.127, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": -1.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.04490128, + "x": -0.04490128, + "z": 0.0 + }, + "curve": "KGVB", + "end_point": { + "y": -0.08980256, + "x": -0.08980256, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": -0.04490128, + "x": -0.04490128, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGx", + "end_angle": 0.7853981633974483, + "radius": 0.0635, + "type": "Arc3D", + "start_point": { + "y": 0.0, + "x": -0.0635, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": -1.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0, + "x": -0.0635, + "z": 0.0 + }, + "curve": "KGRB", + "end_point": { + "y": 0.0, + "x": -0.127, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGW": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": -0.08980256, + "x": -0.08980256, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGV", + "end_angle": 0.7853981633974483, + "radius": 0.127, + "type": "Arc3D", + "start_point": { + "y": -0.127, + "x": 0.0, + "z": 0.0 + }, + "reference_vector": { + "y": -0.7071067811865475, + "x": -0.7071067811865475, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.04490128, + "x": -0.04490128, + "z": 0.0 + }, + "curve": "KGVB", + "end_point": { + "y": -0.08980256, + "x": -0.08980256, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": -0.04490128, + "x": -0.04490128, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JG1", + "end_angle": 0.7853981633974483, + "radius": 0.0635, + "type": "Arc3D", + "start_point": { + "y": -0.0635, + "x": 0.0, + "z": 0.0 + }, + "reference_vector": { + "y": -0.7071067811865475, + "x": -0.7071067811865475, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.0635, + "x": 0.0, + "z": 0.0 + }, + "curve": "KGBB", + "end_point": { + "y": -0.127, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "FZsd20hAP3yogGi_7": { + "name": "Extrude 8", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGW", + "sketch": "FvI77z4ukaNTCHu_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.20320000000000002 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FFP0lU8G1nmArPn_3": { + "name": "Extrude 4", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGG", + "sketch": "FvI77z4ukaNTCHu_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.10160000000000001 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FhSMTAMIYqU07N4_8": { + "name": "Extrude 9", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGi", + "sketch": "FvI77z4ukaNTCHu_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.10160000000000001 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FKAw1Da7UwmdJ87_4": { + "name": "Extrude 5", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGK", + "sketch": "FvI77z4ukaNTCHu_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.127 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FY5KKeGyNwJggzc_5": { + "name": "Extrude 6", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGO", + "sketch": "FvI77z4ukaNTCHu_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.1524 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "F2ZoAFshUN8JMGw_2": { + "name": "Extrude 3", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGC", + "sketch": "FvI77z4ukaNTCHu_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.0762 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FFqTcJFeVotIeRA_6": { + "name": "Extrude 7", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGS", + "sketch": "FvI77z4ukaNTCHu_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.1778 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + } + }, + "properties": { + "bounding_box": { + "max_point": { + "y": 0.127, + "x": 0.127, + "z": 0.20320000000000002 + }, + "type": "BoundingBox3D", + "min_point": { + "y": -0.127, + "x": -0.127, + "z": 0.0 + } + } + }, + "sequence": [ + { + "index": 0, + "type": "Sketch", + "entity": "FvI77z4ukaNTCHu_0" + }, + { + "index": 1, + "type": "ExtrudeFeature", + "entity": "Fy764kKG1BS9fZ0_0" + }, + { + "index": 2, + "type": "ExtrudeFeature", + "entity": "Fc8GnOUCGRcQ4an_1" + }, + { + "index": 3, + "type": "ExtrudeFeature", + "entity": "F2ZoAFshUN8JMGw_2" + }, + { + "index": 4, + "type": "ExtrudeFeature", + "entity": "FFP0lU8G1nmArPn_3" + }, + { + "index": 5, + "type": "ExtrudeFeature", + "entity": "FKAw1Da7UwmdJ87_4" + }, + { + "index": 6, + "type": "ExtrudeFeature", + "entity": "FY5KKeGyNwJggzc_5" + }, + { + "index": 7, + "type": "ExtrudeFeature", + "entity": "FFqTcJFeVotIeRA_6" + }, + { + "index": 8, + "type": "ExtrudeFeature", + "entity": "FZsd20hAP3yogGi_7" + }, + { + "index": 9, + "type": "ExtrudeFeature", + "entity": "FhSMTAMIYqU07N4_8" + } + ] +} \ No newline at end of file diff --git a/Bethany/examples/00003763.json b/Bethany/examples/00003763.json new file mode 100644 index 0000000..1042b34 --- /dev/null +++ b/Bethany/examples/00003763.json @@ -0,0 +1,547 @@ +{ + "entities": { + "F94fSs5Rrru6Csr_1": { + "name": "Extrude 4", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JRG", + "sketch": "FgQr27bSD2lOoPV_1" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": -0.030457750000000002 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FJvbya9Ckc0JTKP_0": { + "name": "Extrude 1", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGC", + "sketch": "F1cZkOtDYlVqWtk_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.10793309 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "F34Rmfkp42JY8ON_1": { + "transform": { + "origin": { + "y": -0.23403896, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 0.0, + "x": -0.0, + "z": 1.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + "type": "Sketch", + "name": "Sketch 3", + "profiles": { + "JNC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.02144662, + "curve": "JNB", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "FZopFG87VXSkIrt_1": { + "name": "Extrude 2", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JJC", + "sketch": "FKI3A6vhIzpZNfN_1" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.12610587 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "JoinFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "F1cZkOtDYlVqWtk_0": { + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 0.0, + "x": -0.0, + "z": 1.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + "type": "Sketch", + "name": "Sketch 1", + "profiles": { + "JGC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.04175514, + "curve": "JGB", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "FgQr27bSD2lOoPV_1": { + "transform": { + "origin": { + "y": -0.23403896, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 0.0, + "x": -0.0, + "z": 1.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + "type": "Sketch", + "name": "Sketch 4", + "profiles": { + "JRG": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.05449525, + "curve": "JRF", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.02891399, + "curve": "JRJ", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JRC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.02144662, + "curve": "JRB", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JRK": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.02144662, + "curve": "JRB", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.02891399, + "curve": "JRJ", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "FKI3A6vhIzpZNfN_1": { + "transform": { + "origin": { + "y": -0.10793309, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 0.0, + "x": -0.0, + "z": 1.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + "type": "Sketch", + "name": "Sketch 2", + "profiles": { + "JJC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.02891399, + "curve": "JJB", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "F4IsHPXzRLoUquG_1": { + "name": "Extrude 3", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JNC", + "sketch": "F34Rmfkp42JY8ON_1" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": -0.26565213 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "CutFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + } + }, + "properties": { + "bounding_box": { + "max_point": { + "y": 0.025400000000000002, + "x": 0.054495252668857574, + "z": 0.054495252668857574 + }, + "type": "BoundingBox3D", + "min_point": { + "y": -0.32511954, + "x": -0.054495252668857574, + "z": -0.054495252668857574 + } + } + }, + "sequence": [ + { + "index": 0, + "type": "Sketch", + "entity": "F1cZkOtDYlVqWtk_0" + }, + { + "index": 1, + "type": "ExtrudeFeature", + "entity": "FJvbya9Ckc0JTKP_0" + }, + { + "index": 2, + "type": "Sketch", + "entity": "FKI3A6vhIzpZNfN_1" + }, + { + "index": 3, + "type": "ExtrudeFeature", + "entity": "FZopFG87VXSkIrt_1" + }, + { + "index": 4, + "type": "Sketch", + "entity": "F34Rmfkp42JY8ON_1" + }, + { + "index": 5, + "type": "ExtrudeFeature", + "entity": "F4IsHPXzRLoUquG_1" + }, + { + "index": 6, + "type": "Sketch", + "entity": "FgQr27bSD2lOoPV_1" + }, + { + "index": 7, + "type": "ExtrudeFeature", + "entity": "F94fSs5Rrru6Csr_1" + } + ] +} \ No newline at end of file diff --git a/Bethany/examples/00003877.json b/Bethany/examples/00003877.json new file mode 100644 index 0000000..7b2bffc --- /dev/null +++ b/Bethany/examples/00003877.json @@ -0,0 +1,308 @@ +{ + "entities": { + "Fz5ZkhSFew6soRB_0": { + "name": "Extrude 1", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGC", + "sketch": "FvqT0Llm0TkI5qe_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.02 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FR6JugW7scIQZrM_1": { + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 0.0, + "x": -0.0, + "z": 1.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + "type": "Sketch", + "name": "Sketch 2", + "profiles": { + "JJC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.01, + "x": 0.0065, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0017526, + "curve": "JJB", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "F8dMsQ0VNGp1h7Y_1": { + "name": "Extrude 2", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JJC", + "sketch": "FR6JugW7scIQZrM_1" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": -0.025 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "CutFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FvqT0Llm0TkI5qe_0": { + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + }, + "type": "Sketch", + "name": "Sketch 1", + "profiles": { + "JGC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.01, + "x": 0.0, + "z": 0.0 + }, + "curve": "JGB", + "end_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "curve": "JGF", + "end_point": { + "y": 0.0, + "x": 0.01, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0, + "x": 0.01, + "z": 0.0 + }, + "curve": "JGJ", + "end_point": { + "y": 0.003, + "x": 0.01, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.003, + "x": 0.01, + "z": 0.0 + }, + "curve": "JGN", + "end_point": { + "y": 0.003, + "x": 0.003, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.003, + "x": 0.003, + "z": 0.0 + }, + "curve": "JGR", + "end_point": { + "y": 0.01, + "x": 0.003, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.01, + "x": 0.0, + "z": 0.0 + }, + "curve": "JGV", + "end_point": { + "y": 0.01, + "x": 0.003, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + } + }, + "properties": { + "bounding_box": { + "max_point": { + "y": 0.01, + "x": 0.01, + "z": 0.02 + }, + "type": "BoundingBox3D", + "min_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + } + } + }, + "sequence": [ + { + "index": 0, + "type": "Sketch", + "entity": "FvqT0Llm0TkI5qe_0" + }, + { + "index": 1, + "type": "ExtrudeFeature", + "entity": "Fz5ZkhSFew6soRB_0" + }, + { + "index": 2, + "type": "Sketch", + "entity": "FR6JugW7scIQZrM_1" + }, + { + "index": 3, + "type": "ExtrudeFeature", + "entity": "F8dMsQ0VNGp1h7Y_1" + } + ] +} \ No newline at end of file diff --git a/Bethany/examples/00003999.json b/Bethany/examples/00003999.json new file mode 100644 index 0000000..972989e --- /dev/null +++ b/Bethany/examples/00003999.json @@ -0,0 +1,1160 @@ +{ + "entities": { + "FJ40dF9MH7rGtXk_1": { + "name": "Extrude 3", + "extent_type": "OneSideFeatureExtentType", + "profiles": [ + { + "profile": "JNG", + "sketch": "FN68dN3WUbEJmfT_1" + }, + { + "profile": "JNK", + "sketch": "FN68dN3WUbEJmfT_1" + }, + { + "profile": "JNS", + "sketch": "FN68dN3WUbEJmfT_1" + } + ], + "extent_two": { + "distance": { + "role": "AgainstDistance", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "role": "Side2TaperAngle", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "role": "AlongDistance", + "type": "ModelParameter", + "name": "none", + "value": -0.004 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "role": "TaperAngle", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + } + }, + "operation": "JoinFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "type": "ExtrudeFeature" + }, + "F3z1PiRMRyXYwGL_1": { + "reference_plane": {}, + "type": "Sketch", + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "x_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + }, + "profiles": { + "JJG": { + "loops": [ + { + "profile_curves": [ + { + "center_point": { + "y": 0.0135, + "x": -0.0025, + "z": 0.0 + }, + "radius": 0.0015, + "type": "Circle3D", + "curve": "JJd+JJZ", + "normal": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + }, + "JJO": { + "loops": [ + { + "profile_curves": [ + { + "center_point": { + "y": 0.0195, + "x": -0.0025, + "z": 0.0 + }, + "start_point": { + "y": 0.0195, + "x": -0.001, + "z": 0.0 + }, + "start_angle": 0.0, + "end_point": { + "y": 0.0195, + "x": -0.004, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "curve": "JJV", + "end_angle": 3.141592653589793, + "radius": 0.0015, + "type": "Arc3D", + "reference_vector": { + "y": -0.0, + "x": -1.0, + "z": -0.0 + } + }, + { + "start_point": { + "y": 0.0195, + "x": -0.004, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JJl", + "end_point": { + "y": 0.0135, + "x": -0.004, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.0135, + "x": -0.0025, + "z": 0.0 + }, + "start_point": { + "y": 0.0135, + "x": -0.001, + "z": 0.0 + }, + "start_angle": 0.0, + "end_point": { + "y": 0.0135, + "x": -0.004, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "curve": "JJd", + "end_angle": 3.141592653589793, + "radius": 0.0015, + "type": "Arc3D", + "reference_vector": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + }, + { + "start_point": { + "y": 0.0135, + "x": -0.001, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JJh", + "end_point": { + "y": 0.0195, + "x": -0.001, + "z": 0.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + }, + "JJK": { + "loops": [ + { + "profile_curves": [ + { + "start_point": { + "y": 0.0, + "x": 0.003, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JJB", + "end_point": { + "y": 0.0, + "x": -0.008, + "z": 0.0 + } + }, + { + "start_point": { + "y": 0.0, + "x": -0.008, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JJN", + "end_point": { + "y": 0.02, + "x": -0.008, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.02, + "x": -0.004, + "z": 0.0 + }, + "start_point": { + "y": 0.024, + "x": -0.004, + "z": 0.0 + }, + "start_angle": 0.0, + "end_point": { + "y": 0.02, + "x": -0.008, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "curve": "JJp", + "end_angle": 1.5707963267948966, + "radius": 0.004, + "type": "Arc3D", + "reference_vector": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "start_point": { + "y": 0.024, + "x": -0.001, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JJF", + "end_point": { + "y": 0.024, + "x": -0.004, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.02, + "x": -0.001, + "z": 0.0 + }, + "start_point": { + "y": 0.024, + "x": -0.001, + "z": 0.0 + }, + "start_angle": 0.0, + "end_point": { + "y": 0.02, + "x": 0.003, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "curve": "JJt", + "end_angle": 1.5707963267948966, + "radius": 0.004, + "type": "Arc3D", + "reference_vector": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + }, + { + "start_point": { + "y": 0.0, + "x": 0.003, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JJJ", + "end_point": { + "y": 0.02, + "x": 0.003, + "z": 0.0 + } + } + ], + "is_outer": true + }, + { + "profile_curves": [ + { + "center_point": { + "y": 0.0195, + "x": -0.0025, + "z": 0.0 + }, + "start_point": { + "y": 0.0195, + "x": -0.001, + "z": 0.0 + }, + "start_angle": 0.0, + "end_point": { + "y": 0.0195, + "x": -0.004, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "curve": "JJR", + "end_angle": 3.141592653589793, + "radius": 0.0015, + "type": "Arc3D", + "reference_vector": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + }, + { + "start_point": { + "y": 0.0195, + "x": -0.004, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JJl", + "end_point": { + "y": 0.0135, + "x": -0.004, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.0135, + "x": -0.0025, + "z": 0.0 + }, + "start_point": { + "y": 0.0135, + "x": -0.001, + "z": 0.0 + }, + "start_angle": 0.0, + "end_point": { + "y": 0.0135, + "x": -0.004, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "curve": "JJZ", + "end_angle": 3.141592653589793, + "radius": 0.0015, + "type": "Arc3D", + "reference_vector": { + "y": -0.0, + "x": -1.0, + "z": -0.0 + } + }, + { + "start_point": { + "y": 0.0135, + "x": -0.001, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JJh", + "end_point": { + "y": 0.0195, + "x": -0.001, + "z": 0.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + }, + "JJC": { + "loops": [ + { + "profile_curves": [ + { + "center_point": { + "y": 0.0195, + "x": -0.0025, + "z": 0.0 + }, + "radius": 0.0015, + "type": "Circle3D", + "curve": "JJV+JJR", + "normal": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + } + }, + "name": "Sketch 1" + }, + "FcerFBMAXjJi1wF_1": { + "name": "Extrude 2", + "extent_type": "SymmetricFeatureExtentType", + "profiles": [ + { + "profile": "JJK", + "sketch": "F3z1PiRMRyXYwGL_1" + } + ], + "extent_two": { + "distance": { + "role": "AgainstDistance", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "role": "Side2TaperAngle", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "role": "AlongDistance", + "type": "ModelParameter", + "name": "none", + "value": 0.0015 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "role": "TaperAngle", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + } + }, + "operation": "JoinFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "type": "ExtrudeFeature" + }, + "Fz3gF1ioQKdqgMg_0": { + "name": "Extrude 1", + "extent_type": "OneSideFeatureExtentType", + "profiles": [ + { + "profile": "JGK", + "sketch": "FJuDRteU8j1KSGG_0" + } + ], + "extent_two": { + "distance": { + "role": "AgainstDistance", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "role": "Side2TaperAngle", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "role": "AlongDistance", + "type": "ModelParameter", + "name": "none", + "value": 0.004 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "role": "TaperAngle", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "type": "ExtrudeFeature" + }, + "FJuDRteU8j1KSGG_0": { + "reference_plane": {}, + "type": "Sketch", + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + }, + "profiles": { + "JGC": { + "loops": [ + { + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": -0.007, + "z": 0.0 + }, + "radius": 0.0015, + "type": "Circle3D", + "curve": "JGB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + }, + "JGK": { + "loops": [ + { + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": -0.007, + "z": 0.0 + }, + "radius": 0.0015, + "type": "Circle3D", + "curve": "JGB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ], + "is_outer": true + }, + { + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.007, + "z": 0.0 + }, + "radius": 0.0015, + "type": "Circle3D", + "curve": "JGF", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ], + "is_outer": true + }, + { + "profile_curves": [ + { + "start_point": { + "y": 0.0035, + "x": -0.0015, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JGJ", + "end_point": { + "y": 0.0035, + "x": -0.011, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.0015, + "x": -0.011, + "z": 0.0 + }, + "start_point": { + "y": 0.0035, + "x": -0.011, + "z": 0.0 + }, + "start_angle": 0.0, + "end_point": { + "y": 0.0015, + "x": -0.013, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "curve": "JGp", + "end_angle": 1.5707963267948966, + "radius": 0.002, + "type": "Arc3D", + "reference_vector": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "start_point": { + "y": 0.0015, + "x": -0.013, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JGN", + "end_point": { + "y": -0.004, + "x": -0.013, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.004, + "x": -0.009, + "z": 0.0 + }, + "start_point": { + "y": -0.004, + "x": -0.013, + "z": 0.0 + }, + "start_angle": 0.0, + "end_point": { + "y": -0.008, + "x": -0.009, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "curve": "JGh", + "end_angle": 1.5707963267948966, + "radius": 0.004, + "type": "Arc3D", + "reference_vector": { + "y": 0.0, + "x": -1.0, + "z": 0.0 + } + }, + { + "start_point": { + "y": -0.008, + "x": -0.009, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JGR", + "end_point": { + "y": -0.008, + "x": 0.009, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.004, + "x": 0.009, + "z": 0.0 + }, + "start_point": { + "y": -0.008, + "x": 0.009, + "z": 0.0 + }, + "start_angle": 0.0, + "end_point": { + "y": -0.004, + "x": 0.013, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "curve": "JGl", + "end_angle": 1.5707963267948966, + "radius": 0.004, + "type": "Arc3D", + "reference_vector": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "start_point": { + "y": -0.004, + "x": 0.013, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JGV", + "end_point": { + "y": 0.002, + "x": 0.013, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.002, + "x": 0.011, + "z": 0.0 + }, + "start_point": { + "y": 0.002, + "x": 0.013, + "z": 0.0 + }, + "start_angle": 0.0, + "end_point": { + "y": 0.004, + "x": 0.011, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "curve": "JGt", + "end_angle": 1.5707963267948966, + "radius": 0.002, + "type": "Arc3D", + "reference_vector": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + }, + { + "start_point": { + "y": 0.004, + "x": 0.011, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JGZ", + "end_point": { + "y": 0.004, + "x": 0.007, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.076, + "x": -0.0015, + "z": 0.0 + }, + "start_point": { + "y": 0.0035, + "x": -0.0015, + "z": 0.0 + }, + "start_angle": 0.0, + "end_point": { + "y": 0.004, + "x": 0.007, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "curve": "JGd", + "end_angle": 0.11751164543144554, + "radius": 0.0725, + "type": "Arc3D", + "reference_vector": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + }, + "JGG": { + "loops": [ + { + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.007, + "z": 0.0 + }, + "radius": 0.0015, + "type": "Circle3D", + "curve": "JGF", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + } + }, + "name": "Base" + }, + "FN68dN3WUbEJmfT_1": { + "reference_plane": {}, + "type": "Sketch", + "transform": { + "origin": { + "y": -0.008, + "x": 0.0, + "z": 0.01 + }, + "y_axis": { + "y": 0.0, + "x": -0.0, + "z": 1.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + "profiles": { + "JNK": { + "loops": [ + { + "profile_curves": [ + { + "start_point": { + "y": -0.006, + "x": 0.009, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JNJ", + "end_point": { + "y": 0.0, + "x": 0.0015, + "z": 0.0 + } + }, + { + "start_point": { + "y": -0.006, + "x": 0.0015, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JN1", + "end_point": { + "y": 0.0, + "x": 0.0015, + "z": 0.0 + } + }, + { + "start_point": { + "y": -0.006, + "x": 0.009, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JNV", + "end_point": { + "y": -0.006, + "x": 0.0015, + "z": 0.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + }, + "JNS": { + "loops": [ + { + "profile_curves": [ + { + "start_point": { + "y": 0.0, + "x": -0.0015, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JNF", + "end_point": { + "y": 0.0, + "x": 0.0015, + "z": 0.0 + } + }, + { + "start_point": { + "y": -0.006, + "x": 0.0015, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JN1", + "end_point": { + "y": 0.0, + "x": 0.0015, + "z": 0.0 + } + }, + { + "start_point": { + "y": -0.006, + "x": -0.0015, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JNR", + "end_point": { + "y": -0.006, + "x": 0.0015, + "z": 0.0 + } + }, + { + "start_point": { + "y": -0.006, + "x": -0.0015, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JNt", + "end_point": { + "y": 0.0, + "x": -0.0015, + "z": 0.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + }, + "JNG": { + "loops": [ + { + "profile_curves": [ + { + "start_point": { + "y": -0.006, + "x": -0.009, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JNB", + "end_point": { + "y": 0.0, + "x": -0.0015, + "z": 0.0 + } + }, + { + "start_point": { + "y": -0.006, + "x": -0.0015, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JNt", + "end_point": { + "y": 0.0, + "x": -0.0015, + "z": 0.0 + } + }, + { + "start_point": { + "y": -0.006, + "x": -0.009, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JNN", + "end_point": { + "y": -0.006, + "x": -0.0015, + "z": 0.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + } + }, + "name": "Sketch 2" + } + }, + "properties": { + "bounding_box": { + "max_point": { + "y": 0.004000000000000005, + "x": 0.013000000000000006, + "z": 0.024 + }, + "type": "BoundingBox3D", + "min_point": { + "y": -0.008000000000000002, + "x": -0.013000000000000003, + "z": 0.0 + } + } + }, + "sequence": [ + { + "index": 0, + "type": "Sketch", + "entity": "FJuDRteU8j1KSGG_0" + }, + { + "index": 1, + "type": "ExtrudeFeature", + "entity": "Fz3gF1ioQKdqgMg_0" + }, + { + "index": 2, + "type": "Sketch", + "entity": "F3z1PiRMRyXYwGL_1" + }, + { + "index": 3, + "type": "ExtrudeFeature", + "entity": "FcerFBMAXjJi1wF_1" + }, + { + "index": 4, + "type": "Sketch", + "entity": "FN68dN3WUbEJmfT_1" + }, + { + "index": 5, + "type": "ExtrudeFeature", + "entity": "FJ40dF9MH7rGtXk_1" + } + ] +} \ No newline at end of file diff --git a/Bethany/examples/00004691.json b/Bethany/examples/00004691.json new file mode 100644 index 0000000..b48fbb7 --- /dev/null +++ b/Bethany/examples/00004691.json @@ -0,0 +1,1469 @@ +{ + "entities": { + "FX2cHldky4dQB1G_0": { + "name": "Extrude 1", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGC", + "sketch": "Fbtyvs1G8tHMWUM_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.003 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FWuhpwZcOLBXM1T_1": { + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + }, + "type": "Sketch", + "name": "Sketch 3", + "profiles": { + "JNC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.02854786, + "x": 0.0035, + "z": 0.0 + }, + "curve": "JNB", + "end_point": { + "y": 0.02854786, + "x": 0.0065, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02854786, + "x": 0.0065, + "z": 0.0 + }, + "curve": "JNN", + "end_point": { + "y": 0.02954786, + "x": 0.0065, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02954786, + "x": 0.0035, + "z": 0.0 + }, + "curve": "JNF", + "end_point": { + "y": 0.02954786, + "x": 0.0065, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02854786, + "x": 0.0035, + "z": 0.0 + }, + "curve": "JNJ", + "end_point": { + "y": 0.02954786, + "x": 0.0035, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JNK": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.02904786, + "x": 0.035, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0015, + "curve": "JNR", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.02904786, + "x": 0.035, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.001, + "curve": "JNV", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JNG": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.02854786, + "x": 0.0635, + "z": 0.0 + }, + "curve": "JNZ", + "end_point": { + "y": 0.02854786, + "x": 0.0645, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02854786, + "x": 0.0645, + "z": 0.0 + }, + "curve": "JN1", + "end_point": { + "y": 0.02754786, + "x": 0.0645, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02754786, + "x": 0.0655, + "z": 0.0 + }, + "curve": "JNp", + "end_point": { + "y": 0.02754786, + "x": 0.0645, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02754786, + "x": 0.0655, + "z": 0.0 + }, + "curve": "JNx", + "end_point": { + "y": 0.02854786, + "x": 0.0655, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02854786, + "x": 0.0665, + "z": 0.0 + }, + "curve": "JN9", + "end_point": { + "y": 0.02854786, + "x": 0.0655, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02854786, + "x": 0.0665, + "z": 0.0 + }, + "curve": "JNl", + "end_point": { + "y": 0.02954786, + "x": 0.0665, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02954786, + "x": 0.0665, + "z": 0.0 + }, + "curve": "KNFB", + "end_point": { + "y": 0.02954786, + "x": 0.0655, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.03054786, + "x": 0.0655, + "z": 0.0 + }, + "curve": "KNBB", + "end_point": { + "y": 0.02954786, + "x": 0.0655, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.03054786, + "x": 0.0655, + "z": 0.0 + }, + "curve": "JNt", + "end_point": { + "y": 0.03054786, + "x": 0.0645, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02954786, + "x": 0.0645, + "z": 0.0 + }, + "curve": "JN5", + "end_point": { + "y": 0.03054786, + "x": 0.0645, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02954786, + "x": 0.0635, + "z": 0.0 + }, + "curve": "JNd", + "end_point": { + "y": 0.02954786, + "x": 0.0645, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02854786, + "x": 0.0635, + "z": 0.0 + }, + "curve": "JNh", + "end_point": { + "y": 0.02954786, + "x": 0.0635, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JNO": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.02904786, + "x": 0.035, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.001, + "curve": "JNV", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "Fl4Tj9C4djjjI86_1": { + "name": "Extrude 2", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JJC", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "JJG", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "JJK", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "JJO", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "JJS", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "JJW", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "JJa", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "JJe", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "JJi", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "JJm", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "JJq", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "JJu", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "JJy", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "JJ2", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "JJ6", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "JJ+", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "KJCB", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "KJGB", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "KJKB", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "KJOB", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "KJSB", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "KJWB", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "KJaB", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "KJeB", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "KJiB", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "KJmB", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "KJqB", + "sketch": "FBNgBgD4L1nPzRP_1" + }, + { + "profile": "KJuB", + "sketch": "FBNgBgD4L1nPzRP_1" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.005 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "CutFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "Fbtyvs1G8tHMWUM_0": { + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + }, + "type": "Sketch", + "name": "Sketch 1", + "profiles": { + "JGC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "curve": "JGB", + "end_point": { + "y": 0.0, + "x": 0.07, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0, + "x": 0.07, + "z": 0.0 + }, + "curve": "JGN", + "end_point": { + "y": 0.0325, + "x": 0.07, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0325, + "x": 0.0, + "z": 0.0 + }, + "curve": "JGF", + "end_point": { + "y": 0.0325, + "x": 0.07, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "curve": "JGJ", + "end_point": { + "y": 0.0325, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "FBNgBgD4L1nPzRP_1": { + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + }, + "type": "Sketch", + "name": "Sketch 2", + "profiles": { + "KJCB": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.00884786, + "x": 0.015, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0019, + "curve": "KJBB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "KJmB": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.01544786, + "x": 0.065, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00265, + "curve": "KJlB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JJ6": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.00324786, + "x": 0.045, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00155, + "curve": "JJ5", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JJ2": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.00324786, + "x": 0.035, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0015, + "curve": "JJ1", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JJ+": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.00884786, + "x": 0.005, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00185, + "curve": "JJ9", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "KJqB": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.02304786, + "x": 0.055, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0031, + "curve": "KJpB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "KJKB": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.00884786, + "x": 0.035, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.002, + "curve": "KJJB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "KJuB": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.02304786, + "x": 0.065, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00315, + "curve": "KJtB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "KJOB": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.00884786, + "x": 0.045, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00205, + "curve": "KJNB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "KJSB": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.00324786, + "x": 0.055, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0016, + "curve": "KJRB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "KJWB": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.00324786, + "x": 0.065, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00165, + "curve": "KJVB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JJy": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.00324786, + "x": 0.025, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00145, + "curve": "JJx", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JJu": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.00324786, + "x": 0.015, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0014, + "curve": "JJt", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JJq": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.00324786, + "x": 0.005, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00135, + "curve": "JJp", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JJm": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.02304786, + "x": 0.045, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00305, + "curve": "JJl", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JJi": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.02304786, + "x": 0.035, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.003, + "curve": "JJh", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JJe": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.02304786, + "x": 0.025, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00295, + "curve": "JJd", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JJa": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.02304786, + "x": 0.015, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0029, + "curve": "JJZ", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "KJaB": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.00884786, + "x": 0.055, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0021, + "curve": "KJZB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JJW": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.02304786, + "x": 0.005, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00285, + "curve": "JJV", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "KJeB": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.00884786, + "x": 0.065, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00215, + "curve": "KJdB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JJS": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.01544786, + "x": 0.045, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00255, + "curve": "JJR", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JJO": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.01544786, + "x": 0.035, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0025, + "curve": "JJN", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JJK": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.01544786, + "x": 0.025, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00245, + "curve": "JJJ", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JJG": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.01544786, + "x": 0.015, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0024, + "curve": "JJF", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "KJGB": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.00884786, + "x": 0.025, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00195, + "curve": "KJFB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JJC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.01544786, + "x": 0.005, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00235, + "curve": "JJB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "KJiB": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.01544786, + "x": 0.055, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0026, + "curve": "KJhB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "FspeISVwbxbKQC7_1": { + "name": "Extrude 3", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JNC", + "sketch": "FWuhpwZcOLBXM1T_1" + }, + { + "profile": "JNG", + "sketch": "FWuhpwZcOLBXM1T_1" + }, + { + "profile": "JNK", + "sketch": "FWuhpwZcOLBXM1T_1" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": -0.0005 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "JoinFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + } + }, + "properties": { + "bounding_box": { + "max_point": { + "y": 0.0325, + "x": 0.07, + "z": 0.003 + }, + "type": "BoundingBox3D", + "min_point": { + "y": 0.0, + "x": -5.944591465157291e-18, + "z": -0.0005 + } + } + }, + "sequence": [ + { + "index": 0, + "type": "Sketch", + "entity": "Fbtyvs1G8tHMWUM_0" + }, + { + "index": 1, + "type": "ExtrudeFeature", + "entity": "FX2cHldky4dQB1G_0" + }, + { + "index": 2, + "type": "Sketch", + "entity": "FBNgBgD4L1nPzRP_1" + }, + { + "index": 3, + "type": "ExtrudeFeature", + "entity": "Fl4Tj9C4djjjI86_1" + }, + { + "index": 4, + "type": "Sketch", + "entity": "FWuhpwZcOLBXM1T_1" + }, + { + "index": 5, + "type": "ExtrudeFeature", + "entity": "FspeISVwbxbKQC7_1" + } + ] +} \ No newline at end of file diff --git a/Bethany/examples/00005081.json b/Bethany/examples/00005081.json new file mode 100644 index 0000000..deda537 --- /dev/null +++ b/Bethany/examples/00005081.json @@ -0,0 +1,498 @@ +{ + "entities": { + "F5c4pqDbip87cOv_1": { + "name": "Extrude 2", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JJK", + "sketch": "FZ8bL1M2q7EXt0u_1" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.0014 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "JoinFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FZ8bL1M2q7EXt0u_1": { + "transform": { + "origin": { + "y": -0.0, + "x": 0.0, + "z": 0.0016 + }, + "y_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + }, + "type": "Sketch", + "name": "Sketch 2", + "profiles": { + "JJC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0025, + "curve": "JJB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JJK": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0025, + "curve": "JJB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00345, + "curve": "JJF", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "F5BhbWqXcUw0QKR_0": { + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + }, + "type": "Sketch", + "name": "Sketch 1", + "profiles": { + "JGC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.0075, + "x": 0.0035, + "z": 0.0 + }, + "curve": "JGB", + "end_point": { + "y": 0.0075, + "x": -0.0035, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.006, + "x": -0.0035, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.006, + "x": -0.005, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGR", + "end_angle": 1.5707963267948966, + "radius": 0.0015, + "type": "Arc3D", + "start_point": { + "y": 0.0075, + "x": -0.0035, + "z": 0.0 + }, + "reference_vector": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.006, + "x": -0.005, + "z": 0.0 + }, + "curve": "JGN", + "end_point": { + "y": -0.006, + "x": -0.005, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.006, + "x": -0.0035, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": -0.006, + "x": -0.005, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGV", + "end_angle": 1.5707963267948966, + "radius": 0.0015, + "type": "Arc3D", + "start_point": { + "y": -0.0075, + "x": -0.0035, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": -1.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.0075, + "x": 0.0035, + "z": 0.0 + }, + "curve": "JGF", + "end_point": { + "y": -0.0075, + "x": -0.0035, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.006, + "x": 0.0035, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": -0.006, + "x": 0.005, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGZ", + "end_angle": 1.5707963267948966, + "radius": 0.0015, + "type": "Arc3D", + "start_point": { + "y": -0.0075, + "x": 0.0035, + "z": 0.0 + }, + "reference_vector": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.006, + "x": 0.005, + "z": 0.0 + }, + "curve": "JGJ", + "end_point": { + "y": -0.006, + "x": 0.005, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.006, + "x": 0.0035, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.006, + "x": 0.005, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGd", + "end_angle": 1.5707963267948966, + "radius": 0.0015, + "type": "Arc3D", + "start_point": { + "y": 0.0075, + "x": 0.0035, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0025, + "curve": "JGh", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JGG": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0025, + "curve": "JGh", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "FwAoVHn0IYyGbWo_0": { + "name": "Extrude 1", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGC", + "sketch": "F5BhbWqXcUw0QKR_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.0016 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + } + }, + "properties": { + "bounding_box": { + "max_point": { + "y": 0.007499999999999999, + "x": 0.005000000000000001, + "z": 0.003 + }, + "type": "BoundingBox3D", + "min_point": { + "y": -0.0075, + "x": -0.005000000000000001, + "z": 0.0 + } + } + }, + "sequence": [ + { + "index": 0, + "type": "Sketch", + "entity": "F5BhbWqXcUw0QKR_0" + }, + { + "index": 1, + "type": "ExtrudeFeature", + "entity": "FwAoVHn0IYyGbWo_0" + }, + { + "index": 2, + "type": "Sketch", + "entity": "FZ8bL1M2q7EXt0u_1" + }, + { + "index": 3, + "type": "ExtrudeFeature", + "entity": "F5c4pqDbip87cOv_1" + } + ] +} \ No newline at end of file diff --git a/Bethany/examples/00005082.json b/Bethany/examples/00005082.json new file mode 100644 index 0000000..e74be44 --- /dev/null +++ b/Bethany/examples/00005082.json @@ -0,0 +1,498 @@ +{ + "entities": { + "F99k1D8wnwW2DMl_0": { + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + }, + "type": "Sketch", + "name": "Sketch 1", + "profiles": { + "JGC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.01, + "x": 0.0085, + "z": 0.0 + }, + "curve": "JGB", + "end_point": { + "y": 0.01, + "x": -0.0085, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.0085, + "x": -0.0085, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.0085, + "x": -0.01, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGV", + "end_angle": 1.5707963267948966, + "radius": 0.0015, + "type": "Arc3D", + "start_point": { + "y": 0.01, + "x": -0.0085, + "z": 0.0 + }, + "reference_vector": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0085, + "x": -0.01, + "z": 0.0 + }, + "curve": "JGN", + "end_point": { + "y": -0.0085, + "x": -0.01, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.0085, + "x": -0.0085, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": -0.0085, + "x": -0.01, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGZ", + "end_angle": 1.5707963267948966, + "radius": 0.0015, + "type": "Arc3D", + "start_point": { + "y": -0.01, + "x": -0.0085, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": -1.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01, + "x": 0.0085, + "z": 0.0 + }, + "curve": "JGF", + "end_point": { + "y": -0.01, + "x": -0.0085, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.0085, + "x": 0.0085, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": -0.0085, + "x": 0.01, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGd", + "end_angle": 1.5707963267948966, + "radius": 0.0015, + "type": "Arc3D", + "start_point": { + "y": -0.01, + "x": 0.0085, + "z": 0.0 + }, + "reference_vector": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0085, + "x": 0.01, + "z": 0.0 + }, + "curve": "JGJ", + "end_point": { + "y": -0.0085, + "x": 0.01, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.0085, + "x": 0.0085, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.0085, + "x": 0.01, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGh", + "end_angle": 1.5707963267948966, + "radius": 0.0015, + "type": "Arc3D", + "start_point": { + "y": 0.01, + "x": 0.0085, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0025, + "curve": "JGR", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JGG": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0025, + "curve": "JGR", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "FVF0CQZ4DLkH0Xw_1": { + "name": "Extrude 2", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JJK", + "sketch": "FeTIkbBD8FHuMLr_1" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": -0.0015 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "CutFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FuPAaUoL6yD51aa_0": { + "name": "Extrude 1", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGC", + "sketch": "F99k1D8wnwW2DMl_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.003 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FeTIkbBD8FHuMLr_1": { + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.003 + }, + "y_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + }, + "type": "Sketch", + "name": "Sketch 2", + "profiles": { + "JJC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0025, + "curve": "JJB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JJK": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0025, + "curve": "JJB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.005, + "curve": "JJF", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + } + }, + "properties": { + "bounding_box": { + "max_point": { + "y": 0.01, + "x": 0.01, + "z": 0.003 + }, + "type": "BoundingBox3D", + "min_point": { + "y": -0.01, + "x": -0.01, + "z": 0.0 + } + } + }, + "sequence": [ + { + "index": 0, + "type": "Sketch", + "entity": "F99k1D8wnwW2DMl_0" + }, + { + "index": 1, + "type": "ExtrudeFeature", + "entity": "FuPAaUoL6yD51aa_0" + }, + { + "index": 2, + "type": "Sketch", + "entity": "FeTIkbBD8FHuMLr_1" + }, + { + "index": 3, + "type": "ExtrudeFeature", + "entity": "FVF0CQZ4DLkH0Xw_1" + } + ] +} \ No newline at end of file diff --git a/Bethany/examples/00015361.json b/Bethany/examples/00015361.json new file mode 100644 index 0000000..8350693 --- /dev/null +++ b/Bethany/examples/00015361.json @@ -0,0 +1,4591 @@ +{ + "entities": { + "FoO7MyPj7EaIwWq_1": { + "transform": { + "origin": { + "y": 0.02025, + "x": 0.00165, + "z": 0.0 + }, + "y_axis": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + } + }, + "type": "Sketch", + "name": "Sketch 10", + "profiles": { + "JRG": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": -0.017321069999999997, + "x": 0.03592107, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00175, + "curve": "JRF", + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + } + } + ] + } + ], + "properties": {} + }, + "JRO": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.01732107, + "x": 0.0012789300000000002, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00175, + "curve": "JRN", + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + } + } + ] + } + ], + "properties": {} + }, + "JRC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.01732107, + "x": 0.03592107, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00175, + "curve": "JRB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + } + } + ] + } + ], + "properties": {} + }, + "JRK": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": -0.017321069999999997, + "x": 0.0012789300000000002, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00175, + "curve": "JRJ", + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "FgfW1xp3ztTq9ZU_1": { + "name": "Extrude 9", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JNG", + "sketch": "FCLEQ3DHM0IiJcF_1" + }, + { + "profile": "JNO", + "sketch": "FCLEQ3DHM0IiJcF_1" + }, + { + "profile": "JNS", + "sketch": "FCLEQ3DHM0IiJcF_1" + }, + { + "profile": "JNa", + "sketch": "FCLEQ3DHM0IiJcF_1" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.011 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "JoinFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FAaL8fuCODmBxZX_1": { + "name": "Extrude 10", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JRC", + "sketch": "FoO7MyPj7EaIwWq_1" + }, + { + "profile": "JRG", + "sketch": "FoO7MyPj7EaIwWq_1" + }, + { + "profile": "JRK", + "sketch": "FoO7MyPj7EaIwWq_1" + }, + { + "profile": "JRO", + "sketch": "FoO7MyPj7EaIwWq_1" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.02 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": -0.02 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "CutFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "TwoSidesFeatureExtentType" + }, + "FXbWNcCzWKfLMdX_0": { + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + }, + "type": "Sketch", + "name": "Sketch 1", + "profiles": { + "JGi": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.00292893, + "x": 0.00292893, + "z": 0.0 + }, + "radius": 0.00292893, + "type": "Circle3D", + "curve": "KGZB+KGVB+KGRB+KGNB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JGK": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.00292893, + "x": 0.0, + "z": 0.0 + }, + "curve": "JGJ", + "end_point": { + "y": 0.00858081, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.00858081, + "x": 0.0033, + "z": 0.0 + }, + "curve": "KGlB", + "end_point": { + "y": 0.00858081, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.00583426, + "x": 0.0033, + "z": 0.0 + }, + "curve": "KGhB", + "end_point": { + "y": 0.00858081, + "x": 0.0033, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.00292893, + "x": 0.00292893, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.00583426, + "x": 0.0033, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KGRB", + "end_angle": 1.6978289966786286, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": 0.00292893, + "x": 0.0, + "z": 0.0 + }, + "reference_vector": { + "y": 0.9919421950739371, + "x": 0.12669128475115932, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGm": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.005, + "x": 0.005, + "z": 0.0 + }, + "curve": "JGV", + "end_point": { + "y": 0.005, + "x": 0.0355, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.00292893, + "x": 0.03757107, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.00583426, + "x": 0.0372, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KGBB", + "end_angle": 0.6583654935137153, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": 0.005, + "x": 0.0355, + "z": 0.0 + }, + "reference_vector": { + "y": 0.991942195073937, + "x": -0.12669128475115973, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.03466574, + "x": 0.0372, + "z": 0.0 + }, + "curve": "KGpB", + "end_point": { + "y": 0.00583426, + "x": 0.0372, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.03757107, + "x": 0.03757107, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.03466574, + "x": 0.0372, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JG1", + "end_angle": 0.6583654935137151, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": 0.0355, + "x": 0.0355, + "z": 0.0 + }, + "reference_vector": { + "y": -0.7071067811865476, + "x": -0.7071067811865476, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0355, + "x": 0.005, + "z": 0.0 + }, + "curve": "JGZ", + "end_point": { + "y": 0.0355, + "x": 0.0355, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.03757107, + "x": 0.00292893, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.03466574, + "x": 0.0033, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGl", + "end_angle": 0.6583654935137151, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": 0.0355, + "x": 0.005, + "z": 0.0 + }, + "reference_vector": { + "y": -0.9919421950739371, + "x": 0.1266912847511594, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.03466574, + "x": 0.0033, + "z": 0.0 + }, + "curve": "KGdB", + "end_point": { + "y": 0.00858081, + "x": 0.0033, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.00583426, + "x": 0.0033, + "z": 0.0 + }, + "curve": "KGhB", + "end_point": { + "y": 0.00858081, + "x": 0.0033, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.00292893, + "x": 0.00292893, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.00583426, + "x": 0.0033, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KGNB", + "end_angle": 0.6583654935137161, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": 0.005, + "x": 0.005, + "z": 0.0 + }, + "reference_vector": { + "y": 0.7071067811865476, + "x": 0.7071067811865476, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGO": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.03757107, + "x": 0.0, + "z": 0.0 + }, + "curve": "JGN", + "end_point": { + "y": 0.00858081, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.00858081, + "x": 0.0033, + "z": 0.0 + }, + "curve": "KGlB", + "end_point": { + "y": 0.00858081, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.03466574, + "x": 0.0033, + "z": 0.0 + }, + "curve": "KGdB", + "end_point": { + "y": 0.00858081, + "x": 0.0033, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.03757107, + "x": 0.00292893, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.03466574, + "x": 0.0033, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGh", + "end_angle": 1.6978289966786289, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": 0.03757107, + "x": 0.0, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": -1.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGa": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.03757107, + "x": 0.03757107, + "z": 0.0 + }, + "radius": 0.00292893, + "type": "Circle3D", + "curve": "JGx+JG1+JG5+JGt", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JGC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.0, + "x": 0.00292893, + "z": 0.0 + }, + "curve": "JGB", + "end_point": { + "y": 0.0, + "x": 0.03757107, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.00292893, + "x": 0.03757107, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.005, + "x": 0.0355, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KGFB", + "end_angle": 2.356194490192345, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": 0.0, + "x": 0.03757107, + "z": 0.0 + }, + "reference_vector": { + "y": 0.7071067811865474, + "x": -0.7071067811865478, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.005, + "x": 0.005, + "z": 0.0 + }, + "curve": "JGV", + "end_point": { + "y": 0.005, + "x": 0.0355, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.00292893, + "x": 0.00292893, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.005, + "x": 0.005, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KGZB", + "end_angle": 2.356194490192345, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": 0.0, + "x": 0.00292893, + "z": 0.0 + }, + "reference_vector": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGe": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.00292893, + "x": 0.03757107, + "z": 0.0 + }, + "radius": 0.00292893, + "type": "Circle3D", + "curve": "KGJB+KGFB+KGBB+JG9", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JGG": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.0405, + "x": 0.00292893, + "z": 0.0 + }, + "curve": "JGF", + "end_point": { + "y": 0.0405, + "x": 0.03757107, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.03757107, + "x": 0.03757107, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.0355, + "x": 0.0355, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGx", + "end_angle": 2.356194490192345, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": 0.0405, + "x": 0.03757107, + "z": 0.0 + }, + "reference_vector": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0355, + "x": 0.005, + "z": 0.0 + }, + "curve": "JGZ", + "end_point": { + "y": 0.0355, + "x": 0.0355, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.03757107, + "x": 0.00292893, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.0355, + "x": 0.005, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JGp", + "end_angle": 2.3561944901923457, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": 0.0405, + "x": 0.00292893, + "z": 0.0 + }, + "reference_vector": { + "y": -0.7071067811865478, + "x": 0.7071067811865474, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGS": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.00292893, + "x": 0.0405, + "z": 0.0 + }, + "curve": "JGR", + "end_point": { + "y": 0.03757107, + "x": 0.0405, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.03757107, + "x": 0.03757107, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.03466574, + "x": 0.0372, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JG5", + "end_angle": 1.6978289966786297, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": 0.03757107, + "x": 0.0405, + "z": 0.0 + }, + "reference_vector": { + "y": -0.991942195073937, + "x": -0.12669128475115984, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.03466574, + "x": 0.0372, + "z": 0.0 + }, + "curve": "KGpB", + "end_point": { + "y": 0.00583426, + "x": 0.0372, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.00292893, + "x": 0.03757107, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.00583426, + "x": 0.0372, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JG9", + "end_angle": 1.6978289966786295, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": 0.00292893, + "x": 0.0405, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JGW": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.03757107, + "x": 0.00292893, + "z": 0.0 + }, + "radius": 0.00292893, + "type": "Circle3D", + "curve": "JGp+JGl+JGh+JGd", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "FDfhYsBHgRf8Zr1_1": { + "name": "Extrude 2", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JJC", + "sketch": "FzRWb4mdluwe2Hl_1" + }, + { + "profile": "JJK", + "sketch": "FzRWb4mdluwe2Hl_1" + }, + { + "profile": "JJO", + "sketch": "FzRWb4mdluwe2Hl_1" + }, + { + "profile": "JJS", + "sketch": "FzRWb4mdluwe2Hl_1" + }, + { + "profile": "JJi", + "sketch": "FzRWb4mdluwe2Hl_1" + }, + { + "profile": "JJq", + "sketch": "FzRWb4mdluwe2Hl_1" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": -0.002 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "JoinFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FzRWb4mdluwe2Hl_1": { + "transform": { + "origin": { + "y": 0.02025, + "x": 0.02025, + "z": 0.002 + }, + "y_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + }, + "type": "Sketch", + "name": "Sketch 2", + "profiles": { + "JJS": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.02025, + "x": -0.005125000000000001, + "z": 0.0 + }, + "curve": "KJZB", + "end_point": { + "y": 0.015249999999999996, + "x": -0.005125000000000001, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.015249999999999996, + "x": -0.005125000000000001, + "z": 0.0 + }, + "curve": "KJRD", + "end_point": { + "y": 0.015249999999999996, + "x": -0.007125000000000001, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02025, + "x": -0.007125000000000001, + "z": 0.0 + }, + "curve": "KJhB", + "end_point": { + "y": 0.015249999999999996, + "x": -0.007125000000000001, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02025, + "x": -0.005125000000000001, + "z": 0.0 + }, + "curve": "KJlB", + "end_point": { + "y": 0.02025, + "x": -0.007125000000000001, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JJq": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": -0.002749999999999999, + "x": -0.005125000000000001, + "z": 0.0 + }, + "curve": "JJd", + "end_point": { + "y": -0.01525, + "x": -0.005125000000000001, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01525, + "x": -0.005125000000000001, + "z": 0.0 + }, + "curve": "KJFD", + "end_point": { + "y": -0.01525, + "x": -0.007125000000000001, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.002749999999999999, + "x": -0.007125000000000001, + "z": 0.0 + }, + "curve": "JJl", + "end_point": { + "y": -0.01525, + "x": -0.007125000000000001, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.002749999999999999, + "x": -0.007125000000000001, + "z": 0.0 + }, + "curve": "JJ9", + "end_point": { + "y": 0.0022499999999999985, + "x": -0.007125000000000001, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0022499999999999985, + "x": -0.007125000000000001, + "z": 0.0 + }, + "curve": "KJdB", + "end_point": { + "y": 0.015249999999999996, + "x": -0.007125000000000001, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.015249999999999996, + "x": -0.005125000000000001, + "z": 0.0 + }, + "curve": "KJRD", + "end_point": { + "y": 0.015249999999999996, + "x": -0.007125000000000001, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0022499999999999985, + "x": -0.005125000000000001, + "z": 0.0 + }, + "curve": "KJVB", + "end_point": { + "y": 0.015249999999999996, + "x": -0.005125000000000001, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.002749999999999999, + "x": -0.005125000000000001, + "z": 0.0 + }, + "curve": "KJBB", + "end_point": { + "y": 0.0022499999999999985, + "x": -0.005125000000000001, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JJO": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": -0.02025, + "x": -0.005125000000000001, + "z": 0.0 + }, + "curve": "JJZ", + "end_point": { + "y": -0.01525, + "x": -0.005125000000000001, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01525, + "x": -0.005125000000000001, + "z": 0.0 + }, + "curve": "KJFD", + "end_point": { + "y": -0.01525, + "x": -0.007125000000000001, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.02025, + "x": -0.007125000000000001, + "z": 0.0 + }, + "curve": "JJh", + "end_point": { + "y": -0.01525, + "x": -0.007125000000000001, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.02025, + "x": -0.005125000000000001, + "z": 0.0 + }, + "curve": "JJp", + "end_point": { + "y": -0.02025, + "x": -0.007125000000000001, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JJK": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.02025, + "x": 0.005125000000000001, + "z": 0.0 + }, + "curve": "JJR", + "end_point": { + "y": 0.02025, + "x": 0.007124999999999999, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02025, + "x": 0.007124999999999999, + "z": 0.0 + }, + "curve": "JJ5", + "end_point": { + "y": 0.015249999999999996, + "x": 0.007124999999999999, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.015249999999999996, + "x": 0.005125000000000001, + "z": 0.0 + }, + "curve": "KJJD", + "end_point": { + "y": 0.015249999999999996, + "x": 0.007124999999999999, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02025, + "x": 0.005125000000000001, + "z": 0.0 + }, + "curve": "JJx", + "end_point": { + "y": 0.015249999999999996, + "x": 0.005125000000000001, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JJi": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": -0.002749999999999999, + "x": 0.005125000000000001, + "z": 0.0 + }, + "curve": "JJF", + "end_point": { + "y": -0.01525, + "x": 0.005125000000000001, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01525, + "x": 0.005125000000000001, + "z": 0.0 + }, + "curve": "KJ9C", + "end_point": { + "y": -0.01525, + "x": 0.007124999999999999, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.002749999999999999, + "x": 0.007124999999999999, + "z": 0.0 + }, + "curve": "JJN", + "end_point": { + "y": -0.01525, + "x": 0.007124999999999999, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.002749999999999999, + "x": 0.007124999999999999, + "z": 0.0 + }, + "curve": "KJJB", + "end_point": { + "y": 0.0022499999999999985, + "x": 0.007124999999999999, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0022499999999999985, + "x": 0.007124999999999999, + "z": 0.0 + }, + "curve": "JJ1", + "end_point": { + "y": 0.015249999999999996, + "x": 0.007124999999999999, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.015249999999999996, + "x": 0.005125000000000001, + "z": 0.0 + }, + "curve": "KJJD", + "end_point": { + "y": 0.015249999999999996, + "x": 0.007124999999999999, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0022499999999999985, + "x": 0.005125000000000001, + "z": 0.0 + }, + "curve": "JJt", + "end_point": { + "y": 0.015249999999999996, + "x": 0.005125000000000001, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.002749999999999999, + "x": 0.005125000000000001, + "z": 0.0 + }, + "curve": "KJFB", + "end_point": { + "y": 0.0022499999999999985, + "x": 0.005125000000000001, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JJC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": -0.02025, + "x": 0.005125000000000001, + "z": 0.0 + }, + "curve": "JJB", + "end_point": { + "y": -0.01525, + "x": 0.005125000000000001, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01525, + "x": 0.005125000000000001, + "z": 0.0 + }, + "curve": "KJ9C", + "end_point": { + "y": -0.01525, + "x": 0.007124999999999999, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.02025, + "x": 0.007124999999999999, + "z": 0.0 + }, + "curve": "JJJ", + "end_point": { + "y": -0.01525, + "x": 0.007124999999999999, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.02025, + "x": 0.005125000000000001, + "z": 0.0 + }, + "curve": "JJV", + "end_point": { + "y": -0.02025, + "x": 0.007124999999999999, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "FhRJxCbsk2Zj5Ld_1": { + "transform": { + "origin": { + "y": 0.02025, + "x": 0.02025, + "z": 0.002 + }, + "y_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + }, + "type": "Sketch", + "name": "Sketch 4", + "profiles": { + "JZO": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": -0.01732107, + "x": 0.017321069999999997, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00175, + "curve": "KZpC", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JZm": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": -0.01558902, + "x": 0.02032107, + "z": 0.0 + }, + "curve": "KZBB", + "end_point": { + "y": -0.015547990000000001, + "x": 0.02025, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01732107, + "x": 0.02025, + "z": 0.0 + }, + "curve": "KZtD", + "end_point": { + "y": -0.015547990000000001, + "x": 0.02025, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.01732107, + "x": 0.017321069999999997, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": -0.01732107, + "x": 0.02025, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KZJC", + "end_angle": 1.5707963267948966, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": -0.02025, + "x": 0.017321069999999997, + "z": 0.0 + }, + "reference_vector": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.02025, + "x": 0.017321069999999997, + "z": 0.0 + }, + "curve": "KZ9D", + "end_point": { + "y": -0.02025, + "x": 0.016394129999999996, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.020785170000000002, + "x": 0.017321069999999997, + "z": 0.0 + }, + "curve": "KZRB", + "end_point": { + "y": -0.02025, + "x": 0.016394129999999996, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01905312, + "x": 0.02032107, + "z": 0.0 + }, + "curve": "KZJB", + "end_point": { + "y": -0.020785170000000002, + "x": 0.017321069999999997, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01558902, + "x": 0.02032107, + "z": 0.0 + }, + "curve": "KZdB", + "end_point": { + "y": -0.01905312, + "x": 0.02032107, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JZi": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.015589019999999999, + "x": 0.02032107, + "z": 0.0 + }, + "curve": "JZh", + "end_point": { + "y": 0.015547990000000001, + "x": 0.02025, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.017321069999999997, + "x": 0.02025, + "z": 0.0 + }, + "curve": "KZxD", + "end_point": { + "y": 0.015547990000000001, + "x": 0.02025, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.017321069999999997, + "x": 0.017321069999999997, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.017321069999999997, + "x": 0.02025, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KZFC", + "end_angle": 1.5707963267948966, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": 0.02025, + "x": 0.017321069999999997, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02025, + "x": 0.017321069999999997, + "z": 0.0 + }, + "curve": "KZJE", + "end_point": { + "y": 0.02025, + "x": 0.016394129999999996, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.020785170000000002, + "x": 0.017321069999999997, + "z": 0.0 + }, + "curve": "JZ5", + "end_point": { + "y": 0.02025, + "x": 0.016394129999999996, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.019053119999999996, + "x": 0.02032107, + "z": 0.0 + }, + "curve": "JZp", + "end_point": { + "y": 0.020785170000000002, + "x": 0.017321069999999997, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.015589019999999999, + "x": 0.02032107, + "z": 0.0 + }, + "curve": "JZt", + "end_point": { + "y": 0.019053119999999996, + "x": 0.02032107, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JZe": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": -0.020785170000000002, + "x": -0.01732107, + "z": 0.0 + }, + "curve": "JZF", + "end_point": { + "y": -0.02025, + "x": -0.01639413, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.02025, + "x": -0.01732107, + "z": 0.0 + }, + "curve": "KZ5D", + "end_point": { + "y": -0.02025, + "x": -0.01639413, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.01732107, + "x": -0.01732107, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": -0.01732107, + "x": -0.02025, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KZNC", + "end_angle": 1.5707963267948966, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": -0.02025, + "x": -0.01732107, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": -1.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01732107, + "x": -0.02025, + "z": 0.0 + }, + "curve": "KZhD", + "end_point": { + "y": -0.015547990000000001, + "x": -0.02025, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01558902, + "x": -0.02032107, + "z": 0.0 + }, + "curve": "JZR", + "end_point": { + "y": -0.015547990000000001, + "x": -0.02025, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01905312, + "x": -0.02032107, + "z": 0.0 + }, + "curve": "JZZ", + "end_point": { + "y": -0.01558902, + "x": -0.02032107, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.020785170000000002, + "x": -0.01732107, + "z": 0.0 + }, + "curve": "JZJ", + "end_point": { + "y": -0.01905312, + "x": -0.02032107, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JZa": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": -0.01732107, + "x": -0.01732107, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00175, + "curve": "KZ1C", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JZy": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.01385697, + "x": 0.017321069999999997, + "z": 0.0 + }, + "curve": "JZl", + "end_point": { + "y": 0.015547990000000001, + "x": 0.02025, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.017321069999999997, + "x": 0.02025, + "z": 0.0 + }, + "curve": "KZxD", + "end_point": { + "y": 0.015547990000000001, + "x": 0.02025, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.017321069999999997, + "x": 0.017321069999999997, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.017321069999999997, + "x": 0.02025, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KZFC", + "end_angle": 1.5707963267948966, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": 0.02025, + "x": 0.017321069999999997, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02025, + "x": 0.017321069999999997, + "z": 0.0 + }, + "curve": "KZJE", + "end_point": { + "y": 0.02025, + "x": 0.016394129999999996, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.019053119999999996, + "x": 0.014321070000000002, + "z": 0.0 + }, + "curve": "JZ1", + "end_point": { + "y": 0.02025, + "x": 0.016394129999999996, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.015589019999999999, + "x": 0.014321070000000002, + "z": 0.0 + }, + "curve": "JZx", + "end_point": { + "y": 0.019053119999999996, + "x": 0.014321070000000002, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.01385697, + "x": 0.017321069999999997, + "z": 0.0 + }, + "curve": "JZ9", + "end_point": { + "y": 0.015589019999999999, + "x": 0.014321070000000002, + "z": 0.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.017321069999999997, + "x": 0.017321069999999997, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00175, + "curve": "KZtC", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JZW": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.017321069999999997, + "x": -0.01732107, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00175, + "curve": "KZxC", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JZ6": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.01385697, + "x": -0.01732107, + "z": 0.0 + }, + "curve": "KZlB", + "end_point": { + "y": 0.015589019999999999, + "x": -0.014321070000000002, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.015589019999999999, + "x": -0.014321070000000002, + "z": 0.0 + }, + "curve": "KZ9B", + "end_point": { + "y": 0.019053119999999996, + "x": -0.014321070000000002, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.019053119999999996, + "x": -0.014321070000000002, + "z": 0.0 + }, + "curve": "KZ1B", + "end_point": { + "y": 0.02025, + "x": -0.01639413, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02025, + "x": -0.01732107, + "z": 0.0 + }, + "curve": "KZFE", + "end_point": { + "y": 0.02025, + "x": -0.01639413, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.017321069999999997, + "x": -0.01732107, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.017321069999999997, + "x": -0.02025, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KZBC", + "end_angle": 1.5707963267948966, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": 0.02025, + "x": -0.01732107, + "z": 0.0 + }, + "reference_vector": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.017321069999999997, + "x": -0.02025, + "z": 0.0 + }, + "curve": "KZlD", + "end_point": { + "y": 0.015547990000000001, + "x": -0.02025, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.01385697, + "x": -0.01732107, + "z": 0.0 + }, + "curve": "KZxB", + "end_point": { + "y": 0.015547990000000001, + "x": -0.02025, + "z": 0.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.017321069999999997, + "x": -0.01732107, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00175, + "curve": "KZxC", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JZu": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": -0.01905312, + "x": -0.014321070000000002, + "z": 0.0 + }, + "curve": "JZB", + "end_point": { + "y": -0.02025, + "x": -0.01639413, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.02025, + "x": -0.01732107, + "z": 0.0 + }, + "curve": "KZ5D", + "end_point": { + "y": -0.02025, + "x": -0.01639413, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.01732107, + "x": -0.01732107, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": -0.01732107, + "x": -0.02025, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KZNC", + "end_angle": 1.5707963267948966, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": -0.02025, + "x": -0.01732107, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": -1.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01732107, + "x": -0.02025, + "z": 0.0 + }, + "curve": "KZhD", + "end_point": { + "y": -0.015547990000000001, + "x": -0.02025, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01385697, + "x": -0.01732107, + "z": 0.0 + }, + "curve": "JZV", + "end_point": { + "y": -0.015547990000000001, + "x": -0.02025, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01558902, + "x": -0.014321070000000002, + "z": 0.0 + }, + "curve": "JZd", + "end_point": { + "y": -0.01385697, + "x": -0.01732107, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01905312, + "x": -0.014321070000000002, + "z": 0.0 + }, + "curve": "JZN", + "end_point": { + "y": -0.01558902, + "x": -0.014321070000000002, + "z": 0.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": -0.01732107, + "x": -0.01732107, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00175, + "curve": "KZ1C", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JZS": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.017321069999999997, + "x": 0.017321069999999997, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00175, + "curve": "KZtC", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JZ2": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": -0.01385697, + "x": 0.017321069999999997, + "z": 0.0 + }, + "curve": "KZFB", + "end_point": { + "y": -0.015547990000000001, + "x": 0.02025, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01732107, + "x": 0.02025, + "z": 0.0 + }, + "curve": "KZtD", + "end_point": { + "y": -0.015547990000000001, + "x": 0.02025, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.01732107, + "x": 0.017321069999999997, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": -0.01732107, + "x": 0.02025, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KZJC", + "end_angle": 1.5707963267948966, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": -0.02025, + "x": 0.017321069999999997, + "z": 0.0 + }, + "reference_vector": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.02025, + "x": 0.017321069999999997, + "z": 0.0 + }, + "curve": "KZ9D", + "end_point": { + "y": -0.02025, + "x": 0.016394129999999996, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01905312, + "x": 0.014321070000000002, + "z": 0.0 + }, + "curve": "KZNB", + "end_point": { + "y": -0.02025, + "x": 0.016394129999999996, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01905312, + "x": 0.014321070000000002, + "z": 0.0 + }, + "curve": "KZZB", + "end_point": { + "y": -0.01558902, + "x": 0.014321070000000002, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01385697, + "x": 0.017321069999999997, + "z": 0.0 + }, + "curve": "KZVB", + "end_point": { + "y": -0.01558902, + "x": 0.014321070000000002, + "z": 0.0 + } + } + ] + }, + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": -0.01732107, + "x": 0.017321069999999997, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.00175, + "curve": "KZpC", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JZq": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.019053119999999996, + "x": -0.02032107, + "z": 0.0 + }, + "curve": "KZhB", + "end_point": { + "y": 0.020785170000000002, + "x": -0.01732107, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.020785170000000002, + "x": -0.01732107, + "z": 0.0 + }, + "curve": "KZ5B", + "end_point": { + "y": 0.02025, + "x": -0.01639413, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02025, + "x": -0.01732107, + "z": 0.0 + }, + "curve": "KZFE", + "end_point": { + "y": 0.02025, + "x": -0.01639413, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.017321069999999997, + "x": -0.01732107, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.017321069999999997, + "x": -0.02025, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KZBC", + "end_angle": 1.5707963267948966, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": 0.02025, + "x": -0.01732107, + "z": 0.0 + }, + "reference_vector": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.017321069999999997, + "x": -0.02025, + "z": 0.0 + }, + "curve": "KZlD", + "end_point": { + "y": 0.015547990000000001, + "x": -0.02025, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.015589019999999999, + "x": -0.02032107, + "z": 0.0 + }, + "curve": "KZtB", + "end_point": { + "y": 0.015547990000000001, + "x": -0.02025, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.019053119999999996, + "x": -0.02032107, + "z": 0.0 + }, + "curve": "KZpB", + "end_point": { + "y": 0.015589019999999999, + "x": -0.02032107, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "FCLEQ3DHM0IiJcF_1": { + "transform": { + "origin": { + "y": 0.02025, + "x": 0.00165, + "z": 0.0 + }, + "y_axis": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + } + }, + "type": "Sketch", + "name": "Sketch 9", + "profiles": { + "JNS": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": -0.017321069999999997, + "x": 0.0012789300000000002, + "z": 0.0 + }, + "radius": 0.00292893, + "type": "Circle3D", + "curve": "JNl+JNp+JNt+JNh", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JNG": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.01732107, + "x": 0.03592107, + "z": 0.0 + }, + "radius": 0.00292893, + "type": "Circle3D", + "curve": "JNN+JNJ+JNF+JNB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + }, + "JNa": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.01732107, + "x": 0.0012789300000000002, + "z": 0.0 + }, + "radius": 0.00292893, + "type": "Circle3D", + "curve": "JN9+JN5+JN1+JNx", + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + } + } + ] + } + ], + "properties": {} + }, + "JNO": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": -0.017321069999999997, + "x": 0.03592107, + "z": 0.0 + }, + "radius": 0.00292893, + "type": "Circle3D", + "curve": "JNV+JNZ+JNd+JNR", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "F3sF0B2Gb7JHIWi_1": { + "name": "Extrude 4", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JZO", + "sketch": "FhRJxCbsk2Zj5Ld_1" + }, + { + "profile": "JZS", + "sketch": "FhRJxCbsk2Zj5Ld_1" + }, + { + "profile": "JZW", + "sketch": "FhRJxCbsk2Zj5Ld_1" + }, + { + "profile": "JZa", + "sketch": "FhRJxCbsk2Zj5Ld_1" + }, + { + "profile": "JZe", + "sketch": "FhRJxCbsk2Zj5Ld_1" + }, + { + "profile": "JZi", + "sketch": "FhRJxCbsk2Zj5Ld_1" + }, + { + "profile": "JZm", + "sketch": "FhRJxCbsk2Zj5Ld_1" + }, + { + "profile": "JZq", + "sketch": "FhRJxCbsk2Zj5Ld_1" + }, + { + "profile": "JZu", + "sketch": "FhRJxCbsk2Zj5Ld_1" + }, + { + "profile": "JZy", + "sketch": "FhRJxCbsk2Zj5Ld_1" + }, + { + "profile": "JZ2", + "sketch": "FhRJxCbsk2Zj5Ld_1" + }, + { + "profile": "JZ6", + "sketch": "FhRJxCbsk2Zj5Ld_1" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": -0.003 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "CutFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FOOTur21OWS4wuT_1": { + "name": "Extrude 3", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JVm", + "sketch": "F5aqXT9heqoOvwa_1" + }, + { + "profile": "JVq", + "sketch": "F5aqXT9heqoOvwa_1" + }, + { + "profile": "JVy", + "sketch": "F5aqXT9heqoOvwa_1" + }, + { + "profile": "JV2", + "sketch": "F5aqXT9heqoOvwa_1" + }, + { + "profile": "JV+", + "sketch": "F5aqXT9heqoOvwa_1" + }, + { + "profile": "KVCB", + "sketch": "F5aqXT9heqoOvwa_1" + }, + { + "profile": "KVGB", + "sketch": "F5aqXT9heqoOvwa_1" + }, + { + "profile": "KVKB", + "sketch": "F5aqXT9heqoOvwa_1" + }, + { + "profile": "KVOB", + "sketch": "F5aqXT9heqoOvwa_1" + }, + { + "profile": "KVSB", + "sketch": "F5aqXT9heqoOvwa_1" + }, + { + "profile": "KVWB", + "sketch": "F5aqXT9heqoOvwa_1" + }, + { + "profile": "KVaB", + "sketch": "F5aqXT9heqoOvwa_1" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": -0.004 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "JoinFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FmaALPq104pofI8_0": { + "name": "Extrude 1", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGC", + "sketch": "FXbWNcCzWKfLMdX_0" + }, + { + "profile": "JGG", + "sketch": "FXbWNcCzWKfLMdX_0" + }, + { + "profile": "JGK", + "sketch": "FXbWNcCzWKfLMdX_0" + }, + { + "profile": "JGO", + "sketch": "FXbWNcCzWKfLMdX_0" + }, + { + "profile": "JGS", + "sketch": "FXbWNcCzWKfLMdX_0" + }, + { + "profile": "JGW", + "sketch": "FXbWNcCzWKfLMdX_0" + }, + { + "profile": "JGa", + "sketch": "FXbWNcCzWKfLMdX_0" + }, + { + "profile": "JGe", + "sketch": "FXbWNcCzWKfLMdX_0" + }, + { + "profile": "JGi", + "sketch": "FXbWNcCzWKfLMdX_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.002 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "F5aqXT9heqoOvwa_1": { + "transform": { + "origin": { + "y": 0.02025, + "x": 0.02025, + "z": 0.002 + }, + "y_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + }, + "type": "Sketch", + "name": "Sketch 3", + "profiles": { + "KVGB": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.017321069999999997, + "x": 0.017321069999999997, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.015249999999999996, + "x": 0.011689839999999996, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KVhB", + "end_angle": 0.8624030186903937, + "radius": 0.006, + "type": "Arc3D", + "start_point": { + "y": 0.02025, + "x": 0.01208453, + "z": 0.0 + }, + "reference_vector": { + "y": 0.48815512124893384, + "x": -0.872756883443745, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.015249999999999996, + "x": 0.015249999999999996, + "z": 0.0 + }, + "curve": "KV5D", + "end_point": { + "y": 0.015249999999999996, + "x": 0.011689839999999996, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.017321069999999997, + "x": 0.017321069999999997, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.015249999999999996, + "x": 0.015249999999999996, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KVxB", + "end_angle": 2.356194490192345, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": 0.02025, + "x": 0.017321069999999997, + "z": 0.0 + }, + "reference_vector": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02025, + "x": 0.017321069999999997, + "z": 0.0 + }, + "curve": "KV9B", + "end_point": { + "y": 0.02025, + "x": 0.01208453, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JV+": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.017321069999999997, + "x": -0.01732107, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + }, + "end_point": { + "y": 0.015249999999999996, + "x": -0.01168984, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KVBB", + "end_angle": 0.8624030186903937, + "radius": 0.006, + "type": "Arc3D", + "start_point": { + "y": 0.02025, + "x": -0.012084530000000001, + "z": 0.0 + }, + "reference_vector": { + "y": -0.34517793897831056, + "x": 0.9385372610838025, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.015249999999999996, + "x": -0.01525, + "z": 0.0 + }, + "curve": "KVxD", + "end_point": { + "y": 0.015249999999999996, + "x": -0.01168984, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.017321069999999997, + "x": -0.01732107, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + }, + "end_point": { + "y": 0.015249999999999996, + "x": -0.01525, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KVRB", + "end_angle": 2.356194490192345, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": 0.02025, + "x": -0.01732107, + "z": 0.0 + }, + "reference_vector": { + "y": -0.7071067811865476, + "x": 0.7071067811865476, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.02025, + "x": -0.01732107, + "z": 0.0 + }, + "curve": "KVdB", + "end_point": { + "y": 0.02025, + "x": -0.012084530000000001, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JVy": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": -0.01732107, + "x": 0.017321069999999997, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + }, + "end_point": { + "y": -0.01525, + "x": 0.011689839999999996, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JVh", + "end_angle": 0.8624030186903928, + "radius": 0.006, + "type": "Arc3D", + "start_point": { + "y": -0.02025, + "x": 0.01208453, + "z": 0.0 + }, + "reference_vector": { + "y": 0.34517793897831056, + "x": -0.9385372610838025, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01525, + "x": 0.015249999999999996, + "z": 0.0 + }, + "curve": "KVpD", + "end_point": { + "y": -0.01525, + "x": 0.011689839999999996, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.01732107, + "x": 0.017321069999999997, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + }, + "end_point": { + "y": -0.01525, + "x": 0.015249999999999996, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JVt", + "end_angle": 2.356194490192345, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": -0.02025, + "x": 0.017321069999999997, + "z": 0.0 + }, + "reference_vector": { + "y": 0.7071067811865476, + "x": -0.7071067811865476, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.02025, + "x": 0.017321069999999997, + "z": 0.0 + }, + "curve": "JV9", + "end_point": { + "y": -0.02025, + "x": 0.01208453, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "KVSB": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": -0.01732107, + "x": 0.017321069999999997, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + }, + "end_point": { + "y": -0.01133255, + "x": 0.016949999999999996, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JVl", + "end_angle": 1.1564835200297248, + "radius": 0.006, + "type": "Arc3D", + "start_point": { + "y": -0.01525, + "x": 0.011689839999999996, + "z": 0.0 + }, + "reference_vector": { + "y": 0.9980857692867685, + "x": -0.061844944395149766, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01441574, + "x": 0.016949999999999996, + "z": 0.0 + }, + "curve": "KVZD", + "end_point": { + "y": -0.01133255, + "x": 0.016949999999999996, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.01732107, + "x": 0.017321069999999997, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": -0.01441574, + "x": 0.016949999999999996, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JVx", + "end_angle": 0.6583654935137153, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": -0.01525, + "x": 0.015249999999999996, + "z": 0.0 + }, + "reference_vector": { + "y": 0.991942195073937, + "x": -0.12669128475115968, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01525, + "x": 0.015249999999999996, + "z": 0.0 + }, + "curve": "KVpD", + "end_point": { + "y": -0.01525, + "x": 0.011689839999999996, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JV2": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": -0.01732107, + "x": 0.017321069999999997, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + }, + "end_point": { + "y": -0.01133255, + "x": 0.016949999999999996, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JVp", + "end_angle": 0.5718590848577301, + "radius": 0.006, + "type": "Arc3D", + "start_point": { + "y": -0.012084530000000001, + "x": 0.02025, + "z": 0.0 + }, + "reference_vector": { + "y": 0.8727568834437451, + "x": 0.48815512124893373, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01441574, + "x": 0.016949999999999996, + "z": 0.0 + }, + "curve": "KVZD", + "end_point": { + "y": -0.01133255, + "x": 0.016949999999999996, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.01732107, + "x": 0.017321069999999997, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + }, + "end_point": { + "y": -0.01441574, + "x": 0.016949999999999996, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JV1", + "end_angle": 1.6978289966786295, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": -0.01732107, + "x": 0.02025, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01732107, + "x": 0.02025, + "z": 0.0 + }, + "curve": "JV5", + "end_point": { + "y": -0.012084530000000001, + "x": 0.02025, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JVq": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": -0.01732107, + "x": -0.01732107, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": -0.01441574, + "x": -0.01695, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JVJ", + "end_angle": 1.6978289966786295, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": -0.01732107, + "x": -0.02025, + "z": 0.0 + }, + "reference_vector": { + "y": 0.991942195073937, + "x": 0.12669128475115968, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01441574, + "x": -0.01695, + "z": 0.0 + }, + "curve": "KVND", + "end_point": { + "y": -0.01133255, + "x": -0.01695, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.01732107, + "x": -0.01732107, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": -0.01133255, + "x": -0.01695, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JVV", + "end_angle": 0.5718590848577296, + "radius": 0.006, + "type": "Arc3D", + "start_point": { + "y": -0.012084530000000001, + "x": -0.02025, + "z": 0.0 + }, + "reference_vector": { + "y": 0.9980857692867685, + "x": 0.061844944395149766, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01732107, + "x": -0.02025, + "z": 0.0 + }, + "curve": "JVZ", + "end_point": { + "y": -0.012084530000000001, + "x": -0.02025, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "KVKB": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.017321069999999997, + "x": 0.017321069999999997, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.01133255, + "x": 0.016949999999999996, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KVpB", + "end_angle": 0.571859084857727, + "radius": 0.006, + "type": "Arc3D", + "start_point": { + "y": 0.01208453, + "x": 0.02025, + "z": 0.0 + }, + "reference_vector": { + "y": -0.9980857692867687, + "x": -0.061844944395149815, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.01441574, + "x": 0.016949999999999996, + "z": 0.0 + }, + "curve": "KVVD", + "end_point": { + "y": 0.01133255, + "x": 0.016949999999999996, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.017321069999999997, + "x": 0.017321069999999997, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.01441574, + "x": 0.016949999999999996, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KV1B", + "end_angle": 1.6978289966786297, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": 0.017321069999999997, + "x": 0.02025, + "z": 0.0 + }, + "reference_vector": { + "y": -0.991942195073937, + "x": -0.12669128475115984, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.017321069999999997, + "x": 0.02025, + "z": 0.0 + }, + "curve": "KVtB", + "end_point": { + "y": 0.01208453, + "x": 0.02025, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "KVWB": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.017321069999999997, + "x": -0.01732107, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + }, + "end_point": { + "y": 0.01133255, + "x": -0.01695, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KVFB", + "end_angle": 1.1564835200297283, + "radius": 0.006, + "type": "Arc3D", + "start_point": { + "y": 0.015249999999999996, + "x": -0.01168984, + "z": 0.0 + }, + "reference_vector": { + "y": -0.9980857692867687, + "x": 0.061844944395149815, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.01441574, + "x": -0.01695, + "z": 0.0 + }, + "curve": "KVJD", + "end_point": { + "y": 0.01133255, + "x": -0.01695, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.017321069999999997, + "x": -0.01732107, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.01441574, + "x": -0.01695, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KVZB", + "end_angle": 0.6583654935137151, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": 0.015249999999999996, + "x": -0.01525, + "z": 0.0 + }, + "reference_vector": { + "y": -0.991942195073937, + "x": 0.12669128475115984, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.015249999999999996, + "x": -0.01525, + "z": 0.0 + }, + "curve": "KVxD", + "end_point": { + "y": 0.015249999999999996, + "x": -0.01168984, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "KVCB": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.017321069999999997, + "x": -0.01732107, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + }, + "end_point": { + "y": 0.01133255, + "x": -0.01695, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KVJB", + "end_angle": 0.5718590848577261, + "radius": 0.006, + "type": "Arc3D", + "start_point": { + "y": 0.01208453, + "x": -0.02025, + "z": 0.0 + }, + "reference_vector": { + "y": -0.8727568834437454, + "x": -0.4881551212489334, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.01441574, + "x": -0.01695, + "z": 0.0 + }, + "curve": "KVJD", + "end_point": { + "y": 0.01133255, + "x": -0.01695, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.017321069999999997, + "x": -0.01732107, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + }, + "end_point": { + "y": 0.01441574, + "x": -0.01695, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KVVB", + "end_angle": 1.6978289966786297, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": 0.017321069999999997, + "x": -0.02025, + "z": 0.0 + }, + "reference_vector": { + "y": 0.0, + "x": -1.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.017321069999999997, + "x": -0.02025, + "z": 0.0 + }, + "curve": "KVNB", + "end_point": { + "y": 0.01208453, + "x": -0.02025, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "JVm": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": -0.01732107, + "x": -0.01732107, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": -0.01525, + "x": -0.01525, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JVB", + "end_angle": 2.356194490192345, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": -0.02025, + "x": -0.01732107, + "z": 0.0 + }, + "reference_vector": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01525, + "x": -0.01525, + "z": 0.0 + }, + "curve": "KVhD", + "end_point": { + "y": -0.01525, + "x": -0.01168984, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.01732107, + "x": -0.01732107, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": -0.01525, + "x": -0.01168984, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JVN", + "end_angle": 0.8624030186903928, + "radius": 0.006, + "type": "Arc3D", + "start_point": { + "y": -0.02025, + "x": -0.012084530000000001, + "z": 0.0 + }, + "reference_vector": { + "y": -0.4881551212489333, + "x": 0.8727568834437454, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.02025, + "x": -0.01732107, + "z": 0.0 + }, + "curve": "JVd", + "end_point": { + "y": -0.02025, + "x": -0.012084530000000001, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "KVOB": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": -0.01732107, + "x": -0.01732107, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": -0.01441574, + "x": -0.01695, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JVF", + "end_angle": 0.6583654935137152, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": -0.01525, + "x": -0.01525, + "z": 0.0 + }, + "reference_vector": { + "y": 0.7071067811865476, + "x": 0.7071067811865476, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01441574, + "x": -0.01695, + "z": 0.0 + }, + "curve": "KVND", + "end_point": { + "y": -0.01133255, + "x": -0.01695, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.01732107, + "x": -0.01732107, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": -0.01133255, + "x": -0.01695, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "JVR", + "end_angle": 1.1564835200297248, + "radius": 0.006, + "type": "Arc3D", + "start_point": { + "y": -0.01525, + "x": -0.01168984, + "z": 0.0 + }, + "reference_vector": { + "y": 0.34517793897831056, + "x": 0.9385372610838025, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.01525, + "x": -0.01525, + "z": 0.0 + }, + "curve": "KVhD", + "end_point": { + "y": -0.01525, + "x": -0.01168984, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + }, + "KVaB": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.017321069999999997, + "x": 0.017321069999999997, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.01133255, + "x": 0.016949999999999996, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KVlB", + "end_angle": 1.1564835200297283, + "radius": 0.006, + "type": "Arc3D", + "start_point": { + "y": 0.015249999999999996, + "x": 0.011689839999999996, + "z": 0.0 + }, + "reference_vector": { + "y": -0.34517793897831056, + "x": -0.9385372610838025, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.01441574, + "x": 0.016949999999999996, + "z": 0.0 + }, + "curve": "KVVD", + "end_point": { + "y": 0.01133255, + "x": 0.016949999999999996, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.017321069999999997, + "x": 0.017321069999999997, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "end_point": { + "y": 0.01441574, + "x": 0.016949999999999996, + "z": 0.0 + }, + "start_angle": 0.0, + "curve": "KV5B", + "end_angle": 0.6583654935137151, + "radius": 0.00292893, + "type": "Arc3D", + "start_point": { + "y": 0.015249999999999996, + "x": 0.015249999999999996, + "z": 0.0 + }, + "reference_vector": { + "y": -0.7071067811865476, + "x": -0.7071067811865476, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.015249999999999996, + "x": 0.015249999999999996, + "z": 0.0 + }, + "curve": "KV5D", + "end_point": { + "y": 0.015249999999999996, + "x": 0.011689839999999996, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + } + }, + "properties": { + "bounding_box": { + "max_point": { + "y": 0.040500000000000015, + "x": 0.04050000000000001, + "z": 0.002 + }, + "type": "BoundingBox3D", + "min_point": { + "y": -1.474514954580286e-17, + "x": -5.204170427930421e-18, + "z": -0.011 + } + } + }, + "sequence": [ + { + "index": 0, + "type": "Sketch", + "entity": "FXbWNcCzWKfLMdX_0" + }, + { + "index": 1, + "type": "ExtrudeFeature", + "entity": "FmaALPq104pofI8_0" + }, + { + "index": 2, + "type": "Sketch", + "entity": "FzRWb4mdluwe2Hl_1" + }, + { + "index": 3, + "type": "ExtrudeFeature", + "entity": "FDfhYsBHgRf8Zr1_1" + }, + { + "index": 4, + "type": "Sketch", + "entity": "FCLEQ3DHM0IiJcF_1" + }, + { + "index": 5, + "type": "ExtrudeFeature", + "entity": "FgfW1xp3ztTq9ZU_1" + }, + { + "index": 6, + "type": "Sketch", + "entity": "FoO7MyPj7EaIwWq_1" + }, + { + "index": 7, + "type": "ExtrudeFeature", + "entity": "FAaL8fuCODmBxZX_1" + }, + { + "index": 8, + "type": "Sketch", + "entity": "F5aqXT9heqoOvwa_1" + }, + { + "index": 9, + "type": "ExtrudeFeature", + "entity": "FOOTur21OWS4wuT_1" + }, + { + "index": 10, + "type": "Sketch", + "entity": "FhRJxCbsk2Zj5Ld_1" + }, + { + "index": 11, + "type": "ExtrudeFeature", + "entity": "F3sF0B2Gb7JHIWi_1" + } + ] +} \ No newline at end of file diff --git a/Bethany/examples/00280150.json b/Bethany/examples/00280150.json new file mode 100644 index 0000000..61f76f5 --- /dev/null +++ b/Bethany/examples/00280150.json @@ -0,0 +1,572 @@ +{ + "entities": { + "FmrV6HbxzaryA5E_1": { + "name": "Extrude 4", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JVC", + "sketch": "FJmIje6KzlYzJQu_1" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.012700000000000001 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "JoinFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FsNWntU6DsmMLjO_1": { + "transform": { + "origin": { + "y": 0.0, + "x": -0.0254, + "z": 0.0254 + }, + "y_axis": { + "y": -0.0, + "x": 0.0, + "z": 1.0 + }, + "x_axis": { + "y": 0.0, + "x": -1.0, + "z": 0.0 + }, + "z_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + } + }, + "type": "Sketch", + "name": "Sketch 3", + "profiles": { + "JNC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0127, + "curve": "JNB", + "normal": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "FsVXe897f08Tjls_1": { + "transform": { + "origin": { + "y": -0.0508, + "x": -0.0254, + "z": 0.0254 + }, + "y_axis": { + "y": 0.0, + "x": -0.0, + "z": 1.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + "type": "Sketch", + "name": "Sketch 4", + "profiles": {}, + "reference_plane": {} + }, + "FbeI0JR1aX5BPSI_0": { + "name": "Extrude 1", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGC", + "sketch": "FaMBajUC8yyUjTc_0" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.050800000000000005 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FJmIje6KzlYzJQu_1": { + "transform": { + "origin": { + "y": -0.0254, + "x": 0.0, + "z": 0.0254 + }, + "y_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "x_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + }, + "type": "Sketch", + "name": "Sketch 5", + "profiles": { + "JVC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.012700000000000003, + "x": -0.012700000000000003, + "z": 0.0 + }, + "curve": "JVB", + "end_point": { + "y": 0.012700000000000003, + "x": 0.0127, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.012700000000000003, + "x": 0.0127, + "z": 0.0 + }, + "curve": "JVN", + "end_point": { + "y": -0.0127, + "x": 0.0127, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": -0.0127, + "x": -0.012700000000000003, + "z": 0.0 + }, + "curve": "JVF", + "end_point": { + "y": -0.0127, + "x": 0.0127, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.012700000000000003, + "x": -0.012700000000000003, + "z": 0.0 + }, + "curve": "JVJ", + "end_point": { + "y": -0.0127, + "x": -0.012700000000000003, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "FfmWQ7YnYtyaUaY_1": { + "name": "Extrude 2", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JJC", + "sketch": "F9BMMoQbB6HQfC2_1" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": -0.050800000000000005 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "CutFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + }, + "FaMBajUC8yyUjTc_0": { + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 0.0, + "x": -0.0, + "z": 1.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + }, + "type": "Sketch", + "name": "Sketch 1", + "profiles": { + "JGC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "type": "Line3D", + "start_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "curve": "JGB", + "end_point": { + "y": 0.0, + "x": -0.0508, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0, + "x": -0.0508, + "z": 0.0 + }, + "curve": "JGN", + "end_point": { + "y": 0.0508, + "x": -0.0508, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0508, + "x": 0.0, + "z": 0.0 + }, + "curve": "JGF", + "end_point": { + "y": 0.0508, + "x": -0.0508, + "z": 0.0 + } + }, + { + "type": "Line3D", + "start_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "curve": "JGJ", + "end_point": { + "y": 0.0508, + "x": 0.0, + "z": 0.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "F9BMMoQbB6HQfC2_1": { + "transform": { + "origin": { + "y": -0.0254, + "x": -0.0254, + "z": 0.0508 + }, + "y_axis": { + "y": 1.0, + "x": 0.0, + "z": -0.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": -0.0, + "z": 1.0 + } + }, + "type": "Sketch", + "name": "Sketch 2", + "profiles": { + "JJC": { + "loops": [ + { + "is_outer": true, + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Circle3D", + "radius": 0.0127, + "curve": "JJB", + "normal": { + "y": 0.0, + "x": -0.0, + "z": 1.0 + } + } + ] + } + ], + "properties": {} + } + }, + "reference_plane": {} + }, + "FDEzbkABrHGG40C_1": { + "name": "Extrude 3", + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JNC", + "sketch": "FsNWntU6DsmMLjO_1" + } + ], + "extent_two": { + "distance": { + "type": "ModelParameter", + "role": "AgainstDistance", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "Side2TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "extent_one": { + "distance": { + "type": "ModelParameter", + "role": "AlongDistance", + "name": "none", + "value": 0.012700000000000001 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "type": "ModelParameter", + "role": "TaperAngle", + "name": "none", + "value": 0.0 + } + }, + "operation": "JoinFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "extent_type": "OneSideFeatureExtentType" + } + }, + "properties": { + "bounding_box": { + "max_point": { + "y": 0.012700000000000001, + "x": 0.012700000000000001, + "z": 0.05080000000000001 + }, + "type": "BoundingBox3D", + "min_point": { + "y": -0.050800000000000005, + "x": -0.05080000000000002, + "z": 0.0 + } + } + }, + "sequence": [ + { + "index": 0, + "type": "Sketch", + "entity": "FaMBajUC8yyUjTc_0" + }, + { + "index": 1, + "type": "ExtrudeFeature", + "entity": "FbeI0JR1aX5BPSI_0" + }, + { + "index": 2, + "type": "Sketch", + "entity": "F9BMMoQbB6HQfC2_1" + }, + { + "index": 3, + "type": "ExtrudeFeature", + "entity": "FfmWQ7YnYtyaUaY_1" + }, + { + "index": 4, + "type": "Sketch", + "entity": "FsNWntU6DsmMLjO_1" + }, + { + "index": 5, + "type": "ExtrudeFeature", + "entity": "FDEzbkABrHGG40C_1" + }, + { + "index": 6, + "type": "Sketch", + "entity": "FsVXe897f08Tjls_1" + }, + { + "index": 7, + "type": "Sketch", + "entity": "FJmIje6KzlYzJQu_1" + }, + { + "index": 8, + "type": "ExtrudeFeature", + "entity": "FmrV6HbxzaryA5E_1" + } + ] +} \ No newline at end of file diff --git a/Bethany/examples/00529152.json b/Bethany/examples/00529152.json new file mode 100644 index 0000000..0b360e2 --- /dev/null +++ b/Bethany/examples/00529152.json @@ -0,0 +1,606 @@ +{ + "entities": { + "FJuq88FpdEHHyl9_0": { + "reference_plane": {}, + "type": "Sketch", + "name": "Sketch 1", + "profiles": { + "JGC": { + "loops": [ + { + "profile_curves": [ + { + "start_point": { + "y": 0.0, + "x": 0.01, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JGB", + "end_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "start_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JGN", + "end_point": { + "y": 0.01, + "x": 0.0, + "z": 0.0 + } + }, + { + "start_point": { + "y": 0.01, + "x": 0.01, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JGF", + "end_point": { + "y": 0.01, + "x": 0.0, + "z": 0.0 + } + }, + { + "start_point": { + "y": 0.0, + "x": 0.01, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JGJ", + "end_point": { + "y": 0.01, + "x": 0.01, + "z": 0.0 + } + } + ], + "is_outer": true + }, + { + "profile_curves": [ + { + "center_point": { + "y": 0.005, + "x": 0.005, + "z": 0.0 + }, + "radius": 0.00150015, + "type": "Circle3D", + "curve": "JGR", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + }, + "JGG": { + "loops": [ + { + "profile_curves": [ + { + "center_point": { + "y": 0.005, + "x": 0.005, + "z": 0.0 + }, + "radius": 0.00150015, + "type": "Circle3D", + "curve": "JGR", + "normal": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + } + }, + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 0.0, + "x": -0.0, + "z": 1.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": -1.0, + "x": 0.0, + "z": 0.0 + } + } + }, + "FRCqhvaTLC45hNi_0": { + "reference_plane": {}, + "type": "Sketch", + "name": "Sketch 2", + "profiles": { + "JIG": { + "loops": [ + { + "profile_curves": [ + { + "center_point": { + "y": 0.005, + "x": 0.005, + "z": 0.0 + }, + "radius": 0.00150015, + "type": "Circle3D", + "curve": "JIR", + "normal": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + }, + "JIC": { + "loops": [ + { + "profile_curves": [ + { + "start_point": { + "y": 0.0, + "x": 0.01, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JIB", + "end_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "start_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JIN", + "end_point": { + "y": 0.01, + "x": 0.0, + "z": 0.0 + } + }, + { + "start_point": { + "y": 0.01, + "x": 0.01, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JIF", + "end_point": { + "y": 0.01, + "x": 0.0, + "z": 0.0 + } + }, + { + "start_point": { + "y": 0.0, + "x": 0.01, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JIJ", + "end_point": { + "y": 0.01, + "x": 0.01, + "z": 0.0 + } + } + ], + "is_outer": true + }, + { + "profile_curves": [ + { + "center_point": { + "y": 0.005, + "x": 0.005, + "z": 0.0 + }, + "radius": 0.00150015, + "type": "Circle3D", + "curve": "JIR", + "normal": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + } + }, + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "x_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + } + } + }, + "FzDqYq1JMieZAmV_0": { + "reference_plane": {}, + "type": "Sketch", + "name": "Sketch 3", + "profiles": { + "JKG": { + "loops": [ + { + "profile_curves": [ + { + "center_point": { + "y": 0.005, + "x": 0.005, + "z": 0.0 + }, + "radius": 0.00150015, + "type": "Circle3D", + "curve": "JKR", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + }, + "JKC": { + "loops": [ + { + "profile_curves": [ + { + "start_point": { + "y": 0.0, + "x": 0.01, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JKB", + "end_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + } + }, + { + "start_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JKN", + "end_point": { + "y": 0.01, + "x": 0.0, + "z": 0.0 + } + }, + { + "start_point": { + "y": 0.01, + "x": 0.01, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JKF", + "end_point": { + "y": 0.01, + "x": 0.0, + "z": 0.0 + } + }, + { + "start_point": { + "y": 0.0, + "x": 0.01, + "z": 0.0 + }, + "type": "Line3D", + "curve": "JKJ", + "end_point": { + "y": 0.01, + "x": 0.01, + "z": 0.0 + } + } + ], + "is_outer": true + }, + { + "profile_curves": [ + { + "center_point": { + "y": 0.005, + "x": 0.005, + "z": 0.0 + }, + "radius": 0.00150015, + "type": "Circle3D", + "curve": "JKR", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + } + }, + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + }, + "FEguRxck489nlUH_0": { + "extent_two": { + "distance": { + "role": "AgainstDistance", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "role": "Side2TaperAngle", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + } + }, + "name": "Extrude 1", + "extent_one": { + "distance": { + "role": "AlongDistance", + "type": "ModelParameter", + "name": "none", + "value": -0.0015 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "role": "TaperAngle", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + } + }, + "extent_type": "OneSideFeatureExtentType", + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGC", + "sketch": "FJuq88FpdEHHyl9_0" + } + ] + }, + "FfFCWbj9yhmlzJq_1": { + "extent_two": { + "distance": { + "role": "AgainstDistance", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "role": "Side2TaperAngle", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + } + }, + "name": "Extrude 2", + "extent_one": { + "distance": { + "role": "AlongDistance", + "type": "ModelParameter", + "name": "none", + "value": 0.0015 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "role": "TaperAngle", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + } + }, + "extent_type": "OneSideFeatureExtentType", + "operation": "JoinFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JKC", + "sketch": "FzDqYq1JMieZAmV_0" + } + ] + }, + "FZQ8SCqstPv0Z03_1": { + "extent_two": { + "distance": { + "role": "AgainstDistance", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "role": "Side2TaperAngle", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + } + }, + "name": "Extrude 3", + "extent_one": { + "distance": { + "role": "AlongDistance", + "type": "ModelParameter", + "name": "none", + "value": 0.0015 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "role": "TaperAngle", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + } + }, + "extent_type": "OneSideFeatureExtentType", + "operation": "JoinFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JIC", + "sketch": "FRCqhvaTLC45hNi_0" + } + ] + } + }, + "properties": { + "bounding_box": { + "max_point": { + "y": 0.010000000000000002, + "x": 0.010000000000000002, + "z": 0.010000000000000002 + }, + "type": "BoundingBox3D", + "min_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + } + } + }, + "sequence": [ + { + "index": 0, + "type": "Sketch", + "entity": "FJuq88FpdEHHyl9_0" + }, + { + "index": 1, + "type": "Sketch", + "entity": "FRCqhvaTLC45hNi_0" + }, + { + "index": 2, + "type": "Sketch", + "entity": "FzDqYq1JMieZAmV_0" + }, + { + "index": 3, + "type": "ExtrudeFeature", + "entity": "FEguRxck489nlUH_0" + }, + { + "index": 4, + "type": "ExtrudeFeature", + "entity": "FfFCWbj9yhmlzJq_1" + }, + { + "index": 5, + "type": "ExtrudeFeature", + "entity": "FZQ8SCqstPv0Z03_1" + } + ] +} \ No newline at end of file diff --git a/Bethany/examples/00633023.json b/Bethany/examples/00633023.json new file mode 100644 index 0000000..f977043 --- /dev/null +++ b/Bethany/examples/00633023.json @@ -0,0 +1,239 @@ +{ + "entities": { + "FpO04MEuGua24Pb_0": { + "reference_plane": {}, + "type": "Sketch", + "name": "Sketch 1", + "profiles": { + "JGC": { + "loops": [ + { + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "radius": 0.009, + "type": "Circle3D", + "curve": "JGB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + } + }, + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + }, + "FzNOyOEp7IOU6cG_0": { + "extent_two": { + "distance": { + "role": "AgainstDistance", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "role": "Side2TaperAngle", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + } + }, + "name": "Extrude 1", + "extent_one": { + "distance": { + "role": "AlongDistance", + "type": "ModelParameter", + "name": "none", + "value": 0.005 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "role": "TaperAngle", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + } + }, + "extent_type": "OneSideFeatureExtentType", + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGC", + "sketch": "FpO04MEuGua24Pb_0" + } + ] + }, + "FmWYDK3pbyUD5IL_1": { + "reference_plane": {}, + "type": "Sketch", + "name": "Sketch 2", + "profiles": { + "JJC": { + "loops": [ + { + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "radius": 0.0062, + "type": "Circle3D", + "curve": "JJB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + } + }, + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.005 + }, + "y_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + }, + "FgMDBvjh4kgvPkY_1": { + "extent_two": { + "distance": { + "role": "AgainstDistance", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "role": "Side2TaperAngle", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + } + }, + "name": "Extrude 2", + "extent_one": { + "distance": { + "role": "AlongDistance", + "type": "ModelParameter", + "name": "none", + "value": 0.007 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "role": "TaperAngle", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + } + }, + "extent_type": "OneSideFeatureExtentType", + "operation": "JoinFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JJC", + "sketch": "FmWYDK3pbyUD5IL_1" + } + ] + } + }, + "properties": { + "bounding_box": { + "max_point": { + "y": 0.009000000000000003, + "x": 0.009000000000000003, + "z": 0.014 + }, + "type": "BoundingBox3D", + "min_point": { + "y": -0.009000000000000003, + "x": -0.009000000000000003, + "z": 0.0 + } + } + }, + "sequence": [ + { + "index": 0, + "type": "Sketch", + "entity": "FpO04MEuGua24Pb_0" + }, + { + "index": 1, + "type": "ExtrudeFeature", + "entity": "FzNOyOEp7IOU6cG_0" + }, + { + "index": 2, + "type": "Sketch", + "entity": "FmWYDK3pbyUD5IL_1" + }, + { + "index": 3, + "type": "ExtrudeFeature", + "entity": "FgMDBvjh4kgvPkY_1" + } + ] +} \ No newline at end of file diff --git a/Bethany/examples/00809394.json b/Bethany/examples/00809394.json new file mode 100644 index 0000000..3b38fd8 --- /dev/null +++ b/Bethany/examples/00809394.json @@ -0,0 +1,761 @@ +{ + "entities": { + "FRX1UekMEYmT7BZ_0": { + "reference_plane": {}, + "type": "Sketch", + "name": "Sketch 1", + "profiles": { + "JGC": { + "loops": [ + { + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "radius": 0.03175, + "type": "Circle3D", + "curve": "JGB", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ], + "is_outer": true + }, + { + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "radius": 0.0111125, + "type": "Circle3D", + "curve": "JGF", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + }, + "JGG": { + "loops": [ + { + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "radius": 0.0111125, + "type": "Circle3D", + "curve": "JGF", + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + } + }, + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + }, + "F5tX7NvnA1Y5aRR_0": { + "extent_two": { + "distance": { + "role": "AgainstDistance", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "role": "Side2TaperAngle", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + } + }, + "name": "Extrude 1", + "extent_one": { + "distance": { + "role": "AlongDistance", + "type": "ModelParameter", + "name": "none", + "value": 0.006350000000000001 + }, + "type": "DistanceExtentDefinition", + "taper_angle": { + "role": "TaperAngle", + "type": "ModelParameter", + "name": "none", + "value": 0.0 + } + }, + "extent_type": "OneSideFeatureExtentType", + "operation": "NewBodyFeatureOperation", + "start_extent": { + "type": "ProfilePlaneStartDefinition" + }, + "type": "ExtrudeFeature", + "profiles": [ + { + "profile": "JGC", + "sketch": "FRX1UekMEYmT7BZ_0" + } + ] + }, + "FlG94wXw67CXwu8_1": { + "reference_plane": {}, + "type": "Sketch", + "name": "Sketch 2", + "profiles": { + "JJG": { + "loops": [ + { + "profile_curves": [ + { + "center_point": { + "y": -0.01085092, + "x": 0.01760707, + "z": 0.0 + }, + "start_angle": 0.0, + "radius": 0.00817648, + "end_point": { + "y": -0.00544286, + "x": 0.01147455, + "z": 0.0 + }, + "start_point": { + "y": -0.01625898, + "x": 0.02373958, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "type": "Arc3D", + "curve": "JJR", + "end_angle": 3.14159346251536, + "reference_vector": { + "y": -0.6614168135850699, + "x": 0.7500185322423527, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "start_angle": 0.0, + "radius": 0.0127, + "end_point": { + "y": -0.01147455, + "x": 0.00544286, + "z": 0.0 + }, + "start_point": { + "y": -0.00544286, + "x": 0.01147455, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + }, + "type": "Arc3D", + "curve": "JJd", + "end_angle": 0.684973807357478, + "reference_vector": { + "y": -0.9035078104859143, + "x": 0.4285716234084442, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.0179236, + "x": 0.01017941, + "z": 0.0 + }, + "start_angle": 0.0, + "radius": 0.00800158, + "end_point": { + "y": -0.01147455, + "x": 0.00544286, + "z": 0.0 + }, + "start_point": { + "y": -0.02437266, + "x": 0.01491596, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + }, + "type": "Arc3D", + "curve": "JJZ", + "end_angle": 3.141591913795338, + "reference_vector": { + "y": 0.8059728931112685, + "x": -0.5919524436725064, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.00407723, + "x": 0.00439573, + "z": 0.0 + }, + "start_angle": 0.0, + "radius": 0.02286, + "end_point": { + "y": -0.02437266, + "x": 0.01491596, + "z": 0.0 + }, + "start_point": { + "y": -0.01625898, + "x": 0.02373958, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + }, + "type": "Arc3D", + "curve": "JJV", + "end_angle": 0.5305667776595886, + "reference_vector": { + "y": -0.8878139853867381, + "x": 0.4602024851646467, + "z": 0.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + }, + "JJK": { + "loops": [ + { + "profile_curves": [ + { + "center_point": { + "y": 0.0179236, + "x": -0.01017941, + "z": 0.0 + }, + "start_angle": 0.0, + "radius": 0.00800158, + "end_point": { + "y": 0.01147455, + "x": -0.00544286, + "z": 0.0 + }, + "start_point": { + "y": 0.02437266, + "x": -0.01491596, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + }, + "type": "Arc3D", + "curve": "JJh", + "end_angle": 3.141591913795338, + "reference_vector": { + "y": -0.8059728931112685, + "x": 0.5919524436725064, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "start_angle": 0.0, + "radius": 0.0127, + "end_point": { + "y": 0.00544286, + "x": -0.01147455, + "z": 0.0 + }, + "start_point": { + "y": 0.01147455, + "x": -0.00544286, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + }, + "type": "Arc3D", + "curve": "JJl", + "end_angle": 0.6849738073574776, + "reference_vector": { + "y": 0.9035078104859143, + "x": -0.4285716234084442, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.01085092, + "x": -0.01760707, + "z": 0.0 + }, + "start_angle": 0.0, + "radius": 0.00817648, + "end_point": { + "y": 0.01625898, + "x": -0.02373958, + "z": 0.0 + }, + "start_point": { + "y": 0.00544286, + "x": -0.01147455, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "type": "Arc3D", + "curve": "JJp", + "end_angle": 3.141593462515359, + "reference_vector": { + "y": 0.6614168135850699, + "x": -0.7500185322423527, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.00407723, + "x": -0.00439573, + "z": 0.0 + }, + "start_angle": 0.0, + "radius": 0.02286, + "end_point": { + "y": 0.01625898, + "x": -0.02373958, + "z": 0.0 + }, + "start_point": { + "y": 0.02437266, + "x": -0.01491596, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + }, + "type": "Arc3D", + "curve": "JJt", + "end_angle": 0.5305667776595886, + "reference_vector": { + "y": 0.8878139853867381, + "x": -0.4602024851646467, + "z": 0.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + }, + "JJO": { + "loops": [ + { + "profile_curves": [ + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "start_angle": 0.0, + "radius": 0.0127, + "end_point": { + "y": -0.01147455, + "x": -0.00544286, + "z": 0.0 + }, + "start_point": { + "y": -0.00544286, + "x": -0.01147455, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "type": "Arc3D", + "curve": "JJx", + "end_angle": 0.6849738073574776, + "reference_vector": { + "y": -0.4285716234084442, + "x": -0.9035078104859143, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.0179236, + "x": -0.01017941, + "z": 0.0 + }, + "start_angle": 0.0, + "radius": 0.00800158, + "end_point": { + "y": -0.02437266, + "x": -0.01491596, + "z": 0.0 + }, + "start_point": { + "y": -0.01147455, + "x": -0.00544286, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "type": "Arc3D", + "curve": "JJ9", + "end_angle": 3.141591913795338, + "reference_vector": { + "y": -0.8059733310341832, + "x": -0.5919518474180674, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.00407723, + "x": -0.00439573, + "z": 0.0 + }, + "start_angle": 0.0, + "radius": 0.02286, + "end_point": { + "y": -0.02437266, + "x": -0.01491596, + "z": 0.0 + }, + "start_point": { + "y": -0.01625898, + "x": -0.02373958, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "type": "Arc3D", + "curve": "JJ5", + "end_angle": 0.5305667776595886, + "reference_vector": { + "y": -0.5328849692748923, + "x": -0.8461876916623742, + "z": 0.0 + } + }, + { + "center_point": { + "y": -0.01085092, + "x": -0.01760707, + "z": 0.0 + }, + "start_angle": 0.0, + "radius": 0.00817648, + "end_point": { + "y": -0.01625898, + "x": -0.02373958, + "z": 0.0 + }, + "start_point": { + "y": -0.00544286, + "x": -0.01147455, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + }, + "type": "Arc3D", + "curve": "JJ1", + "end_angle": 3.1415934625153596, + "reference_vector": { + "y": 0.6614162068756875, + "x": 0.7500190672790779, + "z": 0.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + }, + "JJC": { + "loops": [ + { + "profile_curves": [ + { + "center_point": { + "y": 0.0179236, + "x": 0.01017941, + "z": 0.0 + }, + "start_angle": 0.0, + "radius": 0.00800158, + "end_point": { + "y": 0.01147455, + "x": 0.00544286, + "z": 0.0 + }, + "start_point": { + "y": 0.02437266, + "x": 0.01491596, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "type": "Arc3D", + "curve": "JJB", + "end_angle": 3.141591913795338, + "reference_vector": { + "y": 0.8059733310341832, + "x": 0.5919518474180674, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "start_angle": 0.0, + "radius": 0.0127, + "end_point": { + "y": 0.00544286, + "x": 0.01147455, + "z": 0.0 + }, + "start_point": { + "y": 0.01147455, + "x": 0.00544286, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "type": "Arc3D", + "curve": "JJJ", + "end_angle": 0.6849738073574777, + "reference_vector": { + "y": 0.4285716234084442, + "x": 0.9035078104859143, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.01085092, + "x": 0.01760707, + "z": 0.0 + }, + "start_angle": 0.0, + "radius": 0.00817648, + "end_point": { + "y": 0.00544286, + "x": 0.01147455, + "z": 0.0 + }, + "start_point": { + "y": 0.01625898, + "x": 0.02373958, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": -1.0 + }, + "type": "Arc3D", + "curve": "JJF", + "end_angle": 3.1415934625153596, + "reference_vector": { + "y": -0.6614162068756875, + "x": -0.7500190672790779, + "z": 0.0 + } + }, + { + "center_point": { + "y": 0.00407723, + "x": 0.00439573, + "z": 0.0 + }, + "start_angle": 0.0, + "radius": 0.02286, + "end_point": { + "y": 0.01625898, + "x": 0.02373958, + "z": 0.0 + }, + "start_point": { + "y": 0.02437266, + "x": 0.01491596, + "z": 0.0 + }, + "normal": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + }, + "type": "Arc3D", + "curve": "JJN", + "end_angle": 0.5305667776595889, + "reference_vector": { + "y": 0.5328849692748923, + "x": 0.8461876916623742, + "z": 0.0 + } + } + ], + "is_outer": true + } + ], + "properties": {} + } + }, + "transform": { + "origin": { + "y": 0.0, + "x": 0.0, + "z": 0.0 + }, + "y_axis": { + "y": 1.0, + "x": 0.0, + "z": 0.0 + }, + "x_axis": { + "y": 0.0, + "x": 1.0, + "z": 0.0 + }, + "z_axis": { + "y": 0.0, + "x": 0.0, + "z": 1.0 + } + } + } + }, + "properties": { + "bounding_box": { + "max_point": { + "y": 0.03175, + "x": 0.03175, + "z": 0.006350000000000001 + }, + "type": "BoundingBox3D", + "min_point": { + "y": -0.03175, + "x": -0.03175, + "z": 0.0 + } + } + }, + "sequence": [ + { + "index": 0, + "type": "Sketch", + "entity": "FRX1UekMEYmT7BZ_0" + }, + { + "index": 1, + "type": "ExtrudeFeature", + "entity": "F5tX7NvnA1Y5aRR_0" + }, + { + "index": 2, + "type": "Sketch", + "entity": "FlG94wXw67CXwu8_1" + } + ] +} \ No newline at end of file diff --git a/Bethany/json2dataset.py b/Bethany/json2dataset.py new file mode 100644 index 0000000..1c6cfb6 --- /dev/null +++ b/Bethany/json2dataset.py @@ -0,0 +1,113 @@ +import os +import glob +import json +import argparse +import sys +sys.path.append(".") +from lib.extrude import CADSequence + +from lib.cad2code import get_cad_code +from count_tokens.count import count_tokens_in_string + +parser = argparse.ArgumentParser() +parser.add_argument('--src', type=str, required=True, help="source folder") +parser.add_argument('--idx', type=int, default=0, help="export n files starting from idx.") +parser.add_argument('--num', type=int, default=-1, help="number of shapes to export. -1 exports all shapes.") +parser.add_argument('--filter', type=str, default=None, help="filter folder") +parser.add_argument('--ignore', type=bool, default=False, help="ignore too long code") +parser.add_argument('--mode', type=str, default="default", help="mode of generation") +parser.add_argument('--token', type=int, default=2048, help="limit of tokens count") +parser.add_argument('-o', '--outputs', type=str, default=None, help="save filename") +args = parser.parse_args() + +src_dir = args.src +print(src_dir) +out_paths = sorted(glob.glob(os.path.join(src_dir, "*.{}".format("json")))) +if args.num != -1: + out_paths = out_paths[args.idx:args.idx+args.num] + + +from multiprocessing import Process, cpu_count, Manager + +#tmp_folder="./_tmp/" +#ensure_dir(tmp_folder) + +num_processes = cpu_count() + +def main_process(process_id, result_list): + json_data = [] + for index in range(process_id, len(out_paths), num_processes): + print(f"{index + 1}/{len(out_paths)}",end='\r') + path = out_paths[index] + name = path.split("/")[-1].split(".")[0] + + data = {} + data["id"] = f"{name}" + data["image"] = f"{name}.jpg" + data["conversations"] = [] + + if args.filter is not None: + filter_dir = args.filter + filter_path = os.path.join(filter_dir, name + ".jpg") + if not os.path.isfile(filter_path): + continue + + try: + with open(path, 'r') as fp: + src_data = json.load(fp) + cad_seq = CADSequence.from_dict(src_data) + cad_code = get_cad_code(cad_seq) + + conversation_human = {"from": "human"} + if args.mode == "transparent": + conversation_human["value"] = f"\nThis image is a transparent view of a 3D model from a certain angle. Please try to use OpenECAD-style API to render this model." + elif args.mode == "orthographic": + conversation_human["value"] = f"\nThis image contains 4 views of a 3D model from a certain angle and three orthographic views. Please try to use OpenECAD-style API to render this model." + else: + conversation_human["value"] = f"\nThis image is a view of a 3D model from a certain angle. Please try to use OpenECAD-style API to render this model." + data["conversations"].append(conversation_human) + conversation_gpt = {"from": "gpt"} + conversation_gpt["value"] = f"Of course, here are the codes:\n```python\n{cad_code}```" + num_tokens = count_tokens_in_string(cad_code) + if num_tokens > args.token: + continue + data["conversations"].append(conversation_gpt) + json_data.append(data) + except Exception as e: + print(f"load and create failed. Error: {e}") + continue + + result_list.append(json_data) + #json_str = json.dumps(json_data, indent=4) # `indent=4` 用于美化输出, 使其更易读 + #with open(os.path.join(tmp_folder ,f"data{process_id}.json"), "w") as json_file: + # json_file.write(json_str) + + ## python export2step.py --src ./ --filter ./ + +if __name__ == "__main__": + with Manager() as manager: + # 创建一个共享的列表 + result_list = manager.list() + + processes = [] + for i in range(num_processes): + process = Process(target=main_process, args=(i, result_list,)) + processes.append(process) + process.start() + + # 等待所有进程完成 + for process in processes: + process.join() + + result_list = list(result_list) + json_res = [] + for result in result_list: + json_res += result + + print() + print(len(json_res)) + + with open(f'{args.outputs}', 'w') as f: + json.dump(json_res, f, indent=4) + + print('任务完成') \ No newline at end of file diff --git a/Bethany/json2py.py b/Bethany/json2py.py new file mode 100644 index 0000000..a993098 --- /dev/null +++ b/Bethany/json2py.py @@ -0,0 +1,76 @@ +import os +import glob +import json +import argparse +import sys +sys.path.append(".") +from lib.extrude import CADSequence +from lib.file_utils import ensure_dir + +from lib.cad2code import get_cad_code + +import traceback + +parser = argparse.ArgumentParser() +parser.add_argument('--src', type=str, required=True, help="source folder") +parser.add_argument('--idx', type=int, default=0, help="export n files starting from idx.") +parser.add_argument('--num', type=int, default=-1, help="number of shapes to export. -1 exports all shapes.") +parser.add_argument('--filter', type=str, default=None, help="filter folder") +parser.add_argument('-o', '--outputs', type=str, default=None, help="save folder") +args = parser.parse_args() + +src_dir = args.src +print(src_dir) +out_paths = sorted(glob.glob(os.path.join(src_dir, "*.{}".format("json")))) +if args.num != -1: + out_paths = out_paths[args.idx:args.idx+args.num] +save_dir = args.src + "_py" if args.outputs is None else args.outputs +ensure_dir(save_dir) + +from multiprocessing import Process, cpu_count, Manager + +num_processes = cpu_count() + +def main_process(process_id): + for index in range(process_id, len(out_paths), num_processes): + print(f"{index + 1}/{len(out_paths)}",end='\r') + path = out_paths[index] + name = path.split("/")[-1].split(".")[0] + + if args.filter is not None: + filter_dir = args.filter + filter_path = os.path.join(filter_dir, name + ".jpg") + if not os.path.isfile(filter_path): + continue + + try: + with open(path, 'r') as fp: + src_data = json.load(fp) + cad_seq = CADSequence.from_dict(src_data) + cad_code = get_cad_code(cad_seq) + #print(cad_code) + except Exception as e: + print(f"load and create failed. Error: {e}") + traceback.print_exc() + continue + + save_path = os.path.join(save_dir, name + ".py") + with open(save_path, 'w', encoding='utf-8') as file: + file.write(cad_code) + ## python export2step.py --src ./ --filter ./ + +if __name__ == "__main__": + with Manager() as manager: + # 创建一个共享的列表 + + processes = [] + for i in range(num_processes): + process = Process(target=main_process, args=(i, )) + processes.append(process) + process.start() + + # 等待所有进程完成 + for process in processes: + process.join() + + print('任务完成') diff --git a/Bethany/json2step.py b/Bethany/json2step.py new file mode 100644 index 0000000..5033eef --- /dev/null +++ b/Bethany/json2step.py @@ -0,0 +1,125 @@ +import os +import glob +import json +import numpy as np +from OCC.Core.BRepCheck import BRepCheck_Analyzer +from lib.DataExchange import write_step_file +import argparse +import sys +sys.path.append(".") +from lib.extrude import CADSequence +from lib.visualize import vec2CADsolid, create_CAD, create_CAD_index +from lib.file_utils import ensure_dir + + +import traceback + +parser = argparse.ArgumentParser() +parser.add_argument('--src', type=str, required=True, help="source folder") +parser.add_argument('--idx', type=int, default=0, help="export n files starting from idx.") +parser.add_argument('--num', type=int, default=-1, help="number of shapes to export. -1 exports all shapes.") +parser.add_argument('--mode', type=str, default="default", help="mode of generation") +parser.add_argument('--filter', action="store_true", help="use opencascade analyzer to filter invalid model") +parser.add_argument('-o', '--outputs', type=str, default=None, help="save folder") +args = parser.parse_args() + +src_dir = args.src +print(src_dir) +out_paths = sorted(glob.glob(os.path.join(src_dir, "*.{}".format("json")))) +if args.num != -1: + out_paths = out_paths[args.idx:args.idx+args.num] +save_dir = args.src + "_step" if args.outputs is None else args.outputs +ensure_dir(save_dir) + + +from multiprocessing import Process, cpu_count + +num_processes = cpu_count() + +from OCC.Core.TDocStd import TDocStd_Document +from OCC.Core.TCollection import TCollection_ExtendedString + +from lib.timeout import timeout_decorator +def main_process(process_id): + if args.mode == "segment": + for index in range(process_id, len(out_paths), num_processes): + path = out_paths[index] + @timeout_decorator + def main__(): + with open(path, 'r') as fp: + data = json.load(fp) + cad_seq = CADSequence.from_dict(data) + + for i in range(len(cad_seq.seq)): + doc_name = TCollection_ExtendedString("pythonocc-doc") + doc = TDocStd_Document(doc_name) + out_shape = create_CAD_index(doc, cad_seq, index=i) + + name = path.split("/")[-1].split(".")[0] + sub_folder = os.path.join(save_dir, name) + ensure_dir(sub_folder) + save_path = os.path.join(sub_folder, name + f".{i:02d}.step") + write_step_file(doc, save_path, application_protocol="AP242DIS") + + doc_name = TCollection_ExtendedString("pythonocc-doc") + doc = TDocStd_Document(doc_name) + out_shape = create_CAD(doc, cad_seq) + + if args.filter: + analyzer = BRepCheck_Analyzer(out_shape) + if not analyzer.IsValid(): + print("detect invalid.") + return + name = path.split("/")[-1].split(".")[0] + save_path = os.path.join(save_dir, name + f".step") + write_step_file(doc, save_path, application_protocol="AP242DIS") + try: + main__() + except Exception as e: + print(f"load and create failed. Error: {e}") + traceback.print_exc() + continue + elif args.mode == "default": + for index in range(process_id, len(out_paths), num_processes): + path = out_paths[index] + @timeout_decorator + def main__(): + name = path.split("/")[-1].split(".")[0] + save_path = os.path.join(save_dir, name + f".step") + if os.path.isfile(save_path): return + with open(path, 'r') as fp: + data = json.load(fp) + cad_seq = CADSequence.from_dict(data) + doc_name = TCollection_ExtendedString("pythonocc-doc") + doc = TDocStd_Document(doc_name) + cad = CADSequence(cad_seq) + out_shape = create_CAD(doc, cad_seq) + if args.filter: + analyzer = BRepCheck_Analyzer(out_shape) + if not analyzer.IsValid(): + print("detect invalid.") + return + + write_step_file(doc, save_path, application_protocol="AP242DIS") + try: + main__() + except Exception as e: + print(f"load and create failed. Error: {e}") + traceback.print_exc() + continue + + + ## python export2step.py --src ./ --outputs ./ + +if __name__ == "__main__": + processes = [] + for i in range(num_processes): + process = Process(target=main_process, args=(i,)) + processes.append(process) + process.start() + + # 等待所有进程完成 + for process in processes: + process.join() + + print('任务完成') \ No newline at end of file diff --git a/Bethany/lib/DataExchange.py b/Bethany/lib/DataExchange.py new file mode 100644 index 0000000..4f4f82f --- /dev/null +++ b/Bethany/lib/DataExchange.py @@ -0,0 +1,40 @@ +import os +from OCC.Core.STEPControl import STEPControl_Reader, STEPControl_Writer, STEPControl_AsIs +from OCC.Core.STEPCAFControl import STEPCAFControl_Writer + +from OCC.Core.Interface import Interface_Static_SetCVal +from OCC.Core.IFSelect import IFSelect_RetDone, IFSelect_ItemsByEntity +from OCC.Core.TDocStd import TDocStd_Document +from OCC.Core.TCollection import TCollection_ExtendedString + +try: + import svgwrite + HAVE_SVGWRITE = True +except ImportError: + HAVE_SVGWRITE = False + +def write_step_file(a_shape, filename, application_protocol="AP242DIS"): + """ exports a shape to a STEP file + a_shape: the topods_shape to export (a compound, a solid etc.) + filename: the filename + application protocol: "AP203" or "AP214IS" or "AP242DIS" + """ + # a few checks + #if a_shape.IsNull(): + # raise AssertionError("Shape %s is null." % a_shape) + if application_protocol not in ["AP203", "AP214IS", "AP242DIS"]: + raise AssertionError("application_protocol must be either AP203 or AP214IS. You passed %s." % application_protocol) + if os.path.isfile(filename): + print("Warning: %s file already exists and will be replaced" % filename) + # creates and initialise the step exporter + step_writer = STEPCAFControl_Writer() + Interface_Static_SetCVal("write.step.schema", application_protocol) + + # transfer shapes and write file + step_writer.Transfer(a_shape, STEPControl_AsIs) + status = step_writer.Write(filename) + + if not status == IFSelect_RetDone: + raise IOError("Error while writing shape to STEP file.") + if not os.path.isfile(filename): + raise IOError("File %s was not saved to filesystem." % filename) diff --git a/Bethany/lib/__init__.py b/Bethany/lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Bethany/lib/cad2code.py b/Bethany/lib/cad2code.py new file mode 100644 index 0000000..dbd193a --- /dev/null +++ b/Bethany/lib/cad2code.py @@ -0,0 +1,147 @@ +import numpy as np +from lib.extrude import CADSequence +import lib.curves +from lib.math_utils import * + +tol = 1e-10 +def get_sketchplane(cad_seq, index): + ext = cad_seq.seq[index] + res = f"SketchPlane{index} = add_sketchplane(\n" + res += "\torigin= {}, normal= {}, x_axis= {})\n".format( + np.array2string(ext.sketch_plane.origin.round(4), separator=', '), np.array2string(ext.sketch_plane.normal.round(4), separator=', '), + np.array2string(ext.sketch_plane.x_axis.round(4), separator=', ')) + return res + +def get_sketchplane_ref(cad_seq, index): + if index == 0: return get_sketchplane(cad_seq, index) # 第一个没有参考 + target_ext = cad_seq.seq[index] + target_plane = target_ext.sketch_plane + target_x_axis = target_plane.x_axis + target_n_axis = target_plane.normal + target_origin = target_plane.origin + for i in range(0, index): + ref_ext = cad_seq.seq[i] + ref_plane = ref_ext.sketch_plane + ref_x_axis = ref_plane.x_axis + ref_y_axis = ref_plane.y_axis + ref_n_axis = ref_plane.normal + ref_origin = ref_plane.origin + if are_parallel(target_n_axis, ref_n_axis): + # sameplane or extent_one/two + reverse = False if np.dot(target_n_axis, ref_n_axis) > 0 else True + vec_origin = target_origin - ref_origin + #if (np.linalg.norm(vec_origin) < tol) or (np.dot(vec_origin, ref_n_axis) < tol and np.abs(np.dot(vec_origin, ref_x_axis)) > tol): + if is_point_on_plane(ref_origin, ref_x_axis, ref_y_axis, target_origin): + # sameplane if OO' is same point or OO' and normal_axis are vertical. + typeop = "sameplane" + origin = map_3d_to_2d(ref_origin, ref_x_axis, ref_y_axis, target_origin) + angle = calculate_rotation_angle(ref_x_axis, target_x_axis, ref_n_axis) + res = f"SketchPlane{index} = add_sketchplane_ref(\n" + res += f"\tExtrude{i}, origin = {np.array2string(origin.round(4), separator=', ')}, type = \"{typeop}\"" + if np.abs(angle) > tol: + res += f", angle = {number_to_pi_string(angle)}" + if reverse: + res += ", reverse = True" + res += ")\n" + return res + #elif (are_parallel(vec_origin, ref_n_axis) and np.dot(vec_origin, ref_n_axis) > 0) or (np.dot(vec_origin - ref_ext.extent_one * ref_n_axis, ref_n_axis) < tol): + elif (are_parallel(vec_origin, ref_n_axis) and np.dot(vec_origin, ref_n_axis) > 0) and np.abs(distance_of_point_and_plane(ref_origin, ref_x_axis, ref_y_axis, target_origin) - np.abs(ref_ext.extent_one)) < tol: + typeop = "extent_one" + ref_origin_ = ref_origin + ref_n_axis * ref_ext.extent_one + origin = map_3d_to_2d(ref_origin_, ref_x_axis, ref_y_axis, target_origin) + angle = calculate_rotation_angle(ref_x_axis, target_x_axis, ref_n_axis) + res = f"SketchPlane{index} = add_sketchplane_ref(\n" + res += f"\tExtrude{i}, origin = {np.array2string(origin.round(4), separator=', ')}, type = \"{typeop}\"" + if np.abs(angle) > tol: + res += f", angle = {number_to_pi_string(angle)}" + if reverse: + res += ", reverse = True" + res += ")\n" + return res + #elif (are_parallel(vec_origin, ref_n_axis) and np.dot(vec_origin, ref_n_axis) < 0) or (np.dot(vec_origin + ref_ext.extent_two * ref_n_axis, ref_n_axis) < tol): + elif (are_parallel(vec_origin, ref_n_axis) and np.dot(vec_origin, ref_n_axis) < 0) and np.abs(distance_of_point_and_plane(ref_origin, ref_x_axis, ref_y_axis, target_origin) - np.abs(ref_ext.extent_two)) < tol: + typeop = "extent_two" + ref_origin_ = ref_origin - ref_n_axis * ref_ext.extent_two + origin = map_3d_to_2d(ref_origin_, ref_x_axis, ref_y_axis, target_origin) + angle = calculate_rotation_angle(ref_x_axis, target_x_axis, ref_n_axis) + res = f"SketchPlane{index} = add_sketchplane_ref(\n" + res += f"\tExtrude{i}, origin = {np.array2string(origin.round(4), separator=', ')}, type = \"{typeop}\"" + if np.abs(angle) > tol: + res += f", angle = {number_to_pi_string(angle)}" + if reverse: + res += ", reverse = True" + res += ")\n" + return res + else: + pass # next situation + elif np.dot(target_n_axis, ref_n_axis) < tol: + typeop = "line" + # line + for j, loop in enumerate(ref_ext.profile.children): + for k, curve in enumerate(loop.children): + if type(curve) == lib.curves.Line: + start_point = map_2d_to_3d(ref_origin, ref_x_axis, ref_y_axis, curve.start_point) + end_point = map_2d_to_3d(ref_origin, ref_x_axis, ref_y_axis, curve.end_point) + ref_x_axis_ = unit_vector(end_point - start_point) + ref_y_axis_ = ref_n_axis + ref_n_axis_ = find_n_from_x_and_y(ref_x_axis_, ref_y_axis_) + ref_origin_ = start_point + reverse = False if np.dot(target_n_axis, ref_n_axis_) > 0 else True + vec_origin = target_origin - ref_origin_ + if are_parallel(target_n_axis, ref_n_axis_): + #if (np.linalg.norm(vec_origin) < tol) or (np.dot(vec_origin, ref_n_axis_) < tol and np.abs(np.dot(vec_origin, ref_x_axis_)) > tol): + + if is_point_on_plane(ref_origin_, ref_x_axis_, ref_y_axis_, target_origin): + # if SO' is same point or SO' and normal_axis are vertical. + origin = map_3d_to_2d(ref_origin_, ref_x_axis_, ref_y_axis_, target_origin) + angle = calculate_rotation_angle(ref_x_axis_, target_x_axis, ref_n_axis_) + res = f"SketchPlane{index} = add_sketchplane_ref(\n" + res += f"\tExtrude{i}, origin= {np.array2string(origin.round(4), separator=', ')}, type= \"{typeop}\", line= Line{i}_{j}_{k}" + if np.abs(angle) > tol: + res += f", angle= {number_to_pi_string(angle)}" + if reverse: + res += ", reverse= True" + res += ")\n" + return res + + return get_sketchplane(cad_seq, index) # 查找失败,使用绝对坐标定义 + + + + + + +def get_cad_code(cad_seq): + cad_code = "" + for i, ext in enumerate(cad_seq.seq): + # SketchPlane + cad_code += get_sketchplane_ref(cad_seq, i) + # Loops + cad_code += f"Loops{i} = []\n" + for j, loop in enumerate(ext.profile.children): + # Curves + cad_code += f"Curves{i}_{j} = []\n" + for k, curve in enumerate(loop.children): + if type(curve) == lib.curves.Line: + cad_code += f"Line{i}_{j}_{k} = add_line(start= {np.array2string(curve.start_point.round(4), separator=', ')}, end= {np.array2string(curve.end_point.round(4), separator=', ')})\n" + #cad_code += f"Curves{i}_{j}.append(Line{i}_{j}_{k})\n" + elif type(curve) == lib.curves.Arc: + cad_code += f"Arc{i}_{j}_{k} = add_arc(start= {np.array2string(curve.start_point.round(4), separator=', ')}, " + cad_code += f"end= {np.array2string(curve.end_point.round(4), separator=', ')}, mid= {np.array2string(curve.mid_point.round(4), separator=', ')})\n" + #cad_code += f"Curves{i}_{j}.append(Arc{i}_{j}_{k})\n" + elif type(curve) == lib.curves.Circle: + cad_code += f"Circle{i}_{j}_{k} = add_circle(center= {np.array2string(curve.center.round(4), separator=', ')}, radius= {np.array2string(np.float64(curve.radius).round(4), separator=', ')})\n" + #cad_code += f"Curves{i}_{j}.append(Circle{i}_{j}_{k})\n" + cad_code += f"Loop{i}_{j} = add_loop(Curves{i}_{j})\n" + #cad_code += f"Loops{i}.append(Loop{i}_{j})\n" + # Profile + cad_code += f"Profile{i} = add_profile(Loops{i})\n" + # Sketch + cad_code += f"Sketch{i} = add_sketch(sketch_plane= SketchPlane{i}, profile= Profile{i})\n" + #cad_code += "\tsketch_position= {}, sketch_size= {})\n".format( + # np.array2string(ext.sketch_pos.round(4), separator=', '), np.array2string(ext.sketch_size.round(4), separator=', ')) + # Finally: Extrude + cad_code += f"Extrude{i} = add_extrude(sketch= Sketch{i},\n" + cad_code += "\toperation= {}, type= {}, extent_one= {}, extent_two= {})\n".format( + ext.operation, ext.extent_type, np.array2string(np.float64(ext.extent_one).round(4), separator=', '), np.array2string(np.float64(ext.extent_two).round(4), separator=', ')) + return cad_code \ No newline at end of file diff --git a/Bethany/lib/curves.py b/Bethany/lib/curves.py new file mode 100644 index 0000000..9c38d21 --- /dev/null +++ b/Bethany/lib/curves.py @@ -0,0 +1,422 @@ +import numpy as np +import matplotlib.lines as lines +import matplotlib.patches as patches +from .math_utils import rads_to_degs, angle_from_vector_to_x +from .macro import * + + +# FIXME: these two functions can be treated as static method +def construct_curve_from_dict(stat): + if stat['type'] == "Line3D": + return Line.from_dict(stat) + elif stat['type'] == "Circle3D": + return Circle.from_dict(stat) + elif stat['type'] == "Arc3D": + return Arc.from_dict(stat) + else: + raise NotImplementedError("curve type not supported yet: {}".format(stat['type'])) + + +def construct_curve_from_vector(vec, start_point, is_numerical=True): + type = vec[0] + if type == LINE_IDX: + return Line.from_vector(vec, start_point, is_numerical=is_numerical) + elif type == CIRCLE_IDX: + return Circle.from_vector(vec, start_point, is_numerical=is_numerical) + elif type == ARC_IDX: + res = Arc.from_vector(vec, start_point, is_numerical=is_numerical) + if res is None: # for visualization purpose, replace illed arc with line + return Line.from_vector(vec, start_point, is_numerical=is_numerical) + return res + else: + raise NotImplementedError("curve type not supported yet: command idx {}".format(vec[0])) + + +####################### base ####################### +class CurveBase(object): + """Base class for curve. All types of curves shall inherit from this.""" + def __init__(self): + pass + + @staticmethod + def from_dict(stat): + """construct curve from json data""" + raise NotImplementedError + + @staticmethod + def from_vector(vec, start_point, is_numerical=True): + """construct curve from vector representation""" + raise NotImplementedError + + @property + def bbox(self): + """compute bounding box of the curve""" + raise NotImplementedError + + def direction(self, from_start=True): + """return a vector indicating the curve direction""" + raise NotImplementedError + + def transform(self, translate, scale): + """linear transformation""" + raise NotImplementedError + + def flip(self, axis): + """flip the curve about axis""" + raise NotImplementedError + + def reverse(self): + """reverse the curve direction""" + raise NotImplementedError + + def numericalize(self, n=256): + """quantize curve parameters into integers""" + raise NotImplementedError + + def to_vector(self): + """represent curve using a vector. see macro.py""" + raise NotImplementedError + + def draw(self, ax, color): + """draw the curve using matplotlib""" + raise NotImplementedError + + def sample_points(self, n=32): + """uniformly sample points from the curve""" + raise NotImplementedError + + +####################### curves ####################### +class Line(CurveBase): + def __init__(self, start_point, end_point): + super(Line, self).__init__() + self.start_point = start_point + self.end_point = end_point + + def __str__(self): + return "Line: start({}), end({})".format(self.start_point.round(4), self.end_point.round(4)) + + @staticmethod + def from_dict(stat): + assert stat['type'] == "Line3D" + start_point = np.array([stat['start_point']['x'] * 1000, + stat['start_point']['y'] * 1000]) + end_point = np.array([stat['end_point']['x'] * 1000, + stat['end_point']['y'] * 1000]) + return Line(start_point, end_point) + + @staticmethod + def from_vector(vec, start_point, is_numerical=True): + return Line(start_point, vec[1:3]) + + @property + def bbox(self): + points = np.stack([self.start_point, self.end_point], axis=0) + return np.stack([np.min(points, axis=0), np.max(points, axis=0)], axis=0) + + def direction(self, from_start=True): + return self.end_point - self.start_point + + def transform(self, translate, scale): + self.start_point = (self.start_point + translate) * scale + self.end_point = (self.end_point + translate) * scale + + def flip(self, axis): + if axis == 'x': + self.start_point[1], self.end_point[1] = -self.start_point[1], -self.end_point[1] + elif axis == 'y': + self.start_point[0], self.end_point[0] = -self.start_point[0], -self.end_point[0] + elif axis == 'xy': + self.start_point = self.start_point * -1 + self.end_point = self.end_point * -1 + else: + raise ValueError("axis = {}".format(axis)) + + def reverse(self): + self.start_point, self.end_point = self.end_point, self.start_point + + def numericalize(self, n=256): + self.start_point = self.start_point.round().clip(min=0, max=n-1).astype(np.int) + self.end_point = self.end_point.round().clip(min=0, max=n-1).astype(np.int) + + def to_vector(self): + vec = [LINE_IDX, self.end_point[0], self.end_point[1]] + return np.array(vec + [PAD_VAL] * (1 + N_ARGS - len(vec))) + + def draw(self, ax, color): + xdata = [self.start_point[0], self.end_point[0]] + ydata = [self.start_point[1], self.end_point[1]] + l1 = lines.Line2D(xdata, ydata, lw=1, color=color, axes=ax) + ax.add_line(l1) + ax.plot(self.start_point[0], self.start_point[1], 'ok', color=color) + # ax.plot(self.end_point[0], self.end_point[1], 'ok') + + def sample_points(self, n=32): + return np.linspace(self.start_point, self.end_point, num=n) + + +class Arc(CurveBase): + def __init__(self, start_point, end_point, center, radius, + normal=None, start_angle=None, end_angle=None, ref_vec=None, mid_point=None): + super(Arc, self).__init__() + self.start_point = start_point + self.end_point = end_point + self.center = center + self.radius = radius + self.normal = normal + self.start_angle = start_angle + self.end_angle = end_angle + self.ref_vec = ref_vec + if mid_point is None: + self.mid_point = self.get_mid_point() + else: + self.mid_point = mid_point + + def __str__(self): + return "Arc: start({}), end({}), mid({})".format(self.start_point.round(4), self.end_point.round(4), + self.mid_point.round(4)) + + @staticmethod + def from_dict(stat): + assert stat['type'] == "Arc3D" + start_point = np.array([stat['start_point']['x'] * 1000, + stat['start_point']['y'] * 1000]) + end_point = np.array([stat['end_point']['x'] * 1000, + stat['end_point']['y'] * 1000]) + center = np.array([stat['center_point']['x'] * 1000, + stat['center_point']['y'] * 1000]) + radius = stat['radius'] * 1000 + normal = np.array([stat['normal']['x'], + stat['normal']['y'], + stat['normal']['z']]) + start_angle = stat['start_angle'] + end_angle = stat['end_angle'] + ref_vec = np.array([stat['reference_vector']['x'], + stat['reference_vector']['y']]) + return Arc(start_point, end_point, center, radius, normal, start_angle, end_angle, ref_vec) + + @staticmethod + def from_vector(vec, start_point, is_numerical=True): + end_point = vec[1:3] + sweep_angle = vec[3] / 256 * 2 * np.pi if is_numerical else vec[3] + clock_sign = vec[4] + s2e_vec = end_point - start_point + if np.linalg.norm(s2e_vec) == 0: + return None + radius = (np.linalg.norm(s2e_vec) / 2) / np.sin(sweep_angle / 2) + s2e_mid = (start_point + end_point) / 2 + vertical = np.cross(s2e_vec, [0, 0, 1])[:2] + vertical = vertical / np.linalg.norm(vertical) + if clock_sign == 0: + vertical = -vertical + center_point = s2e_mid - vertical * (radius * np.cos(sweep_angle / 2)) + + start_angle = 0 + end_angle = sweep_angle + if clock_sign == 0: + ref_vec = end_point - center_point + else: + ref_vec = start_point - center_point + ref_vec = ref_vec / np.linalg.norm(ref_vec) + + return Arc(start_point, end_point, center_point, radius, + start_angle=start_angle, end_angle=end_angle, ref_vec=ref_vec) + + def get_angles_counterclockwise(self, eps=1e-8): + c2s_vec = (self.start_point - self.center) / (np.linalg.norm(self.start_point - self.center) + eps) + c2m_vec = (self.mid_point - self.center) / (np.linalg.norm(self.mid_point - self.center) + eps) + c2e_vec = (self.end_point - self.center) / (np.linalg.norm(self.end_point - self.center) + eps) + angle_s, angle_m, angle_e = angle_from_vector_to_x(c2s_vec), angle_from_vector_to_x(c2m_vec), \ + angle_from_vector_to_x(c2e_vec) + angle_s, angle_e = min(angle_s, angle_e), max(angle_s, angle_e) + if not angle_s < angle_m < angle_e: + angle_s, angle_e = angle_e - np.pi * 2, angle_s + return angle_s, angle_e + + @property + def bbox(self): + points = [self.start_point, self.end_point] + angle_s, angle_e = self.get_angles_counterclockwise() + if angle_s < 0 < angle_e: + points.append(np.array([self.center[0] + self.radius, self.center[1]])) + if angle_s < np.pi / 2 < angle_e or angle_s < -np.pi / 2 * 3 < angle_e: + points.append(np.array([self.center[0], self.center[1] + self.radius])) + if angle_s < np.pi < angle_e or angle_s < -np.pi < angle_e: + points.append(np.array([self.center[0] - self.radius, self.center[1]])) + if angle_s < np.pi / 2 * 3 < angle_e or angle_s < -np.pi/2 < angle_e: + points.append(np.array([self.center[0], self.center[1] - self.radius])) + points = np.stack(points, axis=0) + return np.stack([np.min(points, axis=0), np.max(points, axis=0)], axis=0) + + def direction(self, from_start=True): + if from_start: + return self.mid_point - self.start_point + else: + return self.end_point - self.mid_point + + @property + def clock_sign(self): + """get a boolean sign indicating whether the arc is on top of s->e """ + s2e = self.end_point - self.start_point + s2m = self.mid_point - self.start_point + sign = np.cross(s2m, s2e) >= 0 # counter-clockwise + return sign + + def get_mid_point(self): + mid_angle = (self.start_angle + self.end_angle) / 2 + rot_mat = np.array([[np.cos(mid_angle), -np.sin(mid_angle)], + [np.sin(mid_angle), np.cos(mid_angle)]]) + mid_vec = rot_mat @ self.ref_vec + return self.center + mid_vec * self.radius + + def transform(self, translate, scale): + self.start_point = (self.start_point + translate) * scale + self.mid_point = (self.mid_point + translate) * scale + self.end_point = (self.end_point + translate) * scale + self.center = (self.center + translate) * scale + if isinstance(scale * 1.0, float): + self.radius = abs(self.radius * scale) + + def flip(self, axis): + if axis == 'x': + self.transform(0, np.array([1, -1])) + new_ref_vec_angle = angle_from_vector_to_x(self.ref_vec) + self.end_angle - self.start_angle + self.ref_vec = np.array([np.cos(new_ref_vec_angle), -np.sin(new_ref_vec_angle)]) + elif axis == 'y': + self.transform(0, np.array([-1, 1])) + new_ref_vec_angle = angle_from_vector_to_x(self.ref_vec) + self.end_angle - self.start_angle + self.ref_vec = np.array([-np.cos(new_ref_vec_angle), np.sin(new_ref_vec_angle)]) + elif axis == 'xy': + self.transform(0, -1) + self.ref_vec = self.ref_vec * -1 + else: + raise ValueError("axis = {}".format(axis)) + + def reverse(self): + self.start_point, self.end_point = self.end_point, self.start_point + + def numericalize(self, n=256): + self.start_point = self.start_point.round().clip(min=0, max=n-1).astype(np.int) + self.mid_point = self.mid_point.round().clip(min=0, max=n-1).astype(np.int) + self.end_point = self.end_point.round().clip(min=0, max=n-1).astype(np.int) + self.center = self.center.round().clip(min=0, max=n-1).astype(np.int) + tmp = np.array([self.start_angle, self.end_angle]) + self.start_angle, self.end_angle = (tmp / (2 * np.pi) * n).round().clip( + min=0, max=n-1).astype(np.int) + + def to_vector(self): + sweep_angle = max(abs(self.start_angle - self.end_angle), 1) + return np.array([ARC_IDX, self.end_point[0], self.end_point[1], sweep_angle, int(self.clock_sign), PAD_VAL, + *[PAD_VAL] * N_ARGS_EXT]) + + def draw(self, ax, color): + ref_vec_angle = rads_to_degs(angle_from_vector_to_x(self.ref_vec)) + start_angle = rads_to_degs(self.start_angle) + end_angle = rads_to_degs(self.end_angle) + diameter = 2.0 * self.radius + ap = patches.Arc( + (self.center[0], self.center[1]), + diameter, + diameter, + angle=ref_vec_angle, + theta1=start_angle, + theta2=end_angle, + lw=1, + color=color + ) + ax.add_patch(ap) + ax.plot(self.start_point[0], self.start_point[1], 'ok', color=color) + # ax.plot(self.center[0], self.center[1], 'ok', color=color) + ax.plot(self.mid_point[0], self.mid_point[1], 'ok', color=color) + # ax.plot(self.end_point[0], self.end_point[1], 'ok') + + def sample_points(self, n=32): + c2s_vec = (self.start_point - self.center) / np.linalg.norm(self.start_point - self.center) + c2m_vec = (self.mid_point - self.center) / np.linalg.norm(self.mid_point - self.center) + c2e_vec = (self.end_point - self.center) / np.linalg.norm(self.end_point - self.center) + angle_s, angle_m, angle_e = angle_from_vector_to_x(c2s_vec), angle_from_vector_to_x(c2m_vec), \ + angle_from_vector_to_x(c2e_vec) + angle_s, angle_e = min(angle_s, angle_e), max(angle_s, angle_e) + if not angle_s < angle_m < angle_e: + angle_s, angle_e = angle_e - np.pi * 2, angle_s + + angles = np.linspace(angle_s, angle_e, num=n) + points = np.stack([np.cos(angles), np.sin(angles)], axis=1) * self.radius + self.center[np.newaxis] + return points + + +class Circle(CurveBase): + def __init__(self, center, radius, normal=None): + super(Circle, self).__init__() + self.center = center + self.radius = radius + self.normal = normal + + def __str__(self): + return "Circle: center({}), radius({})".format(self.center.round(4), round(self.radius, 4)) + + @staticmethod + def from_dict(stat): + assert stat['type'] == "Circle3D" + center = np.array([stat['center_point']['x'] * 1000, + stat['center_point']['y'] * 1000]) + radius = stat['radius'] * 1000 + normal = np.array([stat['normal']['x'], + stat['normal']['y'], + stat['normal']['z']]) + return Circle(center, radius, normal) + + @staticmethod + def from_vector(vec, start_point=None, is_numerical=True): + return Circle(vec[1:3], vec[5]) + + @property + def bbox(self): + return np.stack([self.center - self.radius, self.center + self.radius], axis=0) + + def direction(self, from_start=True): + return self.center - self.start_point + + @property + def start_point(self): + return np.array([self.center[0] - self.radius, self.center[1]]) + + @property + def end_point(self): + return np.array([self.center[0] + self.radius, self.center[1]]) + + def transform(self, translate, scale): + self.center = (self.center + translate) * scale + self.radius = self.radius * scale + + def flip(self, axis): + if axis == 'x': + self.center[1] = -self.center[1] + elif axis == 'y': + self.center[0] = -self.center[0] + elif axis == 'xy': + self.center = self.center * -1 + else: + raise ValueError("axis = {}".format(axis)) + + def reverse(self): + pass + + def numericalize(self, n=256): + self.center = self.center.round().clip(min=0, max=n-1).astype(np.int) + self.radius = np.round(self.radius).clip(min=1, max=n-1).astype(np.int) + + def to_vector(self): + vec = [CIRCLE_IDX, self.center[0], self.center[1], PAD_VAL, PAD_VAL, self.radius] + return np.array(vec + [PAD_VAL] * (1 + N_ARGS - len(vec))) + + def draw(self, ax, color): + ap = patches.Circle((self.center[0], self.center[1]), self.radius, + lw=1, fill=None, color=color) + ax.add_patch(ap) + ax.plot(self.center[0], self.center[1], 'ok') + + def sample_points(self, n=32): + angles = np.linspace(0, np.pi * 2, num=n, endpoint=False) + points = np.stack([np.cos(angles), np.sin(angles)], axis=1) * self.radius + self.center[np.newaxis] + return points diff --git a/Bethany/lib/extrude.py b/Bethany/lib/extrude.py new file mode 100644 index 0000000..263bb01 --- /dev/null +++ b/Bethany/lib/extrude.py @@ -0,0 +1,324 @@ +import numpy as np +import random +from .sketch import Profile +from .macro import * +from .math_utils import cartesian2polar, polar2cartesian, polar_parameterization, polar_parameterization_inverse + + +class CoordSystem(object): + """Local coordinate system for sketch plane.""" + def __init__(self, origin, theta, phi, gamma, y_axis=None, is_numerical=False): + self.origin = origin + self._theta = theta # 0~pi + self._phi = phi # -pi~pi + self._gamma = gamma # -pi~pi + self._y_axis = y_axis # (theta, phi) + self.is_numerical = is_numerical + + @property + def normal(self): + return polar2cartesian([self._theta, self._phi]) + + @property + def x_axis(self): + normal_3d, x_axis_3d = polar_parameterization_inverse(self._theta, self._phi, self._gamma) + return x_axis_3d + + @property + def y_axis(self): + if self._y_axis is None: + return np.cross(self.normal, self.x_axis) + return polar2cartesian(self._y_axis) + + @staticmethod + def from_dict(stat): + origin = np.array([stat["origin"]["x"] * 1000, stat["origin"]["y"] * 1000, stat["origin"]["z"] * 1000]) + normal_3d = np.array([stat["z_axis"]["x"], stat["z_axis"]["y"], stat["z_axis"]["z"]]) + x_axis_3d = np.array([stat["x_axis"]["x"], stat["x_axis"]["y"], stat["x_axis"]["z"]]) + y_axis_3d = np.array([stat["y_axis"]["x"], stat["y_axis"]["y"], stat["y_axis"]["z"]]) + theta, phi, gamma = polar_parameterization(normal_3d, x_axis_3d) + return CoordSystem(origin, theta, phi, gamma, y_axis=cartesian2polar(y_axis_3d)) + + @staticmethod + def from_vector(vec, is_numerical=False, n=256): + origin = vec[:3] + theta, phi, gamma = vec[3:] + system = CoordSystem(origin, theta, phi, gamma) + if is_numerical: + system.denumericalize(n) + return system + + def __str__(self): + return "origin: {}, normal: {}, x_axis: {}, y_axis: {}".format( + self.origin.round(4), self.normal.round(4), self.x_axis.round(4), self.y_axis.round(4)) + + def transform(self, translation, scale): + self.origin = (self.origin + translation) * scale + + def numericalize(self, n=256): + """NOTE: shall only be called after normalization""" + # assert np.max(self.origin) <= 1.0 and np.min(self.origin) >= -1.0 # TODO: origin can be out-of-bound! + self.origin = ((self.origin + 1.0) / 2 * n).round().clip(min=0, max=n-1).astype(np.int) + tmp = np.array([self._theta, self._phi, self._gamma]) + self._theta, self._phi, self._gamma = ((tmp / np.pi + 1.0) / 2 * n).round().clip( + min=0, max=n-1).astype(np.int) + self.is_numerical = True + + def denumericalize(self, n=256): + self.origin = self.origin / n * 2 - 1.0 + tmp = np.array([self._theta, self._phi, self._gamma]) + self._theta, self._phi, self._gamma = (tmp / n * 2 - 1.0) * np.pi + self.is_numerical = False + + def to_vector(self): + return np.array([*self.origin, self._theta, self._phi, self._gamma]) + + +class Extrude(object): + """Single extrude operation with corresponding a sketch profile. + NOTE: only support single sketch profile. Extrusion with multiple profiles is decomposed.""" + def __init__(self, profile: Profile, sketch_plane: CoordSystem, + operation, extent_type, extent_one, extent_two, sketch_pos, sketch_size): + """ + Args: + profile (Profile): normalized sketch profile + sketch_plane (CoordSystem): coordinate system for sketch plane + operation (int): index of EXTRUDE_OPERATIONS, see macro.py + extent_type (int): index of EXTENT_TYPE, see macro.py + extent_one (float): extrude distance in normal direction (NOTE: it's negative in some data) + extent_two (float): extrude distance in opposite direction + sketch_pos (np.array): the global 3D position of sketch starting point + sketch_size (float): size of the sketch + """ + self.profile = profile # normalized sketch + self.sketch_plane = sketch_plane + self.operation = operation + self.extent_type = extent_type + self.extent_one = extent_one + self.extent_two = extent_two + + self.sketch_pos = sketch_pos + self.sketch_size = sketch_size + + @staticmethod + def from_dict(all_stat, extrude_id, sketch_dim=256): + """construct Extrude from json data + + Args: + all_stat (dict): all json data + extrude_id (str): entity ID for this extrude + sketch_dim (int, optional): sketch normalization size. Defaults to 256. + + Returns: + list: one or more Extrude instances + """ + extrude_entity = all_stat["entities"][extrude_id] + assert extrude_entity["start_extent"]["type"] == "ProfilePlaneStartDefinition" + + all_skets = [] + n = len(extrude_entity["profiles"]) + for i in range(len(extrude_entity["profiles"])): + sket_id, profile_id = extrude_entity["profiles"][i]["sketch"], extrude_entity["profiles"][i]["profile"] + sket_entity = all_stat["entities"][sket_id] + sket_profile = Profile.from_dict(sket_entity["profiles"][profile_id]) + sket_plane = CoordSystem.from_dict(sket_entity["transform"]) + # normalize profile + #point = sket_profile.start_point + point = np.array([0.0,0.0,0.0]) + sket_pos = point[0] * sket_plane.x_axis + point[1] * sket_plane.y_axis + sket_plane.origin + sket_size = sket_profile.bbox_size + sket_profile.normalize(sketch_dim) + all_skets.append((sket_profile, sket_plane, sket_pos, sket_size)) + + operation = EXTRUDE_OPERATIONS.index(extrude_entity["operation"]) + extent_type = EXTENT_TYPE.index(extrude_entity["extent_type"]) + extent_one = extrude_entity["extent_one"]["distance"]["value"] * 1000 + extent_two = 0.0 + if extrude_entity["extent_type"] == "TwoSidesFeatureExtentType": + extent_two = extrude_entity["extent_two"]["distance"]["value"] * 1000 + + if operation == EXTRUDE_OPERATIONS.index("NewBodyFeatureOperation"): + all_operations = [operation] + [EXTRUDE_OPERATIONS.index("JoinFeatureOperation")] * (n - 1) + else: + all_operations = [operation] * n + + return [Extrude(all_skets[i][0], all_skets[i][1], all_operations[i], extent_type, extent_one, extent_two, + all_skets[i][2], all_skets[i][3]) for i in range(n)] + + @staticmethod + def from_vector(vec, is_numerical=False, n=256): + """vector representation: commands [SOL, ..., SOL, ..., EXT]""" + assert vec[-1][0] == EXT_IDX and vec[0][0] == SOL_IDX + profile_vec = np.concatenate([vec[:-1], EOS_VEC[np.newaxis]]) + profile = Profile.from_vector(profile_vec, is_numerical=is_numerical) + ext_vec = vec[-1][-N_ARGS_EXT:] + + sket_pos = ext_vec[N_ARGS_PLANE:N_ARGS_PLANE + 3] + sket_size = ext_vec[N_ARGS_PLANE + N_ARGS_TRANS - 1] + sket_plane = CoordSystem.from_vector(np.concatenate([sket_pos, ext_vec[:N_ARGS_PLANE]])) + ext_param = ext_vec[-N_ARGS_EXT_PARAM:] + + res = Extrude(profile, sket_plane, int(ext_param[2]), int(ext_param[3]), ext_param[0], ext_param[1], + sket_pos, sket_size) + if is_numerical: + res.denumericalize(n) + return res + + def __str__(self): + s = "Sketch-Extrude pair:" + s += "\n -" + str(self.sketch_plane) + s += "\n -sketch position: {}, sketch size: {}".format(self.sketch_pos.round(4), self.sketch_size.round(4)) + s += "\n -operation:{}, type:{}, extent_one:{}, extent_two:{}".format( + self.operation, self.extent_type, self.extent_one.round(4), self.extent_two.round(4)) + s += "\n -" + str(self.profile) + return s + + def transform(self, translation, scale): + """linear transformation""" + # self.profile.transform(np.array([0, 0]), scale) + self.sketch_plane.transform(translation, scale) + self.extent_one *= scale + self.extent_two *= scale + self.sketch_pos = (self.sketch_pos + translation) * scale + self.sketch_size *= scale + + def numericalize(self, n=256): + """quantize the representation. + NOTE: shall only be called after CADSequence.normalize (the shape lies in unit cube, -1~1)""" + assert -2.0 <= self.extent_one <= 2.0 and -2.0 <= self.extent_two <= 2.0 + self.profile.numericalize(n) + self.sketch_plane.numericalize(n) + self.extent_one = ((self.extent_one + 1.0) / 2 * n).round().clip(min=0, max=n-1).astype(np.int) + self.extent_two = ((self.extent_two + 1.0) / 2 * n).round().clip(min=0, max=n-1).astype(np.int) + self.operation = int(self.operation) + self.extent_type = int(self.extent_type) + + self.sketch_pos = ((self.sketch_pos + 1.0) / 2 * n).round().clip(min=0, max=n-1).astype(np.int) + self.sketch_size = (self.sketch_size / 2 * n).round().clip(min=0, max=n-1).astype(np.int) + + def denumericalize(self, n=256): + """de-quantize the representation.""" + self.extent_one = self.extent_one / n * 2 - 1.0 + self.extent_two = self.extent_two / n * 2 - 1.0 + self.sketch_plane.denumericalize(n) + self.sketch_pos = self.sketch_pos / n * 2 - 1.0 + self.sketch_size = self.sketch_size / n * 2 + + self.operation = self.operation + self.extent_type = self.extent_type + + def flip_sketch(self, axis): + self.profile.flip(axis) + self.profile.normalize() + + def to_vector(self, max_n_loops=6, max_len_loop=15, pad=True): + """vector representation: commands [SOL, ..., SOL, ..., EXT]""" + profile_vec = self.profile.to_vector(max_n_loops, max_len_loop, pad=False) + if profile_vec is None: + return None + sket_plane_orientation = self.sketch_plane.to_vector()[3:] + ext_param = list(sket_plane_orientation) + list(self.sketch_pos) + [self.sketch_size] + \ + [self.extent_one, self.extent_two, self.operation, self.extent_type] + ext_vec = np.array([EXT_IDX, *[PAD_VAL] * N_ARGS_SKETCH, *ext_param]) + vec = np.concatenate([profile_vec[:-1], ext_vec[np.newaxis], profile_vec[-1:]], axis=0) # NOTE: last one is EOS + if pad: + pad_len = max_n_loops * max_len_loop - vec.shape[0] + vec = np.concatenate([vec, EOS_VEC[np.newaxis].repeat(pad_len, axis=0)], axis=0) + return vec + + +class CADSequence(object): + """A CAD modeling sequence, a series of extrude operations.""" + def __init__(self, extrude_seq, bbox=None): + self.seq = extrude_seq + self.bbox = bbox + + @staticmethod + def from_dict(all_stat): + """construct CADSequence from json data""" + seq = [] + for item in all_stat["sequence"]: + if item["type"] == "ExtrudeFeature": + extrude_ops = Extrude.from_dict(all_stat, item["entity"]) + seq.extend(extrude_ops) + bbox_info = all_stat["properties"]["bounding_box"] + max_point = np.array([bbox_info["max_point"]["x"] * 1000, bbox_info["max_point"]["y"] * 1000, bbox_info["max_point"]["z"] * 1000]) + min_point = np.array([bbox_info["min_point"]["x"] * 1000, bbox_info["min_point"]["y"] * 1000, bbox_info["min_point"]["z"] * 1000]) + bbox = np.stack([max_point, min_point], axis=0) + return CADSequence(seq, bbox) + + @staticmethod + def from_vector(vec, is_numerical=False, n=256): + commands = vec[:, 0] + ext_indices = [-1] + np.where(commands == EXT_IDX)[0].tolist() + ext_seq = [] + for i in range(len(ext_indices) - 1): + start, end = ext_indices[i], ext_indices[i + 1] + ext_seq.append(Extrude.from_vector(vec[start+1:end+1], is_numerical, n)) + cad_seq = CADSequence(ext_seq) + return cad_seq + + def __str__(self): + return "" + "\n".join(["({})".format(i) + str(ext) for i, ext in enumerate(self.seq)]) + + def to_vector(self, max_n_ext=10, max_n_loops=6, max_len_loop=15, max_total_len=60, pad=False): + if len(self.seq) > max_n_ext: + return None + vec_seq = [] + for item in self.seq: + vec = item.to_vector(max_n_loops, max_len_loop, pad=False) + if vec is None: + return None + vec = vec[:-1] # last one is EOS, removed + vec_seq.append(vec) + + vec_seq = np.concatenate(vec_seq, axis=0) + vec_seq = np.concatenate([vec_seq, EOS_VEC[np.newaxis]], axis=0) + + # add EOS padding + if pad and vec_seq.shape[0] < max_total_len: + pad_len = max_total_len - vec_seq.shape[0] + vec_seq = np.concatenate([vec_seq, EOS_VEC[np.newaxis].repeat(pad_len, axis=0)], axis=0) + + return vec_seq + + def transform(self, translation, scale): + """linear transformation""" + for item in self.seq: + item.transform(translation, scale) + + def normalize(self, size=1.0): + """(1)normalize the shape into unit cube (-1~1). """ + scale = size * NORM_FACTOR / np.max(np.abs(self.bbox)) + self.transform(0.0, scale) + + def numericalize(self, n=256): + for item in self.seq: + item.numericalize(n) + + def flip_sketch(self, axis): + for item in self.seq: + item.flip_sketch(axis) + + def random_transform(self): + for item in self.seq: + # random transform sketch + scale = random.uniform(0.8, 1.2) + item.profile.transform(-np.array([128, 128]), scale) + translate = np.array([random.randint(-5, 5), random.randint(-5, 5)], dtype=np.int) + 128 + item.profile.transform(translate, 1) + + # random transform and scale extrusion + t = 0.05 + translate = np.array([random.uniform(-t, t), random.uniform(-t, t), random.uniform(-t, t)]) + scale = random.uniform(0.8, 1.2) + # item.sketch_plane.transform(translate, scale) + item.sketch_pos = (item.sketch_pos + translate) * scale + item.extent_one *= random.uniform(0.8, 1.2) + item.extent_two *= random.uniform(0.8, 1.2) + + def random_flip_sketch(self): + for item in self.seq: + flip_idx = random.randint(0, 3) + if flip_idx > 0: + item.flip_sketch(['x', 'y', 'xy'][flip_idx - 1]) diff --git a/Bethany/lib/file_utils.py b/Bethany/lib/file_utils.py new file mode 100644 index 0000000..2e18319 --- /dev/null +++ b/Bethany/lib/file_utils.py @@ -0,0 +1,52 @@ +import os +import json +import logging +import shutil +import csv + + +def save_args(args, save_dir): + param_path = os.path.join(save_dir, 'params.json') + + with open(param_path, 'w') as fp: + json.dump(args.__dict__, fp, indent=4, sort_keys=True) + + +def ensure_dir(path): + """ + create path by first checking its existence, + :param paths: path + :return: + """ + if not os.path.exists(path): + os.makedirs(path) + + +def ensure_dirs(paths): + """ + create paths by first checking their existence + :param paths: list of path + :return: + """ + if isinstance(paths, list) and not isinstance(paths, str): + for path in paths: + ensure_dir(path) + else: + ensure_dir(paths) + + +def remkdir(path): + """ + if dir exists, remove it and create a new one + :param path: + :return: + """ + if os.path.exists(path): + shutil.rmtree(path) + os.makedirs(path) + + +def cycle(iterable): + while True: + for x in iterable: + yield x diff --git a/Bethany/lib/macro.py b/Bethany/lib/macro.py new file mode 100644 index 0000000..c4659a4 --- /dev/null +++ b/Bethany/lib/macro.py @@ -0,0 +1,40 @@ +import numpy as np + +ALL_COMMANDS = ['Line', 'Arc', 'Circle', 'EOS', 'SOL', 'Ext'] +LINE_IDX = ALL_COMMANDS.index('Line') +ARC_IDX = ALL_COMMANDS.index('Arc') +CIRCLE_IDX = ALL_COMMANDS.index('Circle') +EOS_IDX = ALL_COMMANDS.index('EOS') +SOL_IDX = ALL_COMMANDS.index('SOL') +EXT_IDX = ALL_COMMANDS.index('Ext') + +EXTRUDE_OPERATIONS = ["NewBodyFeatureOperation", "JoinFeatureOperation", + "CutFeatureOperation", "IntersectFeatureOperation"] +EXTENT_TYPE = ["OneSideFeatureExtentType", "SymmetricFeatureExtentType", + "TwoSidesFeatureExtentType"] + +PAD_VAL = -1 +N_ARGS_SKETCH = 5 # sketch parameters: x, y, alpha, f, r +N_ARGS_PLANE = 3 # sketch plane orientation: theta, phi, gamma +N_ARGS_TRANS = 4 # sketch plane origin + sketch bbox size: p_x, p_y, p_z, s +N_ARGS_EXT_PARAM = 4 # extrusion parameters: e1, e2, b, u +N_ARGS_EXT = N_ARGS_PLANE + N_ARGS_TRANS + N_ARGS_EXT_PARAM +N_ARGS = N_ARGS_SKETCH + N_ARGS_EXT + +SOL_VEC = np.array([SOL_IDX, *([PAD_VAL] * N_ARGS)]) +EOS_VEC = np.array([EOS_IDX, *([PAD_VAL] * N_ARGS)]) + +CMD_ARGS_MASK = np.array([[1, 1, 0, 0, 0, *[0]*N_ARGS_EXT], # line + [1, 1, 1, 1, 0, *[0]*N_ARGS_EXT], # arc + [1, 1, 0, 0, 1, *[0]*N_ARGS_EXT], # circle + [0, 0, 0, 0, 0, *[0]*N_ARGS_EXT], # EOS + [0, 0, 0, 0, 0, *[0]*N_ARGS_EXT], # SOL + [*[0]*N_ARGS_SKETCH, *[1]*N_ARGS_EXT]]) # Extrude + +NORM_FACTOR = 0.75 # scale factor for normalization to prevent overflow during augmentation + +MAX_N_EXT = 10 # maximum number of extrusion +MAX_N_LOOPS = 6 # maximum number of loops per sketch +MAX_N_CURVES = 15 # maximum number of curves per loop +MAX_TOTAL_LEN = 60 # maximum cad sequence length +ARGS_DIM = 256 diff --git a/Bethany/lib/math_utils.py b/Bethany/lib/math_utils.py new file mode 100644 index 0000000..bad46d0 --- /dev/null +++ b/Bethany/lib/math_utils.py @@ -0,0 +1,367 @@ +import math +import numpy as np + + +def rads_to_degs(rads): + """Convert an angle from radians to degrees""" + return 180 * rads / math.pi + +def distance_of_point_and_plane(origin, x_axis, y_axis, point): + # 确保输入是 numpy 数组 + origin = np.array(origin) + x_axis = np.array(x_axis) + y_axis = np.array(y_axis) + point = np.array(point) + normal_vector = np.cross(x_axis, y_axis) + distance = np.dot(point - origin, normal_vector) + return np.abs(distance) + +def is_point_on_plane(origin, x_axis, y_axis, point, tolerance=1e-10): + """ + 判断一个3D点是否在给定的平面上 + + 参数: + origin - 平面的原点坐标,形状为 (3,) + x_axis - 平面X轴的方向向量,形状为 (3,) + y_axis - 平面Y轴的方向向量,形状为 (3,) + point - 要检查的3D点,形状为 (3,) + tolerance - 容忍度,默认值为 1e-10 + + 返回: + 如果点在平面上返回 True,否则返回 False + """ + # 确保输入是 numpy 数组 + origin = np.array(origin) + x_axis = np.array(x_axis) + y_axis = np.array(y_axis) + point = np.array(point) + + # 计算法向量 + normal_vector = np.cross(x_axis, y_axis) + + # 计算点到平面的距离 + distance = np.dot(point - origin, normal_vector) + + # 判断距离是否在容忍度范围内 + return np.abs(distance) < tolerance + + +def number_to_pi_string(number): + """ + 将数字转换为带有 np.pi 的字符串表示形式 + + 参数: + number - 输入数字,可以是 np.pi 的倍数 + + 返回: + 带有 np.pi 的字符串表示形式 + """ + # 定义一个容忍度来比较浮点数 + tolerance = 1e-10 + + # 预定义一些常见的 π 的倍数及其对应的字符串表示 + pi_factors = { + np.pi: 'np.pi', + np.pi / 2: 'np.pi/2', + np.pi / 3: 'np.pi/3', + np.pi / 4: 'np.pi/4', + np.pi / 6: 'np.pi/6', + 2 * np.pi: '2*np.pi', + 3 * np.pi / 2: '3*np.pi/2', + 3 * np.pi / 4: '3*np.pi/4', + 5 * np.pi / 6: '5*np.pi/6', + 5 * np.pi / 3: '5*np.pi/3', + 7 * np.pi / 6: '7*np.pi/6', + 4 * np.pi / 3: '4*np.pi/3', + } + + # 检查输入数字是否接近这些常见的 π 倍数 + for key, value in pi_factors.items(): + if np.abs(np.abs(number) - key) < tolerance: + return value if number > 0 else '-' + value + + # 如果数字不在预定义的 π 倍数中,返回原数字 + return str(number.round(6)) + +def are_parallel(v1, v2, tol=1e-10): + # 计算叉积 + cross_product = np.cross(v1, v2) + # 判断叉积是否接近于零向量 + return np.all(np.abs(cross_product) < tol) + +def find_circle_center_and_radius(start_point, end_point, mid_point): + # Calculate midpoints of the chords + mid_point_start_end = (start_point + end_point) / 2 + mid_point_start_mid = (start_point + mid_point) / 2 + + # Calculate direction vectors of the chords + direction_start_end = end_point - start_point + direction_start_mid = mid_point - start_point + + # Calculate perpendicular direction vectors + perp_start_end = np.array([-direction_start_end[1], direction_start_end[0]]) + perp_start_mid = np.array([-direction_start_mid[1], direction_start_mid[0]]) + + # Solve for the intersection of the perpendicular bisectors + A = np.array([perp_start_end, -perp_start_mid]).T + b = mid_point_start_mid - mid_point_start_end + + # Solve the linear system + t, s = np.linalg.solve(A, b) + + # Calculate the center + center = mid_point_start_end + t * perp_start_end + + # Calculate the radius + radius = np.linalg.norm(center - start_point) + + return center, radius + +def rotate_vector(vector, axis, angle): + """ + 将一个3D向量绕指定轴逆时针旋转给定角度 + + 参数: + vector - 要旋转的3D向量,形状为 (3,) + axis - 旋转轴,形状为 (3,) + angle - 旋转角度(弧度) + + 返回: + 旋转后的3D向量,形状为 (3,) + """ + # 确保输入是 numpy 数组 + vector = np.array(vector) + axis = np.array(axis) + + # 计算单位轴向量 + axis = axis / np.linalg.norm(axis) + + # 计算旋转矩阵的各个分量 + cos_theta = np.cos(angle) + sin_theta = np.sin(angle) + cross_product = np.cross(axis, vector) + dot_product = np.dot(axis, vector) + + # 计算旋转后的向量 + rotated_vector = (vector * cos_theta + + cross_product * sin_theta + + axis * dot_product * (1 - cos_theta)) + + return rotated_vector + +def calculate_rotation_angle(v1, v2, axis): + """ + 计算从向量 v1 到向量 v2 绕给定轴的逆时针旋转角度 + + 参数: + v1 - 初始向量,形状为 (3,) + v2 - 旋转后的向量,形状为 (3,) + axis - 旋转轴,形状为 (3,) + + 返回: + 旋转角度(弧度),范围 (-pi, pi] + """ + # 确保输入是 numpy 数组 + v1 = np.array(v1) + v2 = np.array(v2) + axis = np.array(axis) + + # 计算单位轴向量 + axis = axis / np.linalg.norm(axis) + + # 计算点积 + dot_product = np.dot(v1, v2) + + # 计算叉积 + cross_product = np.cross(v1, v2) + + # 计算叉积在旋转轴上的投影长度 + projection_length = np.dot(cross_product, axis) + + # 计算向量的范数 + norm_v1 = np.linalg.norm(v1) + norm_v2 = np.linalg.norm(v2) + + # 计算角度的余弦值和正弦值 + cos_theta = dot_product / (norm_v1 * norm_v2) + sin_theta = projection_length / (norm_v1 * norm_v2) + + # 使用 arctan2 计算角度 + angle = np.arctan2(sin_theta, cos_theta) + + return angle + +def map_2d_to_3d(origin, x_axis, y_axis, point): + u, v = point + return origin + u * x_axis + v * y_axis + +def map_3d_to_2d(origin, x_axis, y_axis, point_3d): + """ + 将三维空间中的点转换为二维平面上的点 + + 参数: + origin - 原点坐标 (Ox, Oy, Oz),形状为 (3,) + x_axis - X轴向量 (Xx, Xy, Xz),形状为 (3,) + y_axis - Y轴向量 (Yx, Yy, Yz),形状为 (3,) + point_3d - 三维空间中的点 (Px, Py, Pz),形状为 (3,) + + 返回: + 二维平面上的点 (u, v),形状为 (2,) + """ + # 确保输入是 numpy 数组 + origin = np.array(origin) + x_axis = np.array(x_axis) + y_axis = np.array(y_axis) + point_3d = np.array(point_3d) + + # 构建矩阵 A 和向量 b + A = np.vstack([x_axis, y_axis]).T + b = point_3d - origin + + # 求解线性方程组 Ax = b + uv = np.linalg.lstsq(A, b, rcond=None)[0] + + return uv + + +def unit_vector(vector): + """ + 计算给定向量的单位向量 + + 参数: + vector - 输入向量,形状为 (n,) + + 返回: + 单位向量,形状为 (n,) + """ + # 计算向量的范数 + norm = np.linalg.norm(vector) + if norm == 0: + raise ValueError("零向量没有单位向量") + # 计算单位向量 + unit_vector = vector / norm + return unit_vector + + +def find_n_from_x_and_y(x, y): + """ + Given vectors x and y, find a vector n such that y = n × x. + Assumes that n is orthogonal to x. + + Parameters: + x (numpy array): The vector x. + y (numpy array): The vector y. + + Returns: + numpy array: The vector n. + """ + # Step 1: Compute the cross product of x and y to get n' + n_prime = np.cross(x, y) + + # Step 2: Normalize n' to get the unit vector + n_prime_unit = n_prime / np.linalg.norm(n_prime) + + # Step 3: Determine the correct sign of n_prime_unit + # To ensure y = n × x, we should check if the direction is correct + if np.allclose(np.cross(n_prime_unit, x), y): + n = n_prime_unit + else: + n = -n_prime_unit + + return n + +def angle_from_vector_to_x(vec): + """computer the angle (0~2pi) between a unit vector and positive x axis""" + angle = 0.0 + # 2 | 1 + # ------- + # 3 | 4 + if vec[0] >= 0: + if vec[1] >= 0: + # Qadrant 1 + angle = math.asin(vec[1]) + else: + # Qadrant 4 + angle = 2.0 * math.pi - math.asin(-vec[1]) + else: + if vec[1] >= 0: + # Qadrant 2 + angle = math.pi - math.asin(vec[1]) + else: + # Qadrant 3 + angle = math.pi + math.asin(-vec[1]) + return angle + + +def cartesian2polar(vec, with_radius=False): + """convert a vector in cartesian coordinates to polar(spherical) coordinates""" + vec = vec.round(6) + norm = np.linalg.norm(vec) + theta = np.arccos(vec[2] / norm) # (0, pi) + phi = np.arctan(vec[1] / (vec[0] + 1e-15)) # (-pi, pi) # FIXME: -0.0 cannot be identified here + if not with_radius: + return np.array([theta, phi]) + else: + return np.array([theta, phi, norm]) + + +def polar2cartesian(vec): + """convert a vector in polar(spherical) coordinates to cartesian coordinates""" + r = 1 if len(vec) == 2 else vec[2] + theta, phi = vec[0], vec[1] + x = r * np.sin(theta) * np.cos(phi) + y = r * np.sin(theta) * np.sin(phi) + z = r * np.cos(theta) + return np.array([x, y, z]) + + +def rotate_by_x(vec, theta): + mat = np.array([[1, 0, 0], + [0, np.cos(theta), -np.sin(theta)], + [0, np.sin(theta), np.cos(theta)]]) + return np.dot(mat, vec) + + +def rotate_by_y(vec, theta): + mat = np.array([[np.cos(theta), 0, np.sin(theta)], + [0, 1, 0], + [-np.sin(theta), 0, np.cos(theta)]]) + return np.dot(mat, vec) + + +def rotate_by_z(vec, phi): + mat = np.array([[np.cos(phi), -np.sin(phi), 0], + [np.sin(phi), np.cos(phi), 0], + [0, 0, 1]]) + return np.dot(mat, vec) + + +def polar_parameterization(normal_3d, x_axis_3d): + """represent a coordinate system by its rotation from the standard 3D coordinate system + + Args: + normal_3d (np.array): unit vector for normal direction (z-axis) + x_axis_3d (np.array): unit vector for x-axis + + Returns: + theta, phi, gamma: axis-angle rotation + """ + normal_polar = cartesian2polar(normal_3d) + theta = normal_polar[0] + phi = normal_polar[1] + + ref_x = rotate_by_z(rotate_by_y(np.array([1, 0, 0]), theta), phi) + + gamma = np.arccos(np.dot(x_axis_3d, ref_x).round(6)) + if np.dot(np.cross(ref_x, x_axis_3d), normal_3d) < 0: + gamma = -gamma + return theta, phi, gamma + + +def polar_parameterization_inverse(theta, phi, gamma): + """build a coordinate system by the given rotation from the standard 3D coordinate system""" + normal_3d = polar2cartesian([theta, phi]) + ref_x = rotate_by_z(rotate_by_y(np.array([1, 0, 0]), theta), phi) + ref_y = np.cross(normal_3d, ref_x) + x_axis_3d = ref_x * np.cos(gamma) + ref_y * np.sin(gamma) + return normal_3d, x_axis_3d diff --git a/Bethany/lib/sketch.py b/Bethany/lib/sketch.py new file mode 100644 index 0000000..23aed34 --- /dev/null +++ b/Bethany/lib/sketch.py @@ -0,0 +1,263 @@ +import numpy as np +import matplotlib +matplotlib.use('TkAgg') +import matplotlib.pyplot as plt +from .curves import * +from .macro import * + + +########################## base ########################### +class SketchBase(object): + """Base class for sketch (a collection of curves). """ + def __init__(self, children, reorder=True): + self.children = children + + if reorder: + self.reorder() + + @staticmethod + def from_dict(stat): + """construct sketch from json data + + Args: + stat (dict): dict from json data + """ + raise NotImplementedError + + @staticmethod + def from_vector(vec, start_point, is_numerical=True): + """construct sketch from vector representation + + Args: + vec (np.array): (seq_len, n_args) + start_point (np.array): (2, ). If none, implicitly defined as the last end point. + """ + raise NotImplementedError + + def reorder(self): + """rearrange the curves to follow counter-clockwise direction""" + raise NotImplementedError + + @property + def start_point(self): + return self.children[0].start_point + + @property + def end_point(self): + return self.children[-1].end_point + + @property + def bbox(self): + """compute bounding box (min/max points) of the sketch""" + all_points = np.concatenate([child.bbox for child in self.children], axis=0) + return np.stack([np.min(all_points, axis=0), np.max(all_points, axis=0)], axis=0) + + @property + def bbox_size(self): + """compute bounding box size (max of height and width)""" + bbox_min, bbox_max = self.bbox[0], self.bbox[1] + bbox_size = np.max(np.abs(np.concatenate([bbox_max - self.start_point, bbox_min - self.start_point]))) + return bbox_size + + @property + def global_trans(self): + """start point + sketch size (bbox_size)""" + return np.concatenate([self.start_point, np.array([self.bbox_size])]) + + def transform(self, translate, scale): + """linear transformation""" + for child in self.children: + child.transform(translate, scale) + + def flip(self, axis): + for child in self.children: + child.flip(axis) + self.reorder() + + def numericalize(self, n=256): + """quantize curve parameters into integers""" + for child in self.children: + child.numericalize(n) + + def normalize(self, size=256): + """normalize within the given size, with start_point in the middle center""" + cur_size = self.bbox_size + scale = (size / 2 * NORM_FACTOR - 1) / cur_size # prevent potential overflow if data augmentation applied + #self.transform(-self.start_point, scale) + #self.transform(np.array((size / 2, size / 2)), 1) + + def denormalize(self, bbox_size, size=256): + """inverse procedure of normalize method""" + scale = bbox_size / (size / 2 * NORM_FACTOR - 1) + #self.transform(-np.array((size / 2, size / 2)), scale) + + def to_vector(self): + """convert to vector representation""" + raise NotImplementedError + + def draw(self, ax): + """draw sketch on matplotlib ax""" + raise NotImplementedError + + def to_image(self): + """convert to image""" + fig, ax = plt.subplots() + self.draw(ax) + ax.axis('equal') + fig.canvas.draw() + X = np.array(fig.canvas.renderer.buffer_rgba())[:, :, :3] + plt.close(fig) + return X + + def sample_points(self, n=32): + """uniformly sample points from the sketch""" + raise NotImplementedError + + +####################### loop & profile ####################### +class Loop(SketchBase): + """Sketch loop, a sequence of connected curves.""" + @staticmethod + def from_dict(stat): + all_curves = [construct_curve_from_dict(item) for item in stat['profile_curves']] + this_loop = Loop(all_curves) + this_loop.is_outer = stat['is_outer'] + return this_loop + + def __str__(self): + return "Loop:" + "\n -" + "\n -".join([str(curve) for curve in self.children]) + + @staticmethod + def from_vector(vec, start_point=None, is_numerical=True): + all_curves = [] + if start_point is None: + # FIXME: explicit for loop can be avoided here + for i in range(vec.shape[0]): + if vec[i][0] == EOS_IDX: + start_point = vec[i - 1][1:3] + break + for i in range(vec.shape[0]): + type = vec[i][0] + if type == SOL_IDX: + continue + elif type == EOS_IDX: + break + else: + curve = construct_curve_from_vector(vec[i], start_point, is_numerical=is_numerical) + start_point = vec[i][1:3] # current curve's end_point serves as next curve's start_point + all_curves.append(curve) + return Loop(all_curves) + + def reorder(self): + """reorder by starting left most and counter-clockwise""" + if len(self.children) <= 1: + return + + start_curve_idx = -1 + sx, sy = 10000, 10000 + + # correct start-end point order + if np.allclose(self.children[0].start_point, self.children[1].start_point) or \ + np.allclose(self.children[0].start_point, self.children[1].end_point): + self.children[0].reverse() + + # correct start-end point order and find left-most point + for i, curve in enumerate(self.children): + if i < len(self.children) - 1 and np.allclose(curve.end_point, self.children[i + 1].end_point): + self.children[i + 1].reverse() + if round(curve.start_point[0], 6) < round(sx, 6) or \ + (round(curve.start_point[0], 6) == round(sx, 6) and round(curve.start_point[1], 6) < round(sy, 6)): + start_curve_idx = i + sx, sy = curve.start_point + + self.children = self.children[start_curve_idx:] + self.children[:start_curve_idx] + + # ensure mostly counter-clock wise + if isinstance(self.children[0], Circle) or isinstance(self.children[-1], Circle): # FIXME: hard-coded + return + start_vec = self.children[0].direction() + end_vec = self.children[-1].direction(from_start=False) + if np.cross(end_vec, start_vec) <= 0: + for curve in self.children: + curve.reverse() + self.children.reverse() + + def to_vector(self, max_len=None, add_sol=True, add_eos=True): + loop_vec = np.stack([curve.to_vector() for curve in self.children], axis=0) + if add_sol: + loop_vec = np.concatenate([SOL_VEC[np.newaxis], loop_vec], axis=0) + if add_eos: + loop_vec = np.concatenate([loop_vec, EOS_VEC[np.newaxis]], axis=0) + if max_len is None: + return loop_vec + + if loop_vec.shape[0] > max_len: + return None + elif loop_vec.shape[0] < max_len: + pad_vec = np.tile(EOS_VEC, max_len - loop_vec.shape[0]).reshape((-1, len(EOS_VEC))) + loop_vec = np.concatenate([loop_vec, pad_vec], axis=0) # (max_len, 1 + N_ARGS) + return loop_vec + + def draw(self, ax): + colors = ['red', 'blue', 'green', 'brown', 'pink', 'yellow', 'purple', 'black'] * 10 + for i, curve in enumerate(self.children): + curve.draw(ax, colors[i]) + + def sample_points(self, n=32): + points = np.stack([curve.sample_points(n) for curve in self.children], axis=0) # (n_curves, n, 2) + return points + + +class Profile(SketchBase): + """Sketch profile,a closed region formed by one or more loops. + The outer-most loop is placed at first.""" + @staticmethod + def from_dict(stat): + all_loops = [Loop.from_dict(item) for item in stat['loops']] + return Profile(all_loops) + + def __str__(self): + return "Profile:" + "\n -".join([str(loop) for loop in self.children]) + + @staticmethod + def from_vector(vec, start_point=None, is_numerical=True): + all_loops = [] + command = vec[:, 0] + end_idx = command.tolist().index(EOS_IDX) + indices = np.where(command[:end_idx] == SOL_IDX)[0].tolist() + [end_idx] + for i in range(len(indices) - 1): + loop_vec = vec[indices[i]:indices[i + 1]] + loop_vec = np.concatenate([loop_vec, EOS_VEC[np.newaxis]], axis=0) + if loop_vec[0][0] == SOL_IDX and loop_vec[1][0] not in [SOL_IDX, EOS_IDX]: + all_loops.append(Loop.from_vector(loop_vec, is_numerical=is_numerical)) + return Profile(all_loops) + + def reorder(self): + if len(self.children) <= 1: + return + all_loops_bbox_min = np.stack([loop.bbox[0] for loop in self.children], axis=0).round(6) + ind = np.lexsort(all_loops_bbox_min.transpose()[[1, 0]]) + self.children = [self.children[i] for i in ind] + + def draw(self, ax): + for i, loop in enumerate(self.children): + loop.draw(ax) + ax.text(loop.start_point[0], loop.start_point[1], str(i)) + + def to_vector(self, max_n_loops=None, max_len_loop=None, pad=True): + loop_vecs = [loop.to_vector(None, add_eos=False) for loop in self.children] + if max_n_loops is not None and len(loop_vecs) > max_n_loops: + return None + for vec in loop_vecs: + if max_len_loop is not None and vec.shape[0] > max_len_loop: + return None + profile_vec = np.concatenate(loop_vecs, axis=0) + profile_vec = np.concatenate([profile_vec, EOS_VEC[np.newaxis]], axis=0) + if pad: + pad_len = max_n_loops * max_len_loop - profile_vec.shape[0] + profile_vec = np.concatenate([profile_vec, EOS_VEC[np.newaxis].repeat(pad_len, axis=0)], axis=0) + return profile_vec + + def sample_points(self, n=32): + points = np.concatenate([loop.sample_points(n) for loop in self.children], axis=0) + return points diff --git a/Bethany/lib/timeout.py b/Bethany/lib/timeout.py new file mode 100644 index 0000000..b7363d4 --- /dev/null +++ b/Bethany/lib/timeout.py @@ -0,0 +1,31 @@ + +import signal + +# 定义超时异常 +class TimeoutException(Exception): + pass + +# 处理超时信号 +def handler(signum, frame): + raise TimeoutException() + +# 设置超时时间(秒) +timeout = 30 + +# 使用装饰器设置超时 +def timeout_decorator(func): + def wrapper(*args, **kwargs): + # 设置信号处理器 + signal.signal(signal.SIGALRM, handler) + # 启动闹钟 + signal.alarm(timeout) + try: + result = func(*args, **kwargs) + except TimeoutException: + print("Function timed out!") + result = None + finally: + # 关闭闹钟 + signal.alarm(0) + return result + return wrapper \ No newline at end of file diff --git a/Bethany/lib/visualize.py b/Bethany/lib/visualize.py new file mode 100644 index 0000000..f2dc2d6 --- /dev/null +++ b/Bethany/lib/visualize.py @@ -0,0 +1,197 @@ +from OCC.Core.gp import gp_Pnt, gp_Dir, gp_Circ, gp_Pln, gp_Vec, gp_Ax3, gp_Ax2, gp_Lin +from OCC.Core.BRepBuilderAPI import (BRepBuilderAPI_MakeEdge, BRepBuilderAPI_MakeFace, BRepBuilderAPI_MakeWire) +from OCC.Core.BRepPrimAPI import BRepPrimAPI_MakePrism +from OCC.Core.BRepAlgoAPI import BRepAlgoAPI_Cut, BRepAlgoAPI_Fuse, BRepAlgoAPI_Common +from OCC.Core.GC import GC_MakeArcOfCircle +from OCC.Extend.DataExchange import write_stl_file +from OCC.Core.Bnd import Bnd_Box +from OCC.Core.BRepBndLib import brepbndlib_Add +from copy import copy +from .extrude import * +from .sketch import Loop, Profile +from .curves import * +import os +import trimesh +from trimesh.sample import sample_surface +import random + +from OCC.Core.Quantity import Quantity_Color, Quantity_TOC_RGB +from OCC.Core.TDocStd import TDocStd_Document +from OCC.Core.XCAFDoc import XCAFDoc_DocumentTool, XCAFDoc_ColorGen +from OCC.Core.AIS import AIS_Shape + +# 创建不同颜色 +red = Quantity_Color(1.0, 0.1, 0.1, Quantity_TOC_RGB) +green = Quantity_Color(0.1, 1.0, 0.1, Quantity_TOC_RGB) +blue = Quantity_Color(0.1, 0.1, 1.0, Quantity_TOC_RGB) +white = Quantity_Color(1.0, 1.0, 1.0, Quantity_TOC_RGB) +gray = Quantity_Color(0.1, 0.1, 0.1, Quantity_TOC_RGB) + +import random +def generate_random_color(): + r = random.uniform(0, 1) + g = random.uniform(0, 1) + b = random.uniform(0, 1) + return Quantity_Color(r, g, b, Quantity_TOC_RGB) +import numpy as np +def color_distance(color1, color2): + rgb1 = np.array([color1.Red(), color1.Green(), color1.Blue()]) + rgb2 = np.array([color2.Red(), color2.Green(), color2.Blue()]) + return np.linalg.norm(rgb1 - rgb2) + +def vec2CADsolid(vec, is_numerical=True, n=256): + cad = CADSequence.from_vector(vec, is_numerical=is_numerical, n=256) + cad = create_CAD(cad) + return cad + + +from copy import deepcopy +def create_CAD_index(doc: TDocStd_Document, cad_seq: CADSequence, index = 0, color = red): + """create a 3D CAD model from CADSequence. Only support extrude with boolean operation.""" + if len(cad_seq.seq) != 1: + _ = create_CAD(doc, cad_seq) + extrude_op = cad_seq.seq[index] + profile = copy(extrude_op.profile) # use copy to prevent changing extrude_op internally + profile.denormalize(extrude_op.sketch_size) + + sketch_plane = copy(extrude_op.sketch_plane) + #sketch_plane.origin = extrude_op.sketch_pos + + face = create_profile_face(profile, sketch_plane) + normal = gp_Dir(*extrude_op.sketch_plane.normal) + ext_vec = gp_Vec(normal).Multiplied(extrude_op.extent_one) + body = BRepPrimAPI_MakePrism(face, ext_vec).Shape() + + shape_tool = XCAFDoc_DocumentTool.ShapeTool(doc.Main()) + color_tool = XCAFDoc_DocumentTool.ColorTool(doc.Main()) + label = shape_tool.AddShape(body) + color_tool.SetColor(label, red, XCAFDoc_ColorGen) + + if extrude_op.extent_type == EXTENT_TYPE.index("SymmetricFeatureExtentType"): + body_sym = BRepPrimAPI_MakePrism(face, ext_vec.Reversed()).Shape() + body = BRepAlgoAPI_Fuse(body, body_sym).Shape() + label_sym = shape_tool.AddShape(body_sym) + color_tool.SetColor(label_sym, red, XCAFDoc_ColorGen) + if extrude_op.extent_type == EXTENT_TYPE.index("TwoSidesFeatureExtentType"): + ext_vec = gp_Vec(normal.Reversed()).Multiplied(extrude_op.extent_two) + body_two = BRepPrimAPI_MakePrism(face, ext_vec).Shape() + body = BRepAlgoAPI_Fuse(body, body_two).Shape() + label_two = shape_tool.AddShape(body_two) + color_tool.SetColor(label_two, red, XCAFDoc_ColorGen) + return body + +def create_CAD(doc: TDocStd_Document, cad_seq: CADSequence): + """create a 3D CAD model from CADSequence. Only support extrude with boolean operation.""" + body = create_by_extrude(doc, cad_seq.seq[0]) + + for extrude_op in cad_seq.seq[1:]: + new_body = create_by_extrude(doc, extrude_op) + + if extrude_op.operation == EXTRUDE_OPERATIONS.index("NewBodyFeatureOperation") or \ + extrude_op.operation == EXTRUDE_OPERATIONS.index("JoinFeatureOperation"): + body = BRepAlgoAPI_Fuse(body, new_body).Shape() + elif extrude_op.operation == EXTRUDE_OPERATIONS.index("CutFeatureOperation"): + body = BRepAlgoAPI_Cut(body, new_body).Shape() + elif extrude_op.operation == EXTRUDE_OPERATIONS.index("IntersectFeatureOperation"): + body = BRepAlgoAPI_Common(body, new_body).Shape() + + shape_tool = XCAFDoc_DocumentTool.ShapeTool(doc.Main()) + _ = shape_tool.AddShape(body) + return body + + +def create_by_extrude(doc: TDocStd_Document, extrude_op: Extrude): + """create a solid body from Extrude instance.""" + profile = copy(extrude_op.profile) # use copy to prevent changing extrude_op internally + profile.denormalize(extrude_op.sketch_size) + + sketch_plane = copy(extrude_op.sketch_plane) + #sketch_plane.origin = extrude_op.sketch_pos + + face = create_profile_face(profile, sketch_plane) + normal = gp_Dir(*extrude_op.sketch_plane.normal) + ext_vec = gp_Vec(normal).Multiplied(extrude_op.extent_one) + body = BRepPrimAPI_MakePrism(face, ext_vec).Shape() + if extrude_op.extent_type == EXTENT_TYPE.index("SymmetricFeatureExtentType"): + body_sym = BRepPrimAPI_MakePrism(face, ext_vec.Reversed()).Shape() + body = BRepAlgoAPI_Fuse(body, body_sym).Shape() + if extrude_op.extent_type == EXTENT_TYPE.index("TwoSidesFeatureExtentType"): + ext_vec = gp_Vec(normal.Reversed()).Multiplied(extrude_op.extent_two) + body_two = BRepPrimAPI_MakePrism(face, ext_vec).Shape() + body = BRepAlgoAPI_Fuse(body, body_two).Shape() + + return body + + +def create_profile_face(profile: Profile, sketch_plane: CoordSystem): + """create a face from a sketch profile and the sketch plane""" + origin = gp_Pnt(*sketch_plane.origin) + normal = gp_Dir(*sketch_plane.normal) + x_axis = gp_Dir(*sketch_plane.x_axis) + gp_face = gp_Pln(gp_Ax3(origin, normal, x_axis)) + + all_loops = [create_loop_3d(loop, sketch_plane) for loop in profile.children] + topo_face = BRepBuilderAPI_MakeFace(gp_face, all_loops[0]) + for loop in all_loops[1:]: + topo_face.Add(loop.Reversed()) + return topo_face.Face() + + +def create_loop_3d(loop: Loop, sketch_plane: CoordSystem): + """create a 3D sketch loop""" + topo_wire = BRepBuilderAPI_MakeWire() + for curve in loop.children: + topo_edge = create_edge_3d(curve, sketch_plane) + if topo_edge == -1: # omitted + continue + topo_wire.Add(topo_edge) + return topo_wire.Wire() + + +def create_edge_3d(curve: CurveBase, sketch_plane: CoordSystem): + """create a 3D edge""" + if isinstance(curve, Line): + if np.allclose(curve.start_point, curve.end_point): + return -1 + start_point = point_local2global(curve.start_point, sketch_plane) + end_point = point_local2global(curve.end_point, sketch_plane) + topo_edge = BRepBuilderAPI_MakeEdge(start_point, end_point) + elif isinstance(curve, Circle): + center = point_local2global(curve.center, sketch_plane) + axis = gp_Dir(*sketch_plane.normal) + gp_circle = gp_Circ(gp_Ax2(center, axis), abs(float(curve.radius))) + topo_edge = BRepBuilderAPI_MakeEdge(gp_circle) + elif isinstance(curve, Arc): + # print(curve.start_point, curve.mid_point, curve.end_point) + start_point = point_local2global(curve.start_point, sketch_plane) + mid_point = point_local2global(curve.mid_point, sketch_plane) + end_point = point_local2global(curve.end_point, sketch_plane) + arc = GC_MakeArcOfCircle(start_point, mid_point, end_point).Value() + topo_edge = BRepBuilderAPI_MakeEdge(arc) + else: + raise NotImplementedError(type(curve)) + return topo_edge.Edge() + + +def point_local2global(point, sketch_plane: CoordSystem, to_gp_Pnt=True): + """convert point in sketch plane local coordinates to global coordinates""" + g_point = point[0] * sketch_plane.x_axis + point[1] * sketch_plane.y_axis + sketch_plane.origin + if to_gp_Pnt: + return gp_Pnt(*g_point) + return g_point + + +def CADsolid2pc(shape, n_points, name=None): + """convert opencascade solid to point clouds""" + bbox = Bnd_Box() + brepbndlib_Add(shape, bbox) + if bbox.IsVoid(): + raise ValueError("box check failed") + + if name is None: + name = random.randint(100000, 999999) + write_stl_file(shape, "tmp_out_{}.stl".format(name)) + out_mesh = trimesh.load("tmp_out_{}.stl".format(name)) + os.system("rm tmp_out_{}.stl".format(name)) + out_pc, _ = sample_surface(out_mesh, n_points) + return out_pc diff --git a/Bethany/png2jpg.py b/Bethany/png2jpg.py new file mode 100644 index 0000000..af965f7 --- /dev/null +++ b/Bethany/png2jpg.py @@ -0,0 +1,63 @@ +import argparse +import sys +import os +import glob +sys.path.append(".") +from PIL import Image + +parser = argparse.ArgumentParser() +parser.add_argument('--src', type=str, required=True, help="source folder") + +from PIL import Image +import os + + +parser = argparse.ArgumentParser() +parser.add_argument('--src', type=str, required=True, help="source folder") +args = parser.parse_args() + +src_dir = args.src +print(src_dir) +out_paths = sorted(glob.glob(os.path.join(src_dir, "*.{}".format("png")))) + +def convert_png_to_jpg_and_delete(png_path, jpg_path): + # 打开PNG文件 + png_image = Image.open(png_path) + + # 转换为RGB模式 + rgb_image = png_image.convert('RGB') + + # 保存为JPG文件 + rgb_image.save(jpg_path, "JPEG") + + # 删除原始的PNG文件 + os.remove(png_path) + print(f"{png_path} has been deleted.") + + +from multiprocessing import Process, cpu_count + +num_processes = cpu_count() + +def main_process(process_id): + + for index in range(process_id, len(out_paths), num_processes): + print(f"{index + 1}/{len(out_paths)}",end='\r') + path = out_paths[index] + name = path.split("/")[-1].split(".")[0] + save_path = os.path.join(src_dir, name + ".jpg") + # 调用函数进行转换并删除原始文件 + convert_png_to_jpg_and_delete(path, save_path) + +if __name__ == "__main__": + processes = [] + for i in range(num_processes): + process = Process(target=main_process, args=(i,)) + processes.append(process) + process.start() + + # 等待所有进程完成 + for process in processes: + process.join() + + print('任务完成') \ No newline at end of file diff --git a/Bethany/py2step.py b/Bethany/py2step.py new file mode 100644 index 0000000..af067ca --- /dev/null +++ b/Bethany/py2step.py @@ -0,0 +1,214 @@ +import os +import glob +import numpy as np +import argparse +import sys +sys.path.append(".") + +from lib.DataExchange import write_step_file +from lib.visualize import create_CAD +from lib.curves import Line, Arc, Circle +from lib.sketch import Loop, Profile +from lib.math_utils import * +from lib.extrude import CoordSystem, Extrude, CADSequence + +# Curves +def add_line(start, end): + start = np.array(start) + end = np.array(end) + return Line(start, end) + +def add_arc(start, end, mid): + # get radius and center point + start = np.array(start) + end = np.array(end) + mid = np.array(mid) + center, radius = find_circle_center_and_radius(start, end, mid) + def get_angles_counterclockwise(eps=1e-8): + c2s_vec = (start - center) / (np.linalg.norm(start - center) + eps) + c2m_vec = (mid - center) / (np.linalg.norm(mid - center) + eps) + c2e_vec = (end - center) / (np.linalg.norm(end - center) + eps) + angle_s, angle_m, angle_e = angle_from_vector_to_x(c2s_vec), angle_from_vector_to_x(c2m_vec), \ + angle_from_vector_to_x(c2e_vec) + angle_s, angle_e = min(angle_s, angle_e), max(angle_s, angle_e) + if not angle_s < angle_m < angle_e: + angle_s, angle_e = angle_e - np.pi * 2, angle_s + return angle_s, angle_e + angle_s, angle_e = get_angles_counterclockwise() + return Arc(start, end, center, radius, start_angle=angle_s, end_angle=angle_e, mid_point=mid) + +def add_circle(center, radius): + center = np.array(center) + return Circle(center, radius) + +# Loops +def add_loop(curves): + res = Loop(curves) + res.reorder() + def autofix(loop): + if len(loop.children) <= 1: + return + if isinstance(loop.children[0], Circle): + return + for i in range(0, len(loop.children) - 1): + if not np.allclose(loop.children[i].end_point, loop.children[i+1].start_point): + loop.children[i+1].start_point = loop.children[i].end_point + print("warning: fixing loop") + if not np.allclose(loop.children[len(loop.children) - 1].end_point, loop.children[0].start_point): + loop.children[len(loop.children) - 1].start_point = loop.children[0].end_point + print("warning: fixing loop") + + autofix(res) + return res + +# Sketch-Profile +def add_profile(loops): + return Profile(loops) + +def add_sketchplane(origin, normal, x_axis):#, y_axis): + #print(origin, normal, x_axis) + origin = np.array(origin) + normal = np.array(normal) + x_axis = np.array(x_axis) + y_axis = find_n_from_x_and_y(normal, x_axis) + # get theta and phi + theta, phi, gamma = polar_parameterization(normal, x_axis) + #print(normal_axis, x_axis) + #print(theta, phi, gamma) + return CoordSystem(origin, theta, phi, gamma, y_axis=cartesian2polar(y_axis)) + +def add_sketchplane_ref(extrude: Extrude, origin, type: str, line: Line = None, reverse = False, angle=0): + origin = np.array(origin) + types_dict = ["sameplane", "extent_one", "extent_two", "line"] + """ + sameplane: 参考Extrude的SketchPlane,angle是以normal为轴,向下看逆时针角度,原点是在SketchPlane内的2D相对坐标。reverse只在最后反转normal,其他参考并不反转。 + line:默认normal为y轴,line start to end 为x轴,它们的叉积为方向向量normal',原点是在该默认平面的2D相对坐标。angle是以normal'为轴,向下看逆时针角度。reverse只在最后反转normal',其他参考并不反转。 + """ + if type not in types_dict: + raise ValueError + ref_plane = extrude.sketch_plane + ref_x_axis = unit_vector(ref_plane.x_axis) + ref_y_axis = unit_vector(ref_plane.y_axis) + ref_n_axis = unit_vector(ref_plane.normal) + ref_origin = ref_plane.origin + if type == "sameplane": + real_origin = map_2d_to_3d(ref_origin, ref_x_axis, ref_y_axis, origin) + elif type == "extent_one": + ref_origin_ = ref_origin + extrude.extent_one * ref_n_axis + real_origin = map_2d_to_3d(ref_origin_, ref_x_axis, ref_y_axis, origin) + elif type == "extent_two": + ref_origin_ = ref_origin - extrude.extent_two * ref_n_axis + real_origin = map_2d_to_3d(ref_origin_, ref_x_axis, ref_y_axis, origin) + if type in types_dict[:3]: + real_x_axis = rotate_vector(ref_x_axis, ref_n_axis, angle) + return add_sketchplane(real_origin, ref_n_axis if not reverse else -ref_n_axis, real_x_axis) + if type == "line": + if line is None: + raise TypeError + start_point = map_2d_to_3d(ref_origin, ref_x_axis, ref_y_axis, line.start_point) + end_point = map_2d_to_3d(ref_origin, ref_x_axis, ref_y_axis, line.end_point) + default_x_axis = unit_vector(end_point - start_point) + real_origin = map_2d_to_3d(start_point, default_x_axis, ref_n_axis, origin) # ref_n_axis is y axis of default plane + default_normal = find_n_from_x_and_y(default_x_axis, ref_n_axis) + real_x_axis = rotate_vector(default_x_axis, default_normal, angle) + return add_sketchplane(real_origin, default_normal if not reverse else -default_normal, real_x_axis) + raise ValueError + +class Sketch(object): + def __init__(self, sketch_plane, profile, sketch_position, sketch_size): + self.sketch_plane = sketch_plane + self.profile = profile + self.sketch_position = sketch_position + self.sketch_size = sketch_size + +def add_sketch(sketch_plane, profile, sketch_position=[0.0,0.0,0.0], sketch_size=0): + return Sketch(sketch_plane, profile, np.array(sketch_position), sketch_size) + +cad_seq = [] +def add_extrude(sketch: Sketch, operation, type, extent_one, extent_two): + res = Extrude( + sketch.profile, + sketch.sketch_plane, + np.intc(operation), np.intc(type), np.double(extent_one), np.double(extent_two), + np.double(sketch.sketch_position), + np.double(sketch.sketch_size) + ) + cad_seq.append(res) + return res + +from OCC.Core.TDocStd import TDocStd_Document +from OCC.Core.TCollection import TCollection_ExtendedString + +def _process(path, path_o): + global cad_seq + cad_seq.clear() + with open(path, 'r') as file: + codes = file.read() + # 执行读取到的代码 + + codes = codes.split("\n") + i = 0 + last_curves_list, last_loops_list = None, None + while i < len(codes): + code = codes[i] + last_curve_name, last_loop_name = None, None + if codes[i].startswith('Curves'): + last_curves_list = codes[i].split('=', 1)[0].split()[0] + elif codes[i].startswith('Loops'): + last_loops_list = codes[i].split('=', 1)[0].split()[0] + elif codes[i].startswith('Arc') or codes[i].startswith('Line') or codes[i].startswith('Circle'): + last_curve_name = codes[i].split('=', 1)[0].split()[0] + elif codes[i].startswith('Loop'): + last_loop_name = codes[i].split('=', 1)[0].split()[0] + for j in range(i + 1, len(codes)): + if codes[j].startswith('\t') or codes[j].startswith(' '): + code += '\n' + codes[j] + i += 1 + else: + break + exec(code) + if last_curve_name is not None: + exec(f"{last_curves_list}.append({last_curve_name})") + elif last_loop_name is not None: + exec(f"{last_loops_list}.append({last_loop_name})") + + i += 1 + doc_name = TCollection_ExtendedString("pythonocc-doc") + doc = TDocStd_Document(doc_name) + cad = CADSequence(cad_seq) + #print(cad) + out_shape = create_CAD(doc, cad) + + write_step_file(doc, path_o) + +error_list = [] + +from lib.file_utils import ensure_dir + +parser = argparse.ArgumentParser() +parser.add_argument('--src', type=str, required=True, help="source folder") +parser.add_argument('-o', '--outputs', type=str, default=None, help="save folder") +args = parser.parse_args() + +src_dir = args.src +print(src_dir) +out_paths = sorted(glob.glob(os.path.join(src_dir, "*.{}".format("py")))) +save_dir = args.src + "_step" if args.outputs is None else args.outputs +ensure_dir(save_dir) + +import traceback + +for path in out_paths: + name = path.split("/")[-1].split(".")[0] + try: + save_path = os.path.join(save_dir, name + ".step") + _process(path, save_path) + + except Exception as e: + print("load and create failed.") + traceback.print_exc() + print(name) + error_list.append(name) + +for error in error_list: + print(error) \ No newline at end of file diff --git a/Bethany/requirements.txt b/Bethany/requirements.txt new file mode 100644 index 0000000..090ca28 --- /dev/null +++ b/Bethany/requirements.txt @@ -0,0 +1,6 @@ +matplotlib==3.9.1 +numpy==1.26.4 +Pillow==8.3.2 +trimesh==3.23.5 +count-tokens==0.7.0 +opencv-python==4.10.0.84 \ No newline at end of file diff --git a/Bethany/step2img.py b/Bethany/step2img.py new file mode 100644 index 0000000..1a89dbb --- /dev/null +++ b/Bethany/step2img.py @@ -0,0 +1,248 @@ +import argparse +import sys +import os +import glob +import json +sys.path.append(".") +from lib.file_utils import ensure_dir +import random + +from OCC.Core.STEPControl import STEPControl_Reader +from OCC.Core.IFSelect import IFSelect_RetDone +from OCC.Display.SimpleGui import init_display +from OCC.Core.Bnd import Bnd_Box +from OCC.Core.BRepBndLib import brepbndlib_Add + +from OCC.Extend.DataExchange import read_step_file_with_names_colors +from OCC.Core.Quantity import Quantity_Color, Quantity_TOC_RGB + +from OCC.Core.AIS import AIS_Shape +from OCC.Core.Aspect import Aspect_TOL_SOLID, Aspect_TOL_DASH, Aspect_TOL_DOT +from OCC.Core.Prs3d import Prs3d_Drawer, Prs3d_LineAspect, Prs3d_Root + +from PIL import Image + +import traceback + +os.environ["PYTHONOCC_OFFSCREEN_RENDERER"] = "1" + +parser = argparse.ArgumentParser() +parser.add_argument('--src', type=str, required=True, help="source folder") +parser.add_argument('--idx', type=int, default=0, help="export n files starting from idx.") +parser.add_argument('--num', type=int, default=-1, help="number of shapes to export. -1 exports all shapes.") +parser.add_argument('-o', '--outputs', type=str, default=None, help="save folder") +parser.add_argument('--mode', type=str, default="default", help="mode of generation") +args = parser.parse_args() + +src_dir = args.src +print(src_dir) +out_paths = sorted(glob.glob(os.path.join(src_dir, "*.{}".format("step")))) +if args.num != -1: + out_paths = out_paths[args.idx:args.idx+args.num] +save_dir = args.src + "_images" if args.outputs is None else args.outputs +ensure_dir(save_dir) + +from lib.timeout import timeout_decorator + +from multiprocessing import Process, cpu_count + +num_processes = 4 #cpu_count() + +def main_process(process_id): + + HasTarget = False + for index in range(process_id, len(out_paths), num_processes): + HasTarget = True + break + if not HasTarget: + return + + # 初始化显示窗口 + display, start_display, add_menu, add_function_to_menu = init_display() + display.View.SetBgGradientColors(Quantity_Color(1.0, 1.0, 1.0, Quantity_TOC_RGB), Quantity_Color(1.0, 1.0, 1.0, Quantity_TOC_RGB), 2, True) + + # 加载3D模型 + def load_step_file(filename): + step_reader = STEPControl_Reader() + status = step_reader.ReadFile(filename) + if status == IFSelect_RetDone: + step_reader.TransferRoots() + shape = step_reader.OneShape() + shapes_labels_colors = read_step_file_with_names_colors(filename) + return shapes_labels_colors, shape + else: + raise IOError("Error: cannot read file.") + + # 计算模型包围盒 + def compute_bounding_box(shape): + box = Bnd_Box() + brepbndlib_Add(shape, box) + return box + + # 渲染并保存图片 + def render_and_save(display, shapes_labels_colors, view_name): + #display.DisplayShape(shape, update=True) + for shpt_lbl_color in shapes_labels_colors: + label, c = shapes_labels_colors[shpt_lbl_color] + + if args.mode == "segment": + color = Quantity_Color(c.Red() , c.Green() , c.Blue() , Quantity_TOC_RGB) + ais_shape = AIS_Shape(shpt_lbl_color) + ais_shape.SetColor(color) + if color == Quantity_Color(1.0 , 0.1 , 0.1 , Quantity_TOC_RGB): + display.Context.SetTransparency(ais_shape, 0.0, False) + else: + display.Context.SetTransparency(ais_shape, 1.0, False) + display.Context.Display(ais_shape, False) + elif args.mode == "transparent": + ais_shape = AIS_Shape(shpt_lbl_color) + color = Quantity_Color(c.Red() * 0.25, c.Green() * 0.25, c.Blue() * 0.25, Quantity_TOC_RGB) + ais_shape.SetColor(color) + + display.Context.SetTransparency(ais_shape, 0.25, False) + display.Context.Display(ais_shape, False) + + ais_shape = AIS_Shape(shpt_lbl_color) + ais_shape.SetWidth(2.0) + display.Context.SetTransparency(ais_shape, 1.0, False) + display.Context.Display(ais_shape, False) + else: + ais_shape = AIS_Shape(shpt_lbl_color) + color = Quantity_Color(c.Red() * 0.25, c.Green() * 0.25, c.Blue() * 0.25, Quantity_TOC_RGB) + ais_shape.SetColor(color) + + display.Context.SetTransparency(ais_shape, 0.0, False) + display.Context.Display(ais_shape, False) + + ais_shape = AIS_Shape(shpt_lbl_color) + ais_shape.SetWidth(2.0) + display.Context.SetTransparency(ais_shape, 1.0, False) + display.Context.Display(ais_shape, False) + + #display.DisplayColoredShape( + # shpt_lbl_color, + # color=Quantity_Color(c.Red() * 0.25, c.Green() * 0.25, c.Blue() * 0.25, Quantity_TOC_RGB), + #) + display.FitAll() + display.View.Dump(view_name) + + # 设置视角并保存图片 + def save_views_from_angles(shapes_labels_colors, proj_directions, output_dir, name): + if not os.path.exists(output_dir): + os.makedirs(output_dir) + + image_paths = [] + for proj_direction in proj_directions: + x, y, z = proj_direction + display.View_Front() + #display.View_Iso() + display.View.SetProj(x, y, z) + display.View.FitAll() + if args.mode == "orthographic": + if x * y * z > 0: d = 'o' + elif x > 0: d = 'x' + elif y > 0: d = 'y' + else: d = 'z' + view_name = os.path.join(output_dir, f'{name}_{d}.jpg') + else: + view_name = os.path.join(output_dir, f'{name}.jpg') + render_and_save(display, shapes_labels_colors, view_name) + image_paths.append(view_name) + + return image_paths + + def merge_images(image_paths, output_path): + # 打开所有图片 + images = [Image.open(image_path) for image_path in image_paths] + + # 获取单张图片的宽度和高度(假设所有图片大小相同) + width, height = images[0].size + + # 创建一个新图像,大小为 2x2 布局的总大小 + merged_image = Image.new('RGB', (2 * width, 2 * height)) + + # 将每张图片粘贴到新图像的正确位置 + positions = [(0, 0), (width, 0), (0, height), (width, height)] + for pos, img in zip(positions, images): + merged_image.paste(img, pos) + + # 保存拼接后的图像 + merged_image.save(output_path) + + # 删除原图 + for image_path in image_paths: + os.remove(image_path) + + for index in range(process_id, len(out_paths), num_processes): + step_file = out_paths[index] + + @timeout_decorator + def main__(): + name = step_file.split("/")[-1].split(".")[0] + view_name = os.path.join(save_dir, f'{name}.jpg') + if os.path.isfile(view_name): return + # 加载模型 + shapes_labels_colors, shape = load_step_file(step_file) + # 计算包围盒 + bounding_box = compute_bounding_box(shape) + # 定义方向矢量 + if args.mode == "default": + proj_directions = [ + (random.random() * 0.25 + 0.75, random.random() * 0.25 + 0.75, random.random() * 0.25 + 0.75) + ] + elif args.mode == "orthographic": + proj_directions = [ + (1, 1, 1), + (1, 0, 0), + (0, 1, 0), + (0, 0, 1) + ] + else: + proj_directions = [ + (1, 1, 1) + ] + + # 保存多角度视图 + image_paths = save_views_from_angles(shapes_labels_colors, proj_directions, save_dir, name=name) + if args.mode == "orthographic": + output_path = os.path.join(save_dir, f'{name}.jpg') + merge_images(image_paths, output_path) + # 结束显示 + display.EraseAll() + #display.FitAll() + #start_display() + + sub_folder = os.path.join(src_dir, name) + sub_output_dir = os.path.join(save_dir, name) + if os.path.exists(sub_folder) and args.mode == "segment": + ensure_dir(sub_output_dir) + sub_steps = sorted(glob.glob(os.path.join(sub_folder, "*.{}".format("step")))) + for sub_step in sub_steps: + sub_shapes_labels_colors, sub_shape = load_step_file(sub_step) + bounding_box = compute_bounding_box(sub_shape) + sub_proj_directions = [(1, 1, 1)] + sub_name = sub_step.split("/")[-1].split(".")[0] + "." + sub_step.split("/")[-1].split(".")[1] + image_paths = save_views_from_angles(sub_shapes_labels_colors, sub_proj_directions, sub_output_dir, name=sub_name) + display.EraseAll() + try: + main__() + display.EraseAll() + except Exception as e: + print("load and create failed.") + traceback.print_exc() + display.EraseAll() + continue + + +if __name__ == "__main__": + processes = [] + for i in range(num_processes): + process = Process(target=main_process, args=(i,)) + processes.append(process) + process.start() + + # 等待所有进程完成 + for process in processes: + process.join() + + print('任务完成') \ No newline at end of file